text: (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["BootstrapCookieConsent"] = factory();
  	else
  		root["BootstrapCookieConsent"] = 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 = "./src/BootstrapCookieConsent.js");
  /******/ })
  /************************************************************************/
  /******/ ({
  
  /***/ "../../bootstrap.native/dist/bootstrap-native.js":
  /*!****************************************************************************************************!*\
    !*** /home/robin/Bureau/rando/site/symfony/node_modules/bootstrap.native/dist/bootstrap-native.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__;// Native Javascript for Bootstrap 3 v2.0.24 | © dnp_theme | MIT-License\n(function (root, factory) {\n  if (true) {\n    // AMD support:\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 { var bsn; }\n}(this, function () {\n  \n  /* Native Javascript for Bootstrap 3 | Internal Utility Functions\n  ----------------------------------------------------------------*/\n  \"use strict\";\n  \n  // globals\n  var globalObject = typeof global !== 'undefined' ? global : this||window,\n    DOC = document, HTML = DOC.documentElement, body = 'body', // allow the library to be used in <head>\n  \n    // Native Javascript for Bootstrap Global Object\n    BSN = globalObject.BSN = {},\n    supports = BSN.supports = [],\n  \n    // function toggle attributes\n    dataToggle    = 'data-toggle',\n    dataDismiss   = 'data-dismiss',\n    dataSpy       = 'data-spy',\n    dataRide      = 'data-ride',\n    \n    // components\n    stringAffix     = 'Affix',\n    stringAlert     = 'Alert',\n    stringButton    = 'Button',\n    stringCarousel  = 'Carousel',\n    stringCollapse  = 'Collapse',\n    stringDropdown  = 'Dropdown',\n    stringModal     = 'Modal',\n    stringPopover   = 'Popover',\n    stringScrollSpy = 'ScrollSpy',\n    stringTab       = 'Tab',\n    stringTooltip   = 'Tooltip',\n  \n    // options DATA API\n    databackdrop      = 'data-backdrop',\n    dataKeyboard      = 'data-keyboard',\n    dataTarget        = 'data-target',\n    dataInterval      = 'data-interval',\n    dataHeight        = 'data-height',\n    dataPause         = 'data-pause',\n    dataTitle         = 'data-title',  \n    dataOriginalTitle = 'data-original-title',\n    dataOriginalText  = 'data-original-text',\n    dataDismissible   = 'data-dismissible',\n    dataTrigger       = 'data-trigger',\n    dataAnimation     = 'data-animation',\n    dataContainer     = 'data-container',\n    dataPlacement     = 'data-placement',\n    dataDelay         = 'data-delay',\n    dataOffsetTop     = 'data-offset-top',\n    dataOffsetBottom  = 'data-offset-bottom',\n  \n    // option keys\n    backdrop = 'backdrop', keyboard = 'keyboard', delay = 'delay',\n    content = 'content', target = 'target', \n    interval = 'interval', pause = 'pause', animation = 'animation',\n    placement = 'placement', container = 'container', \n  \n    // box model\n    offsetTop    = 'offsetTop',      offsetBottom   = 'offsetBottom',\n    offsetLeft   = 'offsetLeft',\n    scrollTop    = 'scrollTop',      scrollLeft     = 'scrollLeft',\n    clientWidth  = 'clientWidth',    clientHeight   = 'clientHeight',\n    offsetWidth  = 'offsetWidth',    offsetHeight   = 'offsetHeight',\n    innerWidth   = 'innerWidth',     innerHeight    = 'innerHeight',\n    scrollHeight = 'scrollHeight',   height         = 'height',\n  \n    // aria\n    ariaExpanded = 'aria-expanded',\n    ariaHidden   = 'aria-hidden',\n  \n    // event names\n    clickEvent    = 'click',\n    hoverEvent    = 'hover',\n    keydownEvent  = 'keydown',\n    keyupEvent    = 'keyup',  \n    resizeEvent   = 'resize',\n    scrollEvent   = 'scroll',\n    // originalEvents\n    showEvent     = 'show',\n    shownEvent    = 'shown',\n    hideEvent     = 'hide',\n    hiddenEvent   = 'hidden',\n    closeEvent    = 'close',\n    closedEvent   = 'closed',\n    slidEvent     = 'slid',\n    slideEvent    = 'slide',\n    changeEvent   = 'change',\n  \n    // other\n    getAttribute           = 'getAttribute',\n    setAttribute           = 'setAttribute',\n    hasAttribute           = 'hasAttribute',\n    createElement          = 'createElement',\n    appendChild            = 'appendChild',\n    innerHTML              = 'innerHTML',\n    getElementsByTagName   = 'getElementsByTagName',\n    preventDefault         = 'preventDefault',\n    getBoundingClientRect  = 'getBoundingClientRect',\n    querySelectorAll       = 'querySelectorAll',\n    getElementsByCLASSNAME = 'getElementsByClassName',\n    getComputedStyle       = 'getComputedStyle',  \n  \n    indexOf      = 'indexOf',\n    parentNode   = 'parentNode',\n    length       = 'length',\n    toLowerCase  = 'toLowerCase',\n    Transition   = 'Transition',\n    Duration     = 'Duration',  \n    Webkit       = 'Webkit',\n    style        = 'style',\n    push         = 'push',\n    tabindex     = 'tabindex',\n    contains     = 'contains',  \n    \n    active     = 'active',\n    inClass    = 'in',\n    collapsing = 'collapsing',\n    disabled   = 'disabled',\n    loading    = 'loading',\n    left       = 'left',\n    right      = 'right',\n    top        = 'top',\n    bottom     = 'bottom',\n  \n    // IE8 browser detect\n    isIE8 = !('opacity' in HTML[style]),\n  \n    // tooltip / popover\n    mouseHover = ('onmouseleave' in DOC) ? [ 'mouseenter', 'mouseleave'] : [ 'mouseover', 'mouseout' ],\n    tipPositions = /\\b(top|bottom|left|right)+/,\n    \n    // modal\n    modalOverlay = 0,\n    fixedTop = 'navbar-fixed-top',\n    fixedBottom = 'navbar-fixed-bottom',  \n    \n    // transitionEnd since 2.0.4\n    supportTransitions = Webkit+Transition in HTML[style] || Transition[toLowerCase]() in HTML[style],\n    transitionEndEvent = Webkit+Transition in HTML[style] ? Webkit[toLowerCase]()+Transition+'End' : Transition[toLowerCase]()+'end',\n    transitionDuration = Webkit+Duration in HTML[style] ? Webkit[toLowerCase]()+Transition+Duration : Transition[toLowerCase]()+Duration,\n  \n    // set new focus element since 2.0.3\n    setFocus = function(element){\n      element.focus ? element.focus() : element.setActive();\n    },\n  \n    // class manipulation, since 2.0.0 requires polyfill.js\n    addClass = function(element,classNAME) {\n      element.classList.add(classNAME);\n    },\n    removeClass = function(element,classNAME) {\n      element.classList.remove(classNAME);\n    },\n    hasClass = function(element,classNAME){ // since 2.0.0\n      return element.classList[contains](classNAME);\n    },\n  \n    // selection methods\n    nodeListToArray = function(nodeList){\n      var childItems = []; for (var i = 0, nll = nodeList[length]; i<nll; i++) { childItems[push]( nodeList[i] ) }\n      return childItems;\n    },\n    getElementsByClassName = function(element,classNAME) { // getElementsByClassName IE8+\n      var selectionMethod = isIE8 ? querySelectorAll : getElementsByCLASSNAME;      \n      return nodeListToArray(element[selectionMethod]( isIE8 ? '.' + classNAME.replace(/\\s(?=[a-z])/g,'.') : classNAME ));\n    },\n    queryElement = function (selector, parent) {\n      var lookUp = parent ? parent : DOC;\n      return typeof selector === 'object' ? selector : lookUp.querySelector(selector);\n    },\n    getClosest = function (element, selector) { //element is the element and selector is for the closest parent element to find\n      // source http://gomakethings.com/climbing-up-and-down-the-dom-tree-with-vanilla-javascript/\n      var firstChar = selector.charAt(0), selectorSubstring = selector.substr(1);\n      if ( firstChar === '.' ) {// If selector is a class\n        for ( ; element && element !== DOC; element = element[parentNode] ) { // Get closest match\n          if ( queryElement(selector,element[parentNode]) !== null && hasClass(element,selectorSubstring) ) { return element; }\n        }\n      } else if ( firstChar === '#' ) { // If selector is an ID\n        for ( ; element && element !== DOC; element = element[parentNode] ) { // Get closest match\n          if ( element.id === selectorSubstring ) { return element; }\n        }\n      }\n      return false;\n    },\n  \n    // event attach jQuery style / trigger  since 1.2.0\n    on = function (element, event, handler) {\n      element.addEventListener(event, handler, false);\n    },\n    off = function(element, event, handler) {\n      element.removeEventListener(event, handler, false);\n    },\n    one = function (element, event, handler) { // one since 2.0.4\n      on(element, event, function handlerWrapper(e){\n        handler(e);\n        off(element, event, handlerWrapper);\n      });\n    },\n    getTransitionDurationFromElement = function(element) {\n      var duration = globalObject[getComputedStyle](element)[transitionDuration];\n      duration = parseFloat(duration);\n      duration = typeof duration === 'number' && !isNaN(duration) ? duration * 1000 : 0;\n      return duration + 50; // we take a short offset to make sure we fire on the next frame after animation\n    },\n    emulateTransitionEnd = function(element,handler){ // emulateTransitionEnd since 2.0.4\n      var called = 0, duration = getTransitionDurationFromElement(element);\n      supportTransitions && one(element, transitionEndEvent, function(e){ handler(e); called = 1; });\n      setTimeout(function() { !called && handler(); }, duration);\n    },\n    bootstrapCustomEvent = function (eventName, componentName, related) {\n      var OriginalCustomEvent = new CustomEvent( eventName + '.bs.' + componentName);\n      OriginalCustomEvent.relatedTarget = related;\n      this.dispatchEvent(OriginalCustomEvent);\n    },\n  \n    // tooltip / popover stuff\n    getScroll = function() { // also Affix and ScrollSpy uses it\n      return {\n        y : globalObject.pageYOffset || HTML[scrollTop],\n        x : globalObject.pageXOffset || HTML[scrollLeft]\n      }\n    },\n    styleTip = function(link,element,position,parent) { // both popovers and tooltips (target,tooltip/popover,placement,elementToAppendTo)\n      var elementDimensions = { w : element[offsetWidth], h: element[offsetHeight] },\n          windowWidth = (HTML[clientWidth] || DOC[body][clientWidth]),\n          windowHeight = (HTML[clientHeight] || DOC[body][clientHeight]),\n          rect = link[getBoundingClientRect](), \n          scroll = parent === DOC[body] ? getScroll() : { x: parent[offsetLeft] + parent[scrollLeft], y: parent[offsetTop] + parent[scrollTop] },\n          linkDimensions = { w: rect[right] - rect[left], h: rect[bottom] - rect[top] },\n          arrow = queryElement('[class*=\"arrow\"]',element),\n          topPosition, leftPosition, arrowTop, arrowLeft,\n  \n          halfTopExceed = rect[top] + linkDimensions.h/2 - elementDimensions.h/2 < 0,\n          halfLeftExceed = rect[left] + linkDimensions.w/2 - elementDimensions.w/2 < 0,\n          halfRightExceed = rect[left] + elementDimensions.w/2 + linkDimensions.w/2 >= windowWidth,\n          halfBottomExceed = rect[top] + elementDimensions.h/2 + linkDimensions.h/2 >= windowHeight,\n          topExceed = rect[top] - elementDimensions.h < 0,\n          leftExceed = rect[left] - elementDimensions.w < 0,\n          bottomExceed = rect[top] + elementDimensions.h + linkDimensions.h >= windowHeight,\n          rightExceed = rect[left] + elementDimensions.w + linkDimensions.w >= windowWidth;\n  \n      // recompute position\n      position = (position === left || position === right) && leftExceed && rightExceed ? top : position; // first, when both left and right limits are exceeded, we fall back to top|bottom\n      position = position === top && topExceed ? bottom : position;\n      position = position === bottom && bottomExceed ? top : position;\n      position = position === left && leftExceed ? right : position;\n      position = position === right && rightExceed ? left : position;\n      \n      // apply styling to tooltip or popover\n      if ( position === left || position === right ) { // secondary|side positions\n        if ( position === left ) { // LEFT\n          leftPosition = rect[left] + scroll.x - elementDimensions.w;\n        } else { // RIGHT\n          leftPosition = rect[left] + scroll.x + linkDimensions.w;\n        }\n  \n        // adjust top and arrow\n        if (halfTopExceed) {\n          topPosition = rect[top] + scroll.y;\n          arrowTop = linkDimensions.h/2;\n        } else if (halfBottomExceed) {\n          topPosition = rect[top] + scroll.y - elementDimensions.h + linkDimensions.h;\n          arrowTop = elementDimensions.h - linkDimensions.h/2;\n        } else {\n          topPosition = rect[top] + scroll.y - elementDimensions.h/2 + linkDimensions.h/2;\n        }\n      } else if ( position === top || position === bottom ) { // primary|vertical positions\n        if ( position === top) { // TOP\n          topPosition =  rect[top] + scroll.y - elementDimensions.h;\n        } else { // BOTTOM\n          topPosition = rect[top] + scroll.y + linkDimensions.h;\n        }\n        // adjust left | right and also the arrow\n        if (halfLeftExceed) {\n          leftPosition = 0;\n          arrowLeft = rect[left] + linkDimensions.w/2;\n        } else if (halfRightExceed) {\n          leftPosition = windowWidth - elementDimensions.w*1.01;\n          arrowLeft = elementDimensions.w - ( windowWidth - rect[left] ) + linkDimensions.w/2;\n        } else {\n          leftPosition = rect[left] + scroll.x - elementDimensions.w/2 + linkDimensions.w/2;\n        }\n      }\n  \n      // apply style to tooltip/popover and it's arrow\n      element[style][top] = topPosition + 'px';\n      element[style][left] = leftPosition + 'px';\n  \n      arrowTop && (arrow[style][top] = arrowTop + 'px');\n      arrowLeft && (arrow[style][left] = arrowLeft + 'px');\n  \n      element.className[indexOf](position) === -1 && (element.className = element.className.replace(tipPositions,position));\n    };\n  \n  BSN.version = '2.0.24';\n  \n  /* Native Javascript for Bootstrap 3 | Affix\n  -------------------------------------------*/\n  \n  //AFFIX DEFINITION\n  var Affix = function(element, options) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // set options\n    options = options || {};\n  \n    // read DATA API\n    var targetData        = element[getAttribute](dataTarget),\n        offsetTopData     = element[getAttribute](dataOffsetTop),\n        offsetBottomData  = element[getAttribute](dataOffsetBottom),\n        \n        // component specific strings\n        affix = 'affix', affixed = 'affixed', fn = 'function', update = 'update',\n        affixTop = 'affix-top', affixedTop = 'affixed-top',\n        affixBottom = 'affix-bottom', affixedBottom = 'affixed-bottom';\n  \n    this[target] = options[target] ? queryElement(options[target]) : queryElement(targetData) || null; // target is an object\n    this[offsetTop] = options[offsetTop] ? options[offsetTop] : parseInt(offsetTopData) || 0; // offset option is an integer number or function to determine that number\n    this[offsetBottom] = options[offsetBottom] ? options[offsetBottom]: parseInt(offsetBottomData) || 0;\n  \n    if ( !this[target] && !( this[offsetTop] || this[offsetBottom] ) ) { return; } // invalidate\n  \n    // internal bind\n    var self = this,\n  \n      // constants\n      pinOffsetTop, pinOffsetBottom, maxScroll, scrollY, pinnedTop, pinnedBottom,\n      affixedToTop = false, affixedToBottom = false,\n      \n      // private methods \n      getMaxScroll = function(){\n        return Math.max( DOC[body][scrollHeight], DOC[body][offsetHeight], HTML[clientHeight], HTML[scrollHeight], HTML[offsetHeight] );\n      },\n      getOffsetTop = function () {\n        if ( self[target] !== null ) {\n          return self[target][getBoundingClientRect]()[top] + scrollY;\n        } else if ( self[offsetTop] ) {\n          return parseInt(typeof self[offsetTop] === fn ? self[offsetTop]() : self[offsetTop] || 0);\n        }\n      },\n      getOffsetBottom = function () {\n        if ( self[offsetBottom] ) {\n          return maxScroll - element[offsetHeight] - parseInt( typeof self[offsetBottom] === fn ? self[offsetBottom]() : self[offsetBottom] || 0 );\n        }\n      },\n      checkPosition = function () {\n        maxScroll = getMaxScroll();\n        scrollY = parseInt(getScroll().y,0);\n        pinOffsetTop = getOffsetTop();\n        pinOffsetBottom = getOffsetBottom(); \n        pinnedTop = ( parseInt(pinOffsetTop) - scrollY < 0) && (scrollY > parseInt(pinOffsetTop) );\n        pinnedBottom = ( parseInt(pinOffsetBottom) - scrollY < 0) && (scrollY > parseInt(pinOffsetBottom) );\n      },\n      pinTop = function () {\n        if ( !affixedToTop && !hasClass(element,affix) ) { // on loading a page halfway scrolled these events don't trigger in Chrome\n          bootstrapCustomEvent.call(element, affix, affix);\n          bootstrapCustomEvent.call(element, affixTop, affix);\n          addClass(element,affix);\n          affixedToTop = true;\n          bootstrapCustomEvent.call(element, affixed, affix);\n          bootstrapCustomEvent.call(element, affixedTop, affix);\n        }\n      },\n      unPinTop = function () {\n        if ( affixedToTop && hasClass(element,affix) ) {\n          removeClass(element,affix);\n          affixedToTop = false;\n        }\n      },\n      pinBottom = function () {\n        if ( !affixedToBottom && !hasClass(element, affixBottom) ) {\n          bootstrapCustomEvent.call(element, affix, affix);\n          bootstrapCustomEvent.call(element, affixBottom, affix);\n          addClass(element,affixBottom);\n          affixedToBottom = true;\n          bootstrapCustomEvent.call(element, affixed, affix);\n          bootstrapCustomEvent.call(element, affixedBottom, affix);\n        }\n      },\n      unPinBottom = function () {\n        if ( affixedToBottom && hasClass(element,affixBottom) ) {\n          removeClass(element,affixBottom);\n          affixedToBottom = false;\n        }\n      },\n      updatePin = function () {\n        if ( pinnedBottom ) {\n          if ( pinnedTop ) { unPinTop(); }\n          pinBottom(); \n        } else {\n          unPinBottom();\n          if ( pinnedTop ) { pinTop(); } \n          else { unPinTop(); }\n        }\n      };\n  \n    // public method\n    this[update] = function () {\n      checkPosition();\n      updatePin(); \n    };\n  \n    // init\n    if ( !(stringAffix in element ) ) { // prevent adding event handlers twice\n      on( globalObject, scrollEvent, self[update] );\n      !isIE8 && on( globalObject, resizeEvent, self[update] );\n    }\n    element[stringAffix] = self;\n  \n    self[update]();\n  };\n  \n  // AFFIX DATA API\n  // =================\n  supports[push]([stringAffix, Affix, '['+dataSpy+'=\"affix\"]']);\n  \n  \n  \n  /* Native Javascript for Bootstrap 3 | Alert\n  -------------------------------------------*/\n  \n  // ALERT DEFINITION\n  // ================\n  var Alert = function( element ) {\n    \n    // initialization element\n    element = queryElement(element);\n  \n    // bind, target alert, duration and stuff\n    var self = this, component = 'alert',\n      alert = getClosest(element,'.'+component),\n      triggerHandler = function(){ hasClass(alert,'fade') ? emulateTransitionEnd(alert,transitionEndHandler) : transitionEndHandler(); },\n      // handlers\n      clickHandler = function(e){\n        alert = getClosest(e[target],'.'+component);\n        element = queryElement('['+dataDismiss+'=\"'+component+'\"]',alert);\n        element && alert && (element === e[target] || element[contains](e[target])) && self.close();\n      },\n      transitionEndHandler = function(){\n        bootstrapCustomEvent.call(alert, closedEvent, component);\n        off(element, clickEvent, clickHandler); // detach it's listener\n        alert[parentNode].removeChild(alert);\n      };\n    \n    // public method\n    this.close = function() {\n      if ( alert && element && hasClass(alert,inClass) ) {\n        bootstrapCustomEvent.call(alert, closeEvent, component);\n        removeClass(alert,inClass);\n        alert && triggerHandler();\n      }\n    };\n  \n    // init\n    if ( !(stringAlert in element ) ) { // prevent adding event handlers twice\n      on(element, clickEvent, clickHandler);\n    }\n    element[stringAlert] = self;\n  };\n  \n  // ALERT DATA API\n  // ==============\n  supports[push]([stringAlert, Alert, '['+dataDismiss+'=\"alert\"]']);\n  \n  \n  \n  /* Native Javascript for Bootstrap 3 | Button\n  ---------------------------------------------*/\n  \n  // BUTTON DEFINITION\n  // ===================\n  var Button = function( element, option ) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // set option\n    option = option || null;\n  \n    // constant\n    var toggled = false, // toggled makes sure to prevent triggering twice the change.bs.button events\n  \n        // strings\n        component = 'button',\n        checked = 'checked',\n        reset = 'reset',\n        LABEL = 'LABEL',\n        INPUT = 'INPUT',\n  \n      // private methods\n      setState = function() {\n        if ( !! option && option !== reset ) {\n          if ( option === loading ) {\n            addClass(element,disabled);\n            element[setAttribute](disabled,disabled);\n            element[setAttribute](dataOriginalText, element[innerHTML].trim()); // trim the text\n          }\n          element[innerHTML] = element[getAttribute]('data-'+option+'-text');\n        }\n      },\n      resetState = function() {\n        if (element[getAttribute](dataOriginalText)) {\n          if ( hasClass(element,disabled) || element[getAttribute](disabled) === disabled ) {\n            removeClass(element,disabled);\n            element.removeAttribute(disabled);\n          }\n          element[innerHTML] = element[getAttribute](dataOriginalText);\n        }\n      },\n      keyHandler = function(e){ \n        var key = e.which || e.keyCode;\n        key === 32 && e[target] === DOC.activeElement && toggle(e);\n      },\n      preventScroll = function(e){ \n        var key = e.which || e.keyCode;\n        key === 32 && e[preventDefault]();\n      },    \n      toggle = function(e) {\n        var label = e[target].tagName === LABEL ? e[target] : e[target][parentNode].tagName === LABEL ? e[target][parentNode] : null; // the .btn label\n        \n        if ( !label ) return; //react if a label or its immediate child is clicked\n  \n        var eventTarget = e[target], // the button itself, the target of the handler function\n          labels = getElementsByClassName(eventTarget[parentNode],'btn'), // all the button group buttons\n          input = label[getElementsByTagName](INPUT)[0];\n  \n        if ( !input ) return; //return if no input found\n  \n        // manage the dom manipulation\n        if ( input.type === 'checkbox' ) { //checkboxes\n          if ( !input[checked] ) {\n            addClass(label,active);\n            input[getAttribute](checked);\n            input[setAttribute](checked,checked);\n            input[checked] = true;\n          } else {\n            removeClass(label,active);\n            input[getAttribute](checked);\n            input.removeAttribute(checked);\n            input[checked] = false;\n          }\n  \n          if (!toggled) { // prevent triggering the event twice\n            toggled = true;\n            bootstrapCustomEvent.call(input, changeEvent, component); //trigger the change for the input\n            bootstrapCustomEvent.call(element, changeEvent, component); //trigger the change for the btn-group\n          }\n        }\n  \n        if ( input.type === 'radio' && !toggled ) { // radio buttons\n          if ( !input[checked] ) { // don't trigger if already active\n            addClass(label,active);\n            input[setAttribute](checked,checked);\n            input[checked] = true;\n            bootstrapCustomEvent.call(input, changeEvent, component); //trigger the change for the input\n            bootstrapCustomEvent.call(element, changeEvent, component); //trigger the change for the btn-group\n  \n            toggled = true;\n            for (var i = 0, ll = labels[length]; i<ll; i++) {\n              var otherLabel = labels[i], otherInput = otherLabel[getElementsByTagName](INPUT)[0];\n              if ( otherLabel !== label && hasClass(otherLabel,active) )  {\n                removeClass(otherLabel,active);\n                otherInput.removeAttribute(checked);\n                otherInput[checked] = false;\n                bootstrapCustomEvent.call(otherInput, changeEvent, component); // trigger the change\n              }\n            }\n          }\n        }\n        setTimeout( function() { toggled = false; }, 50 );\n      };\n  \n    // init\n    if ( hasClass(element,'btn') ) { // when Button text is used we execute it as an instance method\n      if ( option !== null ) {\n        if ( option !== reset ) { setState(); } \n        else { resetState(); }\n      }\n    } else { // if ( hasClass(element,'btn-group') ) // we allow the script to work outside btn-group component\n      \n      if ( !( stringButton in element ) ) { // prevent adding event handlers twice\n        on( element, clickEvent, toggle );\n        queryElement('['+tabindex+']',element) && on( element, keyupEvent, keyHandler ), \n                                                  on( element, keydownEvent, preventScroll );\n      }\n  \n      // activate items on load\n      var labelsToACtivate = getElementsByClassName(element, 'btn'), lbll = labelsToACtivate[length];\n      for (var i=0; i<lbll; i++) {\n        !hasClass(labelsToACtivate[i],active) && queryElement('input',labelsToACtivate[i])[getAttribute](checked)\n                                              && addClass(labelsToACtivate[i],active);\n      }\n      element[stringButton] = this;\n    }\n  };\n  \n  // BUTTON DATA API\n  // =================\n  supports[push]( [ stringButton, Button, '['+dataToggle+'=\"buttons\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Carousel\n  ----------------------------------------------*/\n  \n  // CAROUSEL DEFINITION\n  // ===================\n  var Carousel = function( element, options ) {\n  \n    // initialization element\n    element = queryElement( element );\n  \n    // set options\n    options = options || {};\n  \n    // DATA API\n    var intervalAttribute = element[getAttribute](dataInterval),\n        intervalOption = options[interval],\n        intervalData = intervalAttribute === 'false' ? 0 : parseInt(intervalAttribute),  \n        pauseData = element[getAttribute](dataPause) === hoverEvent || false,\n        keyboardData = element[getAttribute](dataKeyboard) === 'true' || false,\n      \n        // strings\n        component = 'carousel',\n        paused = 'paused',\n        direction = 'direction',\n        dataSlideTo = 'data-slide-to'; \n  \n    this[keyboard] = options[keyboard] === true || keyboardData;\n    this[pause] = (options[pause] === hoverEvent || pauseData) ? hoverEvent : false; // false / hover\n  \n    this[interval] = typeof intervalOption === 'number' ? intervalOption\n                   : intervalOption === false || intervalData === 0 || intervalData === false ? 0\n                   : isNaN(intervalData) ? 5000 // bootstrap carousel default interval\n                   : intervalData;\n  \n    // bind, event targets\n    var self = this, index = element.index = 0, timer = element.timer = 0, \n      isSliding = false, // isSliding prevents click event handlers when animation is running\n      slides = getElementsByClassName(element,'item'), total = slides[length],\n      slideDirection = this[direction] = left,\n      controls = getElementsByClassName(element,component+'-control'),\n      leftArrow = controls[0], rightArrow = controls[1],\n      indicator = queryElement( '.'+component+'-indicators', element ),\n      indicators = indicator && indicator[getElementsByTagName]( \"LI\" ) || [];\n  \n    // handlers\n    var pauseHandler = function () {\n        if ( self[interval] !==false && !hasClass(element,paused) ) {\n          addClass(element,paused);\n          !isSliding && ( clearInterval(timer), timer = null );\n        }\n      },\n      resumeHandler = function() {\n        if ( self[interval] !== false && hasClass(element,paused) ) {\n          removeClass(element,paused);\n          !isSliding && ( clearInterval(timer), timer = null );\n          !isSliding && self.cycle();\n        }\n      },\n      indicatorHandler = function(e) {\n        e[preventDefault]();\n        if (isSliding) return;\n  \n        var eventTarget = e[target]; // event target | the current active item\n  \n        if ( eventTarget && !hasClass(eventTarget,active) && eventTarget[getAttribute](dataSlideTo) ) {\n          index = parseInt( eventTarget[getAttribute](dataSlideTo), 10 );\n        } else { return false; }\n  \n        self.slideTo( index ); //Do the slide\n      },\n      controlsHandler = function (e) {\n        e[preventDefault]();\n        if (isSliding) return;\n  \n        var eventTarget = e.currentTarget || e.srcElement;\n  \n        if ( eventTarget === rightArrow ) {\n          index++;\n        } else if ( eventTarget === leftArrow ) {\n          index--;\n        }\n  \n        self.slideTo( index ); //Do the slide\n      },\n      keyHandler = function (e) {\n        if (isSliding) return;\n        switch (e.which) {\n          case 39:\n            index++;\n            break;\n          case 37:\n            index--;\n            break;\n          default: return;\n        }\n        self.slideTo( index ); //Do the slide\n      },\n      // private methods\n      isElementInScrollRange = function () {\n        var rect = element[getBoundingClientRect](),\n          viewportHeight = globalObject[innerHeight] || HTML[clientHeight]\n        return rect[top] <= viewportHeight && rect[bottom] >= 0; // bottom && top\n      },  \n      setActivePage = function( pageIndex ) { //indicators\n        for ( var i = 0, icl = indicators[length]; i < icl; i++ ) {\n          removeClass(indicators[i],active);\n        }\n        if (indicators[pageIndex]) addClass(indicators[pageIndex], active);\n      };\n  \n  \n    // public methods\n    this.cycle = function() {\n      if (timer) {\n        clearInterval(timer);\n        timer = null;\n      }\n  \n      timer = setInterval(function() {\n        isElementInScrollRange() && (index++, self.slideTo( index ) );\n      }, this[interval]);\n    };\n    this.slideTo = function( next ) {\n      if (isSliding) return; // when controled via methods, make sure to check again    \n      var activeItem = this.getActiveIndex(), // the current active\n          orientation;\n      \n        // first return if we're on the same item #227\n        if ( activeItem === next ) {\n          return;\n        // or determine slideDirection\n        } else if  ( (activeItem < next ) || (activeItem === 0 && next === total -1 ) ) {\n        slideDirection = self[direction] = left; // next\n      } else if  ( (activeItem > next) || (activeItem === total - 1 && next === 0 ) ) {\n        slideDirection = self[direction] = right; // prev\n      }\n  \n      // find the right next index \n      if ( next < 0 ) { next = total - 1; } \n      else if ( next >= total ){ next = 0; }\n  \n      // update index\n      index = next;\n      \n      orientation = slideDirection === left ? 'next' : 'prev'; //determine type\n      bootstrapCustomEvent.call(element, slideEvent, component, slides[next]); // here we go with the slide\n  \n      isSliding = true;\n      clearInterval(timer);\n      timer = null;\n      setActivePage( next );\n  \n      if ( supportTransitions && hasClass(element,'slide') ) {\n  \n        addClass(slides[next],orientation);\n        slides[next][offsetWidth];\n        addClass(slides[next],slideDirection);\n        addClass(slides[activeItem],slideDirection);\n  \n        one(slides[next], transitionEndEvent, function(e) {\n          var timeout = e[target] !== slides[next] ? e.elapsedTime*1000+100 : 20;\n          isSliding && setTimeout(function(){\n            isSliding = false;\n  \n            addClass(slides[next],active);\n            removeClass(slides[activeItem],active);\n  \n            removeClass(slides[next],orientation);\n            removeClass(slides[next],slideDirection);\n            removeClass(slides[activeItem],slideDirection);\n  \n            bootstrapCustomEvent.call(element, slidEvent, component, slides[next]);\n  \n            if ( self[interval] && !hasClass(element,paused) ) {\n              self.cycle();\n            }\n          }, timeout);\n        });\n  \n      } else {\n        addClass(slides[next],active);\n        slides[next][offsetWidth];\n        removeClass(slides[activeItem],active);\n        setTimeout(function() {\n          isSliding = false;\n          if ( self[interval] && !hasClass(element,paused) ) {\n            self.cycle();\n          }\n          bootstrapCustomEvent.call(element, slidEvent, component, slides[next]); // here we go with the slid event\n        }, 100 );\n      }\n    };\n    this.getActiveIndex = function () {\n      return slides[indexOf](getElementsByClassName(element,'item active')[0]) || 0;\n    };\n  \n    // init\n    if ( !(stringCarousel in element ) ) { // prevent adding event handlers twice\n  \n      if ( self[pause] && self[interval] ) {\n        on( element, mouseHover[0], pauseHandler );\n        on( element, mouseHover[1], resumeHandler );\n        on( element, 'touchstart', pauseHandler );\n        on( element, 'touchend', resumeHandler );\n      }\n    \n      rightArrow && on( rightArrow, clickEvent, controlsHandler );\n      leftArrow && on( leftArrow, clickEvent, controlsHandler );\n    \n      indicator && on( indicator, clickEvent, indicatorHandler );\n      self[keyboard] && on( globalObject, keydownEvent, keyHandler );\n  \n    }\n    if (self.getActiveIndex()<0) {\n      slides[length] && addClass(slides[0],active);\n      indicators[length] && setActivePage(0);\n    }\n  \n    if ( self[interval] ){ self.cycle(); }\n    element[stringCarousel] = self;\n  };\n  \n  // CAROUSEL DATA API\n  // =================\n  supports[push]( [ stringCarousel, Carousel, '['+dataRide+'=\"carousel\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Collapse\n  -----------------------------------------------*/\n  \n  // COLLAPSE DEFINITION\n  // ===================\n  var Collapse = function( element, options ) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // set options\n    options = options || {};\n  \n    // event targets and constants\n    var accordion = null, collapse = null, self = this,\n      accordionData = element[getAttribute]('data-parent'),\n      activeCollapse, activeElement,\n  \n      // component strings\n      component = 'collapse',\n      collapsed = 'collapsed',\n      isAnimating = 'isAnimating',\n  \n      // private methods\n      openAction = function(collapseElement,toggle) {\n        bootstrapCustomEvent.call(collapseElement, showEvent, component);\n        collapseElement[isAnimating] = true;\n        addClass(collapseElement,collapsing);\n        removeClass(collapseElement,component);\n        collapseElement[style][height] = collapseElement[scrollHeight] + 'px';\n        \n        emulateTransitionEnd(collapseElement, function() {\n          collapseElement[isAnimating] = false;\n          collapseElement[setAttribute](ariaExpanded,'true');\n          toggle[setAttribute](ariaExpanded,'true');          \n          removeClass(collapseElement,collapsing);\n          addClass(collapseElement, component);\n          addClass(collapseElement, inClass);\n          collapseElement[style][height] = '';\n          bootstrapCustomEvent.call(collapseElement, shownEvent, component);\n        });\n      },\n      closeAction = function(collapseElement,toggle) {\n        bootstrapCustomEvent.call(collapseElement, hideEvent, component);\n        collapseElement[isAnimating] = true;\n        collapseElement[style][height] = collapseElement[scrollHeight] + 'px'; // set height first\n        removeClass(collapseElement,component);\n        removeClass(collapseElement, inClass);\n        addClass(collapseElement, collapsing);\n        collapseElement[offsetWidth]; // force reflow to enable transition\n        collapseElement[style][height] = '0px';\n        \n        emulateTransitionEnd(collapseElement, function() {\n          collapseElement[isAnimating] = false;\n          collapseElement[setAttribute](ariaExpanded,'false');\n          toggle[setAttribute](ariaExpanded,'false');\n          removeClass(collapseElement,collapsing);\n          addClass(collapseElement,component);\n          collapseElement[style][height] = '';\n          bootstrapCustomEvent.call(collapseElement, hiddenEvent, component);\n        });\n      },\n      getTarget = function() {\n        var href = element.href && element[getAttribute]('href'),\n          parent = element[getAttribute](dataTarget),\n          id = href || ( parent && parent.charAt(0) === '#' ) && parent;\n        return id && queryElement(id);\n      };\n    \n    // public methods\n    this.toggle = function(e) {\n      e[preventDefault]();\n      if (!hasClass(collapse,inClass)) { self.show(); } \n      else { self.hide(); }\n    };\n    this.hide = function() {\n      if ( collapse[isAnimating] ) return;\n      closeAction(collapse,element);\n      addClass(element,collapsed);\n    };\n    this.show = function() {\n      if ( accordion ) {\n        activeCollapse = queryElement('.'+component+'.'+inClass,accordion);\n        activeElement = activeCollapse && (queryElement('['+dataToggle+'=\"'+component+'\"]['+dataTarget+'=\"#'+activeCollapse.id+'\"]', accordion)\n                      || queryElement('['+dataToggle+'=\"'+component+'\"][href=\"#'+activeCollapse.id+'\"]',accordion) );\n      }\n  \n      if ( !collapse[isAnimating] || activeCollapse && !activeCollapse[isAnimating] ) {\n        if ( activeElement && activeCollapse !== collapse ) {\n          closeAction(activeCollapse,activeElement);\n          addClass(activeElement,collapsed); \n        }\n        openAction(collapse,element);\n        removeClass(element,collapsed);\n      }\n    };\n  \n    // init\n    if ( !(stringCollapse in element ) ) { // prevent adding event handlers twice\n      on(element, clickEvent, self.toggle);\n    }\n    collapse = getTarget();\n    collapse[isAnimating] = false;  // when true it will prevent click handlers  \n    accordion = queryElement(options.parent) || accordionData && getClosest(element, accordionData);\n    element[stringCollapse] = self;\n  };\n  \n  // COLLAPSE DATA API\n  // =================\n  supports[push]( [ stringCollapse, Collapse, '['+dataToggle+'=\"collapse\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Dropdown\n  ----------------------------------------------*/\n  \n  // DROPDOWN DEFINITION\n  // ===================\n  var Dropdown = function( element, option ) {\n      \n    // initialization element\n    element = queryElement(element);\n  \n    // set option\n    this.persist = option === true || element[getAttribute]('data-persist') === 'true' || false;\n  \n    // constants, event targets, strings\n    var self = this, children = 'children',\n      parent = element[parentNode],\n      component = 'dropdown', open = 'open',\n      relatedTarget = null,\n      menu = queryElement('.dropdown-menu', parent),\n      menuItems = (function(){\n        var set = menu[children], newSet = [];\n        for ( var i=0; i<set[length]; i++ ){\n          set[i][children][length] && (set[i][children][0].tagName === 'A' && newSet[push](set[i]));          \n        }\n        return newSet;\n      })(),\n  \n      // preventDefault on empty anchor links\n      preventEmptyAnchor = function(anchor){\n        (anchor.href && anchor.href.slice(-1) === '#' || anchor[parentNode] && anchor[parentNode].href \n          && anchor[parentNode].href.slice(-1) === '#') && this[preventDefault]();      \n      },\n  \n      // toggle dismissible events\n      toggleDismiss = function(){\n        var type = element[open] ? on : off;\n        type(DOC, clickEvent, dismissHandler); \n        type(DOC, keydownEvent, preventScroll);\n        type(DOC, keyupEvent, keyHandler);\n      },\n  \n      // handlers\n      dismissHandler = function(e) {\n        var eventTarget = e[target], hasData = eventTarget && (stringDropdown in eventTarget || stringDropdown in eventTarget[parentNode]);\n        if ( (eventTarget === menu || menu[contains](eventTarget)) && (self.persist || hasData) ) { return; }\n        else {\n          relatedTarget = eventTarget === element || element[contains](eventTarget) ? element : null;\n          hide();\n        }\n        preventEmptyAnchor.call(e,eventTarget);\n      },\n      clickHandler = function(e) {\n        relatedTarget = element;\n        show();\n        preventEmptyAnchor.call(e,e[target]);\n      },\n      preventScroll = function(e){\n        var key = e.which || e.keyCode;\n        if( key === 38 || key === 40 ) { e[preventDefault](); }\n      },\n      keyHandler = function(e){\n        var key = e.which || e.keyCode, \n            activeItem = DOC.activeElement,\n            idx = menuItems[indexOf](activeItem[parentNode]),\n            isSameElement = activeItem === element,\n            isInsideMenu = menu[contains](activeItem),\n            isMenuItem = activeItem[parentNode][parentNode] === menu;\n        \n        if ( isMenuItem || isSameElement ) { // navigate up | down\n          idx = isSameElement ? 0 \n                              : key === 38 ? (idx>1?idx-1:0) \n                              : key === 40 ? (idx<menuItems[length]-1?idx+1:idx) : idx;\n          menuItems[idx] && setFocus(menuItems[idx][children][0]);\n        }\n        if ( (menuItems[length] && isMenuItem // menu has items\n          || !menuItems[length] && (isInsideMenu || isSameElement)  // menu might be a form\n          || !isInsideMenu ) // or the focused element is not in the menu at all\n          && element[open] && key === 27 // menu must be open\n        ) {\n          self.toggle();\n          relatedTarget = null;\n        }\n      },  \n  \n      // private methods\n      show = function() {\n        bootstrapCustomEvent.call(parent, showEvent, component, relatedTarget);\n        addClass(parent,open);\n        element[setAttribute](ariaExpanded,true);\n        bootstrapCustomEvent.call(parent, shownEvent, component, relatedTarget);\n        element[open] = true;\n        off(element, clickEvent, clickHandler);\n        setTimeout(function(){ \n          setFocus( menu[getElementsByTagName]('INPUT')[0] || element ); // focus the first input item | element\n          toggleDismiss(); \n        },1);\n      },\n      hide = function() {\n        bootstrapCustomEvent.call(parent, hideEvent, component, relatedTarget);\n        removeClass(parent,open);\n        element[setAttribute](ariaExpanded,false);\n        bootstrapCustomEvent.call(parent, hiddenEvent, component, relatedTarget);\n        element[open] = false;\n        toggleDismiss();\n        setFocus(element);\n        setTimeout(function(){ on(element, clickEvent, clickHandler); },1);\n      };\n  \n    // set initial state to closed\n    element[open] = false;\n  \n    // public methods\n    this.toggle = function() {\n      if (hasClass(parent,open) && element[open]) { hide(); } \n      else { show(); }\n    };\n  \n    // init\n    if (!(stringDropdown in element)) { // prevent adding event handlers twice\n      !tabindex in menu && menu[setAttribute](tabindex, '0'); // Fix onblur on Chrome | Safari\n      on(element, clickEvent, clickHandler);\n    }\n  \n    element[stringDropdown] = self;\n  };\n  \n  // DROPDOWN DATA API\n  // =================\n  supports[push]( [stringDropdown, Dropdown, '['+dataToggle+'=\"dropdown\"]'] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Modal\n  -------------------------------------------*/\n  \n  // MODAL DEFINITION\n  // ===============\n  var Modal = function(element, options) { // element can be the modal/triggering button\n  \n    // the modal (both JavaScript / DATA API init) / triggering button element (DATA API)\n    element = queryElement(element);\n  \n    // determine modal, triggering element\n    var btnCheck = element[getAttribute](dataTarget)||element[getAttribute]('href'),\n      checkModal = queryElement( btnCheck ),\n      modal = hasClass(element,'modal') ? element : checkModal,\n      overlayDelay,\n  \n      // strings\n      component = 'modal',\n      staticString = 'static',\n      paddingLeft = 'paddingLeft',\n      paddingRight = 'paddingRight',\n      modalBackdropString = 'modal-backdrop';\n  \n    if ( hasClass(element,'modal') ) { element = null; } // modal is now independent of it's triggering element\n  \n    if ( !modal ) { return; } // invalidate\n  \n    // set options\n    options = options || {};\n  \n    this[keyboard] = options[keyboard] === false || modal[getAttribute](dataKeyboard) === 'false' ? false : true;\n    this[backdrop] = options[backdrop] === staticString || modal[getAttribute](databackdrop) === staticString ? staticString : true;\n    this[backdrop] = options[backdrop] === false || modal[getAttribute](databackdrop) === 'false' ? false : this[backdrop];\n    this[content]  = options[content]; // JavaScript only\n  \n    // bind, constants, event targets and other vars\n    var self = this, relatedTarget = null,\n      bodyIsOverflowing, modalIsOverflowing, scrollbarWidth, overlay,\n  \n      // also find fixed-top / fixed-bottom items\n      fixedItems = getElementsByClassName(HTML,fixedTop).concat(getElementsByClassName(HTML,fixedBottom)),\n  \n      // private methods\n      getWindowWidth = function() {\n        var htmlRect = HTML[getBoundingClientRect]();\n        return globalObject[innerWidth] || (htmlRect[right] - Math.abs(htmlRect[left]));\n      },\n      setScrollbar = function () {\n        var bodyStyle = DOC[body].currentStyle || globalObject[getComputedStyle](DOC[body]),\n            bodyPad = parseInt((bodyStyle[paddingRight]), 10), itemPad;\n        if (bodyIsOverflowing) {\n          DOC[body][style][paddingRight] = (bodyPad + scrollbarWidth) + 'px';\n          if (fixedItems[length]){\n            for (var i = 0; i < fixedItems[length]; i++) {\n              itemPad = (fixedItems[i].currentStyle || globalObject[getComputedStyle](fixedItems[i]))[paddingRight];\n              fixedItems[i][style][paddingRight] = ( parseInt(itemPad) + scrollbarWidth) + 'px';\n            }\n          }\n        }\n      },\n      resetScrollbar = function () {\n        DOC[body][style][paddingRight] = '';\n        if (fixedItems[length]){\n          for (var i = 0; i < fixedItems[length]; i++) {\n            fixedItems[i][style][paddingRight] = '';\n          }\n        }\n      },\n      measureScrollbar = function () { // thx walsh\n        var scrollDiv = DOC[createElement]('div'), scrollBarWidth;\n        scrollDiv.className = component+'-scrollbar-measure'; // this is here to stay\n        DOC[body][appendChild](scrollDiv);\n        scrollBarWidth = scrollDiv[offsetWidth] - scrollDiv[clientWidth];\n        DOC[body].removeChild(scrollDiv);\n      return scrollBarWidth;\n      },\n      checkScrollbar = function () {\n        bodyIsOverflowing = DOC[body][clientWidth] < getWindowWidth();\n        modalIsOverflowing = modal[scrollHeight] > HTML[clientHeight];\n        scrollbarWidth = measureScrollbar();\n      },\n      adjustDialog = function () {\n        modal[style][paddingLeft] = !bodyIsOverflowing && modalIsOverflowing ? scrollbarWidth + 'px' : '';\n        modal[style][paddingRight] = bodyIsOverflowing && !modalIsOverflowing ? scrollbarWidth + 'px' : '';\n      },\n      resetAdjustments = function () {\n        modal[style][paddingLeft] = '';\n        modal[style][paddingRight] = '';\n      },\n      createOverlay = function() {\n        modalOverlay = 1;\n        \n        var newOverlay = DOC[createElement]('div');\n        overlay = queryElement('.'+modalBackdropString);\n  \n        if ( overlay === null ) {\n          newOverlay[setAttribute]('class',modalBackdropString+' fade');\n          overlay = newOverlay;\n          DOC[body][appendChild](overlay);\n        }\n      },\n      removeOverlay = function() {\n        overlay = queryElement('.'+modalBackdropString);\n        if ( overlay && overlay !== null && typeof overlay === 'object' ) {\n          modalOverlay = 0;\n          DOC[body].removeChild(overlay); overlay = null;\n        }\n        bootstrapCustomEvent.call(modal, hiddenEvent, component);      \n      },\n      keydownHandlerToggle = function() {\n        if (hasClass(modal,inClass)) {\n          on(DOC, keydownEvent, keyHandler);\n        } else {\n          off(DOC, keydownEvent, keyHandler);\n        }\n      },\n      resizeHandlerToggle = function() {\n        if (hasClass(modal,inClass)) {\n          on(globalObject, resizeEvent, self.update);\n        } else {\n          off(globalObject, resizeEvent, self.update);\n        }\n      },\n      dismissHandlerToggle = function() {\n        if (hasClass(modal,inClass)) {\n          on(modal, clickEvent, dismissHandler);\n        } else {\n          off(modal, clickEvent, dismissHandler);\n        }\n      },\n      // triggers\n      triggerShow = function() {\n        setFocus(modal);\n        bootstrapCustomEvent.call(modal, shownEvent, component, relatedTarget);\n      },\n      triggerHide = function() {\n        modal[style].display = '';\n        element && (setFocus(element));\n        \n        (function(){\n          if (!getElementsByClassName(DOC,component+' '+inClass)[0]) {\n            resetAdjustments();\n            resetScrollbar();\n            removeClass(DOC[body],component+'-open');\n            overlay && hasClass(overlay,'fade') ? (removeClass(overlay,inClass), emulateTransitionEnd(overlay,removeOverlay)) \n            : removeOverlay();\n  \n            resizeHandlerToggle();\n            dismissHandlerToggle();\n            keydownHandlerToggle();\n          }\n        }());\n      },\n      // handlers\n      clickHandler = function(e) {\n        var clickTarget = e[target];\n        clickTarget = clickTarget[hasAttribute](dataTarget) || clickTarget[hasAttribute]('href') ? clickTarget : clickTarget[parentNode];\n        if ( clickTarget === element && !hasClass(modal,inClass) ) {\n          modal.modalTrigger = element;\n          relatedTarget = element;\n          self.show();\n          e[preventDefault]();\n        }\n      },\n      keyHandler = function(e) {\n        var key = e.which || e.keyCode; // keyCode for IE8\n        if (self[keyboard] && key == 27 && hasClass(modal,inClass)) {\n          self.hide();\n        }\n      },\n      dismissHandler = function(e) {\n        var clickTarget = e[target];\n        if ( hasClass(modal,inClass) && (clickTarget[parentNode][getAttribute](dataDismiss) === component\n            || clickTarget[getAttribute](dataDismiss) === component\n            || (clickTarget === modal && self[backdrop] !== staticString) ) ) {\n          self.hide(); relatedTarget = null;\n          e[preventDefault]();\n        }\n      };\n  \n    // public methods\n    this.toggle = function() {\n      if ( hasClass(modal,inClass) ) {this.hide();} else {this.show();}\n    };\n    this.show = function() {\n      bootstrapCustomEvent.call(modal, showEvent, component, relatedTarget);\n  \n      // we elegantly hide any opened modal\n      var currentOpen = getElementsByClassName(DOC,component+' in')[0];\n      currentOpen && currentOpen !== modal && currentOpen.modalTrigger[stringModal].hide();\n  \n      if ( this[backdrop] ) {\n        !modalOverlay && createOverlay();\n      }\n  \n      if ( overlay && modalOverlay && !hasClass(overlay,inClass)) {\n        overlay[offsetWidth]; // force reflow to enable trasition\n        overlayDelay = getTransitionDurationFromElement(overlay);\n        addClass(overlay,inClass);\n      }\n  \n      setTimeout(function() {\n        modal[style].display = 'block';\n  \n        checkScrollbar();\n        setScrollbar();\n        adjustDialog();\n  \n        addClass(DOC[body],component+'-open');\n        addClass(modal,inClass);\n        modal[setAttribute](ariaHidden, false);\n        \n        resizeHandlerToggle();\n        dismissHandlerToggle();\n        keydownHandlerToggle();\n  \n        hasClass(modal,'fade') ? emulateTransitionEnd(modal, triggerShow) : triggerShow();\n      }, supportTransitions && overlay ? overlayDelay : 0);\n    };\n    this.hide = function() {\n      bootstrapCustomEvent.call(modal, hideEvent, component);\n      overlay = queryElement('.'+modalBackdropString);\n      overlayDelay = overlay && getTransitionDurationFromElement(overlay);\n  \n      removeClass(modal,inClass);\n      modal[setAttribute](ariaHidden, true);\n  \n      setTimeout(function(){\n        hasClass(modal,'fade') ? emulateTransitionEnd(modal, triggerHide) : triggerHide();\n      }, supportTransitions && overlay ? overlayDelay : 0);\n    };\n    this.setContent = function( content ) {\n      queryElement('.'+component+'-content',modal)[innerHTML] = content;\n    };\n    this.update = function() {\n      if (hasClass(modal,inClass)) {\n        checkScrollbar();\n        setScrollbar();\n        adjustDialog();\n      }\n    };\n  \n    // init\n    // prevent adding event handlers over and over\n    // modal is independent of a triggering element\n    if ( !!element && !(stringModal in element) ) {\n      on(element, clickEvent, clickHandler);\n    }\n    if ( !!self[content] ) { self.setContent( self[content] ); }\n    !!element && (element[stringModal] = self);\n  };\n  \n  // DATA API\n  supports[push]( [ stringModal, Modal, '['+dataToggle+'=\"modal\"]' ] );\n  \n  /* Native Javascript for Bootstrap 3 | Popover\n  ----------------------------------------------*/\n  \n  // POPOVER DEFINITION\n  // ==================\n  var Popover = function( element, options ) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // set options\n    options = options || {};\n  \n    // DATA API\n    var triggerData = element[getAttribute](dataTrigger), // click / hover / focus\n        animationData = element[getAttribute](dataAnimation), // true / false\n        placementData = element[getAttribute](dataPlacement),\n        dismissibleData = element[getAttribute](dataDismissible),\n        delayData = element[getAttribute](dataDelay),\n        containerData = element[getAttribute](dataContainer),\n  \n        // internal strings\n        component = 'popover',\n        template = 'template',\n        trigger = 'trigger',\n        classString = 'class',\n        div = 'div',\n        fade = 'fade',\n        content = 'content',\n        dataContent = 'data-content',\n        dismissible = 'dismissible',\n        closeBtn = '<button type=\"button\" class=\"close\">×</button>',\n  \n        // check container\n        containerElement = queryElement(options[container]),\n        containerDataElement = queryElement(containerData),      \n        \n        // maybe the element is inside a modal\n        modal = getClosest(element,'.modal'),\n        \n        // maybe the element is inside a fixed navbar\n        navbarFixedTop = getClosest(element,'.'+fixedTop),\n        navbarFixedBottom = getClosest(element,'.'+fixedBottom);\n  \n    // set instance options\n    this[template] = options[template] ? options[template] : null; // JavaScript only\n    this[trigger] = options[trigger] ? options[trigger] : triggerData || hoverEvent;\n    this[animation] = options[animation] && options[animation] !== fade ? options[animation] : animationData || fade;\n    this[placement] = options[placement] ? options[placement] : placementData || top;\n    this[delay] = parseInt(options[delay] || delayData) || 200;\n    this[dismissible] = options[dismissible] || dismissibleData === 'true' ? true : false;\n    this[container] = containerElement ? containerElement \n                    : containerDataElement ? containerDataElement \n                    : navbarFixedTop ? navbarFixedTop\n                    : navbarFixedBottom ? navbarFixedBottom\n                    : modal ? modal : DOC[body];\n  \n    // bind, content\n    var self = this, \n      titleString = element[getAttribute](dataTitle) || null,\n      contentString = element[getAttribute](dataContent) || null;\n  \n    if ( !contentString && !this[template] ) return; // invalidate\n  \n    // constants, vars\n    var popover = null, timer = 0, placementSetting = this[placement],\n      \n      // handlers\n      dismissibleHandler = function(e) {\n        if (popover !== null && e[target] === queryElement('.close',popover)) {\n          self.hide();\n        }\n      },\n  \n      // private methods\n      removePopover = function() {\n        self[container].removeChild(popover);\n        timer = null; popover = null; \n      },\n      createPopover = function() {\n        titleString = element[getAttribute](dataTitle); // check content again\n        contentString = element[getAttribute](dataContent);\n  \n        popover = DOC[createElement](div);\n  \n        if ( contentString !== null && self[template] === null ) { //create the popover from data attributes\n  \n          popover[setAttribute]('role','tooltip');\n  \n          if (titleString !== null) {\n            var popoverTitle = DOC[createElement]('h3');\n            popoverTitle[setAttribute](classString,component+'-title');\n  \n            popoverTitle[innerHTML] = self[dismissible] ? titleString + closeBtn : titleString;\n            popover[appendChild](popoverTitle);\n          }\n  \n          var popoverArrow = DOC[createElement](div), popoverContent = DOC[createElement](div);\n          popoverArrow[setAttribute](classString,'arrow'); popoverContent[setAttribute](classString,component+'-content');\n          popover[appendChild](popoverArrow); popover[appendChild](popoverContent);\n  \n          //set popover content\n          popoverContent[innerHTML] = self[dismissible] && titleString === null ? contentString + closeBtn : contentString;\n  \n        } else {  // or create the popover from template\n          var popoverTemplate = DOC[createElement](div);\n          popoverTemplate[innerHTML] = self[template];\n          popover[innerHTML] = popoverTemplate.firstChild[innerHTML];\n        }\n  \n        //append to the container\n        self[container][appendChild](popover);\n        popover[style].display = 'block';\n        popover[setAttribute](classString, component+ ' ' + placementSetting + ' ' + self[animation]);\n      },\n      showPopover = function () {\n        !hasClass(popover,inClass) && ( addClass(popover,inClass) );\n      },\n      updatePopover = function() {\n        styleTip(element,popover,placementSetting,self[container]);\n      },\n      \n      // event toggle\n      dismissHandlerToggle = function(type){\n        if (clickEvent == self[trigger] || 'focus' == self[trigger]) {\n          !self[dismissible] && type( element, 'blur', self.hide );\n        }\n        self[dismissible] && type( DOC, clickEvent, dismissibleHandler );\n        !isIE8 && type( globalObject, resizeEvent, self.hide );\n      },\n  \n      // triggers\n      showTrigger = function() {\n        dismissHandlerToggle(on);\n        bootstrapCustomEvent.call(element, shownEvent, component);\n      },\n      hideTrigger = function() {\n        dismissHandlerToggle(off);\n        removePopover();\n        bootstrapCustomEvent.call(element, hiddenEvent, component);\n      };\n  \n    // public methods / handlers\n    this.toggle = function() {\n      if (popover === null) { self.show(); } \n      else { self.hide(); }\n    };\n    this.show = function() {\n      clearTimeout(timer);\n      timer = setTimeout( function() {\n        if (popover === null) {\n          placementSetting = self[placement]; // we reset placement in all cases\n          createPopover();\n          updatePopover();\n          showPopover();\n          bootstrapCustomEvent.call(element, showEvent, component);\n          !!self[animation] ? emulateTransitionEnd(popover, showTrigger) : showTrigger();\n        }\n      }, 20 );\n    };\n    this.hide = function() {\n      clearTimeout(timer);\n      timer = setTimeout( function() {\n        if (popover && popover !== null && hasClass(popover,inClass)) {\n          bootstrapCustomEvent.call(element, hideEvent, component);\n          removeClass(popover,inClass);\n          !!self[animation] ? emulateTransitionEnd(popover, hideTrigger) : hideTrigger();\n        }\n      }, self[delay] );\n    };\n  \n    // init\n    if ( !(stringPopover in element) ) { // prevent adding event handlers twice\n      if (self[trigger] === hoverEvent) {\n        on( element, mouseHover[0], self.show );\n        if (!self[dismissible]) { on( element, mouseHover[1], self.hide ); }\n      } else if (clickEvent == self[trigger] || 'focus' == self[trigger]) {\n        on( element, self[trigger], self.toggle );\n      }    \n    }\n    element[stringPopover] = self;\n  };\n  \n  // POPOVER DATA API\n  // ================\n  supports[push]( [ stringPopover, Popover, '['+dataToggle+'=\"popover\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | ScrollSpy\n  -----------------------------------------------*/\n  \n  // SCROLLSPY DEFINITION\n  // ====================\n  var ScrollSpy = function(element, options) {\n  \n    // initialization element, the element we spy on\n    element = queryElement(element); \n  \n    // DATA API\n    var targetData = queryElement(element[getAttribute](dataTarget)),\n        offsetData = element[getAttribute]('data-offset');\n  \n    // set options\n    options = options || {};\n    if ( !options[target] && !targetData ) { return; } // invalidate\n  \n    // event targets, constants\n    var self = this, spyTarget = options[target] && queryElement(options[target]) || targetData,\n        links = spyTarget && spyTarget[getElementsByTagName]('A'),\n        offset = parseInt(offsetData || options['offset']) || 10,      \n        items = [], targetItems = [], scrollOffset,\n        scrollTarget = element[offsetHeight] < element[scrollHeight] ? element : globalObject, // determine which is the real scrollTarget\n        isWindow = scrollTarget === globalObject;  \n  \n    // populate items and targets\n    for (var i=0, il=links[length]; i<il; i++) {\n      var href = links[i][getAttribute]('href'), \n          targetItem = href && href.charAt(0) === '#' && href.slice(-1) !== '#' && queryElement(href);\n      if ( !!targetItem ) {\n        items[push](links[i]);\n        targetItems[push](targetItem);\n      }\n    }\n  \n    // private methods\n    var updateItem = function(index) {\n      var parent = items[index][parentNode], // item's parent LI element\n          targetItem = targetItems[index], // the menu item targets this element\n          dropdown = getClosest(parent,'.dropdown'),\n          targetRect = isWindow && targetItem[getBoundingClientRect](),\n  \n          isActive = hasClass(parent,active) || false,\n  \n          topEdge = (isWindow ? targetRect[top] + scrollOffset : targetItem[offsetTop]) - offset,\n          bottomEdge = isWindow ? targetRect[bottom] + scrollOffset - offset : targetItems[index+1] ? targetItems[index+1][offsetTop] - offset : element[scrollHeight],\n  \n          inside = scrollOffset >= topEdge && bottomEdge > scrollOffset;\n  \n        if ( !isActive && inside ) {\n          if ( parent.tagName === 'LI' && !hasClass(parent,active) ) {\n            addClass(parent,active);\n            if (dropdown && !hasClass(dropdown,active) ) {\n              addClass(dropdown,active);\n            }\n            bootstrapCustomEvent.call(element, 'activate', 'scrollspy', items[index]);\n          }\n        } else if ( !inside ) {\n          if ( parent.tagName === 'LI' && hasClass(parent,active) ) {\n            removeClass(parent,active);\n            if (dropdown && hasClass(dropdown,active) && !getElementsByClassName(parent[parentNode],active).length ) {\n              removeClass(dropdown,active);\n            }\n          }\n        } else if ( !inside && !isActive || isActive && inside ) {\n          return;\n        }\n      },\n      updateItems = function(){\n        scrollOffset = isWindow ? getScroll().y : element[scrollTop];\n        for (var index=0, itl=items[length]; index<itl; index++) {\n          updateItem(index)\n        }\n      };\n  \n    // public method\n    this.refresh = function () {\n      updateItems();\n    }\n  \n    // init\n    if ( !(stringScrollSpy in element) ) { // prevent adding event handlers twice\n      on( scrollTarget, scrollEvent, self.refresh );\n      !isIE8 && on( globalObject, resizeEvent, self.refresh ); \n    }\n    self.refresh();\n    element[stringScrollSpy] = self;\n  };\n  \n  // SCROLLSPY DATA API\n  // ==================\n  supports[push]( [ stringScrollSpy, ScrollSpy, '['+dataSpy+'=\"scroll\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Tab\n  -----------------------------------------*/\n  \n  // TAB DEFINITION\n  // ==============\n  var Tab = function( element, options ) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // DATA API\n    var heightData = element[getAttribute](dataHeight),\n      \n        // strings\n        component = 'tab', height = 'height', float = 'float', isAnimating = 'isAnimating';\n  \n    // set options\n    options = options || {};\n    this[height] = supportTransitions ? (options[height] || heightData === 'true') : false; // filter legacy browsers\n  \n    // bind, event targets\n    var self = this, next,\n      tabs = getClosest(element,'.nav'),\n      tabsContentContainer = false,\n      dropdown = tabs && queryElement('.dropdown',tabs),\n      activeTab, activeContent, nextContent, containerHeight, equalContents, nextHeight,\n  \n      // trigger\n      triggerEnd = function(){\n        tabsContentContainer[style][height] = '';\n        removeClass(tabsContentContainer,collapsing);\n        tabs[isAnimating] = false;\n      },\n      triggerShow = function() {\n        if (tabsContentContainer) { // height animation\n          if ( equalContents ) {\n            triggerEnd();\n          } else {\n            setTimeout(function(){ // enables height animation\n              tabsContentContainer[style][height] = nextHeight + 'px'; // height animation\n              tabsContentContainer[offsetWidth];\n              emulateTransitionEnd(tabsContentContainer, triggerEnd);\n            },50);\n          }\n        } else {\n          tabs[isAnimating] = false; \n        }\n        bootstrapCustomEvent.call(next, shownEvent, component, activeTab);\n      },\n      triggerHide = function() {\n        if (tabsContentContainer) {\n          activeContent[style][float] = left;\n          nextContent[style][float] = left;        \n          containerHeight = activeContent[scrollHeight];\n        }\n        \n        addClass(nextContent,active);\n        bootstrapCustomEvent.call(next, showEvent, component, activeTab);\n        \n        removeClass(activeContent,active);\n        bootstrapCustomEvent.call(activeTab, hiddenEvent, component, next);\n        \n        if (tabsContentContainer) {\n          nextHeight = nextContent[scrollHeight];\n          equalContents = nextHeight === containerHeight;\n          addClass(tabsContentContainer,collapsing);\n          tabsContentContainer[style][height] = containerHeight + 'px'; // height animation\n          tabsContentContainer[offsetHeight];\n          activeContent[style][float] = '';\n          nextContent[style][float] = '';\n        }\n  \n        if ( hasClass(nextContent, 'fade') ) {\n          setTimeout(function(){ // makes sure to go forward\n            addClass(nextContent,inClass);\n            emulateTransitionEnd(nextContent,triggerShow);\n          },20);\n        } else { triggerShow(); }        \n      };\n  \n    if (!tabs) return; // invalidate \n  \n    // set default animation state\n    tabs[isAnimating] = false;\n      \n    // private methods\n    var getActiveTab = function() {\n        var activeTabs = getElementsByClassName(tabs,active), activeTab;\n        if ( activeTabs[length] === 1 && !hasClass(activeTabs[0],'dropdown') ) {\n          activeTab = activeTabs[0];\n        } else if ( activeTabs[length] > 1 ) {\n          activeTab = activeTabs[activeTabs[length]-1];\n        }\n        return activeTab[getElementsByTagName]('A')[0];\n      },\n      getActiveContent = function() {\n        return queryElement(getActiveTab()[getAttribute]('href'));\n      },\n      // handler\n      clickHandler = function(e) {\n        var href = e[target][getAttribute]('href');\n        e[preventDefault]();\n        next = e[target][getAttribute](dataToggle) === component || (href && href.charAt(0) === '#')\n             ? e[target] : e[target][parentNode]; // allow for child elements like icons to use the handler\n        !tabs[isAnimating] && !hasClass(next[parentNode],active) && self.show();\n      };\n  \n    // public method\n    this.show = function() { // the tab we clicked is now the next tab\n      next = next || element;\n      nextContent = queryElement(next[getAttribute]('href')); //this is the actual object, the next tab content to activate\n      activeTab = getActiveTab(); \n      activeContent = getActiveContent();\n  \n      tabs[isAnimating] = true;\n      removeClass(activeTab[parentNode],active);\n      addClass(next[parentNode],active);\n  \n      if ( dropdown ) {\n        if ( !hasClass(element[parentNode][parentNode],'dropdown-menu') ) {\n          if (hasClass(dropdown,active)) removeClass(dropdown,active);\n        } else {\n          if (!hasClass(dropdown,active)) addClass(dropdown,active);\n        }\n      }\n      \n      bootstrapCustomEvent.call(activeTab, hideEvent, component, next);\n      \n      if (hasClass(activeContent, 'fade')) {\n        removeClass(activeContent,inClass);\n        emulateTransitionEnd(activeContent, triggerHide);\n      } else { triggerHide(); }\n    };\n  \n    // init\n    if ( !(stringTab in element) ) { // prevent adding event handlers twice\n      on(element, clickEvent, clickHandler);\n    }\n    if (self[height]) { tabsContentContainer = getActiveContent()[parentNode]; }\n    element[stringTab] = self;\n  };\n  \n  // TAB DATA API\n  // ============\n  supports[push]( [ stringTab, Tab, '['+dataToggle+'=\"tab\"]' ] );\n  \n  \n  /* Native Javascript for Bootstrap 3 | Tooltip\n  ---------------------------------------------*/\n  \n  // TOOLTIP DEFINITION\n  // ==================\n  var Tooltip = function( element,options ) {\n  \n    // initialization element\n    element = queryElement(element);\n  \n    // set options\n    options = options || {};\n  \n    // DATA API\n    var animationData = element[getAttribute](dataAnimation),\n        placementData = element[getAttribute](dataPlacement),\n        delayData = element[getAttribute](dataDelay),\n        containerData = element[getAttribute](dataContainer),\n        \n        // strings\n        component = 'tooltip',\n        classString = 'class',\n        title = 'title',\n        fade = 'fade',\n        div = 'div',\n  \n        // check container\n        containerElement = queryElement(options[container]),\n        containerDataElement = queryElement(containerData),        \n  \n        // maybe the element is inside a modal\n        modal = getClosest(element,'.modal'),\n        \n        // maybe the element is inside a fixed navbar\n        navbarFixedTop = getClosest(element,'.'+fixedTop),\n        navbarFixedBottom = getClosest(element,'.'+fixedBottom);\n  \n    // set instance options\n    this[animation] = options[animation] && options[animation] !== fade ? options[animation] : animationData || fade;\n    this[placement] = options[placement] ? options[placement] : placementData || top;\n    this[delay] = parseInt(options[delay] || delayData) || 200;\n    this[container] = containerElement ? containerElement \n                    : containerDataElement ? containerDataElement \n                    : navbarFixedTop ? navbarFixedTop\n                    : navbarFixedBottom ? navbarFixedBottom\n                    : modal ? modal : DOC[body];\n  \n    // bind, event targets, title and constants\n    var self = this, timer = 0, placementSetting = this[placement], tooltip = null,\n      titleString = element[getAttribute](title) || element[getAttribute](dataTitle) || element[getAttribute](dataOriginalTitle);\n  \n    if ( !titleString || titleString == \"\" ) return; // invalidate\n  \n    // private methods\n    var removeToolTip = function() {\n        self[container].removeChild(tooltip);\n        tooltip = null; timer = null;\n      },\n      createToolTip = function() {\n        titleString = element[getAttribute](title) || element[getAttribute](dataTitle) || element[getAttribute](dataOriginalTitle); // read the title again\n        if ( !titleString || titleString == \"\" ) return false; // invalidate\n        \n        tooltip = DOC[createElement](div);\n        tooltip[setAttribute]('role',component);\n  \n        var tooltipArrow = DOC[createElement](div), tooltipInner = DOC[createElement](div);\n        tooltipArrow[setAttribute](classString, component+'-arrow'); tooltipInner[setAttribute](classString,component+'-inner');\n  \n        tooltip[appendChild](tooltipArrow); tooltip[appendChild](tooltipInner);\n  \n        tooltipInner[innerHTML] = titleString;\n  \n        self[container][appendChild](tooltip);\n        tooltip[setAttribute](classString, component + ' ' + placementSetting + ' ' + self[animation]);\n      },\n      updateTooltip = function () {\n        styleTip(element,tooltip,placementSetting,self[container]);\n      },\n      showTooltip = function () {\n        !hasClass(tooltip,inClass) && ( addClass(tooltip,inClass) );\n      },\n      // triggers\n      showTrigger = function() {\n        bootstrapCustomEvent.call(element, shownEvent, component);\n        !isIE8 && on( globalObject, resizeEvent, self.hide );      \n      },\n      hideTrigger = function() {\n        !isIE8 && off( globalObject, resizeEvent, self.hide );      \n        removeToolTip();\n        bootstrapCustomEvent.call(element, hiddenEvent, component);\n      };\n  \n    // public methods\n    this.show = function() {\n      clearTimeout(timer);\n      timer = setTimeout( function() {\n        if (tooltip === null) {\n          placementSetting = self[placement]; // we reset placement in all cases\n          if(createToolTip() == false) return;\n          updateTooltip();\n          showTooltip();\n          bootstrapCustomEvent.call(element, showEvent, component);\n          !!self[animation] ? emulateTransitionEnd(tooltip, showTrigger) : showTrigger();\n        }\n      }, 20 );\n    };\n    this.hide = function() {\n      clearTimeout(timer);\n      timer = setTimeout( function() {\n        if (tooltip && hasClass(tooltip,inClass)) {\n          bootstrapCustomEvent.call(element, hideEvent, component);\n          removeClass(tooltip,inClass);\n          !!self[animation] ? emulateTransitionEnd(tooltip, hideTrigger) : hideTrigger();\n        }\n      }, self[delay]);\n    };\n    this.toggle = function() {\n      if (!tooltip) { self.show(); } \n      else { self.hide(); }\n    };\n  \n    // init\n    if ( !(stringTooltip in element) ) { // prevent adding event handlers twice\n      element[setAttribute](dataOriginalTitle,titleString);\n      element.removeAttribute(title);\n      on(element, mouseHover[0], self.show);\n      on(element, mouseHover[1], self.hide);\n    }\n    element[stringTooltip] = self;\n  };\n  \n  // TOOLTIP DATA API\n  // =================\n  supports[push]( [ stringTooltip, Tooltip, '['+dataToggle+'=\"tooltip\"]' ] );\n  \n  \n  \r\n  /* Native Javascript for Bootstrap 3 | Initialize Data API\r\n  --------------------------------------------------------*/\r\n  var initializeDataAPI = function( constructor, collection ){\r\n      for (var i=0, l=collection[length]; i<l; i++) {\r\n        new constructor(collection[i]);\r\n      }\r\n    },\r\n    initCallback = BSN.initCallback = function(lookUp){\r\n      lookUp = lookUp || DOC;\r\n      for (var i=0, l=supports[length]; i<l; i++) {\r\n        initializeDataAPI( supports[i][1], lookUp[querySelectorAll] (supports[i][2]) );\r\n      }\r\n    };\r\n  \r\n  // bulk initialize all components\r\n  DOC[body] ? initCallback() : on( DOC, 'DOMContentLoaded', function(){ initCallback(); } );\r\n  \n  return {\n    Affix: Affix,\n    Alert: Alert,\n    Button: Button,\n    Carousel: Carousel,\n    Collapse: Collapse,\n    Dropdown: Dropdown,\n    Modal: Modal,\n    Popover: Popover,\n    ScrollSpy: ScrollSpy,\n    Tab: Tab,\n    Tooltip: Tooltip\n  };\n}));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../bootstrap-cookie-consent/bootstrap-cookie-consent/node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack://BootstrapCookieConsent//home/robin/Bureau/rando/site/symfony/node_modules/bootstrap.native/dist/bootstrap-native.js?");
  
  /***/ }),
  
  /***/ "./node_modules/cookie-consent-api/src/index.js":
  /*!******************************************************!*\
    !*** ./node_modules/cookie-consent-api/src/index.js ***!
    \******************************************************/
  /*! exports provided: default */
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-cookie */ \"./node_modules/js-cookie/src/js.cookie.js\");\n/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(js_cookie__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! events */ \"./node_modules/node-libs-browser/node_modules/events/events.js\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_1__);\n\n\n\nclass CookieConsentApi extends events__WEBPACK_IMPORTED_MODULE_1___default.a\n{\n    constructor(conf = {})\n    {\n        super();\n\n        const defaultConf = {\n            cookieName: 'cookie_consent_settings',\n            cookieDuration: 365,\n            cookieDomain: null,\n            services: []\n        };\n\n        // Merge default config with user config\n        this._conf = Object.assign({}, defaultConf, conf);\n\n        // Console log errors if conf is invalid\n        this._validateConf();\n\n        // Replace dom elements based on cookie consent value\n        this._updateView();\n    }\n\n    reset()\n    {\n        js_cookie__WEBPACK_IMPORTED_MODULE_0___default.a.remove(this._conf.cookieName, {domain: this._conf.cookieDomain});\n        this._updateView();\n        this.emit('clear');\n    }\n\n    acceptAll()\n    {\n        let cookieServices = {};\n        this._conf.services.forEach(service => cookieServices[service] = true);\n\n        this._setCookieServices(cookieServices);\n        this._updateView();\n        this.emit('allConfigured');\n    }\n\n    accept(service)\n    {\n        let cookieServices = this._getCookieServices();\n        cookieServices[service] = true;\n\n        this._setCookieServices(cookieServices);\n        this._updateView();\n        this.emit('accept', service);\n\n        if (this.isAllConfigured()) this.emit('allConfigured');\n    }\n\n    refuse(service)\n    {\n        let cookieServices = this._getCookieServices();\n        cookieServices[service] = false;\n\n        this._setCookieServices(cookieServices);\n        this._updateView();\n        this.emit('refuse', service);\n\n        if (this.isAllConfigured()) this.emit('allConfigured');\n    }\n\n    isAllConfigured()\n    {\n        const cookieServices = this._getCookieServices();\n        let isAllConfigured = true;\n\n        this._conf.services.forEach(service => {\n            if (cookieServices[service] === undefined) isAllConfigured = false;\n        });\n\n        return isAllConfigured;\n    }\n\n    isConfigured(service)\n    {\n        const cookieServices = this._getCookieServices();\n        return cookieServices[service] !== undefined;\n    }\n    \n    isAccepted(service)\n    {\n        const cookieServices = this._getCookieServices();\n        return cookieServices[service] !== undefined && cookieServices[service] === true;\n    }\n\n    isRefused(service)\n    {\n        const cookieServices = this._getCookieServices();\n        return cookieServices[service] !== undefined && cookieServices[service] === false;\n    }\n\n    getServices()\n    {\n        return this._conf.services;\n    }\n\n    _getCookieServices()\n    {\n        return js_cookie__WEBPACK_IMPORTED_MODULE_0___default.a.getJSON(this._conf.cookieName) || {};\n    }\n\n    _setCookieServices(cookieServices)\n    {\n        js_cookie__WEBPACK_IMPORTED_MODULE_0___default.a.set(this._conf.cookieName, cookieServices, {\n            duration: this._conf.cookieDuration,\n            domain: this._conf.cookieDomain\n        });\n    }\n\n    _validateConf()\n    {\n        // Services\n        if (!Array.isArray(this._conf.services)) {\n            console.error('CCM: Services is not an array')\n        }\n        else {\n            this._conf.services.forEach(service => {\n                if (/^[a-zA-Z0-9]+$/.test(service) === false) {\n                    console.error('CCM: \"' + service + '\" is not a valid service name, only alphanumeric allowed');\n                }\n            });\n        }\n    }\n\n    _updateView()\n    {\n        const cookieServices = this._getCookieServices();\n\n        this._conf.services.forEach(service => {\n\n            const elems = document.querySelectorAll('[data-cookie-consent=\"' + service + '\"]');\n\n            // Service is accepted in cookie\n            if (cookieServices[service] === true) {\n                elems.forEach(elem => {\n                    if (!elem.getAttribute('data-ccm-fallback')) {\n                        elem.setAttribute('data-ccm-fallback', elem.innerHTML);\n                    }\n                    var match = elem.innerHTML.match(new RegExp('\\<\\!--if-consent(.*?)endif--\\>', 's'));\n                    if (match && match.length == 2) {\n                        elem.innerHTML = match[1];\n                        this._executeScripts(elem);\n                    }\n                })\n            }\n\n            // Service is refused in cookie\n            else {\n                elems.forEach(elem => {\n                    let fallbackContent = elem.getAttribute('data-ccm-fallback');\n                    if (fallbackContent) {\n                        elem.innerHTML = fallbackContent;\n                        this._executeScripts(elem);\n                    }\n                });\n            }\n\n        });\n    }\n\n    _executeScripts(elem)\n    {\n        const scriptsDom = elem.querySelectorAll('script');\n        scriptsDom.forEach(function(scriptDom) {\n            let script = document.createElement('script');\n            script.innerHTML = scriptDom.innerHTML;\n            scriptDom.remove();\n            elem.append(script);\n        })\n    }\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (CookieConsentApi);\n\n\n//# sourceURL=webpack://BootstrapCookieConsent/./node_modules/cookie-consent-api/src/index.js?");
  
  /***/ }),
  
  /***/ "./node_modules/js-cookie/src/js.cookie.js":
  /*!*************************************************!*\
    !*** ./node_modules/js-cookie/src/js.cookie.js ***!
    \*************************************************/
  /*! no static exports found */
  /***/ (function(module, exports, __webpack_require__) {
  
  eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * JavaScript Cookie v2.2.0\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader = false;\n\tif (true) {\n\t\t!(__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__));\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (true) {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api (key, value, attributes) {\n\t\t\tvar result;\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Write\n\n\t\t\tif (arguments.length > 1) {\n\t\t\t\tattributes = extend({\n\t\t\t\t\tpath: '/'\n\t\t\t\t}, api.defaults, attributes);\n\n\t\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\t\tvar expires = new Date();\n\t\t\t\t\texpires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);\n\t\t\t\t\tattributes.expires = expires;\n\t\t\t\t}\n\n\t\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\t\ttry {\n\t\t\t\t\tresult = JSON.stringify(value);\n\t\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\t\tvalue = result;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\n\t\t\t\tif (!converter.write) {\n\t\t\t\t\tvalue = encodeURIComponent(String(value))\n\t\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = converter.write(value, key);\n\t\t\t\t}\n\n\t\t\t\tkey = encodeURIComponent(String(key));\n\t\t\t\tkey = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);\n\t\t\t\tkey = key.replace(/[\\(\\)]/g, escape);\n\n\t\t\t\tvar stringifiedAttributes = '';\n\n\t\t\t\tfor (var attributeName in attributes) {\n\t\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName];\n\t\t\t\t}\n\t\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t\t}\n\n\t\t\t// Read\n\n\t\t\tif (!key) {\n\t\t\t\tresult = {};\n\t\t\t}\n\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all. Also prevents odd result when\n\t\t\t// calling \"get()\"\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar rdecode = /(%[0-9A-Z]{2})+/g;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!this.json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = parts[0].replace(rdecode, decodeURIComponent);\n\t\t\t\t\tcookie = converter.read ?\n\t\t\t\t\t\tconverter.read(cookie, name) : converter(cookie, name) ||\n\t\t\t\t\t\tcookie.replace(rdecode, decodeURIComponent);\n\n\t\t\t\t\tif (this.json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tresult = cookie;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!key) {\n\t\t\t\t\t\tresult[name] = cookie;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tapi.set = api;\n\t\tapi.get = function (key) {\n\t\t\treturn api.call(api, key);\n\t\t};\n\t\tapi.getJSON = function () {\n\t\t\treturn api.apply({\n\t\t\t\tjson: true\n\t\t\t}, [].slice.call(arguments));\n\t\t};\n\t\tapi.defaults = {};\n\n\t\tapi.remove = function (key, attributes) {\n\t\t\tapi(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n\n\n//# sourceURL=webpack://BootstrapCookieConsent/./node_modules/js-cookie/src/js.cookie.js?");
  
  /***/ }),
  
  /***/ "./node_modules/node-libs-browser/node_modules/events/events.js":
  /*!**********************************************************************!*\
    !*** ./node_modules/node-libs-browser/node_modules/events/events.js ***!
    \**********************************************************************/
  /*! no static exports found */
  /***/ (function(module, exports) {
  
  eval("// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        // At least give some kind of context to the user\n        var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n        err.context = er;\n        throw err;\n      }\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        args = Array.prototype.slice.call(arguments, 1);\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    args = Array.prototype.slice.call(arguments, 1);\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else if (listeners) {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n  if (this._events) {\n    var evlistener = this._events[type];\n\n    if (isFunction(evlistener))\n      return 1;\n    else if (evlistener)\n      return evlistener.length;\n  }\n  return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n\n//# sourceURL=webpack://BootstrapCookieConsent/./node_modules/node-libs-browser/node_modules/events/events.js?");
  
  /***/ }),
  
  /***/ "./node_modules/webpack/buildin/global.js":
  /*!***********************************!*\
    !*** (webpack)/buildin/global.js ***!
    \***********************************/
  /*! no static exports found */
  /***/ (function(module, exports) {
  
  eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\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\nmodule.exports = g;\n\n\n//# sourceURL=webpack://BootstrapCookieConsent/(webpack)/buildin/global.js?");
  
  /***/ }),
  
  /***/ "./src/BootstrapCookieConsent.js":
  /*!***************************************!*\
    !*** ./src/BootstrapCookieConsent.js ***!
    \***************************************/
  /*! exports provided: default */
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  
  "use strict";
  eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cookie_consent_api_src_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/cookie-consent-api/src/index.js */ \"./node_modules/cookie-consent-api/src/index.js\");\n/**\n * @version 0.0.1\n * @author Robin D https://www.robin-d.fr/\n * @license The MIT License (MIT)\n */\n\n\nvar bsn = __webpack_require__(/*! bootstrap.native */ \"../../bootstrap.native/dist/bootstrap-native.js\");\n\nclass BootstrapCookieConsent\n{\n\n    constructor(conf = {})\n    {\n        const defaultConf = {\n            'show_selector'   : '.cc',\n            'accept_id'       : 'accept-cookie',\n            'banner_text'     : 'Ce site utilise des services tiers susceptible de vous déposer un cookie. Pour une navigation optimale, acceptez-vous de les utiliser sur ce site ?',\n            'button_text'     : 'J\\'accepte',\n            'banner_id'       : 'cookies-banner',\n            'link_more_info'  : '#',\n            'more_info_label' : 'En savoir plus',\n            'details_title'   : 'Vie Privée',\n            'details_text'    : 'Vous pouvez accepter ou refuster l\\'utilisation sur ce site de certains services.',\n            'checkbox_class'  : 'switch-sm',\n            'method'          : 1, // 0: native boostrap, 1:jquery bootstrap or (string) 'bsn'\n            services: [],\n            services_descr: {}\n        };\n\n\n        this._conf = Object.assign({}, defaultConf, conf);\n\n        this.cookieConsent = new _node_modules_cookie_consent_api_src_index_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this._conf);\n\n        if (this.cookieConsent.isAllConfigured() == false) {\n            this._showBanner();\n        }\n\n        this.cookieConsent.on('allConfigured', ()=>{\n            this._hideBanner();\n        });\n\n        document.querySelectorAll(this._conf.show_selector).forEach(\n        (item)=>{\n            item.addEventListener('click', ()=>{\n                if (document.getElementById('cookie-modal') === null) {\n                    this._createDetails();\n                }\n\n                if (this._conf.method === 1) {\n                    $('#cookie-modal').modal('toggle');\n                } else {\n                    let modal = document.getElementById('cookie-modal');\n                    let iModal = typeof this._conf.method == 'string' ? new eval(this._conf.method + '.Modal(modal)') : new Modal(modal);\n                    iModal.show();\n                }\n            });\n        });\n\n    }\n\n    _hideBanner() {\n        let bannerElement = document.getElementById(this._conf.banner_id);\n        if (bannerElement !== null) {\n            bannerElement.parentNode.removeChild(bannerElement);\n        }\n    }\n\n    _showBanner() {\n        let parser = new DOMParser();\n\n        let banner = document.createElement('div');\n        banner.setAttribute('id', this._conf.banner_id);\n        banner.setAttribute('class', 'alert alert-warning text-center');\n        banner.innerHTML = this._conf.banner_text+' <button class=\"btn btn-success btn-gradient btn-sm\" id=\"'+this._conf.accept_id+'\">'+this._conf.button_text+'</button> <a href=\"'+this._conf.link_more_info+'\">'+this._conf.more_info_label+'</a>';\n        document.body.insertBefore(banner, document.body.firstChild);\n\n        document.getElementById(this._conf.accept_id).addEventListener('click', ()=>{\n            this.cookieConsent.acceptAll();\n            this._hideBanner();\n        });\n    }\n\n    _createDetails() {\n        let modal = '';\n\t    modal += '<div class=\"modal-dialog\" role=\"document\"><div class=\"modal-content\"><div class=\"modal-header\">';\n\t    modal += '<h5 class=\"modal-title\">' + this._conf.details_title + '</h5>';\n\t    modal += '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Fermer\"><span aria-hidden=\"true\">&times;</span></button></div>';\n\t    modal += '<div class=\"modal-body\">';\n\t    modal += '<p>' + this._conf.details_text + ' <a href=\"' + this._conf.link_more_info + '\">' + this._conf.more_info_label + '</a></p>';\n\t    modal += '<table class=\"table\"><thead class=\"thead-light\"><tr><th scope=\"col\" class=\"col-10\">Service</th><th scope=\"col\" class=\"col-2\">Accepter</th></tr></thead>';\n\t    modal += '<tbody>';\n\n\t    this._conf.services.forEach(elem => {\n\t      modal += '<tr><td>' + elem + (elem in this._conf.services_descr ? '<br><small>' + this._conf.services_descr[elem] + '</small>' : '') + '</td><td class=\"text-center\">';\n\t      modal += '<span class=\"switch\"><input type=\"checkbox\" class=\"' + this._conf.checkbox_class + '\" id=\"switch-' + elem + '\"';\n\t      modal += this.cookieConsent.isAccepted(elem) ? ' checked' : '';\n\t      modal += '><label for=\"switch-' + elem + '\"></label></span>';\n\t      modal += '</td></tr>';\n\t    });\n\n\t    modal += '</tbody></table></div></div></div6';\n\n        let modalElement = document.createElement('div');\n        modalElement.setAttribute('id', 'cookie-modal');\n        modalElement.setAttribute('class', 'modal fade');\n        modalElement.innerHTML = modal;\n\n\t    document.body.appendChild(modalElement);\n\n        this._conf.services.forEach((elem)=>{\n            document.getElementById('switch-'+ elem).addEventListener('change', ()=>{\n                if (document.getElementById('switch-'+ elem).checked) {\n                    this.cookieConsent.accept(elem);\n                } else {\n                    this.cookieConsent.refuse(elem);\n                }\n            });\n        });\n    }\n\n\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (BootstrapCookieConsent);\n\n\n//# sourceURL=webpack://BootstrapCookieConsent/./src/BootstrapCookieConsent.js?");
  
  /***/ })
  
  /******/ })["default"];
  });