{"version":3,"file":"angular-strap.min.js","sources":["module.js","affix/affix.js","aside/aside.js","alert/alert.js","button/button.js","collapse/collapse.js","datepicker/datepicker.js","dropdown/dropdown.js","helpers/date-parser.js","helpers/debounce.js","helpers/dimensions.js","helpers/parse-options.js","helpers/raf.js","modal/modal.js","navbar/navbar.js","popover/popover.js","scrollspy/scrollspy.js","select/select.js","tab/tab.js","timepicker/timepicker.js","tooltip/tooltip.js","typeahead/typeahead.js"],"names":[],"mappings":"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","sourcesContent":["\nangular.module('mgcrea.ngStrap', [\n  'mgcrea.ngStrap.modal',\n  'mgcrea.ngStrap.aside',\n  'mgcrea.ngStrap.alert',\n  'mgcrea.ngStrap.button',\n  'mgcrea.ngStrap.select',\n  'mgcrea.ngStrap.datepicker',\n  'mgcrea.ngStrap.timepicker',\n  'mgcrea.ngStrap.navbar',\n  'mgcrea.ngStrap.tooltip',\n  'mgcrea.ngStrap.popover',\n  'mgcrea.ngStrap.dropdown',\n  'mgcrea.ngStrap.typeahead',\n  'mgcrea.ngStrap.scrollspy',\n  'mgcrea.ngStrap.affix',\n  'mgcrea.ngStrap.tab',\n  'mgcrea.ngStrap.collapse'\n]);\n","'use strict';\n\nangular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions', 'mgcrea.ngStrap.helpers.debounce'])\n\n  .provider('$affix', function() {\n\n    var defaults = this.defaults = {\n      offsetTop: 'auto'\n    };\n\n    this.$get = function($window, debounce, dimensions) {\n\n      var bodyEl = angular.element($window.document.body);\n      var windowEl = angular.element($window);\n\n      function AffixFactory(element, config) {\n\n        var $affix = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n        var targetEl = options.target;\n\n        // Initial private vars\n        var reset = 'affix affix-top affix-bottom',\n            initialAffixTop = 0,\n            initialOffsetTop = 0,\n            offsetTop = 0,\n            offsetBottom = 0,\n            affixed = null,\n            unpin = null;\n\n        var parent = element.parent();\n        // Options: custom parent\n        if (options.offsetParent) {\n          if (options.offsetParent.match(/^\\d+$/)) {\n            for (var i = 0; i < (options.offsetParent * 1) - 1; i++) {\n              parent = parent.parent();\n            }\n          }\n          else {\n            parent = angular.element(options.offsetParent);\n          }\n        }\n\n        $affix.init = function() {\n\n          $affix.$parseOffsets();\n          initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;\n\n          // Bind events\n          targetEl.on('scroll', $affix.checkPosition);\n          targetEl.on('click', $affix.checkPositionWithEventLoop);\n          windowEl.on('resize', $affix.$debouncedOnResize);\n\n          // Both of these checkPosition() calls are necessary for the case where\n          // the user hits refresh after scrolling to the bottom of the page.\n          $affix.checkPosition();\n          $affix.checkPositionWithEventLoop();\n\n        };\n\n        $affix.destroy = function() {\n\n          // Unbind events\n          targetEl.off('scroll', $affix.checkPosition);\n          targetEl.off('click', $affix.checkPositionWithEventLoop);\n          windowEl.off('resize', $affix.$debouncedOnResize);\n\n        };\n\n        $affix.checkPositionWithEventLoop = function() {\n\n          setTimeout($affix.checkPosition, 1);\n\n        };\n\n        $affix.checkPosition = function() {\n          // if (!this.$element.is(':visible')) return\n\n          var scrollTop = getScrollTop();\n          var position = dimensions.offset(element[0]);\n          var elementHeight = dimensions.height(element[0]);\n\n          // Get required affix class according to position\n          var affix = getRequiredAffixClass(unpin, position, elementHeight);\n\n          // Did affix status changed this last check?\n          if(affixed === affix) return;\n          affixed = affix;\n\n          // Add proper affix class\n          element.removeClass(reset).addClass('affix' + ((affix !== 'middle') ? '-' + affix : ''));\n\n          if(affix === 'top') {\n            unpin = null;\n            element.css('position', (options.offsetParent) ? '' : 'relative');\n            element.css('top', '');\n          } else if(affix === 'bottom') {\n            if (options.offsetUnpin) {\n              unpin = -(options.offsetUnpin * 1);\n            }\n            else {\n              // Calculate unpin threshold when affixed to bottom.\n              // Hopefully the browser scrolls pixel by pixel.\n              unpin = position.top - scrollTop;\n            }\n            element.css('position', (options.offsetParent) ? '' : 'relative');\n            element.css('top', (options.offsetParent) ? '' : ((bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop) + 'px'));\n          } else { // affix === 'middle'\n            unpin = null;\n            element.css('position', 'fixed');\n            element.css('top', initialAffixTop + 'px');\n          }\n\n        };\n\n        $affix.$onResize = function() {\n          $affix.$parseOffsets();\n          $affix.checkPosition();\n        };\n        $affix.$debouncedOnResize = debounce($affix.$onResize, 50);\n\n        $affix.$parseOffsets = function() {\n\n          // Reset position to calculate correct offsetTop\n          element.css('position', (options.offsetParent) ? '' : 'relative');\n\n          if(options.offsetTop) {\n            if(options.offsetTop === 'auto') {\n              options.offsetTop = '+0';\n            }\n            if(options.offsetTop.match(/^[-+]\\d+$/)) {\n              initialAffixTop = - options.offsetTop * 1;\n              if(options.offsetParent) {\n                offsetTop = dimensions.offset(parent[0]).top + (options.offsetTop * 1);\n              }\n              else {\n                offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + (options.offsetTop * 1);\n              }\n            }\n            else {\n              offsetTop = options.offsetTop * 1;\n            }\n          }\n\n          if(options.offsetBottom) {\n            if(options.offsetParent && options.offsetBottom.match(/^[-+]\\d+$/)) {\n              // add 1 pixel due to rounding problems...\n              offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + (options.offsetBottom * 1) + 1;\n            }\n            else {\n              offsetBottom = options.offsetBottom * 1;\n            }\n          }\n\n        };\n\n        // Private methods\n\n        function getRequiredAffixClass(unpin, position, elementHeight) {\n\n          var scrollTop = getScrollTop();\n          var scrollHeight = getScrollHeight();\n\n          if(scrollTop <= offsetTop) {\n            return 'top';\n          } else if(unpin !== null && (scrollTop + unpin <= position.top)) {\n            return 'middle';\n          } else if(offsetBottom !== null && (position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom)) {\n            return 'bottom';\n          } else {\n            return 'middle';\n          }\n\n        }\n\n        function getScrollTop() {\n          return targetEl[0] === $window ? $window.pageYOffset : targetEl[0].scrollTop;\n        }\n\n        function getScrollHeight() {\n          return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight;\n        }\n\n        $affix.init();\n        return $affix;\n\n      }\n\n      return AffixFactory;\n\n    };\n\n  })\n\n  .directive('bsAffix', function($affix, $window) {\n\n    return {\n      restrict: 'EAC',\n      require: '^?bsAffixTarget',\n      link: function postLink(scope, element, attr, affixTarget) {\n\n        var options = {scope: scope, offsetTop: 'auto', target: affixTarget ? affixTarget.$element : angular.element($window)};\n        angular.forEach(['offsetTop', 'offsetBottom', 'offsetParent', 'offsetUnpin'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        var affix = $affix(element, options);\n        scope.$on('$destroy', function() {\n          affix && affix.destroy();\n          options = null;\n          affix = null;\n        });\n\n      }\n    };\n\n  })\n\n  .directive('bsAffixTarget', function() {\n    return {\n      controller: function($element) {\n        this.$element = $element;\n      }\n    };\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal'])\n\n  .provider('$aside', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade-and-slide-right',\n      prefixClass: 'aside',\n      placement: 'right',\n      template: 'aside/aside.tpl.html',\n      contentTemplate: false,\n      container: false,\n      element: null,\n      backdrop: true,\n      keyboard: true,\n      html: false,\n      show: true\n    };\n\n    this.$get = function($modal) {\n\n      function AsideFactory(config) {\n\n        var $aside = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n\n        $aside = $modal(options);\n\n        return $aside;\n\n      }\n\n      return AsideFactory;\n\n    };\n\n  })\n\n  .directive('bsAside', function($window, $sce, $aside) {\n\n    var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr, transclusion) {\n        // Directive options\n        var options = {scope: scope, element: element, show: false};\n        angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Support scope as data-attrs\n        angular.forEach(['title', 'content'], function(key) {\n          attr[key] && attr.$observe(key, function(newValue, oldValue) {\n            scope[key] = $sce.trustAsHtml(newValue);\n          });\n        });\n\n        // Support scope as an object\n        attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {\n          if(angular.isObject(newValue)) {\n            angular.extend(scope, newValue);\n          } else {\n            scope.content = newValue;\n          }\n        }, true);\n\n        // Initialize aside\n        var aside = $aside(options);\n\n        // Trigger\n        element.on(attr.trigger || 'click', aside.toggle);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (aside) aside.destroy();\n          options = null;\n          aside = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\n// @BUG: following snippet won't compile correctly\n// @TODO: submit issue to core\n// '<span ng-if=\"title\"><strong ng-bind=\"title\"></strong>&nbsp;</span><span ng-bind-html=\"content\"></span>' +\n\nangular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal'])\n\n  .provider('$alert', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'alert',\n      placement: null,\n      template: 'alert/alert.tpl.html',\n      container: false,\n      element: null,\n      backdrop: false,\n      keyboard: true,\n      show: true,\n      // Specific options\n      duration: false,\n      type: false,\n      dismissable: true\n    };\n\n    this.$get = function($modal, $timeout) {\n\n      function AlertFactory(config) {\n\n        var $alert = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n\n        $alert = $modal(options);\n\n        // Support scope as string options [/*title, content, */ type, dismissable]\n        $alert.$scope.dismissable = !!options.dismissable;\n        if(options.type) {\n          $alert.$scope.type = options.type;\n        }\n\n        // Support auto-close duration\n        var show = $alert.show;\n        if(options.duration) {\n          $alert.show = function() {\n            show();\n            $timeout(function() {\n              $alert.hide();\n            }, options.duration * 1000);\n          };\n        }\n\n        return $alert;\n\n      }\n\n      return AlertFactory;\n\n    };\n\n  })\n\n  .directive('bsAlert', function($window, $sce, $alert) {\n\n    var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr, transclusion) {\n\n        // Directive options\n        var options = {scope: scope, element: element, show: false};\n        angular.forEach(['template', 'placement', 'keyboard', 'html', 'container', 'animation', 'duration', 'dismissable'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Support scope as data-attrs\n        angular.forEach(['title', 'content', 'type'], function(key) {\n          attr[key] && attr.$observe(key, function(newValue, oldValue) {\n            scope[key] = $sce.trustAsHtml(newValue);\n          });\n        });\n\n        // Support scope as an object\n        attr.bsAlert && scope.$watch(attr.bsAlert, function(newValue, oldValue) {\n          if(angular.isObject(newValue)) {\n            angular.extend(scope, newValue);\n          } else {\n            scope.content = newValue;\n          }\n        }, true);\n\n        // Initialize alert\n        var alert = $alert(options);\n\n        // Trigger\n        element.on(attr.trigger || 'click', alert.toggle);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (alert) alert.destroy();\n          options = null;\n          alert = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.button', [])\n\n  .provider('$button', function() {\n\n    var defaults = this.defaults = {\n      activeClass:'active',\n      toggleEvent:'click'\n    };\n\n    this.$get = function() {\n      return {defaults: defaults};\n    };\n\n  })\n\n  .directive('bsCheckboxGroup', function() {\n\n    return {\n      restrict: 'A',\n      require: 'ngModel',\n      compile: function postLink(element, attr) {\n        element.attr('data-toggle', 'buttons');\n        element.removeAttr('ng-model');\n        var children = element[0].querySelectorAll('input[type=\"checkbox\"]');\n        angular.forEach(children, function(child) {\n          var childEl = angular.element(child);\n          childEl.attr('bs-checkbox', '');\n          childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));\n        });\n      }\n\n    };\n\n  })\n\n  .directive('bsCheckbox', function($button, $$rAF) {\n\n    var defaults = $button.defaults;\n    var constantValueRegExp = /^(true|false|\\d+)$/;\n\n    return {\n      restrict: 'A',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        var options = defaults;\n\n        // Support label > input[type=\"checkbox\"]\n        var isInput = element[0].nodeName === 'INPUT';\n        var activeElement = isInput ? element.parent() : element;\n\n        var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;\n        if(constantValueRegExp.test(attr.trueValue)) {\n          trueValue = scope.$eval(attr.trueValue);\n        }\n        var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;\n        if(constantValueRegExp.test(attr.falseValue)) {\n          falseValue = scope.$eval(attr.falseValue);\n        }\n\n        // Parse exotic values\n        var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';\n        if(hasExoticValues) {\n          controller.$parsers.push(function(viewValue) {\n            // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);\n            return viewValue ? trueValue : falseValue;\n          });\n          // Fix rendering for exotic values\n          scope.$watch(attr.ngModel, function(newValue, oldValue) {\n            controller.$render();\n          });\n        }\n\n        // model -> view\n        controller.$render = function () {\n          // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n          var isActive = angular.equals(controller.$modelValue, trueValue);\n          $$rAF(function() {\n            if(isInput) element[0].checked = isActive;\n            activeElement.toggleClass(options.activeClass, isActive);\n          });\n        };\n\n        // view -> model\n        element.bind(options.toggleEvent, function() {\n          scope.$apply(function () {\n            // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n            if(!isInput) {\n              controller.$setViewValue(!activeElement.hasClass('active'));\n            }\n            if(!hasExoticValues) {\n              controller.$render();\n            }\n          });\n        });\n\n      }\n\n    };\n\n  })\n\n  .directive('bsRadioGroup', function() {\n\n    return {\n      restrict: 'A',\n      require: 'ngModel',\n      compile: function postLink(element, attr) {\n        element.attr('data-toggle', 'buttons');\n        element.removeAttr('ng-model');\n        var children = element[0].querySelectorAll('input[type=\"radio\"]');\n        angular.forEach(children, function(child) {\n          angular.element(child).attr('bs-radio', '');\n          angular.element(child).attr('ng-model', attr.ngModel);\n        });\n      }\n\n    };\n\n  })\n\n  .directive('bsRadio', function($button, $$rAF) {\n\n    var defaults = $button.defaults;\n    var constantValueRegExp = /^(true|false|\\d+)$/;\n\n    return {\n      restrict: 'A',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        var options = defaults;\n\n        // Support `label > input[type=\"radio\"]` markup\n        var isInput = element[0].nodeName === 'INPUT';\n        var activeElement = isInput ? element.parent() : element;\n\n        var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;\n\n        // model -> view\n        controller.$render = function () {\n          // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n          var isActive = angular.equals(controller.$modelValue, value);\n          $$rAF(function() {\n            if(isInput) element[0].checked = isActive;\n            activeElement.toggleClass(options.activeClass, isActive);\n          });\n        };\n\n        // view -> model\n        element.bind(options.toggleEvent, function() {\n          scope.$apply(function () {\n            // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n            controller.$setViewValue(value);\n            controller.$render();\n          });\n        });\n\n      }\n\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.collapse', [])\n\n  .provider('$collapse', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-collapse',\n      disallowToggle: false,\n      activeClass: 'in'\n    };\n\n    var controller = this.controller = function($scope, $element, $attrs) {\n      var self = this;\n\n      // Attributes options\n      self.$options = angular.copy(defaults);\n      angular.forEach(['animation', 'disallowToggle', 'activeClass'], function(key) {\n        if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];\n      });\n\n      self.$toggles = [];\n      self.$targets = [];\n\n      self.$viewChangeListeners = [];\n\n      self.$registerToggle = function(element) {\n        self.$toggles.push(element);\n      };\n      self.$registerTarget = function(element) {\n        self.$targets.push(element);\n      };\n\n      self.$targets.$active = 0;\n      self.$setActive = $scope.$setActive = function(value) {\n        if(!self.$options.disallowToggle) {\n          self.$targets.$active = self.$targets.$active === value ? -1 : value;\n        } else {\n          self.$targets.$active = value;\n        }\n        self.$viewChangeListeners.forEach(function(fn) {\n          fn();\n        });\n      };\n\n    };\n\n    this.$get = function() {\n      var $collapse = {};\n      $collapse.defaults = defaults;\n      $collapse.controller = controller;\n      return $collapse;\n    };\n\n  })\n\n  .directive('bsCollapse', function($window, $animate, $collapse) {\n\n    var defaults = $collapse.defaults;\n\n    return {\n      require: ['?ngModel', 'bsCollapse'],\n      controller: ['$scope', '$element', '$attrs', $collapse.controller],\n      link: function postLink(scope, element, attrs, controllers) {\n\n        var ngModelCtrl = controllers[0];\n        var bsCollapseCtrl = controllers[1];\n\n        if(ngModelCtrl) {\n\n          // Update the modelValue following\n          bsCollapseCtrl.$viewChangeListeners.push(function() {\n            ngModelCtrl.$setViewValue(bsCollapseCtrl.$targets.$active);\n          });\n\n          // modelValue -> $formatters -> viewValue\n          ngModelCtrl.$formatters.push(function(modelValue) {\n            // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n            bsCollapseCtrl.$setActive(modelValue * 1);\n            return modelValue;\n          });\n\n        }\n\n      }\n    };\n\n  })\n\n  .directive('bsCollapseToggle', function() {\n\n    return {\n      require: ['^?ngModel', '^bsCollapse'],\n      link: function postLink(scope, element, attrs, controllers) {\n\n        var ngModelCtrl = controllers[0];\n        var bsCollapseCtrl = controllers[1];\n\n        // Add base attr\n        element.attr('data-toggle', 'collapse');\n\n        // Push pane to parent bsCollapse controller\n        bsCollapseCtrl.$registerToggle(element);\n        element.on('click', function() {\n          var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element);\n          bsCollapseCtrl.$setActive(index * 1);\n          scope.$apply();\n        });\n\n      }\n    };\n\n  })\n\n  .directive('bsCollapseTarget', function($animate) {\n\n    return {\n      require: ['^?ngModel', '^bsCollapse'],\n      // scope: true,\n      link: function postLink(scope, element, attrs, controllers) {\n\n        var ngModelCtrl = controllers[0];\n        var bsCollapseCtrl = controllers[1];\n\n        // Add base class\n        element.addClass('collapse');\n\n        // Add animation class\n        if(bsCollapseCtrl.$options.animation) {\n          element.addClass(bsCollapseCtrl.$options.animation);\n        }\n\n        // Push pane to parent bsCollapse controller\n        bsCollapseCtrl.$registerTarget(element);\n\n        function render() {\n          var index = bsCollapseCtrl.$targets.indexOf(element);\n          var active = bsCollapseCtrl.$targets.$active;\n          $animate[index === active ? 'addClass' : 'removeClass'](element, bsCollapseCtrl.$options.activeClass);\n        }\n\n        bsCollapseCtrl.$viewChangeListeners.push(function() {\n          render();\n        });\n        render();\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.datepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n  .provider('$datepicker', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'datepicker',\n      placement: 'bottom-left',\n      template: 'datepicker/datepicker.tpl.html',\n      trigger: 'focus',\n      container: false,\n      keyboard: true,\n      html: false,\n      delay: 0,\n      // lang: $locale.id,\n      useNative: false,\n      dateType: 'date',\n      dateFormat: 'shortDate',\n      modelDateFormat: null,\n      dayFormat: 'dd',\n      strictFormat: false,\n      autoclose: false,\n      minDate: -Infinity,\n      maxDate: +Infinity,\n      startView: 0,\n      minView: 0,\n      startWeek: 0,\n      daysOfWeekDisabled: '',\n      iconLeft: 'glyphicon glyphicon-chevron-left',\n      iconRight: 'glyphicon glyphicon-chevron-right'\n    };\n\n    this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, datepickerViews, $tooltip) {\n\n      var bodyEl = angular.element($window.document.body);\n      var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n      var isTouch = ('createTouch' in $window.document) && isNative;\n      if(!defaults.lang) defaults.lang = $locale.id;\n\n      function DatepickerFactory(element, controller, config) {\n\n        var $datepicker = $tooltip(element, angular.extend({}, defaults, config));\n        var parentScope = config.scope;\n        var options = $datepicker.$options;\n        var scope = $datepicker.$scope;\n        if(options.startView) options.startView -= options.minView;\n\n        // View vars\n\n        var pickerViews = datepickerViews($datepicker);\n        $datepicker.$views = pickerViews.views;\n        var viewDate = pickerViews.viewDate;\n        scope.$mode = options.startView;\n        scope.$iconLeft = options.iconLeft;\n        scope.$iconRight = options.iconRight;\n        var $picker = $datepicker.$views[scope.$mode];\n\n        // Scope methods\n\n        scope.$select = function(date) {\n          $datepicker.select(date);\n        };\n        scope.$selectPane = function(value) {\n          $datepicker.$selectPane(value);\n        };\n        scope.$toggleMode = function() {\n          $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);\n        };\n\n        // Public methods\n\n        $datepicker.update = function(date) {\n          // console.warn('$datepicker.update() newValue=%o', date);\n          if(angular.isDate(date) && !isNaN(date.getTime())) {\n            $datepicker.$date = date;\n            $picker.update.call($picker, date);\n          }\n          // Build only if pristine\n          $datepicker.$build(true);\n        };\n\n        $datepicker.updateDisabledDates = function(dateRanges) {\n          options.disabledDateRanges = dateRanges;\n          for(var i = 0, l = scope.rows.length; i < l; i++) {\n            angular.forEach(scope.rows[i], $datepicker.$setDisabledEl);\n          }\n        };\n\n        $datepicker.select = function(date, keep) {\n          // console.warn('$datepicker.select', date, scope.$mode);\n          if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date);\n          if(!scope.$mode || keep) {\n            controller.$setViewValue(angular.copy(date));\n            controller.$render();\n            if(options.autoclose && !keep) {\n              $datepicker.hide(true);\n            }\n          } else {\n            angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()});\n            $datepicker.setMode(scope.$mode - 1);\n            $datepicker.$build();\n          }\n        };\n\n        $datepicker.setMode = function(mode) {\n          // console.warn('$datepicker.setMode', mode);\n          scope.$mode = mode;\n          $picker = $datepicker.$views[scope.$mode];\n          $datepicker.$build();\n        };\n\n        // Protected methods\n\n        $datepicker.$build = function(pristine) {\n          // console.warn('$datepicker.$build() viewDate=%o', viewDate);\n          if(pristine === true && $picker.built) return;\n          if(pristine === false && !$picker.built) return;\n          $picker.build.call($picker);\n        };\n\n        $datepicker.$updateSelected = function() {\n          for(var i = 0, l = scope.rows.length; i < l; i++) {\n            angular.forEach(scope.rows[i], updateSelected);\n          }\n        };\n\n        $datepicker.$isSelected = function(date) {\n          return $picker.isSelected(date);\n        };\n\n        $datepicker.$setDisabledEl = function(el) {\n          el.disabled = $picker.isDisabled(el.date);\n        };\n\n        $datepicker.$selectPane = function(value) {\n          var steps = $picker.steps;\n          var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), viewDate.date + ((steps.day || 0) * value)));\n          angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()});\n          $datepicker.$build();\n        };\n\n        $datepicker.$onMouseDown = function(evt) {\n          // Prevent blur on mousedown on .dropdown-menu\n          evt.preventDefault();\n          evt.stopPropagation();\n          // Emulate click for mobile devices\n          if(isTouch) {\n            var targetEl = angular.element(evt.target);\n            if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n              targetEl = targetEl.parent();\n            }\n            targetEl.triggerHandler('click');\n          }\n        };\n\n        $datepicker.$onKeyDown = function(evt) {\n          if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n          evt.preventDefault();\n          evt.stopPropagation();\n\n          if(evt.keyCode === 13) {\n            if(!scope.$mode) {\n              return $datepicker.hide(true);\n            } else {\n              return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); });\n            }\n          }\n\n          // Navigate with keyboard\n          $picker.onKeyDown(evt);\n          parentScope.$digest();\n        };\n\n        // Private\n\n        function updateSelected(el) {\n          el.selected = $datepicker.$isSelected(el.date);\n        }\n\n        function focusElement() {\n          element[0].focus();\n        }\n\n        // Overrides\n\n        var _init = $datepicker.init;\n        $datepicker.init = function() {\n          if(isNative && options.useNative) {\n            element.prop('type', 'date');\n            element.css('-webkit-appearance', 'textfield');\n            return;\n          } else if(isTouch) {\n            element.prop('type', 'text');\n            element.attr('readonly', 'true');\n            element.on('click', focusElement);\n          }\n          _init();\n        };\n\n        var _destroy = $datepicker.destroy;\n        $datepicker.destroy = function() {\n          if(isNative && options.useNative) {\n            element.off('click', focusElement);\n          }\n          _destroy();\n        };\n\n        var _show = $datepicker.show;\n        $datepicker.show = function() {\n          _show();\n          setTimeout(function() {\n            $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n            if(options.keyboard) {\n              element.on('keydown', $datepicker.$onKeyDown);\n            }\n          });\n        };\n\n        var _hide = $datepicker.hide;\n        $datepicker.hide = function(blur) {\n          $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n          if(options.keyboard) {\n            element.off('keydown', $datepicker.$onKeyDown);\n          }\n          _hide(blur);\n        };\n\n        return $datepicker;\n\n      }\n\n      DatepickerFactory.defaults = defaults;\n      return DatepickerFactory;\n\n    };\n\n  })\n\n  .directive('bsDatepicker', function($window, $parse, $q, $locale, dateFilter, $datepicker, $dateParser, $timeout) {\n\n    var defaults = $datepicker.defaults;\n    var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n    var isNumeric = function(n) {\n      return !isNaN(parseFloat(n)) && isFinite(n);\n    };\n\n    return {\n      restrict: 'EAC',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        // Directive options\n        var options = {scope: scope, controller: controller};\n        angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'startDate', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight', 'daysOfWeekDisabled'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Visibility binding support\n        attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n          if(!datepicker || !angular.isDefined(newValue)) return;\n          if(angular.isString(newValue)) newValue = !!newValue.match(',?(datepicker),?');\n          newValue === true ? datepicker.show() : datepicker.hide();\n        });\n\n        // Initialize datepicker\n        var datepicker = $datepicker(element, controller, options);\n        options = datepicker.$options;\n        // Set expected iOS format\n        if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd';\n\n        // Observe attributes for changes\n        angular.forEach(['minDate', 'maxDate'], function(key) {\n          // console.warn('attr.$observe(%s)', key, attr[key]);\n          angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n            // console.warn('attr.$observe(%s)=%o', key, newValue);\n            if(newValue === 'today') {\n              var today = new Date();\n              datepicker.$options[key] = +new Date(today.getFullYear(), today.getMonth(), today.getDate() + (key === 'maxDate' ? 1 : 0), 0, 0, 0, (key === 'minDate' ? 0 : -1));\n            } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) { // Support {{ dateObj }}\n              datepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n            } else if(isNumeric(newValue)) {\n              datepicker.$options[key] = +new Date(parseInt(newValue, 10));\n            } else if (angular.isString(newValue) && 0 === newValue.length) { // Reset date\n              datepicker.$options[key] = key === 'maxDate' ? +Infinity : -Infinity;\n            } else {\n              datepicker.$options[key] = +new Date(newValue);\n            }\n            // Build only if dirty\n            !isNaN(datepicker.$options[key]) && datepicker.$build(false);\n          });\n        });\n\n        // Watch model for changes\n        scope.$watch(attr.ngModel, function(newValue, oldValue) {\n          datepicker.update(controller.$dateValue);\n        }, true);\n\n        // Normalize undefined/null/empty array,\n        // so that we don't treat changing from undefined->null as a change.\n        function normalizeDateRanges(ranges) {\n          if (!ranges || !ranges.length) return null;\n          return ranges;\n        }\n\n        if (angular.isDefined(attr.disabledDates)) {\n          scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) {\n            disabledRanges = normalizeDateRanges(disabledRanges);\n            previousValue = normalizeDateRanges(previousValue);\n\n            if (disabledRanges !== previousValue) {\n              datepicker.updateDisabledDates(disabledRanges);\n            }\n          });\n        }\n\n        var dateParser = $dateParser({format: options.dateFormat, lang: options.lang, strict: options.strictFormat});\n\n        // viewValue -> $parsers -> modelValue\n        controller.$parsers.unshift(function(viewValue) {\n          // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n          // Null values should correctly reset the model value & validity\n          if(!viewValue) {\n            controller.$setValidity('date', true);\n            return;\n          }\n          var parsedDate = dateParser.parse(viewValue, controller.$dateValue);\n          if(!parsedDate || isNaN(parsedDate.getTime())) {\n            controller.$setValidity('date', false);\n            return;\n          } else {\n            var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate;\n            var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate;\n            var isValid = isMinValid && isMaxValid;\n            controller.$setValidity('date', isValid);\n            controller.$setValidity('min', isMinValid);\n            controller.$setValidity('max', isMaxValid);\n            // Only update the model when we have a valid date\n            if(isValid) controller.$dateValue = parsedDate;\n          }\n          if(options.dateType === 'string') {\n            return dateFilter(parsedDate, options.modelDateFormat || options.dateFormat);\n          } else if(options.dateType === 'number') {\n            return controller.$dateValue.getTime();\n          } else if(options.dateType === 'iso') {\n            return controller.$dateValue.toISOString();\n          } else {\n            return new Date(controller.$dateValue);\n          }\n        });\n\n        // modelValue -> $formatters -> viewValue\n        controller.$formatters.push(function(modelValue) {\n          // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n          var date;\n          if(angular.isUndefined(modelValue) || modelValue === null) {\n            date = NaN;\n          } else if(angular.isDate(modelValue)) {\n            date = modelValue;\n          } else if(options.dateType === 'string') {\n            date = dateParser.parse(modelValue, null, options.modelDateFormat);\n          } else {\n            date = new Date(modelValue);\n          }\n          // Setup default value?\n          // if(isNaN(date.getTime())) {\n          //   var today = new Date();\n          //   date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);\n          // }\n          controller.$dateValue = date;\n          return controller.$dateValue;\n        });\n\n        // viewValue -> element\n        controller.$render = function() {\n          // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n          element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.dateFormat));\n        };\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if(datepicker) datepicker.destroy();\n          options = null;\n          datepicker = null;\n        });\n\n      }\n    };\n\n  })\n\n  .provider('datepickerViews', function() {\n\n    var defaults = this.defaults = {\n      dayFormat: 'dd',\n      daySplit: 7\n    };\n\n    // Split array into smaller arrays\n    function split(arr, size) {\n      var arrays = [];\n      while(arr.length > 0) {\n        arrays.push(arr.splice(0, size));\n      }\n      return arrays;\n    }\n\n    // Modulus operator\n    function mod(n, m) {\n      return ((n % m) + m) % m;\n    }\n\n    this.$get = function($locale, $sce, dateFilter) {\n\n      return function(picker) {\n\n        var scope = picker.$scope;\n        var options = picker.$options;\n\n        var weekDaysMin = $locale.DATETIME_FORMATS.SHORTDAY;\n        var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));\n        var weekDaysLabelsHtml = $sce.trustAsHtml('<th class=\"dow text-center\">' + weekDaysLabels.join('</th><th class=\"dow text-center\">') + '</th>');\n\n        var startDate = picker.$date || (options.startDate ? new Date(options.startDate) : new Date());\n        var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()};\n        var timezoneOffset = startDate.getTimezoneOffset() * 6e4;\n\n        var views = [{\n            format: options.dayFormat,\n            split: 7,\n            steps: { month: 1 },\n            update: function(date, force) {\n              if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {\n                angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n                picker.$build();\n              } else if(date.getDate() !== viewDate.date) {\n                viewDate.date = picker.$date.getDate();\n                picker.$updateSelected();\n              }\n            },\n            build: function() {\n              var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();\n              var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset();\n              var today = new Date().toDateString();\n              // Handle daylight time switch\n              if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3);\n              var days = [], day;\n              for(var i = 0; i < 42; i++) { // < 7 * 6\n                day = new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i);\n                days.push({date: day, isToday: day.toDateString() === today, label: dateFilter(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)});\n              }\n              scope.title = dateFilter(firstDayOfMonth, 'MMMM yyyy');\n              scope.showLabels = true;\n              scope.labels = weekDaysLabelsHtml;\n              scope.rows = split(days, this.split);\n              this.built = true;\n            },\n            isSelected: function(date) {\n              return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();\n            },\n            isDisabled: function(date) {\n              var time = date.getTime();\n\n              // Disabled because of min/max date.\n              if (time < options.minDate || time > options.maxDate) return true;\n\n              // Disabled due to being a disabled day of the week\n              if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1) return true;\n\n              // Disabled because of disabled date range.\n              if (options.disabledDateRanges) {\n                for (var i = 0; i < options.disabledDateRanges.length; i++) {\n                  if (time >= options.disabledDateRanges[i].start) {\n                    if (time <= options.disabledDateRanges[i].end) return true;\n\n                    // The disabledDateRanges is expected to be sorted, so if time >= start,\n                    // we know it's not disabled.\n                    return false;\n                  }\n                }\n              }\n\n              return false;\n            },\n            onKeyDown: function(evt) {\n              var actualTime = picker.$date.getTime();\n              var newDate;\n\n              if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5);\n              else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5);\n              else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5);\n              else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5);\n\n              if (!this.isDisabled(newDate)) picker.select(newDate, true);\n            }\n          }, {\n            name: 'month',\n            format: 'MMM',\n            split: 4,\n            steps: { year: 1 },\n            update: function(date, force) {\n              if(!this.built || date.getFullYear() !== viewDate.year) {\n                angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n                picker.$build();\n              } else if(date.getMonth() !== viewDate.month) {\n                angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()});\n                picker.$updateSelected();\n              }\n            },\n            build: function() {\n              var firstMonth = new Date(viewDate.year, 0, 1);\n              var months = [], month;\n              for (var i = 0; i < 12; i++) {\n                month = new Date(viewDate.year, i, 1);\n                months.push({date: month, label: dateFilter(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)});\n              }\n              scope.title = dateFilter(month, 'yyyy');\n              scope.showLabels = false;\n              scope.rows = split(months, this.split);\n              this.built = true;\n            },\n            isSelected: function(date) {\n              return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();\n            },\n            isDisabled: function(date) {\n              var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);\n              return lastDate < options.minDate || date.getTime() > options.maxDate;\n            },\n            onKeyDown: function(evt) {\n              var actualMonth = picker.$date.getMonth();\n              var newDate = new Date(picker.$date);\n\n              if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1);\n              else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4);\n              else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1);\n              else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4);\n\n              if (!this.isDisabled(newDate)) picker.select(newDate, true);\n            }\n          }, {\n            name: 'year',\n            format: 'yyyy',\n            split: 4,\n            steps: { year: 12 },\n            update: function(date, force) {\n              if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) {\n                angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n                picker.$build();\n              } else if(date.getFullYear() !== viewDate.year) {\n                angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n                picker.$updateSelected();\n              }\n            },\n            build: function() {\n              var firstYear = viewDate.year - viewDate.year % (this.split * 3);\n              var years = [], year;\n              for (var i = 0; i < 12; i++) {\n                year = new Date(firstYear + i, 0, 1);\n                years.push({date: year, label: dateFilter(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)});\n              }\n              scope.title = years[0].label + '-' + years[years.length - 1].label;\n              scope.showLabels = false;\n              scope.rows = split(years, this.split);\n              this.built = true;\n            },\n            isSelected: function(date) {\n              return picker.$date && date.getFullYear() === picker.$date.getFullYear();\n            },\n            isDisabled: function(date) {\n              var lastDate = +new Date(date.getFullYear() + 1, 0, 0);\n              return lastDate < options.minDate || date.getTime() > options.maxDate;\n            },\n            onKeyDown: function(evt) {\n              var actualYear = picker.$date.getFullYear(),\n                  newDate = new Date(picker.$date);\n\n              if(evt.keyCode === 37) newDate.setYear(actualYear - 1);\n              else if(evt.keyCode === 38) newDate.setYear(actualYear - 4);\n              else if(evt.keyCode === 39) newDate.setYear(actualYear + 1);\n              else if(evt.keyCode === 40) newDate.setYear(actualYear + 4);\n\n              if (!this.isDisabled(newDate)) picker.select(newDate, true);\n            }\n          }];\n\n        return {\n          views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,\n          viewDate: viewDate\n        };\n\n      };\n\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip'])\n\n  .provider('$dropdown', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'dropdown',\n      placement: 'bottom-left',\n      template: 'dropdown/dropdown.tpl.html',\n      trigger: 'click',\n      container: false,\n      keyboard: true,\n      html: false,\n      delay: 0\n    };\n\n    this.$get = function($window, $rootScope, $tooltip) {\n\n      var bodyEl = angular.element($window.document.body);\n      var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;\n\n      function DropdownFactory(element, config) {\n\n        var $dropdown = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n        var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n\n        $dropdown = $tooltip(element, options);\n        var parentEl = element.parent();\n\n        // Protected methods\n\n        $dropdown.$onKeyDown = function(evt) {\n          if (!/(38|40)/.test(evt.keyCode)) return;\n          evt.preventDefault();\n          evt.stopPropagation();\n\n          // Retrieve focused index\n          var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a'));\n          if(!items.length) return;\n          var index;\n          angular.forEach(items, function(el, i) {\n            if(matchesSelector && matchesSelector.call(el, ':focus')) index = i;\n          });\n\n          // Navigate with keyboard\n          if(evt.keyCode === 38 && index > 0) index--;\n          else if(evt.keyCode === 40 && index < items.length - 1) index++;\n          else if(angular.isUndefined(index)) index = 0;\n          items.eq(index)[0].focus();\n\n        };\n\n        // Overrides\n\n        var show = $dropdown.show;\n        $dropdown.show = function() {\n          show();\n          setTimeout(function() {\n            options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);\n            bodyEl.on('click', onBodyClick);\n          });\n          parentEl.hasClass('dropdown') && parentEl.addClass('open');\n        };\n\n        var hide = $dropdown.hide;\n        $dropdown.hide = function() {\n          options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);\n          bodyEl.off('click', onBodyClick);\n          parentEl.hasClass('dropdown') && parentEl.removeClass('open');\n          hide();\n        };\n\n        // Private functions\n\n        function onBodyClick(evt) {\n          if(evt.target === element[0]) return;\n          return evt.target !== element[0] && $dropdown.hide();\n        }\n\n        return $dropdown;\n\n      }\n\n      return DropdownFactory;\n\n    };\n\n  })\n\n  .directive('bsDropdown', function($window, $sce, $dropdown) {\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr, transclusion) {\n\n        // Directive options\n        var options = {scope: scope};\n        angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Support scope as an object\n        attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) {\n          scope.content = newValue;\n        }, true);\n\n        // Visibility binding support\n        attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n          if(!dropdown || !angular.isDefined(newValue)) return;\n          if(angular.isString(newValue)) newValue = !!newValue.match(',?(dropdown),?');\n          newValue === true ? dropdown.show() : dropdown.hide();\n        });\n\n        // Initialize dropdown\n        var dropdown = $dropdown(element, options);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (dropdown) dropdown.destroy();\n          options = null;\n          dropdown = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dateParser', [])\n\n.provider('$dateParser', function($localeProvider) {\n\n  var proto = Date.prototype;\n\n  function noop() {\n  }\n\n  function isNumeric(n) {\n    return !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  var defaults = this.defaults = {\n    format: 'shortDate',\n    strict: false\n  };\n\n  this.$get = function($locale, dateFilter) {\n\n    var DateParserFactory = function(config) {\n\n      var options = angular.extend({}, defaults, config);\n\n      var $dateParser = {};\n\n      var regExpMap = {\n        'sss'   : '[0-9]{3}',\n        'ss'    : '[0-5][0-9]',\n        's'     : options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',\n        'mm'    : '[0-5][0-9]',\n        'm'     : options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]',\n        'HH'    : '[01][0-9]|2[0-3]',\n        'H'     : options.strict ? '1?[0-9]|2[0-3]' : '[01]?[0-9]|2[0-3]',\n        'hh'    : '[0][1-9]|[1][012]',\n        'h'     : options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',\n        'a'     : 'AM|PM',\n        'EEEE'  : $locale.DATETIME_FORMATS.DAY.join('|'),\n        'EEE'   : $locale.DATETIME_FORMATS.SHORTDAY.join('|'),\n        'dd'    : '0[1-9]|[12][0-9]|3[01]',\n        'd'     : options.strict ? '[1-9]|[1-2][0-9]|3[01]' : '0?[1-9]|[1-2][0-9]|3[01]',\n        'MMMM'  : $locale.DATETIME_FORMATS.MONTH.join('|'),\n        'MMM'   : $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n        'MM'    : '0[1-9]|1[012]',\n        'M'     : options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]',\n        'yyyy'  : '[1]{1}[0-9]{3}|[2]{1}[0-9]{3}',\n        'yy'    : '[0-9]{2}',\n        'y'     : options.strict ? '-?(0|[1-9][0-9]{0,3})' : '-?0*[0-9]{1,4}',\n      };\n\n      var setFnMap = {\n        'sss'   : proto.setMilliseconds,\n        'ss'    : proto.setSeconds,\n        's'     : proto.setSeconds,\n        'mm'    : proto.setMinutes,\n        'm'     : proto.setMinutes,\n        'HH'    : proto.setHours,\n        'H'     : proto.setHours,\n        'hh'    : proto.setHours,\n        'h'     : proto.setHours,\n        'EEEE'  : noop,\n        'EEE'   : noop,\n        'dd'    : proto.setDate,\n        'd'     : proto.setDate,\n        'a'     : function(value) { var hours = this.getHours(); return this.setHours(value.match(/pm/i) ? hours + 12 : hours); },\n        'MMMM'  : function(value) { return this.setMonth($locale.DATETIME_FORMATS.MONTH.indexOf(value)); },\n        'MMM'   : function(value) { return this.setMonth($locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value)); },\n        'MM'    : function(value) { return this.setMonth(1 * value - 1); },\n        'M'     : function(value) { return this.setMonth(1 * value - 1); },\n        'yyyy'  : proto.setFullYear,\n        'yy'    : function(value) { return this.setFullYear(2000 + 1 * value); },\n        'y'     : proto.setFullYear\n      };\n\n      var regex, setMap;\n\n      $dateParser.init = function() {\n        $dateParser.$format = $locale.DATETIME_FORMATS[options.format] || options.format;\n        regex = regExpForFormat($dateParser.$format);\n        setMap = setMapForFormat($dateParser.$format);\n      };\n\n      $dateParser.isValid = function(date) {\n        if(angular.isDate(date)) return !isNaN(date.getTime());\n        return regex.test(date);\n      };\n\n      $dateParser.parse = function(value, baseDate, format) {\n        if(angular.isDate(value)) value = dateFilter(value, format || $dateParser.$format);\n        var formatRegex = format ? regExpForFormat(format) : regex;\n        var formatSetMap = format ? setMapForFormat(format) : setMap;\n        var matches = formatRegex.exec(value);\n        if(!matches) return false;\n        var date = baseDate || new Date(0, 0, 1);\n        for(var i = 0; i < matches.length - 1; i++) {\n          formatSetMap[i] && formatSetMap[i].call(date, matches[i+1]);\n        }\n        return date;\n      };\n\n      // Private functions\n\n      function setMapForFormat(format) {\n        var keys = Object.keys(setFnMap), i;\n        var map = [], sortedMap = [];\n        // Map to setFn\n        var clonedFormat = format;\n        for(i = 0; i < keys.length; i++) {\n          if(format.split(keys[i]).length > 1) {\n            var index = clonedFormat.search(keys[i]);\n            format = format.split(keys[i]).join('');\n            if(setFnMap[keys[i]]) {\n              map[index] = setFnMap[keys[i]];\n            }\n          }\n        }\n        // Sort result map\n        angular.forEach(map, function(v) {\n          // conditional required since angular.forEach broke around v1.2.21\n          // related pr: https://github.com/angular/angular.js/pull/8525\n          if(v) sortedMap.push(v);\n        });\n        return sortedMap;\n      }\n\n      function escapeReservedSymbols(text) {\n        return text.replace(/\\//g, '[\\\\/]').replace('/-/g', '[-]').replace(/\\./g, '[.]').replace(/\\\\s/g, '[\\\\s]');\n      }\n\n      function regExpForFormat(format) {\n        var keys = Object.keys(regExpMap), i;\n\n        var re = format;\n        // Abstract replaces to avoid collisions\n        for(i = 0; i < keys.length; i++) {\n          re = re.split(keys[i]).join('${' + i + '}');\n        }\n        // Replace abstracted values\n        for(i = 0; i < keys.length; i++) {\n          re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');\n        }\n        format = escapeReservedSymbols(format);\n\n        return new RegExp('^' + re + '$', ['i']);\n      }\n\n      $dateParser.init();\n      return $dateParser;\n\n    };\n\n    return DateParserFactory;\n\n  };\n\n});\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.debounce', [])\n\n// @source jashkenas/underscore\n// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L693\n.constant('debounce', function(func, wait, immediate) {\n  var timeout, args, context, timestamp, result;\n  return function() {\n    context = this;\n    args = arguments;\n    timestamp = new Date();\n    var later = function() {\n      var last = (new Date()) - timestamp;\n      if (last < wait) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n      }\n    };\n    var callNow = immediate && !timeout;\n    if (!timeout) {\n      timeout = setTimeout(later, wait);\n    }\n    if (callNow) result = func.apply(context, args);\n    return result;\n  };\n})\n\n\n// @source jashkenas/underscore\n// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L661\n.constant('throttle', function(func, wait, options) {\n  var context, args, result;\n  var timeout = null;\n  var previous = 0;\n  options || (options = {});\n  var later = function() {\n    previous = options.leading === false ? 0 : new Date();\n    timeout = null;\n    result = func.apply(context, args);\n  };\n  return function() {\n    var now = new Date();\n    if (!previous && options.leading === false) previous = now;\n    var remaining = wait - (now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0) {\n      clearTimeout(timeout);\n      timeout = null;\n      previous = now;\n      result = func.apply(context, args);\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n});\n\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dimensions', [])\n\n  .factory('dimensions', function($document, $window) {\n\n    var jqLite = angular.element;\n    var fn = {};\n\n    /**\n     * Test the element nodeName\n     * @param element\n     * @param name\n     */\n    var nodeName = fn.nodeName = function(element, name) {\n      return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();\n    };\n\n    /**\n     * Returns the element computed style\n     * @param element\n     * @param prop\n     * @param extra\n     */\n    fn.css = function(element, prop, extra) {\n      var value;\n      if (element.currentStyle) { //IE\n        value = element.currentStyle[prop];\n      } else if (window.getComputedStyle) {\n        value = window.getComputedStyle(element)[prop];\n      } else {\n        value = element.style[prop];\n      }\n      return extra === true ? parseFloat(value) || 0 : value;\n    };\n\n    /**\n     * Provides read-only equivalent of jQuery's offset function:\n     * @required-by bootstrap-tooltip, bootstrap-affix\n     * @url http://api.jquery.com/offset/\n     * @param element\n     */\n    fn.offset = function(element) {\n      var boxRect = element.getBoundingClientRect();\n      var docElement = element.ownerDocument;\n      return {\n        width: boxRect.width || element.offsetWidth,\n        height: boxRect.height || element.offsetHeight,\n        top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),\n        left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)\n      };\n    };\n\n    /**\n     * Provides read-only equivalent of jQuery's position function\n     * @required-by bootstrap-tooltip, bootstrap-affix\n     * @url http://api.jquery.com/offset/\n     * @param element\n     */\n    fn.position = function(element) {\n\n      var offsetParentRect = {top: 0, left: 0},\n          offsetParentElement,\n          offset;\n\n      // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n      if (fn.css(element, 'position') === 'fixed') {\n\n        // We assume that getBoundingClientRect is available when computed position is fixed\n        offset = element.getBoundingClientRect();\n\n      } else {\n\n        // Get *real* offsetParentElement\n        offsetParentElement = offsetParent(element);\n        offset = fn.offset(element);\n\n        // Get correct offsets\n        offset = fn.offset(element);\n        if (!nodeName(offsetParentElement, 'html')) {\n          offsetParentRect = fn.offset(offsetParentElement);\n        }\n\n        // Add offsetParent borders\n        offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true);\n        offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true);\n      }\n\n      // Subtract parent offsets and element margins\n      return {\n        width: element.offsetWidth,\n        height: element.offsetHeight,\n        top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),\n        left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)\n      };\n\n    };\n\n    /**\n     * Returns the closest, non-statically positioned offsetParent of a given element\n     * @required-by fn.position\n     * @param element\n     */\n    var offsetParent = function offsetParentElement(element) {\n      var docElement = element.ownerDocument;\n      var offsetParent = element.offsetParent || docElement;\n      if(nodeName(offsetParent, '#document')) return docElement.documentElement;\n      while(offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent || docElement.documentElement;\n    };\n\n    /**\n     * Provides equivalent of jQuery's height function\n     * @required-by bootstrap-affix\n     * @url http://api.jquery.com/height/\n     * @param element\n     * @param outer\n     */\n    fn.height = function(element, outer) {\n      var value = element.offsetHeight;\n      if(outer) {\n        value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);\n      } else {\n        value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);\n      }\n      return value;\n    };\n\n    /**\n     * Provides equivalent of jQuery's width function\n     * @required-by bootstrap-affix\n     * @url http://api.jquery.com/width/\n     * @param element\n     * @param outer\n     */\n    fn.width = function(element, outer) {\n      var value = element.offsetWidth;\n      if(outer) {\n        value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);\n      } else {\n        value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);\n      }\n      return value;\n    };\n\n    return fn;\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.parseOptions', [])\n\n  .provider('$parseOptions', function() {\n\n    var defaults = this.defaults = {\n      regexp: /^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(.*?)(?:\\s+track\\s+by\\s+(.*?))?$/\n    };\n\n    this.$get = function($parse, $q) {\n\n      function ParseOptionsFactory(attr, config) {\n\n        var $parseOptions = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n        $parseOptions.$values = [];\n\n        // Private vars\n        var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;\n\n        $parseOptions.init = function() {\n          $parseOptions.$match = match = attr.match(options.regexp);\n          displayFn = $parse(match[2] || match[1]),\n          valueName = match[4] || match[6],\n          keyName = match[5],\n          groupByFn = $parse(match[3] || ''),\n          valueFn = $parse(match[2] ? match[1] : valueName),\n          valuesFn = $parse(match[7]);\n        };\n\n        $parseOptions.valuesFn = function(scope, controller) {\n          return $q.when(valuesFn(scope, controller))\n          .then(function(values) {\n            $parseOptions.$values = values ? parseValues(values, scope) : {};\n            return $parseOptions.$values;\n          });\n        };\n\n        // Private functions\n\n        function parseValues(values, scope) {\n          return values.map(function(match, index) {\n            var locals = {}, label, value;\n            locals[valueName] = match;\n            label = displayFn(scope, locals);\n            value = valueFn(scope, locals) || index;\n            return {label: label, value: value};\n          });\n        }\n\n        $parseOptions.init();\n        return $parseOptions;\n\n      }\n\n      return ParseOptionsFactory;\n\n    };\n\n  });\n","'use strict';\n\n(angular.version.minor < 3 && angular.version.dot < 14) && angular.module('ng')\n\n.factory('$$rAF', function($window, $timeout) {\n\n  var requestAnimationFrame = $window.requestAnimationFrame ||\n                              $window.webkitRequestAnimationFrame ||\n                              $window.mozRequestAnimationFrame;\n\n  var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                             $window.webkitCancelAnimationFrame ||\n                             $window.mozCancelAnimationFrame ||\n                             $window.webkitCancelRequestAnimationFrame;\n\n  var rafSupported = !!requestAnimationFrame;\n  var raf = rafSupported ?\n    function(fn) {\n      var id = requestAnimationFrame(fn);\n      return function() {\n        cancelAnimationFrame(id);\n      };\n    } :\n    function(fn) {\n      var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n      return function() {\n        $timeout.cancel(timer);\n      };\n    };\n\n  raf.supported = rafSupported;\n\n  return raf;\n\n});\n\n// .factory('$$animateReflow', function($$rAF, $document) {\n\n//   var bodyEl = $document[0].body;\n\n//   return function(fn) {\n//     //the returned function acts as the cancellation function\n//     return $$rAF(function() {\n//       //the line below will force the browser to perform a repaint\n//       //so that all the animated elements within the animation frame\n//       //will be properly updated and drawn on screen. This is\n//       //required to perform multi-class CSS based animations with\n//       //Firefox. DO NOT REMOVE THIS LINE.\n//       var a = bodyEl.offsetWidth + 1;\n//       fn();\n//     });\n//   };\n\n// });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions'])\n\n  .provider('$modal', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      backdropAnimation: 'am-fade',\n      prefixClass: 'modal',\n      prefixEvent: 'modal',\n      placement: 'top',\n      template: 'modal/modal.tpl.html',\n      contentTemplate: false,\n      container: false,\n      element: null,\n      backdrop: true,\n      keyboard: true,\n      html: false,\n      show: true\n    };\n\n    this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) {\n\n      var forEach = angular.forEach;\n      var trim = String.prototype.trim;\n      var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n      var bodyElement = angular.element($window.document.body);\n      var htmlReplaceRegExp = /ng-bind=\"/ig;\n\n      function ModalFactory(config) {\n\n        var $modal = {};\n\n        // Common vars\n        var options = $modal.$options = angular.extend({}, defaults, config);\n        $modal.$promise = fetchTemplate(options.template);\n        var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n        if(!options.element && !options.container) {\n          options.container = 'body';\n        }\n\n        // Support scope as string options\n        forEach(['title', 'content'], function(key) {\n          if(options[key]) scope[key] = $sce.trustAsHtml(options[key]);\n        });\n\n        // Provide scope helpers\n        scope.$hide = function() {\n          scope.$$postDigest(function() {\n            $modal.hide();\n          });\n        };\n        scope.$show = function() {\n          scope.$$postDigest(function() {\n            $modal.show();\n          });\n        };\n        scope.$toggle = function() {\n          scope.$$postDigest(function() {\n            $modal.toggle();\n          });\n        };\n\n        // Support contentTemplate option\n        if(options.contentTemplate) {\n          $modal.$promise = $modal.$promise.then(function(template) {\n            var templateEl = angular.element(template);\n            return fetchTemplate(options.contentTemplate)\n            .then(function(contentTemplate) {\n              var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);\n              // Drop the default footer as you probably don't want it if you use a custom contentTemplate\n              if(!config.template) contentEl.next().remove();\n              return templateEl[0].outerHTML;\n            });\n          });\n        }\n\n        // Fetch, compile then initialize modal\n        var modalLinker, modalElement;\n        var backdropElement = angular.element('<div class=\"' + options.prefixClass + '-backdrop\"/>');\n        $modal.$promise.then(function(template) {\n          if(angular.isObject(template)) template = template.data;\n          if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n          template = trim.apply(template);\n          modalLinker = $compile(template);\n          $modal.init();\n        });\n\n        $modal.init = function() {\n\n          // Options: show\n          if(options.show) {\n            scope.$$postDigest(function() {\n              $modal.show();\n            });\n          }\n\n        };\n\n        $modal.destroy = function() {\n\n          // Remove element\n          if(modalElement) {\n            modalElement.remove();\n            modalElement = null;\n          }\n          if(backdropElement) {\n            backdropElement.remove();\n            backdropElement = null;\n          }\n\n          // Destroy scope\n          scope.$destroy();\n\n        };\n\n        $modal.show = function() {\n\n          scope.$emit(options.prefixEvent + '.show.before', $modal);\n          var parent;\n          if(angular.isElement(options.container)) {\n            parent = options.container;\n          } else {\n            parent = options.container ? findElement(options.container) : null;\n          }\n          var after = options.container ? null : options.element;\n\n          // Fetch a cloned element linked from template\n          modalElement = $modal.$element = modalLinker(scope, function(clonedElement, scope) {});\n\n          // Set the initial positioning.\n          modalElement.css({display: 'block'}).addClass(options.placement);\n\n          // Options: animation\n          if(options.animation) {\n            if(options.backdrop) {\n              backdropElement.addClass(options.backdropAnimation);\n            }\n            modalElement.addClass(options.animation);\n          }\n\n          if(options.backdrop) {\n            $animate.enter(backdropElement, bodyElement, null, function() {});\n          }\n          $animate.enter(modalElement, parent, after, function() {\n            scope.$emit(options.prefixEvent + '.show', $modal);\n          });\n          scope.$isShown = true;\n          scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n          // Focus once the enter-animation has started\n          // Weird PhantomJS bug hack\n          var el = modalElement[0];\n          requestAnimationFrame(function() {\n            el.focus();\n          });\n\n          bodyElement.addClass(options.prefixClass + '-open');\n          if(options.animation) {\n            bodyElement.addClass(options.prefixClass + '-with-' + options.animation);\n          }\n\n          // Bind events\n          if(options.backdrop) {\n            modalElement.on('click', hideOnBackdropClick);\n            backdropElement.on('click', hideOnBackdropClick);\n          }\n          if(options.keyboard) {\n            modalElement.on('keyup', $modal.$onKeyUp);\n          }\n        };\n\n        $modal.hide = function() {\n\n          scope.$emit(options.prefixEvent + '.hide.before', $modal);\n          $animate.leave(modalElement, function() {\n            scope.$emit(options.prefixEvent + '.hide', $modal);\n            bodyElement.removeClass(options.prefixClass + '-open');\n            if(options.animation) {\n              bodyElement.removeClass(options.prefixClass + '-with-' + options.animation);\n            }\n          });\n          if(options.backdrop) {\n            $animate.leave(backdropElement, function() {});\n          }\n          scope.$isShown = false;\n          scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n\n          // Unbind events\n          if(options.backdrop) {\n            modalElement.off('click', hideOnBackdropClick);\n            backdropElement.off('click', hideOnBackdropClick);\n          }\n          if(options.keyboard) {\n            modalElement.off('keyup', $modal.$onKeyUp);\n          }\n        };\n\n        $modal.toggle = function() {\n\n          scope.$isShown ? $modal.hide() : $modal.show();\n\n        };\n\n        $modal.focus = function() {\n          modalElement[0].focus();\n        };\n\n        // Protected methods\n\n        $modal.$onKeyUp = function(evt) {\n\n          if (evt.which === 27 && scope.$isShown) {\n            $modal.hide();\n            evt.stopPropagation();\n          }\n\n        };\n\n        // Private methods\n\n        function hideOnBackdropClick(evt) {\n          if(evt.target !== evt.currentTarget) return;\n          options.backdrop === 'static' ? $modal.focus() : $modal.hide();\n        }\n\n        return $modal;\n\n      }\n\n      // Helper functions\n\n      function findElement(query, element) {\n        return angular.element((element || document).querySelectorAll(query));\n      }\n\n      function fetchTemplate(template) {\n        return $q.when($templateCache.get(template) || $http.get(template))\n        .then(function(res) {\n          if(angular.isObject(res)) {\n            $templateCache.put(template, res.data);\n            return res.data;\n          }\n          return res;\n        });\n      }\n\n      return ModalFactory;\n\n    };\n\n  })\n\n  .directive('bsModal', function($window, $sce, $modal) {\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr, transclusion) {\n\n        // Directive options\n        var options = {scope: scope, element: element, show: false};\n        angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Support scope as data-attrs\n        angular.forEach(['title', 'content'], function(key) {\n          attr[key] && attr.$observe(key, function(newValue, oldValue) {\n            scope[key] = $sce.trustAsHtml(newValue);\n          });\n        });\n\n        // Support scope as an object\n        attr.bsModal && scope.$watch(attr.bsModal, function(newValue, oldValue) {\n          if(angular.isObject(newValue)) {\n            angular.extend(scope, newValue);\n          } else {\n            scope.content = newValue;\n          }\n        }, true);\n\n        // Initialize modal\n        var modal = $modal(options);\n\n        // Trigger\n        element.on(attr.trigger || 'click', modal.toggle);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (modal) modal.destroy();\n          options = null;\n          modal = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.navbar', [])\n\n  .provider('$navbar', function() {\n\n    var defaults = this.defaults = {\n      activeClass: 'active',\n      routeAttr: 'data-match-route',\n      strict: false\n    };\n\n    this.$get = function() {\n      return {defaults: defaults};\n    };\n\n  })\n\n  .directive('bsNavbar', function($window, $location, $navbar) {\n\n    var defaults = $navbar.defaults;\n\n    return {\n      restrict: 'A',\n      link: function postLink(scope, element, attr, controller) {\n\n        // Directive options\n        var options = angular.copy(defaults);\n        angular.forEach(Object.keys(defaults), function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Watch for the $location\n        scope.$watch(function() {\n\n          return $location.path();\n\n        }, function(newValue, oldValue) {\n\n          var liElements = element[0].querySelectorAll('li[' + options.routeAttr + ']');\n\n          angular.forEach(liElements, function(li) {\n\n            var liElement = angular.element(li);\n            var pattern = liElement.attr(options.routeAttr).replace('/', '\\\\/');\n            if(options.strict) {\n              pattern = '^' + pattern + '$';\n            }\n            var regexp = new RegExp(pattern, ['i']);\n\n            if(regexp.test(newValue)) {\n              liElement.addClass(options.activeClass);\n            } else {\n              liElement.removeClass(options.activeClass);\n            }\n\n          });\n\n        });\n\n      }\n\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip'])\n\n  .provider('$popover', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      customClass: '',\n      container: false,\n      target: false,\n      placement: 'right',\n      template: 'popover/popover.tpl.html',\n      contentTemplate: false,\n      trigger: 'click',\n      keyboard: true,\n      html: false,\n      title: '',\n      content: '',\n      delay: 0\n    };\n\n    this.$get = function($tooltip) {\n\n      function PopoverFactory(element, config) {\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n\n        var $popover = $tooltip(element, options);\n\n        // Support scope as string options [/*title, */content]\n        if(options.content) {\n          $popover.$scope.content = options.content;\n        }\n\n        return $popover;\n\n      }\n\n      return PopoverFactory;\n\n    };\n\n  })\n\n  .directive('bsPopover', function($window, $sce, $popover) {\n\n    var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr) {\n\n        // Directive options\n        var options = {scope: scope};\n        angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'customClass'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Support scope as data-attrs\n        angular.forEach(['title', 'content'], function(key) {\n          attr[key] && attr.$observe(key, function(newValue, oldValue) {\n            scope[key] = $sce.trustAsHtml(newValue);\n            angular.isDefined(oldValue) && requestAnimationFrame(function() {\n              popover && popover.$applyPlacement();\n            });\n          });\n        });\n\n        // Support scope as an object\n        attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) {\n          if(angular.isObject(newValue)) {\n            angular.extend(scope, newValue);\n          } else {\n            scope.content = newValue;\n          }\n          angular.isDefined(oldValue) && requestAnimationFrame(function() {\n            popover && popover.$applyPlacement();\n          });\n        }, true);\n\n        // Visibility binding support\n        attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n          if(!popover || !angular.isDefined(newValue)) return;\n          if(angular.isString(newValue)) newValue = !!newValue.match(',?(popover),?');\n          newValue === true ? popover.show() : popover.hide();\n        });\n\n        // Initialize popover\n        var popover = $popover(element, options);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (popover) popover.destroy();\n          options = null;\n          popover = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.scrollspy', ['mgcrea.ngStrap.helpers.debounce', 'mgcrea.ngStrap.helpers.dimensions'])\n\n  .provider('$scrollspy', function() {\n\n    // Pool of registered spies\n    var spies = this.$$spies = {};\n\n    var defaults = this.defaults = {\n      debounce: 150,\n      throttle: 100,\n      offset: 100\n    };\n\n    this.$get = function($window, $document, $rootScope, dimensions, debounce, throttle) {\n\n      var windowEl = angular.element($window);\n      var docEl = angular.element($document.prop('documentElement'));\n      var bodyEl = angular.element($window.document.body);\n\n      // Helper functions\n\n      function nodeName(element, name) {\n        return element[0].nodeName && element[0].nodeName.toLowerCase() === name.toLowerCase();\n      }\n\n      function ScrollSpyFactory(config) {\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n        if(!options.element) options.element = bodyEl;\n        var isWindowSpy = nodeName(options.element, 'body');\n        var scrollEl = isWindowSpy ? windowEl : options.element;\n        var scrollId = isWindowSpy ? 'window' : options.id;\n\n        // Use existing spy\n        if(spies[scrollId]) {\n          spies[scrollId].$$count++;\n          return spies[scrollId];\n        }\n\n        var $scrollspy = {};\n\n        // Private vars\n        var unbindViewContentLoaded, unbindIncludeContentLoaded;\n        var trackedElements = $scrollspy.$trackedElements = [];\n        var sortedElements = [];\n        var activeTarget;\n        var debouncedCheckPosition;\n        var throttledCheckPosition;\n        var debouncedCheckOffsets;\n        var viewportHeight;\n        var scrollTop;\n\n        $scrollspy.init = function() {\n\n          // Setup internal ref counter\n          this.$$count = 1;\n\n          // Bind events\n          debouncedCheckPosition = debounce(this.checkPosition, options.debounce);\n          throttledCheckPosition = throttle(this.checkPosition, options.throttle);\n          scrollEl.on('click', this.checkPositionWithEventLoop);\n          windowEl.on('resize', debouncedCheckPosition);\n          scrollEl.on('scroll', throttledCheckPosition);\n\n          debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce);\n          unbindViewContentLoaded = $rootScope.$on('$viewContentLoaded', debouncedCheckOffsets);\n          unbindIncludeContentLoaded = $rootScope.$on('$includeContentLoaded', debouncedCheckOffsets);\n          debouncedCheckOffsets();\n\n          // Register spy for reuse\n          if(scrollId) {\n            spies[scrollId] = $scrollspy;\n          }\n\n        };\n\n        $scrollspy.destroy = function() {\n\n          // Check internal ref counter\n          this.$$count--;\n          if(this.$$count > 0) {\n            return;\n          }\n\n          // Unbind events\n          scrollEl.off('click', this.checkPositionWithEventLoop);\n          windowEl.off('resize', debouncedCheckPosition);\n          scrollEl.off('scroll', debouncedCheckPosition);\n          unbindViewContentLoaded();\n          unbindIncludeContentLoaded();\n          if (scrollId) {\n            delete spies[scrollId];\n          }\n        };\n\n        $scrollspy.checkPosition = function() {\n\n          // Not ready yet\n          if(!sortedElements.length) return;\n\n          // Calculate the scroll position\n          scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop('scrollTop')) || 0;\n\n          // Calculate the viewport height for use by the components\n          viewportHeight = Math.max($window.innerHeight, docEl.prop('clientHeight'));\n\n          // Activate first element if scroll is smaller\n          if(scrollTop < sortedElements[0].offsetTop && activeTarget !== sortedElements[0].target) {\n            return $scrollspy.$activateElement(sortedElements[0]);\n          }\n\n          // Activate proper element\n          for (var i = sortedElements.length; i--;) {\n            if(angular.isUndefined(sortedElements[i].offsetTop) || sortedElements[i].offsetTop === null) continue;\n            if(activeTarget === sortedElements[i].target) continue;\n            if(scrollTop < sortedElements[i].offsetTop) continue;\n            if(sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop) continue;\n            return $scrollspy.$activateElement(sortedElements[i]);\n          }\n\n        };\n\n        $scrollspy.checkPositionWithEventLoop = function() {\n          setTimeout(this.checkPosition, 1);\n        };\n\n        // Protected methods\n\n        $scrollspy.$activateElement = function(element) {\n          if(activeTarget) {\n            var activeElement = $scrollspy.$getTrackedElement(activeTarget);\n            if(activeElement) {\n              activeElement.source.removeClass('active');\n              if(nodeName(activeElement.source, 'li') && nodeName(activeElement.source.parent().parent(), 'li')) {\n                activeElement.source.parent().parent().removeClass('active');\n              }\n            }\n          }\n          activeTarget = element.target;\n          element.source.addClass('active');\n          if(nodeName(element.source, 'li') && nodeName(element.source.parent().parent(), 'li')) {\n            element.source.parent().parent().addClass('active');\n          }\n        };\n\n        $scrollspy.$getTrackedElement = function(target) {\n          return trackedElements.filter(function(obj) {\n            return obj.target === target;\n          })[0];\n        };\n\n        // Track offsets behavior\n\n        $scrollspy.checkOffsets = function() {\n\n          angular.forEach(trackedElements, function(trackedElement) {\n            var targetElement = document.querySelector(trackedElement.target);\n            trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null;\n            if(options.offset && trackedElement.offsetTop !== null) trackedElement.offsetTop -= options.offset * 1;\n          });\n\n          sortedElements = trackedElements\n          .filter(function(el) {\n            return el.offsetTop !== null;\n          })\n          .sort(function(a, b) {\n            return a.offsetTop - b.offsetTop;\n          });\n\n          debouncedCheckPosition();\n\n        };\n\n        $scrollspy.trackElement = function(target, source) {\n          trackedElements.push({target: target, source: source});\n        };\n\n        $scrollspy.untrackElement = function(target, source) {\n          var toDelete;\n          for (var i = trackedElements.length; i--;) {\n            if(trackedElements[i].target === target && trackedElements[i].source === source) {\n              toDelete = i;\n              break;\n            }\n          }\n          trackedElements = trackedElements.splice(toDelete, 1);\n        };\n\n        $scrollspy.activate = function(i) {\n          trackedElements[i].addClass('active');\n        };\n\n        // Initialize plugin\n\n        $scrollspy.init();\n        return $scrollspy;\n\n      }\n\n      return ScrollSpyFactory;\n\n    };\n\n  })\n\n  .directive('bsScrollspy', function($rootScope, debounce, dimensions, $scrollspy) {\n\n    return {\n      restrict: 'EAC',\n      link: function postLink(scope, element, attr) {\n\n        var options = {scope: scope};\n        angular.forEach(['offset', 'target'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        var scrollspy = $scrollspy(options);\n        scrollspy.trackElement(options.target, element);\n\n        scope.$on('$destroy', function() {\n          if (scrollspy) {\n            scrollspy.untrackElement(options.target, element);\n            scrollspy.destroy();\n          }\n          options = null;\n          scrollspy = null;\n        });\n\n      }\n    };\n\n  })\n\n\n  .directive('bsScrollspyList', function($rootScope, debounce, dimensions, $scrollspy) {\n\n    return {\n      restrict: 'A',\n      compile: function postLink(element, attr) {\n        var children = element[0].querySelectorAll('li > a[href]');\n        angular.forEach(children, function(child) {\n          var childEl = angular.element(child);\n          childEl.parent().attr('bs-scrollspy', '').attr('data-target', childEl.attr('href'));\n        });\n      }\n\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.select', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n  .provider('$select', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'select',\n      prefixEvent: '$select',\n      placement: 'bottom-left',\n      template: 'select/select.tpl.html',\n      trigger: 'focus',\n      container: false,\n      keyboard: true,\n      html: false,\n      delay: 0,\n      multiple: false,\n      allNoneButtons: false,\n      sort: true,\n      caretHtml: '&nbsp;<span class=\"caret\"></span>',\n      placeholder: 'Choose among the following...',\n      maxLength: 3,\n      maxLengthHtml: 'selected',\n      iconCheckmark: 'glyphicon glyphicon-ok'\n    };\n\n    this.$get = function($window, $document, $rootScope, $tooltip) {\n\n      var bodyEl = angular.element($window.document.body);\n      var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n      var isTouch = ('createTouch' in $window.document) && isNative;\n\n      function SelectFactory(element, controller, config) {\n\n        var $select = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n\n        $select = $tooltip(element, options);\n        var scope = $select.$scope;\n\n        scope.$matches = [];\n        scope.$activeIndex = 0;\n        scope.$isMultiple = options.multiple;\n        scope.$showAllNoneButtons = options.allNoneButtons && options.multiple;\n        scope.$iconCheckmark = options.iconCheckmark;\n\n        scope.$activate = function(index) {\n          scope.$$postDigest(function() {\n            $select.activate(index);\n          });\n        };\n\n        scope.$select = function(index, evt) {\n          scope.$$postDigest(function() {\n            $select.select(index);\n          });\n        };\n\n        scope.$isVisible = function() {\n          return $select.$isVisible();\n        };\n\n        scope.$isActive = function(index) {\n          return $select.$isActive(index);\n        };\n\n        scope.$selectAll = function () {\n          for (var i = 0; i < scope.$matches.length; i++) {\n            if (!scope.$isActive(i)) {\n              scope.$select(i);\n            }\n          }\n        };\n\n        scope.$selectNone = function () {\n          for (var i = 0; i < scope.$matches.length; i++) {\n            if (scope.$isActive(i)) {\n              scope.$select(i);\n            }\n          }\n        };\n\n        // Public methods\n\n        $select.update = function(matches) {\n          scope.$matches = matches;\n          $select.$updateActiveIndex();\n        };\n\n        $select.activate = function(index) {\n          if(options.multiple) {\n            scope.$activeIndex.sort();\n            $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);\n            if(options.sort) scope.$activeIndex.sort();\n          } else {\n            scope.$activeIndex = index;\n          }\n          return scope.$activeIndex;\n        };\n\n        $select.select = function(index) {\n          var value = scope.$matches[index].value;\n          scope.$apply(function() {\n            $select.activate(index);\n            if(options.multiple) {\n              controller.$setViewValue(scope.$activeIndex.map(function(index) {\n                return scope.$matches[index].value;\n              }));\n            } else {\n              controller.$setViewValue(value);\n              // Hide if single select\n              $select.hide();\n            }\n          });\n          // Emit event\n          scope.$emit(options.prefixEvent + '.select', value, index);\n        };\n\n        // Protected methods\n\n        $select.$updateActiveIndex = function() {\n          if(controller.$modelValue && scope.$matches.length) {\n            if(options.multiple && angular.isArray(controller.$modelValue)) {\n              scope.$activeIndex = controller.$modelValue.map(function(value) {\n                return $select.$getIndex(value);\n              });\n            } else {\n              scope.$activeIndex = $select.$getIndex(controller.$modelValue);\n            }\n          } else if(scope.$activeIndex >= scope.$matches.length) {\n            scope.$activeIndex = options.multiple ? [] : 0;\n          }\n        };\n\n        $select.$isVisible = function() {\n          if(!options.minLength || !controller) {\n            return scope.$matches.length;\n          }\n          // minLength support\n          return scope.$matches.length && controller.$viewValue.length >= options.minLength;\n        };\n\n        $select.$isActive = function(index) {\n          if(options.multiple) {\n            return scope.$activeIndex.indexOf(index) !== -1;\n          } else {\n            return scope.$activeIndex === index;\n          }\n        };\n\n        $select.$getIndex = function(value) {\n          var l = scope.$matches.length, i = l;\n          if(!l) return;\n          for(i = l; i--;) {\n            if(scope.$matches[i].value === value) break;\n          }\n          if(i < 0) return;\n          return i;\n        };\n\n        $select.$onMouseDown = function(evt) {\n          // Prevent blur on mousedown on .dropdown-menu\n          evt.preventDefault();\n          evt.stopPropagation();\n          // Emulate click for mobile devices\n          if(isTouch) {\n            var targetEl = angular.element(evt.target);\n            targetEl.triggerHandler('click');\n          }\n        };\n\n        $select.$onKeyDown = function(evt) {\n          if (!/(9|13|38|40)/.test(evt.keyCode)) return;\n          evt.preventDefault();\n          evt.stopPropagation();\n\n          // Select with enter\n          if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) {\n            return $select.select(scope.$activeIndex);\n          }\n\n          // Navigate with keyboard\n          if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n          else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n          else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n          scope.$digest();\n        };\n\n        // Overrides\n\n        var _show = $select.show;\n        $select.show = function() {\n          _show();\n          if(options.multiple) {\n            $select.$element.addClass('select-multiple');\n          }\n          setTimeout(function() {\n            $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n            if(options.keyboard) {\n              element.on('keydown', $select.$onKeyDown);\n            }\n          });\n        };\n\n        var _hide = $select.hide;\n        $select.hide = function() {\n          $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n          if(options.keyboard) {\n            element.off('keydown', $select.$onKeyDown);\n          }\n          _hide(true);\n        };\n\n        return $select;\n\n      }\n\n      SelectFactory.defaults = defaults;\n      return SelectFactory;\n\n    };\n\n  })\n\n  .directive('bsSelect', function($window, $parse, $q, $select, $parseOptions) {\n\n    var defaults = $select.defaults;\n\n    return {\n      restrict: 'EAC',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        // Directive options\n        var options = {scope: scope};\n        angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'placeholder', 'multiple', 'allNoneButtons', 'maxLength', 'maxLengthHtml'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Add support for select markup\n        if(element[0].nodeName.toLowerCase() === 'select') {\n          var inputEl = element;\n          inputEl.css('display', 'none');\n          element = angular.element('<button type=\"button\" class=\"btn btn-default\"></button>');\n          inputEl.after(element);\n        }\n\n        // Build proper ngOptions\n        var parsedOptions = $parseOptions(attr.ngOptions);\n\n        // Initialize select\n        var select = $select(element, controller, options);\n\n        // Watch ngOptions values before filtering for changes\n        var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').trim();\n        scope.$watch(watchedOptions, function(newValue, oldValue) {\n          // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n          parsedOptions.valuesFn(scope, controller)\n          .then(function(values) {\n            select.update(values);\n            controller.$render();\n          });\n        }, true);\n\n        // Watch model for changes\n        scope.$watch(attr.ngModel, function(newValue, oldValue) {\n          // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);\n          select.$updateActiveIndex();\n          controller.$render();\n        }, true);\n\n        // Model rendering in view\n        controller.$render = function () {\n          // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n          var selected, index;\n          if(options.multiple && angular.isArray(controller.$modelValue)) {\n            selected = controller.$modelValue.map(function(value) {\n              index = select.$getIndex(value);\n              return angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n            }).filter(angular.isDefined);\n            if(selected.length > (options.maxLength || defaults.maxLength)) {\n              selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);\n            } else {\n              selected = selected.join(', ');\n            }\n          } else {\n            index = select.$getIndex(controller.$modelValue);\n            selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n          }\n          element.html((selected ? selected : attr.placeholder || defaults.placeholder) + defaults.caretHtml);\n        };\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (select) select.destroy();\n          options = null;\n          select = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.tab', [])\n\n  .provider('$tab', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      template: 'tab/tab.tpl.html',\n      navClass: 'nav-tabs',\n      activeClass: 'active'\n    };\n\n    var controller = this.controller = function($scope, $element, $attrs) {\n      var self = this;\n\n      // Attributes options\n      self.$options = angular.copy(defaults);\n      angular.forEach(['animation', 'navClass', 'activeClass'], function(key) {\n        if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];\n      });\n\n      // Publish options on scope\n      $scope.$navClass = self.$options.navClass;\n      $scope.$activeClass = self.$options.activeClass;\n\n      self.$panes = $scope.$panes = [];\n\n      self.$viewChangeListeners = [];\n\n      self.$push = function(pane) {\n        self.$panes.push(pane);\n      };\n\n      self.$panes.$active = 0;\n      self.$setActive = $scope.$setActive = function(value) {\n        self.$panes.$active = value;\n        self.$viewChangeListeners.forEach(function(fn) {\n          fn();\n        });\n      };\n\n    };\n\n    this.$get = function() {\n      var $tab = {};\n      $tab.defaults = defaults;\n      $tab.controller = controller;\n      return $tab;\n    };\n\n  })\n\n  .directive('bsTabs', function($window, $animate, $tab) {\n\n    var defaults = $tab.defaults;\n\n    return {\n      require: ['?ngModel', 'bsTabs'],\n      transclude: true,\n      scope: true,\n      controller: ['$scope', '$element', '$attrs', $tab.controller],\n      templateUrl: function(element, attr) {\n        return attr.template || defaults.template;\n      },\n      link: function postLink(scope, element, attrs, controllers) {\n\n        var ngModelCtrl = controllers[0];\n        var bsTabsCtrl = controllers[1];\n\n        if(ngModelCtrl) {\n\n          // Update the modelValue following\n          bsTabsCtrl.$viewChangeListeners.push(function() {\n            ngModelCtrl.$setViewValue(bsTabsCtrl.$panes.$active);\n          });\n\n          // modelValue -> $formatters -> viewValue\n          ngModelCtrl.$formatters.push(function(modelValue) {\n            // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n            bsTabsCtrl.$setActive(modelValue * 1);\n            return modelValue;\n          });\n\n        }\n\n      }\n    };\n\n  })\n\n  .directive('bsPane', function($window, $animate, $sce) {\n\n    return {\n      require: ['^?ngModel', '^bsTabs'],\n      scope: true,\n      link: function postLink(scope, element, attrs, controllers) {\n\n        var ngModelCtrl = controllers[0];\n        var bsTabsCtrl = controllers[1];\n\n        // Add base class\n        element.addClass('tab-pane');\n\n        // Observe title attribute for change\n        attrs.$observe('title', function(newValue, oldValue) {\n          scope.title = $sce.trustAsHtml(newValue);\n        });\n\n        // Add animation class\n        if(bsTabsCtrl.$options.animation) {\n          element.addClass(bsTabsCtrl.$options.animation);\n        }\n\n        // Push pane to parent bsTabs controller\n        bsTabsCtrl.$push(scope);\n\n        function render() {\n          var index = bsTabsCtrl.$panes.indexOf(scope);\n          var active = bsTabsCtrl.$panes.$active;\n          $animate[index === active ? 'addClass' : 'removeClass'](element, bsTabsCtrl.$options.activeClass);\n        }\n\n        bsTabsCtrl.$viewChangeListeners.push(function() {\n          render();\n        });\n        render();\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.timepicker', ['mgcrea.ngStrap.helpers.dateParser', 'mgcrea.ngStrap.tooltip'])\n\n  .provider('$timepicker', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'timepicker',\n      placement: 'bottom-left',\n      template: 'timepicker/timepicker.tpl.html',\n      trigger: 'focus',\n      container: false,\n      keyboard: true,\n      html: false,\n      delay: 0,\n      // lang: $locale.id,\n      useNative: true,\n      timeType: 'date',\n      timeFormat: 'shortTime',\n      modelTimeFormat: null,\n      autoclose: false,\n      minTime: -Infinity,\n      maxTime: +Infinity,\n      length: 5,\n      hourStep: 1,\n      minuteStep: 5,\n      iconUp: 'glyphicon glyphicon-chevron-up',\n      iconDown: 'glyphicon glyphicon-chevron-down',\n      arrowBehavior: 'pager'\n    };\n\n    this.$get = function($window, $document, $rootScope, $sce, $locale, dateFilter, $tooltip) {\n\n      var bodyEl = angular.element($window.document.body);\n      var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n      var isTouch = ('createTouch' in $window.document) && isNative;\n      if(!defaults.lang) defaults.lang = $locale.id;\n\n      function timepickerFactory(element, controller, config) {\n\n        var $timepicker = $tooltip(element, angular.extend({}, defaults, config));\n        var parentScope = config.scope;\n        var options = $timepicker.$options;\n        var scope = $timepicker.$scope;\n\n        // View vars\n\n        var selectedIndex = 0;\n        var startDate = controller.$dateValue || new Date();\n        var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()};\n\n        var format = $locale.DATETIME_FORMATS[options.timeFormat] || options.timeFormat;\n        var formats = /(h+)([:\\.])?(m+)[ ]?(a?)/i.exec(format).slice(1);\n        scope.$iconUp = options.iconUp;\n        scope.$iconDown = options.iconDown;\n\n        // Scope methods\n\n        scope.$select = function(date, index) {\n          $timepicker.select(date, index);\n        };\n        scope.$moveIndex = function(value, index) {\n          $timepicker.$moveIndex(value, index);\n        };\n        scope.$switchMeridian = function(date) {\n          $timepicker.switchMeridian(date);\n        };\n\n        // Public methods\n\n        $timepicker.update = function(date) {\n          // console.warn('$timepicker.update() newValue=%o', date);\n          if(angular.isDate(date) && !isNaN(date.getTime())) {\n            $timepicker.$date = date;\n            angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()});\n            $timepicker.$build();\n          } else if(!$timepicker.$isBuilt) {\n            $timepicker.$build();\n          }\n        };\n\n        $timepicker.select = function(date, index, keep) {\n          // console.warn('$timepicker.select', date, scope.$mode);\n          if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1);\n          if(!angular.isDate(date)) date = new Date(date);\n          if(index === 0) controller.$dateValue.setHours(date.getHours());\n          else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes());\n          controller.$setViewValue(controller.$dateValue);\n          controller.$render();\n          if(options.autoclose && !keep) {\n            $timepicker.hide(true);\n          }\n        };\n\n        $timepicker.switchMeridian = function(date) {\n          var hours = (date || controller.$dateValue).getHours();\n          controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);\n          controller.$setViewValue(controller.$dateValue);\n          controller.$render();\n        };\n\n        // Protected methods\n\n        $timepicker.$build = function() {\n          // console.warn('$timepicker.$build() viewDate=%o', viewDate);\n          var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);\n          var hours = [], hour;\n          for(i = 0; i < options.length; i++) {\n            hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);\n            hours.push({date: hour, label: dateFilter(hour, formats[0]), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)});\n          }\n          var minutes = [], minute;\n          for(i = 0; i < options.length; i++) {\n            minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);\n            minutes.push({date: minute, label: dateFilter(minute, formats[2]), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)});\n          }\n\n          var rows = [];\n          for(i = 0; i < options.length; i++) {\n            rows.push([hours[i], minutes[i]]);\n          }\n          scope.rows = rows;\n          scope.showAM = !!formats[3];\n          scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;\n          scope.timeSeparator = formats[1];\n          $timepicker.$isBuilt = true;\n        };\n\n        $timepicker.$isSelected = function(date, index) {\n          if(!$timepicker.$date) return false;\n          else if(index === 0) {\n            return date.getHours() === $timepicker.$date.getHours();\n          } else if(index === 1) {\n            return date.getMinutes() === $timepicker.$date.getMinutes();\n          }\n        };\n\n        $timepicker.$isDisabled = function(date, index) {\n          var selectedTime;\n          if(index === 0) {\n            selectedTime = date.getTime() + viewDate.minute * 6e4;\n          } else if(index === 1) {\n            selectedTime = date.getTime() + viewDate.hour * 36e5;\n          }\n          return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;\n        };\n\n        scope.$arrowAction = function (value, index) {\n          if (options.arrowBehavior === 'picker') {\n            $timepicker.$setTimeByStep(value,index);\n          } else {\n            $timepicker.$moveIndex(value,index);\n          }\n        };\n\n        $timepicker.$setTimeByStep = function(value, index) {\n          var newDate = new Date($timepicker.$date);\n          var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;\n          var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;\n          if (index === 0) {\n            newDate.setHours(hours - (parseInt(options.hourStep, 10) * value));\n          }\n          else {\n            newDate.setMinutes(minutes - (parseInt(options.minuteStep, 10) * value));\n          }\n          $timepicker.select(newDate, index, true);\n          parentScope.$digest();\n        };\n\n        $timepicker.$moveIndex = function(value, index) {\n          var targetDate;\n          if(index === 0) {\n            targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute);\n            angular.extend(viewDate, {hour: targetDate.getHours()});\n          } else if(index === 1) {\n            targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep));\n            angular.extend(viewDate, {minute: targetDate.getMinutes()});\n          }\n          $timepicker.$build();\n        };\n\n        $timepicker.$onMouseDown = function(evt) {\n          // Prevent blur on mousedown on .dropdown-menu\n          if(evt.target.nodeName.toLowerCase() !== 'input') evt.preventDefault();\n          evt.stopPropagation();\n          // Emulate click for mobile devices\n          if(isTouch) {\n            var targetEl = angular.element(evt.target);\n            if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n              targetEl = targetEl.parent();\n            }\n            targetEl.triggerHandler('click');\n          }\n        };\n\n        $timepicker.$onKeyDown = function(evt) {\n          if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n          evt.preventDefault();\n          evt.stopPropagation();\n\n          // Close on enter\n          if(evt.keyCode === 13) return $timepicker.hide(true);\n\n          // Navigate with keyboard\n          var newDate = new Date($timepicker.$date);\n          var hours = newDate.getHours(), hoursLength = dateFilter(newDate, 'h').length;\n          var minutes = newDate.getMinutes(), minutesLength = dateFilter(newDate, 'mm').length;\n          var lateralMove = /(37|39)/.test(evt.keyCode);\n          var count = 2 + !!formats[3] * 1;\n\n          // Navigate indexes (left, right)\n          if (lateralMove) {\n            if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;\n            else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;\n          }\n\n          // Update values (up, down)\n          var selectRange = [0, hoursLength];\n          if(selectedIndex === 0) {\n            if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10));\n            else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10));\n            selectRange = [0, hoursLength];\n          } else if(selectedIndex === 1) {\n            if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10));\n            else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10));\n            selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength];\n          } else if(selectedIndex === 2) {\n            if(!lateralMove) $timepicker.switchMeridian();\n            selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3];\n          }\n          $timepicker.select(newDate, selectedIndex, true);\n          createSelection(selectRange[0], selectRange[1]);\n          parentScope.$digest();\n        };\n\n        // Private\n\n        function createSelection(start, end) {\n          if(element[0].createTextRange) {\n            var selRange = element[0].createTextRange();\n            selRange.collapse(true);\n            selRange.moveStart('character', start);\n            selRange.moveEnd('character', end);\n            selRange.select();\n          } else if(element[0].setSelectionRange) {\n            element[0].setSelectionRange(start, end);\n          } else if(angular.isUndefined(element[0].selectionStart)) {\n            element[0].selectionStart = start;\n            element[0].selectionEnd = end;\n          }\n        }\n\n        function focusElement() {\n          element[0].focus();\n        }\n\n        // Overrides\n\n        var _init = $timepicker.init;\n        $timepicker.init = function() {\n          if(isNative && options.useNative) {\n            element.prop('type', 'time');\n            element.css('-webkit-appearance', 'textfield');\n            return;\n          } else if(isTouch) {\n            element.prop('type', 'text');\n            element.attr('readonly', 'true');\n            element.on('click', focusElement);\n          }\n          _init();\n        };\n\n        var _destroy = $timepicker.destroy;\n        $timepicker.destroy = function() {\n          if(isNative && options.useNative) {\n            element.off('click', focusElement);\n          }\n          _destroy();\n        };\n\n        var _show = $timepicker.show;\n        $timepicker.show = function() {\n          _show();\n          setTimeout(function() {\n            $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n            if(options.keyboard) {\n              element.on('keydown', $timepicker.$onKeyDown);\n            }\n          });\n        };\n\n        var _hide = $timepicker.hide;\n        $timepicker.hide = function(blur) {\n          $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n          if(options.keyboard) {\n            element.off('keydown', $timepicker.$onKeyDown);\n          }\n          _hide(blur);\n        };\n\n        return $timepicker;\n\n      }\n\n      timepickerFactory.defaults = defaults;\n      return timepickerFactory;\n\n    };\n\n  })\n\n\n  .directive('bsTimepicker', function($window, $parse, $q, $locale, dateFilter, $timepicker, $dateParser, $timeout) {\n\n    var defaults = $timepicker.defaults;\n    var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n    var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n    return {\n      restrict: 'EAC',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        // Directive options\n        var options = {scope: scope, controller: controller};\n        angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'timeType', 'timeFormat', 'modelTimeFormat', 'useNative', 'hourStep', 'minuteStep', 'length', 'arrowBehavior'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Visibility binding support\n        attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n          if(!timepicker || !angular.isDefined(newValue)) return;\n          if(angular.isString(newValue)) newValue = !!newValue.match(',?(timepicker),?');\n          newValue === true ? timepicker.show() : timepicker.hide();\n        });\n\n        // Initialize timepicker\n        if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = 'HH:mm';\n        var timepicker = $timepicker(element, controller, options);\n        options = timepicker.$options;\n\n        // Initialize parser\n        var dateParser = $dateParser({format: options.timeFormat, lang: options.lang});\n\n        // Observe attributes for changes\n        angular.forEach(['minTime', 'maxTime'], function(key) {\n          // console.warn('attr.$observe(%s)', key, attr[key]);\n          angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n            if(newValue === 'now') {\n              timepicker.$options[key] = new Date().setFullYear(1970, 0, 1);\n            } else if(angular.isString(newValue) && newValue.match(/^\".+\"$/)) {\n              timepicker.$options[key] = +new Date(newValue.substr(1, newValue.length - 2));\n            } else {\n              timepicker.$options[key] = dateParser.parse(newValue, new Date(1970, 0, 1, 0));\n            }\n            !isNaN(timepicker.$options[key]) && timepicker.$build();\n          });\n        });\n\n        // Watch model for changes\n        scope.$watch(attr.ngModel, function(newValue, oldValue) {\n          // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);\n          timepicker.update(controller.$dateValue);\n        }, true);\n\n        // viewValue -> $parsers -> modelValue\n        controller.$parsers.unshift(function(viewValue) {\n          // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n          // Null values should correctly reset the model value & validity\n          if(!viewValue) {\n            controller.$setValidity('date', true);\n            return;\n          }\n          var parsedTime = angular.isDate(viewValue) ? viewValue : dateParser.parse(viewValue, controller.$dateValue);\n          if(!parsedTime || isNaN(parsedTime.getTime())) {\n            controller.$setValidity('date', false);\n          } else {\n            var isValid = parsedTime.getTime() >= options.minTime && parsedTime.getTime() <= options.maxTime;\n            controller.$setValidity('date', isValid);\n            // Only update the model when we have a valid date\n            if(isValid) controller.$dateValue = parsedTime;\n          }\n          if(options.timeType === 'string') {\n            return dateFilter(parsedTime, options.modelTimeFormat || options.timeFormat);\n          } else if(options.timeType === 'number') {\n            return controller.$dateValue.getTime();\n          } else if(options.timeType === 'iso') {\n            return controller.$dateValue.toISOString();\n          } else {\n            return new Date(controller.$dateValue);\n          }\n        });\n\n        // modelValue -> $formatters -> viewValue\n        controller.$formatters.push(function(modelValue) {\n          // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n          var date;\n          if(angular.isUndefined(modelValue) || modelValue === null) {\n            date = NaN;\n          } else if(angular.isDate(modelValue)) {\n            date = modelValue;\n          } else if(options.timeType === 'string') {\n            date = dateParser.parse(modelValue, null, options.modelTimeFormat);\n          } else {\n            date = new Date(modelValue);\n          }\n          // Setup default value?\n          // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);\n          controller.$dateValue = date;\n          return controller.$dateValue;\n        });\n\n        // viewValue -> element\n        controller.$render = function() {\n          // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n          element.val(!controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : dateFilter(controller.$dateValue, options.timeFormat));\n        };\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (timepicker) timepicker.destroy();\n          options = null;\n          timepicker = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions'])\n\n  .provider('$tooltip', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      customClass: '',\n      prefixClass: 'tooltip',\n      prefixEvent: 'tooltip',\n      container: false,\n      target: false,\n      placement: 'top',\n      template: 'tooltip/tooltip.tpl.html',\n      contentTemplate: false,\n      trigger: 'hover focus',\n      keyboard: false,\n      html: false,\n      show: false,\n      title: '',\n      type: '',\n      delay: 0\n    };\n\n    this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, dimensions, $$rAF) {\n\n      var trim = String.prototype.trim;\n      var isTouch = 'createTouch' in $window.document;\n      var htmlReplaceRegExp = /ng-bind=\"/ig;\n\n      function TooltipFactory(element, config) {\n\n        var $tooltip = {};\n\n        // Common vars\n        var nodeName = element[0].nodeName.toLowerCase();\n        var options = $tooltip.$options = angular.extend({}, defaults, config);\n        $tooltip.$promise = fetchTemplate(options.template);\n        var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n        if(options.delay && angular.isString(options.delay)) {\n          options.delay = parseFloat(options.delay);\n        }\n\n        // Support scope as string options\n        if(options.title) {\n          $tooltip.$scope.title = options.title;\n        }\n\n        // Provide scope helpers\n        scope.$hide = function() {\n          scope.$$postDigest(function() {\n            $tooltip.hide();\n          });\n        };\n        scope.$show = function() {\n          scope.$$postDigest(function() {\n            $tooltip.show();\n          });\n        };\n        scope.$toggle = function() {\n          scope.$$postDigest(function() {\n            $tooltip.toggle();\n          });\n        };\n        $tooltip.$isShown = scope.$isShown = false;\n\n        // Private vars\n        var timeout, hoverState;\n\n        // Support contentTemplate option\n        if(options.contentTemplate) {\n          $tooltip.$promise = $tooltip.$promise.then(function(template) {\n            var templateEl = angular.element(template);\n            return fetchTemplate(options.contentTemplate)\n            .then(function(contentTemplate) {\n              var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]);\n              if(!contentEl.length) contentEl = findElement('[ng-bind=\"title\"]', templateEl[0]);\n              contentEl.removeAttr('ng-bind').html(contentTemplate);\n              return templateEl[0].outerHTML;\n            });\n          });\n        }\n\n        // Fetch, compile then initialize tooltip\n        var tipLinker, tipElement, tipTemplate, tipContainer;\n        $tooltip.$promise.then(function(template) {\n          if(angular.isObject(template)) template = template.data;\n          if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n          template = trim.apply(template);\n          tipTemplate = template;\n          tipLinker = $compile(template);\n          $tooltip.init();\n        });\n\n        $tooltip.init = function() {\n\n          // Options: delay\n          if (options.delay && angular.isNumber(options.delay)) {\n            options.delay = {\n              show: options.delay,\n              hide: options.delay\n            };\n          }\n\n          // Replace trigger on touch devices ?\n          // if(isTouch && options.trigger === defaults.trigger) {\n          //   options.trigger.replace(/hover/g, 'click');\n          // }\n\n          // Options : container\n          if(options.container === 'self') {\n            tipContainer = element;\n          } else if(angular.isElement(options.container)) {\n            tipContainer = options.container;\n          } else if(options.container) {\n            tipContainer = findElement(options.container);\n          }\n\n          // Options: trigger\n          var triggers = options.trigger.split(' ');\n          angular.forEach(triggers, function(trigger) {\n            if(trigger === 'click') {\n              element.on('click', $tooltip.toggle);\n            } else if(trigger !== 'manual') {\n              element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n              element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n              nodeName === 'button' && trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n            }\n          });\n\n          // Options: target\n          if(options.target) {\n            options.target = angular.isElement(options.target) ? options.target : findElement(options.target);\n          }\n\n          // Options: show\n          if(options.show) {\n            scope.$$postDigest(function() {\n              options.trigger === 'focus' ? element[0].focus() : $tooltip.show();\n            });\n          }\n\n        };\n\n        $tooltip.destroy = function() {\n\n          // Unbind events\n          var triggers = options.trigger.split(' ');\n          for (var i = triggers.length; i--;) {\n            var trigger = triggers[i];\n            if(trigger === 'click') {\n              element.off('click', $tooltip.toggle);\n            } else if(trigger !== 'manual') {\n              element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n              element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n              nodeName === 'button' && trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n            }\n          }\n\n          // Remove element\n          if(tipElement) {\n            tipElement.remove();\n            tipElement = null;\n          }\n\n          // Cancel pending callbacks\n          clearTimeout(timeout);\n\n          // Destroy scope\n          scope.$destroy();\n\n        };\n\n        $tooltip.enter = function() {\n\n          clearTimeout(timeout);\n          hoverState = 'in';\n          if (!options.delay || !options.delay.show) {\n            return $tooltip.show();\n          }\n\n          timeout = setTimeout(function() {\n            if (hoverState ==='in') $tooltip.show();\n          }, options.delay.show);\n\n        };\n\n        $tooltip.show = function() {\n\n          scope.$emit(options.prefixEvent + '.show.before', $tooltip);\n          var parent = options.container ? tipContainer : null;\n          var after = options.container ? null : element;\n\n          // Hide any existing tipElement\n          if(tipElement) tipElement.remove();\n          // Fetch a cloned element linked from template\n          tipElement = $tooltip.$element = tipLinker(scope, function(clonedElement, scope) {});\n\n          // Set the initial positioning.  Make the tooltip invisible\n          // so IE doesn't try to focus on it off screen.\n          tipElement.css({top: '-9999px', left: '-9999px', display: 'block', visibility: 'hidden'}).addClass(options.placement);\n\n          // Options: animation\n          if(options.animation) tipElement.addClass(options.animation);\n          // Options: type\n          if(options.type) tipElement.addClass(options.prefixClass + '-' + options.type);\n          // Options: custom classes\n          if(options.customClass) tipElement.addClass(options.customClass);\n\n          $animate.enter(tipElement, parent, after, function() {\n            scope.$emit(options.prefixEvent + '.show', $tooltip);\n          });\n          $tooltip.$isShown = scope.$isShown = true;\n          scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n          $$rAF(function () {\n            $tooltip.$applyPlacement();\n\n            // Once placed, make the tooltip visible\n            tipElement.css({visibility: 'visible'});\n          }); // var a = bodyEl.offsetWidth + 1; ?\n\n          // Bind events\n          if(options.keyboard) {\n            if(options.trigger !== 'focus') {\n              $tooltip.focus();\n              tipElement.on('keyup', $tooltip.$onKeyUp);\n            } else {\n              element.on('keyup', $tooltip.$onFocusKeyUp);\n            }\n          }\n\n        };\n\n        $tooltip.leave = function() {\n\n          clearTimeout(timeout);\n          hoverState = 'out';\n          if (!options.delay || !options.delay.hide) {\n            return $tooltip.hide();\n          }\n          timeout = setTimeout(function () {\n            if (hoverState === 'out') {\n              $tooltip.hide();\n            }\n          }, options.delay.hide);\n\n        };\n\n        $tooltip.hide = function(blur) {\n\n          if(!$tooltip.$isShown) return;\n          scope.$emit(options.prefixEvent + '.hide.before', $tooltip);\n\n          $animate.leave(tipElement, function() {\n            scope.$emit(options.prefixEvent + '.hide', $tooltip);\n\n            // Allow to blur the input when hidden, like when pressing enter key\n            if(blur && options.trigger === 'focus') {\n              return element[0].blur();\n            }\n          });\n\n          $tooltip.$isShown = scope.$isShown = false;\n          scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n\n          // Unbind events\n          if(options.keyboard && tipElement !== null) {\n            tipElement.off('keyup', $tooltip.$onKeyUp);\n          }\n\n        };\n\n        $tooltip.toggle = function() {\n          $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();\n        };\n\n        $tooltip.focus = function() {\n          tipElement[0].focus();\n        };\n\n        // Protected methods\n\n        $tooltip.$applyPlacement = function() {\n          if(!tipElement) return;\n\n          // Get the position of the tooltip element.\n          var elementPosition = getPosition();\n\n          // Get the height and width of the tooltip so we can center it.\n          var tipWidth = tipElement.prop('offsetWidth'),\n              tipHeight = tipElement.prop('offsetHeight');\n\n          // Get the tooltip's top and left coordinates to center it with this directive.\n          var tipPosition = getCalculatedOffset(options.placement, elementPosition, tipWidth, tipHeight);\n\n          // Now set the calculated positioning.\n          tipPosition.top += 'px';\n          tipPosition.left += 'px';\n          tipElement.css(tipPosition);\n\n        };\n\n        $tooltip.$onKeyUp = function(evt) {\n          if (evt.which === 27 && $tooltip.$isShown) {\n            $tooltip.hide();\n            evt.stopPropagation();\n          }\n        };\n\n        $tooltip.$onFocusKeyUp = function(evt) {\n          if (evt.which === 27) {\n            element[0].blur();\n            evt.stopPropagation();\n          }\n        };\n\n        $tooltip.$onFocusElementMouseDown = function(evt) {\n          evt.preventDefault();\n          evt.stopPropagation();\n          // Some browsers do not auto-focus buttons (eg. Safari)\n          $tooltip.$isShown ? element[0].blur() : element[0].focus();\n        };\n\n        // Private methods\n\n        function getPosition() {\n          if(options.container === 'body') {\n            return dimensions.offset(options.target[0] || element[0]);\n          } else {\n            return dimensions.position(options.target[0] || element[0]);\n          }\n        }\n\n        function getCalculatedOffset(placement, position, actualWidth, actualHeight) {\n          var offset;\n          var split = placement.split('-');\n\n          switch (split[0]) {\n          case 'right':\n            offset = {\n              top: position.top + position.height / 2 - actualHeight / 2,\n              left: position.left + position.width\n            };\n            break;\n          case 'bottom':\n            offset = {\n              top: position.top + position.height,\n              left: position.left + position.width / 2 - actualWidth / 2\n            };\n            break;\n          case 'left':\n            offset = {\n              top: position.top + position.height / 2 - actualHeight / 2,\n              left: position.left - actualWidth\n            };\n            break;\n          default:\n            offset = {\n              top: position.top - actualHeight,\n              left: position.left + position.width / 2 - actualWidth / 2\n            };\n            break;\n          }\n\n          if(!split[1]) {\n            return offset;\n          }\n\n          // Add support for corners @todo css\n          if(split[0] === 'top' || split[0] === 'bottom') {\n            switch (split[1]) {\n            case 'left':\n              offset.left = position.left;\n              break;\n            case 'right':\n              offset.left =  position.left + position.width - actualWidth;\n            }\n          } else if(split[0] === 'left' || split[0] === 'right') {\n            switch (split[1]) {\n            case 'top':\n              offset.top = position.top - actualHeight;\n              break;\n            case 'bottom':\n              offset.top = position.top + position.height;\n            }\n          }\n\n          return offset;\n        }\n\n        return $tooltip;\n\n      }\n\n      // Helper functions\n\n      function findElement(query, element) {\n        return angular.element((element || document).querySelectorAll(query));\n      }\n\n      function fetchTemplate(template) {\n        return $q.when($templateCache.get(template) || $http.get(template))\n        .then(function(res) {\n          if(angular.isObject(res)) {\n            $templateCache.put(template, res.data);\n            return res.data;\n          }\n          return res;\n        });\n      }\n\n      return TooltipFactory;\n\n    };\n\n  })\n\n  .directive('bsTooltip', function($window, $location, $sce, $tooltip, $$rAF) {\n\n    return {\n      restrict: 'EAC',\n      scope: true,\n      link: function postLink(scope, element, attr, transclusion) {\n\n        // Directive options\n        var options = {scope: scope};\n        angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'type', 'customClass'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Observe scope attributes for change\n        angular.forEach(['title'], function(key) {\n          attr.$observe(key, function(newValue, oldValue) {\n            scope[key] = $sce.trustAsHtml(newValue);\n            angular.isDefined(oldValue) && $$rAF(function() {\n              tooltip && tooltip.$applyPlacement();\n            });\n          });\n        });\n\n        // Support scope as an object\n        attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) {\n          if(angular.isObject(newValue)) {\n            angular.extend(scope, newValue);\n          } else {\n            scope.title = newValue;\n          }\n          angular.isDefined(oldValue) && $$rAF(function() {\n            tooltip && tooltip.$applyPlacement();\n          });\n        }, true);\n\n        // Visibility binding support\n        attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n          if(!tooltip || !angular.isDefined(newValue)) return;\n          if(angular.isString(newValue)) newValue = !!newValue.match(',?(tooltip),?');\n          newValue === true ? tooltip.show() : tooltip.hide();\n        });\n\n        // Initialize popover\n        var tooltip = $tooltip(element, options);\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if(tooltip) tooltip.destroy();\n          options = null;\n          tooltip = null;\n        });\n\n      }\n    };\n\n  });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.typeahead', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n  .provider('$typeahead', function() {\n\n    var defaults = this.defaults = {\n      animation: 'am-fade',\n      prefixClass: 'typeahead',\n      prefixEvent: '$typeahead',\n      placement: 'bottom-left',\n      template: 'typeahead/typeahead.tpl.html',\n      trigger: 'focus',\n      container: false,\n      keyboard: true,\n      html: false,\n      delay: 0,\n      minLength: 1,\n      filter: 'filter',\n      limit: 6\n    };\n\n    this.$get = function($window, $rootScope, $tooltip) {\n\n      var bodyEl = angular.element($window.document.body);\n\n      function TypeaheadFactory(element, controller, config) {\n\n        var $typeahead = {};\n\n        // Common vars\n        var options = angular.extend({}, defaults, config);\n\n        $typeahead = $tooltip(element, options);\n        var parentScope = config.scope;\n        var scope = $typeahead.$scope;\n\n        scope.$resetMatches = function(){\n          scope.$matches = [];\n          scope.$activeIndex = 0;\n        };\n        scope.$resetMatches();\n\n        scope.$activate = function(index) {\n          scope.$$postDigest(function() {\n            $typeahead.activate(index);\n          });\n        };\n\n        scope.$select = function(index, evt) {\n          scope.$$postDigest(function() {\n            $typeahead.select(index);\n          });\n        };\n\n        scope.$isVisible = function() {\n          return $typeahead.$isVisible();\n        };\n\n        // Public methods\n\n        $typeahead.update = function(matches) {\n          scope.$matches = matches;\n          if(scope.$activeIndex >= matches.length) {\n            scope.$activeIndex = 0;\n          }\n        };\n\n        $typeahead.activate = function(index) {\n          scope.$activeIndex = index;\n        };\n\n        $typeahead.select = function(index) {\n          var value = scope.$matches[index].value;\n          controller.$setViewValue(value);\n          controller.$render();\n          scope.$resetMatches();\n          if(parentScope) parentScope.$digest();\n          // Emit event\n          scope.$emit(options.prefixEvent + '.select', value, index);\n        };\n\n        // Protected methods\n\n        $typeahead.$isVisible = function() {\n          if(!options.minLength || !controller) {\n            return !!scope.$matches.length;\n          }\n          // minLength support\n          return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;\n        };\n\n        $typeahead.$getIndex = function(value) {\n          var l = scope.$matches.length, i = l;\n          if(!l) return;\n          for(i = l; i--;) {\n            if(scope.$matches[i].value === value) break;\n          }\n          if(i < 0) return;\n          return i;\n        };\n\n        $typeahead.$onMouseDown = function(evt) {\n          // Prevent blur on mousedown\n          evt.preventDefault();\n          evt.stopPropagation();\n        };\n\n        $typeahead.$onKeyDown = function(evt) {\n          if(!/(38|40|13)/.test(evt.keyCode)) return;\n\n          // Let ngSubmit pass if the typeahead tip is hidden\n          if($typeahead.$isVisible()) {\n            evt.preventDefault();\n            evt.stopPropagation();\n          }\n\n          // Select with enter\n          if(evt.keyCode === 13 && scope.$matches.length) {\n            $typeahead.select(scope.$activeIndex);\n          }\n\n          // Navigate with keyboard\n          else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n          else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n          else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n          scope.$digest();\n        };\n\n        // Overrides\n\n        var show = $typeahead.show;\n        $typeahead.show = function() {\n          show();\n          setTimeout(function() {\n            $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);\n            if(options.keyboard) {\n              element.on('keydown', $typeahead.$onKeyDown);\n            }\n          });\n        };\n\n        var hide = $typeahead.hide;\n        $typeahead.hide = function() {\n          $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);\n          if(options.keyboard) {\n            element.off('keydown', $typeahead.$onKeyDown);\n          }\n          hide();\n        };\n\n        return $typeahead;\n\n      }\n\n      TypeaheadFactory.defaults = defaults;\n      return TypeaheadFactory;\n\n    };\n\n  })\n\n  .directive('bsTypeahead', function($window, $parse, $q, $typeahead, $parseOptions) {\n\n    var defaults = $typeahead.defaults;\n\n    return {\n      restrict: 'EAC',\n      require: 'ngModel',\n      link: function postLink(scope, element, attr, controller) {\n\n        // Directive options\n        var options = {scope: scope};\n        angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'filter', 'limit', 'minLength', 'watchOptions', 'selectMode'], function(key) {\n          if(angular.isDefined(attr[key])) options[key] = attr[key];\n        });\n\n        // Build proper ngOptions\n        var filter = options.filter || defaults.filter;\n        var limit = options.limit || defaults.limit;\n        var ngOptions = attr.ngOptions;\n        if(filter) ngOptions += ' | ' + filter + ':$viewValue';\n        if(limit) ngOptions += ' | limitTo:' + limit;\n        var parsedOptions = $parseOptions(ngOptions);\n\n        // Initialize typeahead\n        var typeahead = $typeahead(element, controller, options);\n\n        // Watch options on demand\n        if(options.watchOptions) {\n          // Watch ngOptions values before filtering for changes, drop function calls\n          var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').replace(/\\(.*\\)/g, '').trim();\n          scope.$watch(watchedOptions, function (newValue, oldValue) {\n            // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n            parsedOptions.valuesFn(scope, controller).then(function (values) {\n              typeahead.update(values);\n              controller.$render();\n            });\n          }, true);\n        }\n\n        // Watch model for changes\n        scope.$watch(attr.ngModel, function(newValue, oldValue) {\n          // console.warn('$watch', element.attr('ng-model'), newValue);\n          scope.$modelValue = newValue; // Publish modelValue on scope for custom templates\n          parsedOptions.valuesFn(scope, controller)\n          .then(function(values) {\n            // Prevent input with no future prospect if selectMode is truthy\n            // @TODO test selectMode\n            if(options.selectMode && !values.length && newValue.length > 0) {\n              controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1));\n              return;\n            }\n            if(values.length > limit) values = values.slice(0, limit);\n            var isVisible = typeahead.$isVisible();\n            isVisible && typeahead.update(values);\n            // Do not re-queue an update if a correct value has been selected\n            if(values.length === 1 && values[0].value === newValue) return;\n            !isVisible && typeahead.update(values);\n            // Queue a new rendering that will leverage collection loading\n            controller.$render();\n          });\n        });\n\n        // Model rendering in view\n        controller.$render = function () {\n          // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n          if(controller.$isEmpty(controller.$viewValue)) return element.val('');\n          var index = typeahead.$getIndex(controller.$modelValue);\n          var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue;\n          selected = angular.isObject(selected) ? selected.label : selected;\n          element.val(selected.replace(/<(?:.|\\n)*?>/gm, '').trim());\n        };\n\n        // Garbage collection\n        scope.$on('$destroy', function() {\n          if (typeahead) typeahead.destroy();\n          options = null;\n          typeahead = null;\n        });\n\n      }\n    };\n\n  });\n"],"sourceRoot":"/source/"}