{"version":3,"sources":["webpack://aspAndWebpack/./node_modules/angular-ui-bootstrap/index.js","webpack://aspAndWebpack/./node_modules/angular-ui-bootstrap/dist/ui-bootstrap-tpls.js"],"names":["module","exports","angular","directive","$animate","$q","$parse","$injector","$animateCss","has","get","link","scope","element","attrs","expandingExpr","expanding","expandedExpr","expanded","collapsingExpr","collapsing","collapsedExpr","collapsed","expandDone","removeClass","addClass","css","height","collapseDone","$eval","uibCollapse","attr","$watch","shouldCollapse","hasClass","resolve","then","scrollHeight","to","start","collapse","easing","constant","closeOthers","controller","$scope","$attrs","accordionConfig","this","groups","openGroup","isDefined","forEach","group","isOpen","addGroup","groupScope","that","push","$on","event","removeGroup","index","indexOf","splice","controllerAs","transclude","templateUrl","require","replace","heading","panelClass","isDisabled","setHeading","accordionCtrl","openClass","value","toggleClass","toggleOpen","$event","which","id","$id","Math","floor","random","headingId","panelId","template","accordionGroupCtrl","noop","uibAccordionTransclude","elem","querySelector","html","append","$interpolate","$timeout","closeable","close","dismissOnTimeout","$parent","parseInt","type","activeClass","toggleEvent","buttonConfig","ctrls","buttonsCtrl","ngModelCtrl","uncheckableExpr","uibUncheckable","find","display","$render","equals","$modelValue","uibBtnRadio","on","disabled","isActive","uncheckable","$apply","$setViewValue","$set","undefined","getTrueValue","getCheckboxValue","btnCheckboxTrue","attribute","defaultValue","btnCheckboxFalse","$element","$interval","currentInterval","isPlaying","self","slides","currentIndex","active","bufferedTransitions","destroyed","clearBufferedTransitions","length","shift","setActive","i","slide","findSlideIndex","resetTimer","cancel","restartTimer","interval","isNaN","timerFn","next","pause","addSlide","sort","a","b","isNumber","$currentTransition","select","play","getCurrentIndex","newIndex","noWrap","prev","removeSlide","bufferedIndex","nextSlide","direction","nextIndex","goNext","extend","enabled","data","currentIdx","phase","off","pop","nextDirection","indexOfSlide","isPrevDisabled","isNextDisabled","noPause","noTransition","$watchCollection","actual","carouselCtrl","animation","className","callback","beforeAddClass","done","directionClass","removeClassFn","bind","beforeRemoveClass","service","$log","$locale","dateFilter","orderByFilter","localeId","formatCodeToRegex","SPECIAL_CHARACTERS_REGEXP","createParser","format","func","map","regex","split","quoteIndex","inLiteral","join","key","n","apply","matcher","RegExp","toInt","str","timezoneToOffset","timezone","fallback","requestedTimezoneOffset","Date","parse","addDateMinutes","date","minutes","getTime","setMinutes","getMinutes","convertTimezoneToLocal","reverse","dateTimezoneOffset","getTimezoneOffset","init","parsers","formatters","year","formatter","_date","setFullYear","abs","getFullYear","month","getMonth","test","DATETIME_FORMATS","MONTH","SHORTMONTH","getDate","DAY","SHORTDAY","hours","milliseconds","seconds","AMPMS","matches","match","sign","ERANAMES","ERAS","filter","isDate","_format","reduce","mapper","isString","endStr","call","input","baseDate","parser","results","tzOffset","fields","dt","getHours","getSeconds","getMilliseconds","warn","datesetter","prototype","setUTCFullYear","timesetter","setUTCHours","setHours","isValid","toTimezone","fromTimezone","ON_REGEXP","IS_REGEXP","restrict","compile","tElement","tAttrs","linkedScopes","instances","expToData","onExpMatches","uibIsClass","onExp","exps","exp","k","clazz","compareWithExp","watchFn","compareWithVal","newActivated","some","instance","lastActivated","watcher","addForExp","removeScope","e","removedScope","targetScope","newWatchScope","datepickerMode","formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","maxDate","maxMode","minDate","minMode","ngModelOptions","shortcutPropagation","showWeeks","yearColumns","yearRows","datepickerConfig","$datepickerLiteralWarning","$datepickerSuppressError","dateParser","watchListeners","datepickerOptions","modes","startingDay","FIRSTDAYOFWEEK","refreshView","uniqueId","ngDisabled","dateObject","compare","activeDate","activeDateId","uid","ngModelCtrl_","$options","initDate","$isEmpty","$invalid","render","$viewValue","error","selectedDt","_refreshView","activeDt","$setValidity","createDateObject","model","today","time","label","selected","past","current","future","customClass","dateDisabled","mode","arr","size","arrays","setMode","$emit","$broadcast","move","step","years","months","toggleMode","keys","13","32","33","34","35","36","37","38","39","40","focus","keydown","evt","shiftKey","altKey","preventDefault","stopPropagation","ctrlKey","handleKeyDown","DAYS_IN_MONTH","getDaysInMonth","getISO8601WeekNumber","checkDate","setDate","getDay","setMonth","round","ctrl","getDates","startDate","dates","Array","firstDayOfMonth","difference","numDisplayedFromPreviousMonth","firstDate","days","secondary","labels","j","abbr","full","title","rows","weekNumbers","thursdayIndex","numWeeks","curWeek","date1","date2","_date1","_date2","min","columns","range","getStartingYear","yearpickerInit","datepickerCtrl","factory","$document","$window","SCROLLBAR_WIDTH","BODY_SCROLLBAR_WIDTH","OVERFLOW_REGEX","normal","hidden","PLACEMENT_REGEX","auto","primary","vertical","BODY_REGEX","getRawNode","nodeName","parseStyle","parseFloat","isFinite","offsetParent","el","documentElement","getComputedStyle","position","scrollbarWidth","isBody","isUndefined","bodyElem","innerWidth","clientWidth","scrollElem","offsetWidth","remove","scrollbarPadding","elemStyle","paddingRight","paddingBottom","scrollParent","tagName","widthOverflow","scrollWidth","right","originalRight","heightOverflow","clientHeight","bottom","originalBottom","isScrollable","includeHidden","overflowRegex","overflow","overflowY","overflowX","includeSelf","documentEl","excludeStatic","parentElement","spStyle","includeMagins","elemOffset","offset","top","marginTop","left","marginLeft","parent","parentOffset","clientTop","scrollTop","clientLeft","scrollLeft","width","offsetHeight","elemBCR","getBoundingClientRect","pageYOffset","pageXOffset","viewportOffset","useDocument","includePadding","offsetBCR","offsetParentBCR","offsetParentStyle","paddingTop","paddingLeft","parsePlacement","placement","autoPlace","positionElements","hostElem","targetElem","appendToBody","targetWidth","prop","targetHeight","hostElemPos","targetElemPos","targetElemStyle","adjustedSize","marginRight","marginBottom","xOverflow","yOverflow","positionArrow","innerElem","isTooltip","arrowElem","arrowCss","borderProp","borderWidth","borderRadiusProp","borderRadius","altInputFormats","clearText","closeOnDateSelection","closeText","currentText","datepickerPopup","datepickerPopupTemplateUrl","datepickerTemplateUrl","html5Types","onOpenFocus","showButtonBar","$compile","$rootScope","$position","datepickerPopupConfig","$datepickerPopupLiteralWarning","dateFormat","popupEl","datepickerEl","scrollParentEl","ngModel","$popup","isHtml5DateInput","parseDateString","viewValue","parseDate","allowInvalid","validator","modelValue","ngRequired","documentClickBind","popup","dpContainsTarget","contains","target","popupContainsTarget","inputKeydownBind","positionPopup","dpElement","popupPlacement","_ngModel_","datepickerAppendToBody","uibDatepickerPopup","$observe","oldValue","newDateFormat","Error","copy","updateOnDefault","updateOn","children","$formatters","$$parserName","$validators","$parsers","unshift","$viewChangeListeners","after","$$phase","getText","dateSelection","val","debounceTime","timeoutPromise","args","slice","arguments","appendToOpenClass","openScope","open","dropdownScope","closeDropdown","keybindFilter","getAutoClose","toggleElement","getToggleElement","dropdownElement","getDropdownElement","focusToggleElement","isKeynavEnabled","focusDropdownEntry","dropdownConfig","uibDropdownService","$templateRequest","templateScope","getIsOpen","$new","setIsOpen","toggleInvoker","onToggle","appendTo","keynavEnabled","body","assign","dropdownAppendTo","appendToEl","dropdownAppendToBody","keyboardNav","dropdownMenu","toggle","isFunction","autoClose","getElement","keyCode","elems","eq","selectedOption","wasOpen","rightalign","pos","window","appendOffset","openContainer","dropdownMenuTemplateUrl","tplContent","trim","newEl","replaceWith","$destroy","dropdownCtrl","dropdownNested","tplUrl","toggleDropdown","unbind","createNew","stack","add","idx","removeTop","entries","Object","hasKey","put","values","provider","resolver","setResolver","$get","invocables","locals","promises","isArray","invoke","all","resolves","resolveObj","resolveIter","$modalStack","backdropClass","linkFn","modalInClass","NOW_CLOSING_EVENT","setIsAsync","modalOptions","windowClass","windowTopClass","modal","getTop","backdrop","currentTarget","dismiss","$isRendered","modalRenderDeferObj","defer","promise","animationPromise","when","modalRendered","activeElement","inputWithAutofocus","modalAnimation","uibModalAnimationClass","clone","empty","$$multiMap","$$stackedMap","$uibPosition","backdropDomEl","backdropScope","openedWindows","openedClasses","topModalIndex","previousTopOpenedModal","backdropIndex","topBackdropIndex","opened","removeModalWindow","modalInstance","elementToReceiveFocus","modalWindow","appendToElement","modalDomEl","removeAfterAnimate","modalScope","modalBodyClass","openedClass","areAnyOpen","toggleTopWindowClass","closedDeferred","checkRemoveBackdrop","toggleSwitch","domEl","asyncDeferred","asyncPromise","afterAnimating","leave","keydownListener","isDefaultPrevented","keyboard","list","loadFocusElementList","focusChanged","isFocusInFirstItem","isModalFocused","focusLastFocusableElement","isFocusInLastItem","focusFirstFocusableElement","broadcastClosing","resultOrReason","closing","defaultPrevented","newBackdropIndex","modalOpener","deferred","renderDeferred","currBackdropIndex","enter","angularDomEl","windowTemplateUrl","content","result","$$uibDestructionScheduled","reason","reject","dismissAll","topModal","srcElement","modalDomE1","elements","querySelectorAll","getClientRects","isVisible","$modalProvider","options","$controller","$uibResolve","$modal","promiseChain","getPromiseChain","modalResultDeferred","modalOpenedDeferred","modalClosedDeferred","modalRenderDeferred","closed","rendered","samePromise","templateAndResolvePromise","resolveWithTemplate","tplAndVars","providedScope","$close","$dismiss","ctrlInstance","ctrlInstantiate","ctrlLocals","$resolve","$uibModalInstance","bindToController","$onInit","create","setNumPages","numPages","_watchers","config","itemsPerPage","totalPages","calculateTotalPages","updatePage","newTotal","oldTotal","ceil","totalItems","max","page","selectPage","blur","noPrevious","noNext","uibPaging","uibPagerConfig","align","previousText","nextText","paginationCtrl","uibPaginationConfig","maxSize","rotate","forceEllipses","boundaryLinkNumbers","pageLabel","$page","identity","makePage","number","text","boundaryLinks","directionLinks","originalRender","pages","currentPage","startPage","endPage","isMaxSized","previousPageSet","secondPageLink","firstPageLink","nextPageSet","secondToLastPageLink","lastPageLink","getPages","firstText","lastText","defaultOptions","placementClassPrefix","popupDelay","popupCloseDelay","useContentExp","triggerMap","globalOptions","setTriggers","triggers","openedTooltips","keypressListener","last","ttType","prefix","defaultTriggerShow","getTriggers","trigger","show","hide","directiveName","letter","toLowerCase","startSym","startSymbol","endSym","endSymbol","tElem","tooltipLinker","tooltipCtrl","tooltip","tooltipLinkedScope","transitionTimeout","showTimeout","hideTimeout","positionTimeout","lastPlacement","hasEnableExp","ttScope","repositionScheduled","isOpenParse","contentParse","observers","positionTooltip","ttPosition","toggleTooltipBind","hideTooltipBind","showTooltipBind","cancelHide","popupClass","delay","closeDelay","prepareTooltip","cancelShow","$$postDigest","prepObservers","createTooltip","$evalAsync","assignIsOpen","removeTooltip","observer","bodyHideTooltipBind","origScope","contentExp","unregisterTriggers","appendToBodyVal","appendKey","$sce","currentScope","previousElement","currentElement","tooltipTemplateTranscludeScope","changeCounter","cleanupLastIncludeContent","parseAsResourceUrl","uibTooltipTemplateTransclude","src","thisChangeId","response","newScope","tooltipAnimationClass","$uibTooltip","originScope","uibTitle","animate","progressConfig","getMaxOrDefault","maxParam","bars","addBar","bar","recalculatePercentage","totalPercentage","total","percent","toFixed","removeBar","progressCtrl","stateOn","stateOff","enableReset","titles","ratingConfig","tmpTitles","ratingStates","buildTemplateObjects","states","getTitle","rate","readonly","newViewValue","onHover","reset","onLeave","onKeydown","ratingCtrl","oldIndex","findTabIndex","tabs","previousIndex","previousSelected","tab","onDeselect","$selectedIndex","onSelect","addTab","t1","t2","newActiveIndex","removeTab","newActiveTabIndex","justified","classes","elm","tabsetCtrl","disable","t","$transcludeFn","uibTabContentTransclude","contents","node","hasAttribute","isTabHeading","headingElement","hourStep","minuteStep","secondStep","showMeridian","showSeconds","meridians","readonlyInput","mousewheel","arrowkeys","showSpinners","timepickerConfig","watchers","padHours","tabindex","removeAttr","inputs","hoursInputEl","minutesInputEl","secondsInputEl","setupMousewheelEvents","setupArrowkeyEvents","setupInputEvents","noIncrementHours","incrementedSelected","addMinutes","noDecrementHours","decrementedSelected","noIncrementMinutes","noDecrementMinutes","noIncrementSeconds","addSeconds","noDecrementSeconds","noToggleMeridian","getHoursFromTemplate","meridian","getMinutesFromTemplate","pad","noPad","toString","refresh","keyboardChange","makeValid","updateTemplate","invalidHours","invalidMinutes","invalidSeconds","addSecondsToSelected","newDate","modelIsEmpty","$error","isScrollingUp","originalEvent","delta","wheelDelta","deltaY","detail","incrementHours","decrementHours","incrementMinutes","decrementMinutes","incrementSeconds","decrementSeconds","updateHours","updateMinutes","updateSeconds","invalidate","$setDirty","$setTouched","getSecondsFromTemplate","setSeconds","toggleMeridian","uibTimepickerConfig","timepickerCtrl","TYPEAHEAD_REGEXP","itemName","source","viewMapper","modelMapper","originalScope","$$debounce","typeaheadParser","modelCtrl","HOT_KEYS","minLength","typeaheadMinLength","newVal","waitTime","typeaheadWaitMs","isEditable","typeaheadEditable","hasFocus","isLoadingSetter","typeaheadLoading","isSelectEvent","typeaheadShouldSelect","vals","onSelectCallback","typeaheadOnSelect","isSelectOnBlur","typeaheadSelectOnBlur","isNoResultsSetter","typeaheadNoResults","inputFormatter","typeaheadInputFormatter","typeaheadAppendToBody","typeaheadAppendTo","focusFirst","typeaheadFocusFirst","selectOnExact","typeaheadSelectOnExact","isOpenSetter","typeaheadIsOpen","showHint","typeaheadShowHint","parsedModel","invokeModelSetter","parserResult","uibTypeahead","offDestroy","inputsContainer","hintInputElem","popupId","popUpEl","query","debounce","typeaheadTemplateUrl","typeaheadPopupTemplateUrl","resetMatches","activeIdx","getMatchId","getMatchesAsync","inputValue","onCurrentRequest","recalculatePosition","toUpperCase","inputIsExactMatch","debounceUpdate","isObject","firstLabel","fireRecalculating","debouncedRecalculate","moveInProgress","$digest","cancelPreviousTimeout","item","newValue","getterSetter","$$$p","$setModelValue","$item","$model","$label","typeaheadFocusOnSelect","shouldSelect","parentNode","offsetTop","editable","dismissClickHandler","_modelCtrl","_ngModelOptions","scheduleSearchWithTimeout","candidateViewValue","popupTemplateUrl","isDropdownOpen","matchIdx","selectActive","selectMatch","tplEl","isSanitizePresent","matchItem","containsHtml","trustAsHtml","run","$templateCache","$$csp","noInlineStyle","$$uibCarouselCss","document","prepend","$$uibDatepickerCss","$$uibPositionCss","$$uibDatepickerpopupCss","$$uibTooltipCss","$$uibTimepickerCss","$$uibTypeaheadCss"],"mappings":"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","file":"npm.angular-ui-bootstrap.599e75afb77c31efb7a3.js","sourcesContent":["require('./dist/ui-bootstrap-tpls');\n\nmodule.exports = 'ui.bootstrap';\n","/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 1.3.3 - 2016-05-22\n * License: MIT\n */angular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\", \"ui.bootstrap.collapse\",\"ui.bootstrap.accordion\",\"ui.bootstrap.alert\",\"ui.bootstrap.buttons\",\"ui.bootstrap.carousel\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.isClass\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.position\",\"ui.bootstrap.datepickerPopup\",\"ui.bootstrap.debounce\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.stackedMap\",\"ui.bootstrap.modal\",\"ui.bootstrap.paging\",\"ui.bootstrap.pager\",\"ui.bootstrap.pagination\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.popover\",\"ui.bootstrap.progressbar\",\"ui.bootstrap.rating\",\"ui.bootstrap.tabs\",\"ui.bootstrap.timepicker\",\"ui.bootstrap.typeahead\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"uib/template/accordion/accordion-group.html\",\"uib/template/accordion/accordion.html\",\"uib/template/alert/alert.html\",\"uib/template/carousel/carousel.html\",\"uib/template/carousel/slide.html\",\"uib/template/datepicker/datepicker.html\",\"uib/template/datepicker/day.html\",\"uib/template/datepicker/month.html\",\"uib/template/datepicker/year.html\",\"uib/template/datepickerPopup/popup.html\",\"uib/template/modal/backdrop.html\",\"uib/template/modal/window.html\",\"uib/template/pager/pager.html\",\"uib/template/pagination/pagination.html\",\"uib/template/tooltip/tooltip-html-popup.html\",\"uib/template/tooltip/tooltip-popup.html\",\"uib/template/tooltip/tooltip-template-popup.html\",\"uib/template/popover/popover-html.html\",\"uib/template/popover/popover-template.html\",\"uib/template/popover/popover.html\",\"uib/template/progressbar/bar.html\",\"uib/template/progressbar/progress.html\",\"uib/template/progressbar/progressbar.html\",\"uib/template/rating/rating.html\",\"uib/template/tabs/tab.html\",\"uib/template/tabs/tabset.html\",\"uib/template/timepicker/timepicker.html\",\"uib/template/typeahead/typeahead-match.html\",\"uib/template/typeahead/typeahead-popup.html\"]);\nangular.module('ui.bootstrap.collapse', [])\n\n .directive('uibCollapse', ['$animate', '$q', '$parse', '$injector', function($animate, $q, $parse, $injector) {\n var $animateCss = $injector.has('$animateCss') ? $injector.get('$animateCss') : null;\n return {\n link: function(scope, element, attrs) {\n var expandingExpr = $parse(attrs.expanding),\n expandedExpr = $parse(attrs.expanded),\n collapsingExpr = $parse(attrs.collapsing),\n collapsedExpr = $parse(attrs.collapsed);\n\n if (!scope.$eval(attrs.uibCollapse)) {\n element.addClass('in')\n .addClass('collapse')\n .attr('aria-expanded', true)\n .attr('aria-hidden', false)\n .css({height: 'auto'});\n }\n\n function expand() {\n if (element.hasClass('collapse') && element.hasClass('in')) {\n return;\n }\n\n $q.resolve(expandingExpr(scope))\n .then(function() {\n element.removeClass('collapse')\n .addClass('collapsing')\n .attr('aria-expanded', true)\n .attr('aria-hidden', false);\n\n if ($animateCss) {\n $animateCss(element, {\n addClass: 'in',\n easing: 'ease',\n to: { height: element[0].scrollHeight + 'px' }\n }).start()['finally'](expandDone);\n } else {\n $animate.addClass(element, 'in', {\n to: { height: element[0].scrollHeight + 'px' }\n }).then(expandDone);\n }\n });\n }\n\n function expandDone() {\n element.removeClass('collapsing')\n .addClass('collapse')\n .css({height: 'auto'});\n expandedExpr(scope);\n }\n\n function collapse() {\n if (!element.hasClass('collapse') && !element.hasClass('in')) {\n return collapseDone();\n }\n\n $q.resolve(collapsingExpr(scope))\n .then(function() {\n element\n // IMPORTANT: The height must be set before adding \"collapsing\" class.\n // Otherwise, the browser attempts to animate from height 0 (in\n // collapsing class) to the given height here.\n .css({height: element[0].scrollHeight + 'px'})\n // initially all panel collapse have the collapse class, this removal\n // prevents the animation from jumping to collapsed state\n .removeClass('collapse')\n .addClass('collapsing')\n .attr('aria-expanded', false)\n .attr('aria-hidden', true);\n\n if ($animateCss) {\n $animateCss(element, {\n removeClass: 'in',\n to: {height: '0'}\n }).start()['finally'](collapseDone);\n } else {\n $animate.removeClass(element, 'in', {\n to: {height: '0'}\n }).then(collapseDone);\n }\n });\n }\n\n function collapseDone() {\n element.css({height: '0'}); // Required so that collapse works when animation is disabled\n element.removeClass('collapsing')\n .addClass('collapse');\n collapsedExpr(scope);\n }\n\n scope.$watch(attrs.uibCollapse, function(shouldCollapse) {\n if (shouldCollapse) {\n collapse();\n } else {\n expand();\n }\n });\n }\n };\n }]);\n\nangular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])\n\n.constant('uibAccordionConfig', {\n closeOthers: true\n})\n\n.controller('UibAccordionController', ['$scope', '$attrs', 'uibAccordionConfig', function($scope, $attrs, accordionConfig) {\n // This array keeps track of the accordion groups\n this.groups = [];\n\n // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to\n this.closeOthers = function(openGroup) {\n var closeOthers = angular.isDefined($attrs.closeOthers) ?\n $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;\n if (closeOthers) {\n angular.forEach(this.groups, function(group) {\n if (group !== openGroup) {\n group.isOpen = false;\n }\n });\n }\n };\n\n // This is called from the accordion-group directive to add itself to the accordion\n this.addGroup = function(groupScope) {\n var that = this;\n this.groups.push(groupScope);\n\n groupScope.$on('$destroy', function(event) {\n that.removeGroup(groupScope);\n });\n };\n\n // This is called from the accordion-group directive when to remove itself\n this.removeGroup = function(group) {\n var index = this.groups.indexOf(group);\n if (index !== -1) {\n this.groups.splice(index, 1);\n }\n };\n}])\n\n// The accordion directive simply sets up the directive controller\n// and adds an accordion CSS class to itself element.\n.directive('uibAccordion', function() {\n return {\n controller: 'UibAccordionController',\n controllerAs: 'accordion',\n transclude: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/accordion/accordion.html';\n }\n };\n})\n\n// The accordion-group directive indicates a block of html that will expand and collapse in an accordion\n.directive('uibAccordionGroup', function() {\n return {\n require: '^uibAccordion', // We need this directive to be inside an accordion\n transclude: true, // It transcludes the contents of the directive into the template\n replace: true, // The element containing the directive will be replaced with the template\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/accordion/accordion-group.html';\n },\n scope: {\n heading: '@', // Interpolate the heading attribute onto this scope\n panelClass: '@?', // Ditto with panelClass\n isOpen: '=?',\n isDisabled: '=?'\n },\n controller: function() {\n this.setHeading = function(element) {\n this.heading = element;\n };\n },\n link: function(scope, element, attrs, accordionCtrl) {\n accordionCtrl.addGroup(scope);\n\n scope.openClass = attrs.openClass || 'panel-open';\n scope.panelClass = attrs.panelClass || 'panel-default';\n scope.$watch('isOpen', function(value) {\n element.toggleClass(scope.openClass, !!value);\n if (value) {\n accordionCtrl.closeOthers(scope);\n }\n });\n\n scope.toggleOpen = function($event) {\n if (!scope.isDisabled) {\n if (!$event || $event.which === 32) {\n scope.isOpen = !scope.isOpen;\n }\n }\n };\n\n var id = 'accordiongroup-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n scope.headingId = id + '-tab';\n scope.panelId = id + '-panel';\n }\n };\n})\n\n// Use accordion-heading below an accordion-group to provide a heading containing HTML\n.directive('uibAccordionHeading', function() {\n return {\n transclude: true, // Grab the contents to be used as the heading\n template: '', // In effect remove this element!\n replace: true,\n require: '^uibAccordionGroup',\n link: function(scope, element, attrs, accordionGroupCtrl, transclude) {\n // Pass the heading to the accordion-group controller\n // so that it can be transcluded into the right place in the template\n // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]\n accordionGroupCtrl.setHeading(transclude(scope, angular.noop));\n }\n };\n})\n\n// Use in the accordion-group template to indicate where you want the heading to be transcluded\n// You must provide the property on the accordion-group controller that will hold the transcluded element\n.directive('uibAccordionTransclude', function() {\n return {\n require: '^uibAccordionGroup',\n link: function(scope, element, attrs, controller) {\n scope.$watch(function() { return controller[attrs.uibAccordionTransclude]; }, function(heading) {\n if (heading) {\n var elem = angular.element(element[0].querySelector(getHeaderSelectors()));\n elem.html('');\n elem.append(heading);\n }\n });\n }\n };\n\n function getHeaderSelectors() {\n return 'uib-accordion-header,' +\n 'data-uib-accordion-header,' +\n 'x-uib-accordion-header,' +\n 'uib\\\\:accordion-header,' +\n '[uib-accordion-header],' +\n '[data-uib-accordion-header],' +\n '[x-uib-accordion-header]';\n }\n});\n\nangular.module('ui.bootstrap.alert', [])\n\n.controller('UibAlertController', ['$scope', '$attrs', '$interpolate', '$timeout', function($scope, $attrs, $interpolate, $timeout) {\n $scope.closeable = !!$attrs.close;\n\n var dismissOnTimeout = angular.isDefined($attrs.dismissOnTimeout) ?\n $interpolate($attrs.dismissOnTimeout)($scope.$parent) : null;\n\n if (dismissOnTimeout) {\n $timeout(function() {\n $scope.close();\n }, parseInt(dismissOnTimeout, 10));\n }\n}])\n\n.directive('uibAlert', function() {\n return {\n controller: 'UibAlertController',\n controllerAs: 'alert',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/alert/alert.html';\n },\n transclude: true,\n replace: true,\n scope: {\n type: '@',\n close: '&'\n }\n };\n});\n\nangular.module('ui.bootstrap.buttons', [])\n\n.constant('uibButtonConfig', {\n activeClass: 'active',\n toggleEvent: 'click'\n})\n\n.controller('UibButtonsController', ['uibButtonConfig', function(buttonConfig) {\n this.activeClass = buttonConfig.activeClass || 'active';\n this.toggleEvent = buttonConfig.toggleEvent || 'click';\n}])\n\n.directive('uibBtnRadio', ['$parse', function($parse) {\n return {\n require: ['uibBtnRadio', 'ngModel'],\n controller: 'UibButtonsController',\n controllerAs: 'buttons',\n link: function(scope, element, attrs, ctrls) {\n var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n var uncheckableExpr = $parse(attrs.uibUncheckable);\n\n element.find('input').css({display: 'none'});\n\n //model -> UI\n ngModelCtrl.$render = function() {\n element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.uibBtnRadio)));\n };\n\n //ui->model\n element.on(buttonsCtrl.toggleEvent, function() {\n if (attrs.disabled) {\n return;\n }\n\n var isActive = element.hasClass(buttonsCtrl.activeClass);\n\n if (!isActive || angular.isDefined(attrs.uncheckable)) {\n scope.$apply(function() {\n ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.uibBtnRadio));\n ngModelCtrl.$render();\n });\n }\n });\n\n if (attrs.uibUncheckable) {\n scope.$watch(uncheckableExpr, function(uncheckable) {\n attrs.$set('uncheckable', uncheckable ? '' : undefined);\n });\n }\n }\n };\n}])\n\n.directive('uibBtnCheckbox', function() {\n return {\n require: ['uibBtnCheckbox', 'ngModel'],\n controller: 'UibButtonsController',\n controllerAs: 'button',\n link: function(scope, element, attrs, ctrls) {\n var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n element.find('input').css({display: 'none'});\n\n function getTrueValue() {\n return getCheckboxValue(attrs.btnCheckboxTrue, true);\n }\n\n function getFalseValue() {\n return getCheckboxValue(attrs.btnCheckboxFalse, false);\n }\n\n function getCheckboxValue(attribute, defaultValue) {\n return angular.isDefined(attribute) ? scope.$eval(attribute) : defaultValue;\n }\n\n //model -> UI\n ngModelCtrl.$render = function() {\n element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));\n };\n\n //ui->model\n element.on(buttonsCtrl.toggleEvent, function() {\n if (attrs.disabled) {\n return;\n }\n\n scope.$apply(function() {\n ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());\n ngModelCtrl.$render();\n });\n });\n }\n };\n});\n\nangular.module('ui.bootstrap.carousel', [])\n\n.controller('UibCarouselController', ['$scope', '$element', '$interval', '$timeout', '$animate', function($scope, $element, $interval, $timeout, $animate) {\n var self = this,\n slides = self.slides = $scope.slides = [],\n SLIDE_DIRECTION = 'uib-slideDirection',\n currentIndex = $scope.active,\n currentInterval, isPlaying, bufferedTransitions = [];\n\n var destroyed = false;\n\n self.addSlide = function(slide, element) {\n slides.push({\n slide: slide,\n element: element\n });\n slides.sort(function(a, b) {\n return +a.slide.index - +b.slide.index;\n });\n //if this is the first slide or the slide is set to active, select it\n if (slide.index === $scope.active || slides.length === 1 && !angular.isNumber($scope.active)) {\n if ($scope.$currentTransition) {\n $scope.$currentTransition = null;\n }\n\n currentIndex = slide.index;\n $scope.active = slide.index;\n setActive(currentIndex);\n self.select(slides[findSlideIndex(slide)]);\n if (slides.length === 1) {\n $scope.play();\n }\n }\n };\n\n self.getCurrentIndex = function() {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide.index === currentIndex) {\n return i;\n }\n }\n };\n\n self.next = $scope.next = function() {\n var newIndex = (self.getCurrentIndex() + 1) % slides.length;\n\n if (newIndex === 0 && $scope.noWrap()) {\n $scope.pause();\n return;\n }\n\n return self.select(slides[newIndex], 'next');\n };\n\n self.prev = $scope.prev = function() {\n var newIndex = self.getCurrentIndex() - 1 < 0 ? slides.length - 1 : self.getCurrentIndex() - 1;\n\n if ($scope.noWrap() && newIndex === slides.length - 1) {\n $scope.pause();\n return;\n }\n\n return self.select(slides[newIndex], 'prev');\n };\n\n self.removeSlide = function(slide) {\n var index = findSlideIndex(slide);\n\n var bufferedIndex = bufferedTransitions.indexOf(slides[index]);\n if (bufferedIndex !== -1) {\n bufferedTransitions.splice(bufferedIndex, 1);\n }\n\n //get the index of the slide inside the carousel\n slides.splice(index, 1);\n if (slides.length > 0 && currentIndex === index) {\n if (index >= slides.length) {\n currentIndex = slides.length - 1;\n $scope.active = currentIndex;\n setActive(currentIndex);\n self.select(slides[slides.length - 1]);\n } else {\n currentIndex = index;\n $scope.active = currentIndex;\n setActive(currentIndex);\n self.select(slides[index]);\n }\n } else if (currentIndex > index) {\n currentIndex--;\n $scope.active = currentIndex;\n }\n\n //clean the active value when no more slide\n if (slides.length === 0) {\n currentIndex = null;\n $scope.active = null;\n clearBufferedTransitions();\n }\n };\n\n /* direction: \"prev\" or \"next\" */\n self.select = $scope.select = function(nextSlide, direction) {\n var nextIndex = findSlideIndex(nextSlide.slide);\n //Decide direction if it's not given\n if (direction === undefined) {\n direction = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n }\n //Prevent this user-triggered transition from occurring if there is already one in progress\n if (nextSlide.slide.index !== currentIndex &&\n !$scope.$currentTransition) {\n goNext(nextSlide.slide, nextIndex, direction);\n } else if (nextSlide && nextSlide.slide.index !== currentIndex && $scope.$currentTransition) {\n bufferedTransitions.push(slides[nextIndex]);\n }\n };\n\n /* Allow outside people to call indexOf on slides array */\n $scope.indexOfSlide = function(slide) {\n return +slide.slide.index;\n };\n\n $scope.isActive = function(slide) {\n return $scope.active === slide.slide.index;\n };\n\n $scope.isPrevDisabled = function() {\n return $scope.active === 0 && $scope.noWrap();\n };\n\n $scope.isNextDisabled = function() {\n return $scope.active === slides.length - 1 && $scope.noWrap();\n };\n\n $scope.pause = function() {\n if (!$scope.noPause) {\n isPlaying = false;\n resetTimer();\n }\n };\n\n $scope.play = function() {\n if (!isPlaying) {\n isPlaying = true;\n restartTimer();\n }\n };\n\n $scope.$on('$destroy', function() {\n destroyed = true;\n resetTimer();\n });\n\n $scope.$watch('noTransition', function(noTransition) {\n $animate.enabled($element, !noTransition);\n });\n\n $scope.$watch('interval', restartTimer);\n\n $scope.$watchCollection('slides', resetTransition);\n\n $scope.$watch('active', function(index) {\n if (angular.isNumber(index) && currentIndex !== index) {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide.index === index) {\n index = i;\n break;\n }\n }\n\n var slide = slides[index];\n if (slide) {\n setActive(index);\n self.select(slides[index]);\n currentIndex = index;\n }\n }\n });\n\n function clearBufferedTransitions() {\n while (bufferedTransitions.length) {\n bufferedTransitions.shift();\n }\n }\n\n function getSlideByIndex(index) {\n for (var i = 0, l = slides.length; i < l; ++i) {\n if (slides[i].index === index) {\n return slides[i];\n }\n }\n }\n\n function setActive(index) {\n for (var i = 0; i < slides.length; i++) {\n slides[i].slide.active = i === index;\n }\n }\n\n function goNext(slide, index, direction) {\n if (destroyed) {\n return;\n }\n\n angular.extend(slide, {direction: direction});\n angular.extend(slides[currentIndex].slide || {}, {direction: direction});\n if ($animate.enabled($element) && !$scope.$currentTransition &&\n slides[index].element && self.slides.length > 1) {\n slides[index].element.data(SLIDE_DIRECTION, slide.direction);\n var currentIdx = self.getCurrentIndex();\n\n if (angular.isNumber(currentIdx) && slides[currentIdx].element) {\n slides[currentIdx].element.data(SLIDE_DIRECTION, slide.direction);\n }\n\n $scope.$currentTransition = true;\n $animate.on('addClass', slides[index].element, function(element, phase) {\n if (phase === 'close') {\n $scope.$currentTransition = null;\n $animate.off('addClass', element);\n if (bufferedTransitions.length) {\n var nextSlide = bufferedTransitions.pop().slide;\n var nextIndex = nextSlide.index;\n var nextDirection = nextIndex > self.getCurrentIndex() ? 'next' : 'prev';\n clearBufferedTransitions();\n\n goNext(nextSlide, nextIndex, nextDirection);\n }\n }\n });\n }\n\n $scope.active = slide.index;\n currentIndex = slide.index;\n setActive(index);\n\n //every time you change slides, reset the timer\n restartTimer();\n }\n\n function findSlideIndex(slide) {\n for (var i = 0; i < slides.length; i++) {\n if (slides[i].slide === slide) {\n return i;\n }\n }\n }\n\n function resetTimer() {\n if (currentInterval) {\n $interval.cancel(currentInterval);\n currentInterval = null;\n }\n }\n\n function resetTransition(slides) {\n if (!slides.length) {\n $scope.$currentTransition = null;\n clearBufferedTransitions();\n }\n }\n\n function restartTimer() {\n resetTimer();\n var interval = +$scope.interval;\n if (!isNaN(interval) && interval > 0) {\n currentInterval = $interval(timerFn, interval);\n }\n }\n\n function timerFn() {\n var interval = +$scope.interval;\n if (isPlaying && !isNaN(interval) && interval > 0 && slides.length) {\n $scope.next();\n } else {\n $scope.pause();\n }\n }\n}])\n\n.directive('uibCarousel', function() {\n return {\n transclude: true,\n replace: true,\n controller: 'UibCarouselController',\n controllerAs: 'carousel',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/carousel/carousel.html';\n },\n scope: {\n active: '=',\n interval: '=',\n noTransition: '=',\n noPause: '=',\n noWrap: '&'\n }\n };\n})\n\n.directive('uibSlide', function() {\n return {\n require: '^uibCarousel',\n transclude: true,\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/carousel/slide.html';\n },\n scope: {\n actual: '=?',\n index: '=?'\n },\n link: function (scope, element, attrs, carouselCtrl) {\n carouselCtrl.addSlide(scope, element);\n //when the scope is destroyed then remove the slide from the current slides array\n scope.$on('$destroy', function() {\n carouselCtrl.removeSlide(scope);\n });\n }\n };\n})\n\n.animation('.item', ['$animateCss',\nfunction($animateCss) {\n var SLIDE_DIRECTION = 'uib-slideDirection';\n\n function removeClass(element, className, callback) {\n element.removeClass(className);\n if (callback) {\n callback();\n }\n }\n\n return {\n beforeAddClass: function(element, className, done) {\n if (className === 'active') {\n var stopped = false;\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element,\n directionClass + ' ' + direction, done);\n element.addClass(direction);\n\n $animateCss(element, {addClass: directionClass})\n .start()\n .done(removeClassFn);\n\n return function() {\n stopped = true;\n };\n }\n done();\n },\n beforeRemoveClass: function (element, className, done) {\n if (className === 'active') {\n var stopped = false;\n var direction = element.data(SLIDE_DIRECTION);\n var directionClass = direction === 'next' ? 'left' : 'right';\n var removeClassFn = removeClass.bind(this, element, directionClass, done);\n\n $animateCss(element, {addClass: directionClass})\n .start()\n .done(removeClassFn);\n\n return function() {\n stopped = true;\n };\n }\n done();\n }\n };\n}]);\n\nangular.module('ui.bootstrap.dateparser', [])\n\n.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', function($log, $locale, dateFilter, orderByFilter) {\n // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js\n var SPECIAL_CHARACTERS_REGEXP = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n\n var localeId;\n var formatCodeToRegex;\n\n this.init = function() {\n localeId = $locale.id;\n\n this.parsers = {};\n this.formatters = {};\n\n formatCodeToRegex = [\n {\n key: 'yyyy',\n regex: '\\\\d{4}',\n apply: function(value) { this.year = +value; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'yyyy');\n }\n },\n {\n key: 'yy',\n regex: '\\\\d{2}',\n apply: function(value) { value = +value; this.year = value < 69 ? value + 2000 : value + 1900; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'yy');\n }\n },\n {\n key: 'y',\n regex: '\\\\d{1,4}',\n apply: function(value) { this.year = +value; },\n formatter: function(date) {\n var _date = new Date();\n _date.setFullYear(Math.abs(date.getFullYear()));\n return dateFilter(_date, 'y');\n }\n },\n {\n key: 'M!',\n regex: '0?[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) {\n var value = date.getMonth();\n if (/^[0-9]$/.test(value)) {\n return dateFilter(date, 'MM');\n }\n\n return dateFilter(date, 'M');\n }\n },\n {\n key: 'MMMM',\n regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); },\n formatter: function(date) { return dateFilter(date, 'MMMM'); }\n },\n {\n key: 'MMM',\n regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); },\n formatter: function(date) { return dateFilter(date, 'MMM'); }\n },\n {\n key: 'MM',\n regex: '0[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) { return dateFilter(date, 'MM'); }\n },\n {\n key: 'M',\n regex: '[1-9]|1[0-2]',\n apply: function(value) { this.month = value - 1; },\n formatter: function(date) { return dateFilter(date, 'M'); }\n },\n {\n key: 'd!',\n regex: '[0-2]?[0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) {\n var value = date.getDate();\n if (/^[1-9]$/.test(value)) {\n return dateFilter(date, 'dd');\n }\n\n return dateFilter(date, 'd');\n }\n },\n {\n key: 'dd',\n regex: '[0-2][0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) { return dateFilter(date, 'dd'); }\n },\n {\n key: 'd',\n regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\n apply: function(value) { this.date = +value; },\n formatter: function(date) { return dateFilter(date, 'd'); }\n },\n {\n key: 'EEEE',\n regex: $locale.DATETIME_FORMATS.DAY.join('|'),\n formatter: function(date) { return dateFilter(date, 'EEEE'); }\n },\n {\n key: 'EEE',\n regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|'),\n formatter: function(date) { return dateFilter(date, 'EEE'); }\n },\n {\n key: 'HH',\n regex: '(?:0|1)[0-9]|2[0-3]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'HH'); }\n },\n {\n key: 'hh',\n regex: '0[0-9]|1[0-2]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'hh'); }\n },\n {\n key: 'H',\n regex: '1?[0-9]|2[0-3]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'H'); }\n },\n {\n key: 'h',\n regex: '[0-9]|1[0-2]',\n apply: function(value) { this.hours = +value; },\n formatter: function(date) { return dateFilter(date, 'h'); }\n },\n {\n key: 'mm',\n regex: '[0-5][0-9]',\n apply: function(value) { this.minutes = +value; },\n formatter: function(date) { return dateFilter(date, 'mm'); }\n },\n {\n key: 'm',\n regex: '[0-9]|[1-5][0-9]',\n apply: function(value) { this.minutes = +value; },\n formatter: function(date) { return dateFilter(date, 'm'); }\n },\n {\n key: 'sss',\n regex: '[0-9][0-9][0-9]',\n apply: function(value) { this.milliseconds = +value; },\n formatter: function(date) { return dateFilter(date, 'sss'); }\n },\n {\n key: 'ss',\n regex: '[0-5][0-9]',\n apply: function(value) { this.seconds = +value; },\n formatter: function(date) { return dateFilter(date, 'ss'); }\n },\n {\n key: 's',\n regex: '[0-9]|[1-5][0-9]',\n apply: function(value) { this.seconds = +value; },\n formatter: function(date) { return dateFilter(date, 's'); }\n },\n {\n key: 'a',\n regex: $locale.DATETIME_FORMATS.AMPMS.join('|'),\n apply: function(value) {\n if (this.hours === 12) {\n this.hours = 0;\n }\n\n if (value === 'PM') {\n this.hours += 12;\n }\n },\n formatter: function(date) { return dateFilter(date, 'a'); }\n },\n {\n key: 'Z',\n regex: '[+-]\\\\d{4}',\n apply: function(value) {\n var matches = value.match(/([+-])(\\d{2})(\\d{2})/),\n sign = matches[1],\n hours = matches[2],\n minutes = matches[3];\n this.hours += toInt(sign + hours);\n this.minutes += toInt(sign + minutes);\n },\n formatter: function(date) {\n return dateFilter(date, 'Z');\n }\n },\n {\n key: 'ww',\n regex: '[0-4][0-9]|5[0-3]',\n formatter: function(date) { return dateFilter(date, 'ww'); }\n },\n {\n key: 'w',\n regex: '[0-9]|[1-4][0-9]|5[0-3]',\n formatter: function(date) { return dateFilter(date, 'w'); }\n },\n {\n key: 'GGGG',\n regex: $locale.DATETIME_FORMATS.ERANAMES.join('|').replace(/\\s/g, '\\\\s'),\n formatter: function(date) { return dateFilter(date, 'GGGG'); }\n },\n {\n key: 'GGG',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'GGG'); }\n },\n {\n key: 'GG',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'GG'); }\n },\n {\n key: 'G',\n regex: $locale.DATETIME_FORMATS.ERAS.join('|'),\n formatter: function(date) { return dateFilter(date, 'G'); }\n }\n ];\n };\n\n this.init();\n\n function createParser(format, func) {\n var map = [], regex = format.split('');\n\n // check for literal values\n var quoteIndex = format.indexOf('\\'');\n if (quoteIndex > -1) {\n var inLiteral = false;\n format = format.split('');\n for (var i = quoteIndex; i < format.length; i++) {\n if (inLiteral) {\n if (format[i] === '\\'') {\n if (i + 1 < format.length && format[i+1] === '\\'') { // escaped single quote\n format[i+1] = '$';\n regex[i+1] = '';\n } else { // end of literal\n regex[i] = '';\n inLiteral = false;\n }\n }\n format[i] = '$';\n } else {\n if (format[i] === '\\'') { // start of literal\n format[i] = '$';\n regex[i] = '';\n inLiteral = true;\n }\n }\n }\n\n format = format.join('');\n }\n\n angular.forEach(formatCodeToRegex, function(data) {\n var index = format.indexOf(data.key);\n\n if (index > -1) {\n format = format.split('');\n\n regex[index] = '(' + data.regex + ')';\n format[index] = '$'; // Custom symbol to define consumed part of format\n for (var i = index + 1, n = index + data.key.length; i < n; i++) {\n regex[i] = '';\n format[i] = '$';\n }\n format = format.join('');\n\n map.push({\n index: index,\n key: data.key,\n apply: data[func],\n matcher: data.regex\n });\n }\n });\n\n return {\n regex: new RegExp('^' + regex.join('') + '$'),\n map: orderByFilter(map, 'index')\n };\n }\n\n this.filter = function(date, format) {\n if (!angular.isDate(date) || isNaN(date) || !format) {\n return '';\n }\n\n format = $locale.DATETIME_FORMATS[format] || format;\n\n if ($locale.id !== localeId) {\n this.init();\n }\n\n if (!this.formatters[format]) {\n this.formatters[format] = createParser(format, 'formatter');\n }\n\n var parser = this.formatters[format],\n map = parser.map;\n\n var _format = format;\n\n return map.reduce(function(str, mapper, i) {\n var match = _format.match(new RegExp('(.*)' + mapper.key));\n if (match && angular.isString(match[1])) {\n str += match[1];\n _format = _format.replace(match[1] + mapper.key, '');\n }\n\n var endStr = i === map.length - 1 ? _format : '';\n\n if (mapper.apply) {\n return str + mapper.apply.call(null, date) + endStr;\n }\n\n return str + endStr;\n }, '');\n };\n\n this.parse = function(input, format, baseDate) {\n if (!angular.isString(input) || !format) {\n return input;\n }\n\n format = $locale.DATETIME_FORMATS[format] || format;\n format = format.replace(SPECIAL_CHARACTERS_REGEXP, '\\\\$&');\n\n if ($locale.id !== localeId) {\n this.init();\n }\n\n if (!this.parsers[format]) {\n this.parsers[format] = createParser(format, 'apply');\n }\n\n var parser = this.parsers[format],\n regex = parser.regex,\n map = parser.map,\n results = input.match(regex),\n tzOffset = false;\n if (results && results.length) {\n var fields, dt;\n if (angular.isDate(baseDate) && !isNaN(baseDate.getTime())) {\n fields = {\n year: baseDate.getFullYear(),\n month: baseDate.getMonth(),\n date: baseDate.getDate(),\n hours: baseDate.getHours(),\n minutes: baseDate.getMinutes(),\n seconds: baseDate.getSeconds(),\n milliseconds: baseDate.getMilliseconds()\n };\n } else {\n if (baseDate) {\n $log.warn('dateparser:', 'baseDate is not a valid date');\n }\n fields = { year: 1900, month: 0, date: 1, hours: 0, minutes: 0, seconds: 0, milliseconds: 0 };\n }\n\n for (var i = 1, n = results.length; i < n; i++) {\n var mapper = map[i - 1];\n if (mapper.matcher === 'Z') {\n tzOffset = true;\n }\n\n if (mapper.apply) {\n mapper.apply.call(fields, results[i]);\n }\n }\n\n var datesetter = tzOffset ? Date.prototype.setUTCFullYear :\n Date.prototype.setFullYear;\n var timesetter = tzOffset ? Date.prototype.setUTCHours :\n Date.prototype.setHours;\n\n if (isValid(fields.year, fields.month, fields.date)) {\n if (angular.isDate(baseDate) && !isNaN(baseDate.getTime()) && !tzOffset) {\n dt = new Date(baseDate);\n datesetter.call(dt, fields.year, fields.month, fields.date);\n timesetter.call(dt, fields.hours, fields.minutes,\n fields.seconds, fields.milliseconds);\n } else {\n dt = new Date(0);\n datesetter.call(dt, fields.year, fields.month, fields.date);\n timesetter.call(dt, fields.hours || 0, fields.minutes || 0,\n fields.seconds || 0, fields.milliseconds || 0);\n }\n }\n\n return dt;\n }\n };\n\n // Check if date is valid for specific month (and year for February).\n // Month: 0 = Jan, 1 = Feb, etc\n function isValid(year, month, date) {\n if (date < 1) {\n return false;\n }\n\n if (month === 1 && date > 28) {\n return date === 29 && (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0);\n }\n\n if (month === 3 || month === 5 || month === 8 || month === 10) {\n return date < 31;\n }\n\n return true;\n }\n\n function toInt(str) {\n return parseInt(str, 10);\n }\n\n this.toTimezone = toTimezone;\n this.fromTimezone = fromTimezone;\n this.timezoneToOffset = timezoneToOffset;\n this.addDateMinutes = addDateMinutes;\n this.convertTimezoneToLocal = convertTimezoneToLocal;\n\n function toTimezone(date, timezone) {\n return date && timezone ? convertTimezoneToLocal(date, timezone) : date;\n }\n\n function fromTimezone(date, timezone) {\n return date && timezone ? convertTimezoneToLocal(date, timezone, true) : date;\n }\n\n //https://github.com/angular/angular.js/blob/622c42169699ec07fc6daaa19fe6d224e5d2f70e/src/Angular.js#L1207\n function timezoneToOffset(timezone, fallback) {\n timezone = timezone.replace(/:/g, '');\n var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n }\n\n function addDateMinutes(date, minutes) {\n date = new Date(date.getTime());\n date.setMinutes(date.getMinutes() + minutes);\n return date;\n }\n\n function convertTimezoneToLocal(date, timezone, reverse) {\n reverse = reverse ? -1 : 1;\n var dateTimezoneOffset = date.getTimezoneOffset();\n var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));\n }\n}]);\n\n// Avoiding use of ng-class as it creates a lot of watchers when a class is to be applied to\n// at most one element.\nangular.module('ui.bootstrap.isClass', [])\n.directive('uibIsClass', [\n '$animate',\nfunction ($animate) {\n // 11111111 22222222\n var ON_REGEXP = /^\\s*([\\s\\S]+?)\\s+on\\s+([\\s\\S]+?)\\s*$/;\n // 11111111 22222222\n var IS_REGEXP = /^\\s*([\\s\\S]+?)\\s+for\\s+([\\s\\S]+?)\\s*$/;\n\n var dataPerTracked = {};\n\n return {\n restrict: 'A',\n compile: function(tElement, tAttrs) {\n var linkedScopes = [];\n var instances = [];\n var expToData = {};\n var lastActivated = null;\n var onExpMatches = tAttrs.uibIsClass.match(ON_REGEXP);\n var onExp = onExpMatches[2];\n var expsStr = onExpMatches[1];\n var exps = expsStr.split(',');\n\n return linkFn;\n\n function linkFn(scope, element, attrs) {\n linkedScopes.push(scope);\n instances.push({\n scope: scope,\n element: element\n });\n\n exps.forEach(function(exp, k) {\n addForExp(exp, scope);\n });\n\n scope.$on('$destroy', removeScope);\n }\n\n function addForExp(exp, scope) {\n var matches = exp.match(IS_REGEXP);\n var clazz = scope.$eval(matches[1]);\n var compareWithExp = matches[2];\n var data = expToData[exp];\n if (!data) {\n var watchFn = function(compareWithVal) {\n var newActivated = null;\n instances.some(function(instance) {\n var thisVal = instance.scope.$eval(onExp);\n if (thisVal === compareWithVal) {\n newActivated = instance;\n return true;\n }\n });\n if (data.lastActivated !== newActivated) {\n if (data.lastActivated) {\n $animate.removeClass(data.lastActivated.element, clazz);\n }\n if (newActivated) {\n $animate.addClass(newActivated.element, clazz);\n }\n data.lastActivated = newActivated;\n }\n };\n expToData[exp] = data = {\n lastActivated: null,\n scope: scope,\n watchFn: watchFn,\n compareWithExp: compareWithExp,\n watcher: scope.$watch(compareWithExp, watchFn)\n };\n }\n data.watchFn(scope.$eval(compareWithExp));\n }\n\n function removeScope(e) {\n var removedScope = e.targetScope;\n var index = linkedScopes.indexOf(removedScope);\n linkedScopes.splice(index, 1);\n instances.splice(index, 1);\n if (linkedScopes.length) {\n var newWatchScope = linkedScopes[0];\n angular.forEach(expToData, function(data) {\n if (data.scope === removedScope) {\n data.watcher = newWatchScope.$watch(data.compareWithExp, data.watchFn);\n data.scope = newWatchScope;\n }\n });\n } else {\n expToData = {};\n }\n }\n }\n };\n}]);\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.isClass'])\n\n.value('$datepickerSuppressError', false)\n\n.value('$datepickerLiteralWarning', true)\n\n.constant('uibDatepickerConfig', {\n datepickerMode: 'day',\n formatDay: 'dd',\n formatMonth: 'MMMM',\n formatYear: 'yyyy',\n formatDayHeader: 'EEE',\n formatDayTitle: 'MMMM yyyy',\n formatMonthTitle: 'yyyy',\n maxDate: null,\n maxMode: 'year',\n minDate: null,\n minMode: 'day',\n ngModelOptions: {},\n shortcutPropagation: false,\n showWeeks: true,\n yearColumns: 5,\n yearRows: 4\n})\n\n.controller('UibDatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$locale', '$log', 'dateFilter', 'uibDatepickerConfig', '$datepickerLiteralWarning', '$datepickerSuppressError', 'uibDateParser',\n function($scope, $attrs, $parse, $interpolate, $locale, $log, dateFilter, datepickerConfig, $datepickerLiteralWarning, $datepickerSuppressError, dateParser) {\n var self = this,\n ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl;\n ngModelOptions = {},\n watchListeners = [],\n optionsUsed = !!$attrs.datepickerOptions;\n\n if (!$scope.datepickerOptions) {\n $scope.datepickerOptions = {};\n }\n\n // Modes chain\n this.modes = ['day', 'month', 'year'];\n\n [\n 'customClass',\n 'dateDisabled',\n 'datepickerMode',\n 'formatDay',\n 'formatDayHeader',\n 'formatDayTitle',\n 'formatMonth',\n 'formatMonthTitle',\n 'formatYear',\n 'maxDate',\n 'maxMode',\n 'minDate',\n 'minMode',\n 'showWeeks',\n 'shortcutPropagation',\n 'startingDay',\n 'yearColumns',\n 'yearRows'\n ].forEach(function(key) {\n switch (key) {\n case 'customClass':\n case 'dateDisabled':\n $scope[key] = $scope.datepickerOptions[key] || angular.noop;\n break;\n case 'datepickerMode':\n $scope.datepickerMode = angular.isDefined($scope.datepickerOptions.datepickerMode) ?\n $scope.datepickerOptions.datepickerMode : datepickerConfig.datepickerMode;\n break;\n case 'formatDay':\n case 'formatDayHeader':\n case 'formatDayTitle':\n case 'formatMonth':\n case 'formatMonthTitle':\n case 'formatYear':\n self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n $interpolate($scope.datepickerOptions[key])($scope.$parent) :\n datepickerConfig[key];\n break;\n case 'showWeeks':\n case 'shortcutPropagation':\n case 'yearColumns':\n case 'yearRows':\n self[key] = angular.isDefined($scope.datepickerOptions[key]) ?\n $scope.datepickerOptions[key] : datepickerConfig[key];\n break;\n case 'startingDay':\n if (angular.isDefined($scope.datepickerOptions.startingDay)) {\n self.startingDay = $scope.datepickerOptions.startingDay;\n } else if (angular.isNumber(datepickerConfig.startingDay)) {\n self.startingDay = datepickerConfig.startingDay;\n } else {\n self.startingDay = ($locale.DATETIME_FORMATS.FIRSTDAYOFWEEK + 8) % 7;\n }\n\n break;\n case 'maxDate':\n case 'minDate':\n $scope.$watch('datepickerOptions.' + key, function(value) {\n if (value) {\n if (angular.isDate(value)) {\n self[key] = dateParser.fromTimezone(new Date(value), ngModelOptions.timezone);\n } else {\n if ($datepickerLiteralWarning) {\n $log.warn('Literal date support has been deprecated, please switch to date object usage');\n }\n\n self[key] = new Date(dateFilter(value, 'medium'));\n }\n } else {\n self[key] = datepickerConfig[key] ?\n dateParser.fromTimezone(new Date(datepickerConfig[key]), ngModelOptions.timezone) :\n null;\n }\n\n self.refreshView();\n });\n\n break;\n case 'maxMode':\n case 'minMode':\n if ($scope.datepickerOptions[key]) {\n $scope.$watch(function() { return $scope.datepickerOptions[key]; }, function(value) {\n self[key] = $scope[key] = angular.isDefined(value) ? value : datepickerOptions[key];\n if (key === 'minMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) < self.modes.indexOf(self[key]) ||\n key === 'maxMode' && self.modes.indexOf($scope.datepickerOptions.datepickerMode) > self.modes.indexOf(self[key])) {\n $scope.datepickerMode = self[key];\n $scope.datepickerOptions.datepickerMode = self[key];\n }\n });\n } else {\n self[key] = $scope[key] = datepickerConfig[key] || null;\n }\n\n break;\n }\n });\n\n $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\n\n $scope.disabled = angular.isDefined($attrs.disabled) || false;\n if (angular.isDefined($attrs.ngDisabled)) {\n watchListeners.push($scope.$parent.$watch($attrs.ngDisabled, function(disabled) {\n $scope.disabled = disabled;\n self.refreshView();\n }));\n }\n\n $scope.isActive = function(dateObject) {\n if (self.compare(dateObject.date, self.activeDate) === 0) {\n $scope.activeDateId = dateObject.uid;\n return true;\n }\n return false;\n };\n\n this.init = function(ngModelCtrl_) {\n ngModelCtrl = ngModelCtrl_;\n ngModelOptions = ngModelCtrl_.$options || datepickerConfig.ngModelOptions;\n if ($scope.datepickerOptions.initDate) {\n self.activeDate = dateParser.fromTimezone($scope.datepickerOptions.initDate, ngModelOptions.timezone) || new Date();\n $scope.$watch('datepickerOptions.initDate', function(initDate) {\n if (initDate && (ngModelCtrl.$isEmpty(ngModelCtrl.$modelValue) || ngModelCtrl.$invalid)) {\n self.activeDate = dateParser.fromTimezone(initDate, ngModelOptions.timezone);\n self.refreshView();\n }\n });\n } else {\n self.activeDate = new Date();\n }\n\n var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : new Date();\n this.activeDate = !isNaN(date) ?\n dateParser.fromTimezone(date, ngModelOptions.timezone) :\n dateParser.fromTimezone(new Date(), ngModelOptions.timezone);\n\n ngModelCtrl.$render = function() {\n self.render();\n };\n };\n\n this.render = function() {\n if (ngModelCtrl.$viewValue) {\n var date = new Date(ngModelCtrl.$viewValue),\n isValid = !isNaN(date);\n\n if (isValid) {\n this.activeDate = dateParser.fromTimezone(date, ngModelOptions.timezone);\n } else if (!$datepickerSuppressError) {\n $log.error('Datepicker directive: \"ng-model\" value must be a Date object');\n }\n }\n this.refreshView();\n };\n\n this.refreshView = function() {\n if (this.element) {\n $scope.selectedDt = null;\n this._refreshView();\n if ($scope.activeDt) {\n $scope.activeDateId = $scope.activeDt.uid;\n }\n\n var date = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n date = dateParser.fromTimezone(date, ngModelOptions.timezone);\n ngModelCtrl.$setValidity('dateDisabled', !date ||\n this.element && !this.isDisabled(date));\n }\n };\n\n this.createDateObject = function(date, format) {\n var model = ngModelCtrl.$viewValue ? new Date(ngModelCtrl.$viewValue) : null;\n model = dateParser.fromTimezone(model, ngModelOptions.timezone);\n var today = new Date();\n today = dateParser.fromTimezone(today, ngModelOptions.timezone);\n var time = this.compare(date, today);\n var dt = {\n date: date,\n label: dateParser.filter(date, format),\n selected: model && this.compare(date, model) === 0,\n disabled: this.isDisabled(date),\n past: time < 0,\n current: time === 0,\n future: time > 0,\n customClass: this.customClass(date) || null\n };\n\n if (model && this.compare(date, model) === 0) {\n $scope.selectedDt = dt;\n }\n\n if (self.activeDate && this.compare(dt.date, self.activeDate) === 0) {\n $scope.activeDt = dt;\n }\n\n return dt;\n };\n\n this.isDisabled = function(date) {\n return $scope.disabled ||\n this.minDate && this.compare(date, this.minDate) < 0 ||\n this.maxDate && this.compare(date, this.maxDate) > 0 ||\n $scope.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode});\n };\n\n this.customClass = function(date) {\n return $scope.customClass({date: date, mode: $scope.datepickerMode});\n };\n\n // Split array into smaller arrays\n this.split = function(arr, size) {\n var arrays = [];\n while (arr.length > 0) {\n arrays.push(arr.splice(0, size));\n }\n return arrays;\n };\n\n $scope.select = function(date) {\n if ($scope.datepickerMode === self.minMode) {\n var dt = ngModelCtrl.$viewValue ? dateParser.fromTimezone(new Date(ngModelCtrl.$viewValue), ngModelOptions.timezone) : new Date(0, 0, 0, 0, 0, 0, 0);\n dt.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n dt = dateParser.toTimezone(dt, ngModelOptions.timezone);\n ngModelCtrl.$setViewValue(dt);\n ngModelCtrl.$render();\n } else {\n self.activeDate = date;\n setMode(self.modes[self.modes.indexOf($scope.datepickerMode) - 1]);\n\n $scope.$emit('uib:datepicker.mode');\n }\n\n $scope.$broadcast('uib:datepicker.focus');\n };\n\n $scope.move = function(direction) {\n var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\n month = self.activeDate.getMonth() + direction * (self.step.months || 0);\n self.activeDate.setFullYear(year, month, 1);\n self.refreshView();\n };\n\n $scope.toggleMode = function(direction) {\n direction = direction || 1;\n\n if ($scope.datepickerMode === self.maxMode && direction === 1 ||\n $scope.datepickerMode === self.minMode && direction === -1) {\n return;\n }\n\n setMode(self.modes[self.modes.indexOf($scope.datepickerMode) + direction]);\n\n $scope.$emit('uib:datepicker.mode');\n };\n\n // Key event mapper\n $scope.keys = { 13: 'enter', 32: 'space', 33: 'pageup', 34: 'pagedown', 35: 'end', 36: 'home', 37: 'left', 38: 'up', 39: 'right', 40: 'down' };\n\n var focusElement = function() {\n self.element[0].focus();\n };\n\n // Listen for focus requests from popup directive\n $scope.$on('uib:datepicker.focus', focusElement);\n\n $scope.keydown = function(evt) {\n var key = $scope.keys[evt.which];\n\n if (!key || evt.shiftKey || evt.altKey || $scope.disabled) {\n return;\n }\n\n evt.preventDefault();\n if (!self.shortcutPropagation) {\n evt.stopPropagation();\n }\n\n if (key === 'enter' || key === 'space') {\n if (self.isDisabled(self.activeDate)) {\n return; // do nothing\n }\n $scope.select(self.activeDate);\n } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\n $scope.toggleMode(key === 'up' ? 1 : -1);\n } else {\n self.handleKeyDown(key, evt);\n self.refreshView();\n }\n };\n\n $scope.$on('$destroy', function() {\n //Clear all watch listeners on destroy\n while (watchListeners.length) {\n watchListeners.shift()();\n }\n });\n\n function setMode(mode) {\n $scope.datepickerMode = mode;\n $scope.datepickerOptions.datepickerMode = mode;\n }\n}])\n\n.controller('UibDaypickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n this.step = { months: 1 };\n this.element = $element;\n function getDaysInMonth(year, month) {\n return month === 1 && year % 4 === 0 &&\n (year % 100 !== 0 || year % 400 === 0) ? 29 : DAYS_IN_MONTH[month];\n }\n\n this.init = function(ctrl) {\n angular.extend(ctrl, this);\n scope.showWeeks = ctrl.showWeeks;\n ctrl.refreshView();\n };\n\n this.getDates = function(startDate, n) {\n var dates = new Array(n), current = new Date(startDate), i = 0, date;\n while (i < n) {\n date = new Date(current);\n dates[i++] = date;\n current.setDate(current.getDate() + 1);\n }\n return dates;\n };\n\n this._refreshView = function() {\n var year = this.activeDate.getFullYear(),\n month = this.activeDate.getMonth(),\n firstDayOfMonth = new Date(this.activeDate);\n\n firstDayOfMonth.setFullYear(year, month, 1);\n\n var difference = this.startingDay - firstDayOfMonth.getDay(),\n numDisplayedFromPreviousMonth = difference > 0 ?\n 7 - difference : - difference,\n firstDate = new Date(firstDayOfMonth);\n\n if (numDisplayedFromPreviousMonth > 0) {\n firstDate.setDate(-numDisplayedFromPreviousMonth + 1);\n }\n\n // 42 is the number of days on a six-week calendar\n var days = this.getDates(firstDate, 42);\n for (var i = 0; i < 42; i ++) {\n days[i] = angular.extend(this.createDateObject(days[i], this.formatDay), {\n secondary: days[i].getMonth() !== month,\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.labels = new Array(7);\n for (var j = 0; j < 7; j++) {\n scope.labels[j] = {\n abbr: dateFilter(days[j].date, this.formatDayHeader),\n full: dateFilter(days[j].date, 'EEEE')\n };\n }\n\n scope.title = dateFilter(this.activeDate, this.formatDayTitle);\n scope.rows = this.split(days, 7);\n\n if (scope.showWeeks) {\n scope.weekNumbers = [];\n var thursdayIndex = (4 + 7 - this.startingDay) % 7,\n numWeeks = scope.rows.length;\n for (var curWeek = 0; curWeek < numWeeks; curWeek++) {\n scope.weekNumbers.push(\n getISO8601WeekNumber(scope.rows[curWeek][thursdayIndex].date));\n }\n }\n };\n\n this.compare = function(date1, date2) {\n var _date1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());\n var _date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n _date1.setFullYear(date1.getFullYear());\n _date2.setFullYear(date2.getFullYear());\n return _date1 - _date2;\n };\n\n function getISO8601WeekNumber(date) {\n var checkDate = new Date(date);\n checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\n var time = checkDate.getTime();\n checkDate.setMonth(0); // Compare with Jan 1\n checkDate.setDate(1);\n return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n }\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getDate();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - 7;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + 7;\n } else if (key === 'pageup' || key === 'pagedown') {\n var month = this.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\n this.activeDate.setMonth(month, 1);\n date = Math.min(getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth()), date);\n } else if (key === 'home') {\n date = 1;\n } else if (key === 'end') {\n date = getDaysInMonth(this.activeDate.getFullYear(), this.activeDate.getMonth());\n }\n this.activeDate.setDate(date);\n };\n}])\n\n.controller('UibMonthpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n this.step = { years: 1 };\n this.element = $element;\n\n this.init = function(ctrl) {\n angular.extend(ctrl, this);\n ctrl.refreshView();\n };\n\n this._refreshView = function() {\n var months = new Array(12),\n year = this.activeDate.getFullYear(),\n date;\n\n for (var i = 0; i < 12; i++) {\n date = new Date(this.activeDate);\n date.setFullYear(year, i, 1);\n months[i] = angular.extend(this.createDateObject(date, this.formatMonth), {\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.title = dateFilter(this.activeDate, this.formatMonthTitle);\n scope.rows = this.split(months, 3);\n };\n\n this.compare = function(date1, date2) {\n var _date1 = new Date(date1.getFullYear(), date1.getMonth());\n var _date2 = new Date(date2.getFullYear(), date2.getMonth());\n _date1.setFullYear(date1.getFullYear());\n _date2.setFullYear(date2.getFullYear());\n return _date1 - _date2;\n };\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getMonth();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - 3;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + 3;\n } else if (key === 'pageup' || key === 'pagedown') {\n var year = this.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\n this.activeDate.setFullYear(year);\n } else if (key === 'home') {\n date = 0;\n } else if (key === 'end') {\n date = 11;\n }\n this.activeDate.setMonth(date);\n };\n}])\n\n.controller('UibYearpickerController', ['$scope', '$element', 'dateFilter', function(scope, $element, dateFilter) {\n var columns, range;\n this.element = $element;\n\n function getStartingYear(year) {\n return parseInt((year - 1) / range, 10) * range + 1;\n }\n\n this.yearpickerInit = function() {\n columns = this.yearColumns;\n range = this.yearRows * columns;\n this.step = { years: range };\n };\n\n this._refreshView = function() {\n var years = new Array(range), date;\n\n for (var i = 0, start = getStartingYear(this.activeDate.getFullYear()); i < range; i++) {\n date = new Date(this.activeDate);\n date.setFullYear(start + i, 0, 1);\n years[i] = angular.extend(this.createDateObject(date, this.formatYear), {\n uid: scope.uniqueId + '-' + i\n });\n }\n\n scope.title = [years[0].label, years[range - 1].label].join(' - ');\n scope.rows = this.split(years, columns);\n scope.columns = columns;\n };\n\n this.compare = function(date1, date2) {\n return date1.getFullYear() - date2.getFullYear();\n };\n\n this.handleKeyDown = function(key, evt) {\n var date = this.activeDate.getFullYear();\n\n if (key === 'left') {\n date = date - 1;\n } else if (key === 'up') {\n date = date - columns;\n } else if (key === 'right') {\n date = date + 1;\n } else if (key === 'down') {\n date = date + columns;\n } else if (key === 'pageup' || key === 'pagedown') {\n date += (key === 'pageup' ? - 1 : 1) * range;\n } else if (key === 'home') {\n date = getStartingYear(this.activeDate.getFullYear());\n } else if (key === 'end') {\n date = getStartingYear(this.activeDate.getFullYear()) + range - 1;\n }\n this.activeDate.setFullYear(date);\n };\n}])\n\n.directive('uibDatepicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/datepicker.html';\n },\n scope: {\n datepickerOptions: '=?'\n },\n require: ['uibDatepicker', '^ngModel'],\n controller: 'UibDatepickerController',\n controllerAs: 'datepicker',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n datepickerCtrl.init(ngModelCtrl);\n }\n };\n})\n\n.directive('uibDaypicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/day.html';\n },\n require: ['^uibDatepicker', 'uibDaypicker'],\n controller: 'UibDaypickerController',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0],\n daypickerCtrl = ctrls[1];\n\n daypickerCtrl.init(datepickerCtrl);\n }\n };\n})\n\n.directive('uibMonthpicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/month.html';\n },\n require: ['^uibDatepicker', 'uibMonthpicker'],\n controller: 'UibMonthpickerController',\n link: function(scope, element, attrs, ctrls) {\n var datepickerCtrl = ctrls[0],\n monthpickerCtrl = ctrls[1];\n\n monthpickerCtrl.init(datepickerCtrl);\n }\n };\n})\n\n.directive('uibYearpicker', function() {\n return {\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepicker/year.html';\n },\n require: ['^uibDatepicker', 'uibYearpicker'],\n controller: 'UibYearpickerController',\n link: function(scope, element, attrs, ctrls) {\n var ctrl = ctrls[0];\n angular.extend(ctrl, ctrls[1]);\n ctrl.yearpickerInit();\n\n ctrl.refreshView();\n }\n };\n});\n\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods for working with the DOM.\n * It is meant to be used where we need to absolute-position elements in\n * relation to another element (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n .factory('$uibPosition', ['$document', '$window', function($document, $window) {\n /**\n * Used by scrollbarWidth() function to cache scrollbar's width.\n * Do not access this variable directly, use scrollbarWidth() instead.\n */\n var SCROLLBAR_WIDTH;\n /**\n * scrollbar on body and html element in IE and Edge overlay\n * content and should be considered 0 width.\n */\n var BODY_SCROLLBAR_WIDTH;\n var OVERFLOW_REGEX = {\n normal: /(auto|scroll)/,\n hidden: /(auto|scroll|hidden)/\n };\n var PLACEMENT_REGEX = {\n auto: /\\s?auto?\\s?/i,\n primary: /^(top|bottom|left|right)$/,\n secondary: /^(top|bottom|left|right|center)$/,\n vertical: /^(top|bottom)$/\n };\n var BODY_REGEX = /(HTML|BODY)/;\n\n return {\n\n /**\n * Provides a raw DOM element from a jQuery/jQLite element.\n *\n * @param {element} elem - The element to convert.\n *\n * @returns {element} A HTML element.\n */\n getRawNode: function(elem) {\n return elem.nodeName ? elem : elem[0] || elem;\n },\n\n /**\n * Provides a parsed number for a style property. Strips\n * units and casts invalid numbers to 0.\n *\n * @param {string} value - The style value to parse.\n *\n * @returns {number} A valid number.\n */\n parseStyle: function(value) {\n value = parseFloat(value);\n return isFinite(value) ? value : 0;\n },\n\n /**\n * Provides the closest positioned ancestor.\n *\n * @param {element} element - The element to get the offest parent for.\n *\n * @returns {element} The closest positioned ancestor.\n */\n offsetParent: function(elem) {\n elem = this.getRawNode(elem);\n\n var offsetParent = elem.offsetParent || $document[0].documentElement;\n\n function isStaticPositioned(el) {\n return ($window.getComputedStyle(el).position || 'static') === 'static';\n }\n\n while (offsetParent && offsetParent !== $document[0].documentElement && isStaticPositioned(offsetParent)) {\n offsetParent = offsetParent.offsetParent;\n }\n\n return offsetParent || $document[0].documentElement;\n },\n\n /**\n * Provides the scrollbar width, concept from TWBS measureScrollbar()\n * function in https://github.com/twbs/bootstrap/blob/master/js/modal.js\n * In IE and Edge, scollbar on body and html element overlay and should\n * return a width of 0.\n *\n * @returns {number} The width of the browser scollbar.\n */\n scrollbarWidth: function(isBody) {\n if (isBody) {\n if (angular.isUndefined(BODY_SCROLLBAR_WIDTH)) {\n var bodyElem = $document.find('body');\n bodyElem.addClass('uib-position-body-scrollbar-measure');\n BODY_SCROLLBAR_WIDTH = $window.innerWidth - bodyElem[0].clientWidth;\n BODY_SCROLLBAR_WIDTH = isFinite(BODY_SCROLLBAR_WIDTH) ? BODY_SCROLLBAR_WIDTH : 0;\n bodyElem.removeClass('uib-position-body-scrollbar-measure');\n }\n return BODY_SCROLLBAR_WIDTH;\n }\n\n if (angular.isUndefined(SCROLLBAR_WIDTH)) {\n var scrollElem = angular.element('
');\n $document.find('body').append(scrollElem);\n SCROLLBAR_WIDTH = scrollElem[0].offsetWidth - scrollElem[0].clientWidth;\n SCROLLBAR_WIDTH = isFinite(SCROLLBAR_WIDTH) ? SCROLLBAR_WIDTH : 0;\n scrollElem.remove();\n }\n\n return SCROLLBAR_WIDTH;\n },\n\n /**\n * Provides the padding required on an element to replace the scrollbar.\n *\n * @returns {object} An object with the following properties:\n * \n */\n scrollbarPadding: function(elem) {\n elem = this.getRawNode(elem);\n\n var elemStyle = $window.getComputedStyle(elem);\n var paddingRight = this.parseStyle(elemStyle.paddingRight);\n var paddingBottom = this.parseStyle(elemStyle.paddingBottom);\n var scrollParent = this.scrollParent(elem, false, true);\n var scrollbarWidth = this.scrollbarWidth(scrollParent, BODY_REGEX.test(scrollParent.tagName));\n\n return {\n scrollbarWidth: scrollbarWidth,\n widthOverflow: scrollParent.scrollWidth > scrollParent.clientWidth,\n right: paddingRight + scrollbarWidth,\n originalRight: paddingRight,\n heightOverflow: scrollParent.scrollHeight > scrollParent.clientHeight,\n bottom: paddingBottom + scrollbarWidth,\n originalBottom: paddingBottom\n };\n },\n\n /**\n * Checks to see if the element is scrollable.\n *\n * @param {element} elem - The element to check.\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n * default is false.\n *\n * @returns {boolean} Whether the element is scrollable.\n */\n isScrollable: function(elem, includeHidden) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var elemStyle = $window.getComputedStyle(elem);\n return overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX);\n },\n\n /**\n * Provides the closest scrollable ancestor.\n * A port of the jQuery UI scrollParent method:\n * https://github.com/jquery/jquery-ui/blob/master/ui/scroll-parent.js\n *\n * @param {element} elem - The element to find the scroll parent of.\n * @param {boolean=} [includeHidden=false] - Should scroll style of 'hidden' be considered,\n * default is false.\n * @param {boolean=} [includeSelf=false] - Should the element being passed be\n * included in the scrollable llokup.\n *\n * @returns {element} A HTML element.\n */\n scrollParent: function(elem, includeHidden, includeSelf) {\n elem = this.getRawNode(elem);\n\n var overflowRegex = includeHidden ? OVERFLOW_REGEX.hidden : OVERFLOW_REGEX.normal;\n var documentEl = $document[0].documentElement;\n var elemStyle = $window.getComputedStyle(elem);\n if (includeSelf && overflowRegex.test(elemStyle.overflow + elemStyle.overflowY + elemStyle.overflowX)) {\n return elem;\n }\n var excludeStatic = elemStyle.position === 'absolute';\n var scrollParent = elem.parentElement || documentEl;\n\n if (scrollParent === documentEl || elemStyle.position === 'fixed') {\n return documentEl;\n }\n\n while (scrollParent.parentElement && scrollParent !== documentEl) {\n var spStyle = $window.getComputedStyle(scrollParent);\n if (excludeStatic && spStyle.position !== 'static') {\n excludeStatic = false;\n }\n\n if (!excludeStatic && overflowRegex.test(spStyle.overflow + spStyle.overflowY + spStyle.overflowX)) {\n break;\n }\n scrollParent = scrollParent.parentElement;\n }\n\n return scrollParent;\n },\n\n /**\n * Provides read-only equivalent of jQuery's position function:\n * http://api.jquery.com/position/ - distance to closest positioned\n * ancestor. Does not account for margins by default like jQuery position.\n *\n * @param {element} elem - The element to caclulate the position on.\n * @param {boolean=} [includeMargins=false] - Should margins be accounted\n * for, default is false.\n *\n * @returns {object} An object with the following properties:\n * \n */\n position: function(elem, includeMagins) {\n elem = this.getRawNode(elem);\n\n var elemOffset = this.offset(elem);\n if (includeMagins) {\n var elemStyle = $window.getComputedStyle(elem);\n elemOffset.top -= this.parseStyle(elemStyle.marginTop);\n elemOffset.left -= this.parseStyle(elemStyle.marginLeft);\n }\n var parent = this.offsetParent(elem);\n var parentOffset = {top: 0, left: 0};\n\n if (parent !== $document[0].documentElement) {\n parentOffset = this.offset(parent);\n parentOffset.top += parent.clientTop - parent.scrollTop;\n parentOffset.left += parent.clientLeft - parent.scrollLeft;\n }\n\n return {\n width: Math.round(angular.isNumber(elemOffset.width) ? elemOffset.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemOffset.height) ? elemOffset.height : elem.offsetHeight),\n top: Math.round(elemOffset.top - parentOffset.top),\n left: Math.round(elemOffset.left - parentOffset.left)\n };\n },\n\n /**\n * Provides read-only equivalent of jQuery's offset function:\n * http://api.jquery.com/offset/ - distance to viewport. Does\n * not account for borders, margins, or padding on the body\n * element.\n *\n * @param {element} elem - The element to calculate the offset on.\n *\n * @returns {object} An object with the following properties:\n * \n */\n offset: function(elem) {\n elem = this.getRawNode(elem);\n\n var elemBCR = elem.getBoundingClientRect();\n return {\n width: Math.round(angular.isNumber(elemBCR.width) ? elemBCR.width : elem.offsetWidth),\n height: Math.round(angular.isNumber(elemBCR.height) ? elemBCR.height : elem.offsetHeight),\n top: Math.round(elemBCR.top + ($window.pageYOffset || $document[0].documentElement.scrollTop)),\n left: Math.round(elemBCR.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft))\n };\n },\n\n /**\n * Provides offset distance to the closest scrollable ancestor\n * or viewport. Accounts for border and scrollbar width.\n *\n * Right and bottom dimensions represent the distance to the\n * respective edge of the viewport element. If the element\n * edge extends beyond the viewport, a negative value will be\n * reported.\n *\n * @param {element} elem - The element to get the viewport offset for.\n * @param {boolean=} [useDocument=false] - Should the viewport be the document element instead\n * of the first scrollable element, default is false.\n * @param {boolean=} [includePadding=true] - Should the padding on the offset parent element\n * be accounted for, default is true.\n *\n * @returns {object} An object with the following properties:\n * \n */\n viewportOffset: function(elem, useDocument, includePadding) {\n elem = this.getRawNode(elem);\n includePadding = includePadding !== false ? true : false;\n\n var elemBCR = elem.getBoundingClientRect();\n var offsetBCR = {top: 0, left: 0, bottom: 0, right: 0};\n\n var offsetParent = useDocument ? $document[0].documentElement : this.scrollParent(elem);\n var offsetParentBCR = offsetParent.getBoundingClientRect();\n\n offsetBCR.top = offsetParentBCR.top + offsetParent.clientTop;\n offsetBCR.left = offsetParentBCR.left + offsetParent.clientLeft;\n if (offsetParent === $document[0].documentElement) {\n offsetBCR.top += $window.pageYOffset;\n offsetBCR.left += $window.pageXOffset;\n }\n offsetBCR.bottom = offsetBCR.top + offsetParent.clientHeight;\n offsetBCR.right = offsetBCR.left + offsetParent.clientWidth;\n\n if (includePadding) {\n var offsetParentStyle = $window.getComputedStyle(offsetParent);\n offsetBCR.top += this.parseStyle(offsetParentStyle.paddingTop);\n offsetBCR.bottom -= this.parseStyle(offsetParentStyle.paddingBottom);\n offsetBCR.left += this.parseStyle(offsetParentStyle.paddingLeft);\n offsetBCR.right -= this.parseStyle(offsetParentStyle.paddingRight);\n }\n\n return {\n top: Math.round(elemBCR.top - offsetBCR.top),\n bottom: Math.round(offsetBCR.bottom - elemBCR.bottom),\n left: Math.round(elemBCR.left - offsetBCR.left),\n right: Math.round(offsetBCR.right - elemBCR.right)\n };\n },\n\n /**\n * Provides an array of placement values parsed from a placement string.\n * Along with the 'auto' indicator, supported placement strings are:\n * \n * A placement string with an 'auto' indicator is expected to be\n * space separated from the placement, i.e: 'auto bottom-left' If\n * the primary and secondary placement values do not match 'top,\n * bottom, left, right' then 'top' will be the primary placement and\n * 'center' will be the secondary placement. If 'auto' is passed, true\n * will be returned as the 3rd value of the array.\n *\n * @param {string} placement - The placement string to parse.\n *\n * @returns {array} An array with the following values\n * \n */\n parsePlacement: function(placement) {\n var autoPlace = PLACEMENT_REGEX.auto.test(placement);\n if (autoPlace) {\n placement = placement.replace(PLACEMENT_REGEX.auto, '');\n }\n\n placement = placement.split('-');\n\n placement[0] = placement[0] || 'top';\n if (!PLACEMENT_REGEX.primary.test(placement[0])) {\n placement[0] = 'top';\n }\n\n placement[1] = placement[1] || 'center';\n if (!PLACEMENT_REGEX.secondary.test(placement[1])) {\n placement[1] = 'center';\n }\n\n if (autoPlace) {\n placement[2] = true;\n } else {\n placement[2] = false;\n }\n\n return placement;\n },\n\n /**\n * Provides coordinates for an element to be positioned relative to\n * another element. Passing 'auto' as part of the placement parameter\n * will enable smart placement - where the element fits. i.e:\n * 'auto left-top' will check to see if there is enough space to the left\n * of the hostElem to fit the targetElem, if not place right (same for secondary\n * top placement). Available space is calculated using the viewportOffset\n * function.\n *\n * @param {element} hostElem - The element to position against.\n * @param {element} targetElem - The element to position.\n * @param {string=} [placement=top] - The placement for the targetElem,\n * default is 'top'. 'center' is assumed as secondary placement for\n * 'top', 'left', 'right', and 'bottom' placements. Available placements are:\n * \n * @param {boolean=} [appendToBody=false] - Should the top and left values returned\n * be calculated from the body element, default is false.\n *\n * @returns {object} An object with the following properties:\n * \n */\n positionElements: function(hostElem, targetElem, placement, appendToBody) {\n hostElem = this.getRawNode(hostElem);\n targetElem = this.getRawNode(targetElem);\n\n // need to read from prop to support tests.\n var targetWidth = angular.isDefined(targetElem.offsetWidth) ? targetElem.offsetWidth : targetElem.prop('offsetWidth');\n var targetHeight = angular.isDefined(targetElem.offsetHeight) ? targetElem.offsetHeight : targetElem.prop('offsetHeight');\n\n placement = this.parsePlacement(placement);\n\n var hostElemPos = appendToBody ? this.offset(hostElem) : this.position(hostElem);\n var targetElemPos = {top: 0, left: 0, placement: ''};\n\n if (placement[2]) {\n var viewportOffset = this.viewportOffset(hostElem, appendToBody);\n\n var targetElemStyle = $window.getComputedStyle(targetElem);\n var adjustedSize = {\n width: targetWidth + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginLeft) + this.parseStyle(targetElemStyle.marginRight))),\n height: targetHeight + Math.round(Math.abs(this.parseStyle(targetElemStyle.marginTop) + this.parseStyle(targetElemStyle.marginBottom)))\n };\n\n placement[0] = placement[0] === 'top' && adjustedSize.height > viewportOffset.top && adjustedSize.height <= viewportOffset.bottom ? 'bottom' :\n placement[0] === 'bottom' && adjustedSize.height > viewportOffset.bottom && adjustedSize.height <= viewportOffset.top ? 'top' :\n placement[0] === 'left' && adjustedSize.width > viewportOffset.left && adjustedSize.width <= viewportOffset.right ? 'right' :\n placement[0] === 'right' && adjustedSize.width > viewportOffset.right && adjustedSize.width <= viewportOffset.left ? 'left' :\n placement[0];\n\n placement[1] = placement[1] === 'top' && adjustedSize.height - hostElemPos.height > viewportOffset.bottom && adjustedSize.height - hostElemPos.height <= viewportOffset.top ? 'bottom' :\n placement[1] === 'bottom' && adjustedSize.height - hostElemPos.height > viewportOffset.top && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom ? 'top' :\n placement[1] === 'left' && adjustedSize.width - hostElemPos.width > viewportOffset.right && adjustedSize.width - hostElemPos.width <= viewportOffset.left ? 'right' :\n placement[1] === 'right' && adjustedSize.width - hostElemPos.width > viewportOffset.left && adjustedSize.width - hostElemPos.width <= viewportOffset.right ? 'left' :\n placement[1];\n\n if (placement[1] === 'center') {\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n var xOverflow = hostElemPos.width / 2 - targetWidth / 2;\n if (viewportOffset.left + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.right) {\n placement[1] = 'left';\n } else if (viewportOffset.right + xOverflow < 0 && adjustedSize.width - hostElemPos.width <= viewportOffset.left) {\n placement[1] = 'right';\n }\n } else {\n var yOverflow = hostElemPos.height / 2 - adjustedSize.height / 2;\n if (viewportOffset.top + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.bottom) {\n placement[1] = 'top';\n } else if (viewportOffset.bottom + yOverflow < 0 && adjustedSize.height - hostElemPos.height <= viewportOffset.top) {\n placement[1] = 'bottom';\n }\n }\n }\n }\n\n switch (placement[0]) {\n case 'top':\n targetElemPos.top = hostElemPos.top - targetHeight;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left - targetWidth;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width;\n break;\n }\n\n switch (placement[1]) {\n case 'top':\n targetElemPos.top = hostElemPos.top;\n break;\n case 'bottom':\n targetElemPos.top = hostElemPos.top + hostElemPos.height - targetHeight;\n break;\n case 'left':\n targetElemPos.left = hostElemPos.left;\n break;\n case 'right':\n targetElemPos.left = hostElemPos.left + hostElemPos.width - targetWidth;\n break;\n case 'center':\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n targetElemPos.left = hostElemPos.left + hostElemPos.width / 2 - targetWidth / 2;\n } else {\n targetElemPos.top = hostElemPos.top + hostElemPos.height / 2 - targetHeight / 2;\n }\n break;\n }\n\n targetElemPos.top = Math.round(targetElemPos.top);\n targetElemPos.left = Math.round(targetElemPos.left);\n targetElemPos.placement = placement[1] === 'center' ? placement[0] : placement[0] + '-' + placement[1];\n\n return targetElemPos;\n },\n\n /**\n * Provides a way for positioning tooltip & dropdown\n * arrows when using placement options beyond the standard\n * left, right, top, or bottom.\n *\n * @param {element} elem - The tooltip/dropdown element.\n * @param {string} placement - The placement for the elem.\n */\n positionArrow: function(elem, placement) {\n elem = this.getRawNode(elem);\n\n var innerElem = elem.querySelector('.tooltip-inner, .popover-inner');\n if (!innerElem) {\n return;\n }\n\n var isTooltip = angular.element(innerElem).hasClass('tooltip-inner');\n\n var arrowElem = isTooltip ? elem.querySelector('.tooltip-arrow') : elem.querySelector('.arrow');\n if (!arrowElem) {\n return;\n }\n\n var arrowCss = {\n top: '',\n bottom: '',\n left: '',\n right: ''\n };\n\n placement = this.parsePlacement(placement);\n if (placement[1] === 'center') {\n // no adjustment necessary - just reset styles\n angular.element(arrowElem).css(arrowCss);\n return;\n }\n\n var borderProp = 'border-' + placement[0] + '-width';\n var borderWidth = $window.getComputedStyle(arrowElem)[borderProp];\n\n var borderRadiusProp = 'border-';\n if (PLACEMENT_REGEX.vertical.test(placement[0])) {\n borderRadiusProp += placement[0] + '-' + placement[1];\n } else {\n borderRadiusProp += placement[1] + '-' + placement[0];\n }\n borderRadiusProp += '-radius';\n var borderRadius = $window.getComputedStyle(isTooltip ? innerElem : elem)[borderRadiusProp];\n\n switch (placement[0]) {\n case 'top':\n arrowCss.bottom = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'bottom':\n arrowCss.top = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'left':\n arrowCss.right = isTooltip ? '0' : '-' + borderWidth;\n break;\n case 'right':\n arrowCss.left = isTooltip ? '0' : '-' + borderWidth;\n break;\n }\n\n arrowCss[placement[1]] = borderRadius;\n\n angular.element(arrowElem).css(arrowCss);\n }\n };\n }]);\n\nangular.module('ui.bootstrap.datepickerPopup', ['ui.bootstrap.datepicker', 'ui.bootstrap.position'])\n\n.value('$datepickerPopupLiteralWarning', true)\n\n.constant('uibDatepickerPopupConfig', {\n altInputFormats: [],\n appendToBody: false,\n clearText: 'Clear',\n closeOnDateSelection: true,\n closeText: 'Done',\n currentText: 'Today',\n datepickerPopup: 'yyyy-MM-dd',\n datepickerPopupTemplateUrl: 'uib/template/datepickerPopup/popup.html',\n datepickerTemplateUrl: 'uib/template/datepicker/datepicker.html',\n html5Types: {\n date: 'yyyy-MM-dd',\n 'datetime-local': 'yyyy-MM-ddTHH:mm:ss.sss',\n 'month': 'yyyy-MM'\n },\n onOpenFocus: true,\n showButtonBar: true,\n placement: 'auto bottom-left'\n})\n\n.controller('UibDatepickerPopupController', ['$scope', '$element', '$attrs', '$compile', '$log', '$parse', '$window', '$document', '$rootScope', '$uibPosition', 'dateFilter', 'uibDateParser', 'uibDatepickerPopupConfig', '$timeout', 'uibDatepickerConfig', '$datepickerPopupLiteralWarning',\nfunction($scope, $element, $attrs, $compile, $log, $parse, $window, $document, $rootScope, $position, dateFilter, dateParser, datepickerPopupConfig, $timeout, datepickerConfig, $datepickerPopupLiteralWarning) {\n var cache = {},\n isHtml5DateInput = false;\n var dateFormat, closeOnDateSelection, appendToBody, onOpenFocus,\n datepickerPopupTemplateUrl, datepickerTemplateUrl, popupEl, datepickerEl, scrollParentEl,\n ngModel, ngModelOptions, $popup, altInputFormats, watchListeners = [],\n timezone;\n\n this.init = function(_ngModel_) {\n ngModel = _ngModel_;\n ngModelOptions = _ngModel_.$options;\n closeOnDateSelection = angular.isDefined($attrs.closeOnDateSelection) ?\n $scope.$parent.$eval($attrs.closeOnDateSelection) :\n datepickerPopupConfig.closeOnDateSelection;\n appendToBody = angular.isDefined($attrs.datepickerAppendToBody) ?\n $scope.$parent.$eval($attrs.datepickerAppendToBody) :\n datepickerPopupConfig.appendToBody;\n onOpenFocus = angular.isDefined($attrs.onOpenFocus) ?\n $scope.$parent.$eval($attrs.onOpenFocus) : datepickerPopupConfig.onOpenFocus;\n datepickerPopupTemplateUrl = angular.isDefined($attrs.datepickerPopupTemplateUrl) ?\n $attrs.datepickerPopupTemplateUrl :\n datepickerPopupConfig.datepickerPopupTemplateUrl;\n datepickerTemplateUrl = angular.isDefined($attrs.datepickerTemplateUrl) ?\n $attrs.datepickerTemplateUrl : datepickerPopupConfig.datepickerTemplateUrl;\n altInputFormats = angular.isDefined($attrs.altInputFormats) ?\n $scope.$parent.$eval($attrs.altInputFormats) :\n datepickerPopupConfig.altInputFormats;\n\n $scope.showButtonBar = angular.isDefined($attrs.showButtonBar) ?\n $scope.$parent.$eval($attrs.showButtonBar) :\n datepickerPopupConfig.showButtonBar;\n\n if (datepickerPopupConfig.html5Types[$attrs.type]) {\n dateFormat = datepickerPopupConfig.html5Types[$attrs.type];\n isHtml5DateInput = true;\n } else {\n dateFormat = $attrs.uibDatepickerPopup || datepickerPopupConfig.datepickerPopup;\n $attrs.$observe('uibDatepickerPopup', function(value, oldValue) {\n var newDateFormat = value || datepickerPopupConfig.datepickerPopup;\n // Invalidate the $modelValue to ensure that formatters re-run\n // FIXME: Refactor when PR is merged: https://github.com/angular/angular.js/pull/10764\n if (newDateFormat !== dateFormat) {\n dateFormat = newDateFormat;\n ngModel.$modelValue = null;\n\n if (!dateFormat) {\n throw new Error('uibDatepickerPopup must have a date format specified.');\n }\n }\n });\n }\n\n if (!dateFormat) {\n throw new Error('uibDatepickerPopup must have a date format specified.');\n }\n\n if (isHtml5DateInput && $attrs.uibDatepickerPopup) {\n throw new Error('HTML5 date input types do not support custom formats.');\n }\n\n // popup element used to display calendar\n popupEl = angular.element('
');\n if (ngModelOptions) {\n timezone = ngModelOptions.timezone;\n $scope.ngModelOptions = angular.copy(ngModelOptions);\n $scope.ngModelOptions.timezone = null;\n if ($scope.ngModelOptions.updateOnDefault === true) {\n $scope.ngModelOptions.updateOn = $scope.ngModelOptions.updateOn ?\n $scope.ngModelOptions.updateOn + ' default' : 'default';\n }\n\n popupEl.attr('ng-model-options', 'ngModelOptions');\n } else {\n timezone = null;\n }\n\n popupEl.attr({\n 'ng-model': 'date',\n 'ng-change': 'dateSelection(date)',\n 'template-url': datepickerPopupTemplateUrl\n });\n\n // datepicker element\n datepickerEl = angular.element(popupEl.children()[0]);\n datepickerEl.attr('template-url', datepickerTemplateUrl);\n\n if (!$scope.datepickerOptions) {\n $scope.datepickerOptions = {};\n }\n\n if (isHtml5DateInput) {\n if ($attrs.type === 'month') {\n $scope.datepickerOptions.datepickerMode = 'month';\n $scope.datepickerOptions.minMode = 'month';\n }\n }\n\n datepickerEl.attr('datepicker-options', 'datepickerOptions');\n\n if (!isHtml5DateInput) {\n // Internal API to maintain the correct ng-invalid-[key] class\n ngModel.$$parserName = 'date';\n ngModel.$validators.date = validator;\n ngModel.$parsers.unshift(parseDate);\n ngModel.$formatters.push(function(value) {\n if (ngModel.$isEmpty(value)) {\n $scope.date = value;\n return value;\n }\n\n if (angular.isNumber(value)) {\n value = new Date(value);\n }\n\n $scope.date = dateParser.fromTimezone(value, timezone);\n\n return dateParser.filter($scope.date, dateFormat);\n });\n } else {\n ngModel.$formatters.push(function(value) {\n $scope.date = dateParser.fromTimezone(value, timezone);\n return value;\n });\n }\n\n // Detect changes in the view from the text box\n ngModel.$viewChangeListeners.push(function() {\n $scope.date = parseDateString(ngModel.$viewValue);\n });\n\n $element.on('keydown', inputKeydownBind);\n\n $popup = $compile(popupEl)($scope);\n // Prevent jQuery cache memory leak (template is now redundant after linking)\n popupEl.remove();\n\n if (appendToBody) {\n $document.find('body').append($popup);\n } else {\n $element.after($popup);\n }\n\n $scope.$on('$destroy', function() {\n if ($scope.isOpen === true) {\n if (!$rootScope.$$phase) {\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n }\n }\n\n $popup.remove();\n $element.off('keydown', inputKeydownBind);\n $document.off('click', documentClickBind);\n if (scrollParentEl) {\n scrollParentEl.off('scroll', positionPopup);\n }\n angular.element($window).off('resize', positionPopup);\n\n //Clear all watch listeners on destroy\n while (watchListeners.length) {\n watchListeners.shift()();\n }\n });\n };\n\n $scope.getText = function(key) {\n return $scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\n };\n\n $scope.isDisabled = function(date) {\n if (date === 'today') {\n date = dateParser.fromTimezone(new Date(), timezone);\n }\n\n var dates = {};\n angular.forEach(['minDate', 'maxDate'], function(key) {\n if (!$scope.datepickerOptions[key]) {\n dates[key] = null;\n } else if (angular.isDate($scope.datepickerOptions[key])) {\n dates[key] = dateParser.fromTimezone(new Date($scope.datepickerOptions[key]), timezone);\n } else {\n if ($datepickerPopupLiteralWarning) {\n $log.warn('Literal date support has been deprecated, please switch to date object usage');\n }\n\n dates[key] = new Date(dateFilter($scope.datepickerOptions[key], 'medium'));\n }\n });\n\n return $scope.datepickerOptions &&\n dates.minDate && $scope.compare(date, dates.minDate) < 0 ||\n dates.maxDate && $scope.compare(date, dates.maxDate) > 0;\n };\n\n $scope.compare = function(date1, date2) {\n return new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()) - new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());\n };\n\n // Inner change\n $scope.dateSelection = function(dt) {\n if (angular.isDefined(dt)) {\n $scope.date = dt;\n }\n var date = $scope.date ? dateParser.filter($scope.date, dateFormat) : null; // Setting to NULL is necessary for form validators to function\n $element.val(date);\n ngModel.$setViewValue(date);\n\n if (closeOnDateSelection) {\n $scope.isOpen = false;\n $element[0].focus();\n }\n };\n\n $scope.keydown = function(evt) {\n if (evt.which === 27) {\n evt.stopPropagation();\n $scope.isOpen = false;\n $element[0].focus();\n }\n };\n\n $scope.select = function(date, evt) {\n evt.stopPropagation();\n\n if (date === 'today') {\n var today = new Date();\n if (angular.isDate($scope.date)) {\n date = new Date($scope.date);\n date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\n } else {\n date = new Date(today.setHours(0, 0, 0, 0));\n }\n }\n $scope.dateSelection(date);\n };\n\n $scope.close = function(evt) {\n evt.stopPropagation();\n\n $scope.isOpen = false;\n $element[0].focus();\n };\n\n $scope.disabled = angular.isDefined($attrs.disabled) || false;\n if ($attrs.ngDisabled) {\n watchListeners.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(disabled) {\n $scope.disabled = disabled;\n }));\n }\n\n $scope.$watch('isOpen', function(value) {\n if (value) {\n if (!$scope.disabled) {\n $timeout(function() {\n positionPopup();\n\n if (onOpenFocus) {\n $scope.$broadcast('uib:datepicker.focus');\n }\n\n $document.on('click', documentClickBind);\n\n var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n if (appendToBody || $position.parsePlacement(placement)[2]) {\n scrollParentEl = scrollParentEl || angular.element($position.scrollParent($element));\n if (scrollParentEl) {\n scrollParentEl.on('scroll', positionPopup);\n }\n } else {\n scrollParentEl = null;\n }\n\n angular.element($window).on('resize', positionPopup);\n }, 0, false);\n } else {\n $scope.isOpen = false;\n }\n } else {\n $document.off('click', documentClickBind);\n if (scrollParentEl) {\n scrollParentEl.off('scroll', positionPopup);\n }\n angular.element($window).off('resize', positionPopup);\n }\n });\n\n function cameltoDash(string) {\n return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\n }\n\n function parseDateString(viewValue) {\n var date = dateParser.parse(viewValue, dateFormat, $scope.date);\n if (isNaN(date)) {\n for (var i = 0; i < altInputFormats.length; i++) {\n date = dateParser.parse(viewValue, altInputFormats[i], $scope.date);\n if (!isNaN(date)) {\n return date;\n }\n }\n }\n return date;\n }\n\n function parseDate(viewValue) {\n if (angular.isNumber(viewValue)) {\n // presumably timestamp to date object\n viewValue = new Date(viewValue);\n }\n\n if (!viewValue) {\n return null;\n }\n\n if (angular.isDate(viewValue) && !isNaN(viewValue)) {\n return viewValue;\n }\n\n if (angular.isString(viewValue)) {\n var date = parseDateString(viewValue);\n if (!isNaN(date)) {\n return dateParser.toTimezone(date, timezone);\n }\n }\n\n return ngModel.$options && ngModel.$options.allowInvalid ? viewValue : undefined;\n }\n\n function validator(modelValue, viewValue) {\n var value = modelValue || viewValue;\n\n if (!$attrs.ngRequired && !value) {\n return true;\n }\n\n if (angular.isNumber(value)) {\n value = new Date(value);\n }\n\n if (!value) {\n return true;\n }\n\n if (angular.isDate(value) && !isNaN(value)) {\n return true;\n }\n\n if (angular.isString(value)) {\n return !isNaN(parseDateString(viewValue));\n }\n\n return false;\n }\n\n function documentClickBind(event) {\n if (!$scope.isOpen && $scope.disabled) {\n return;\n }\n\n var popup = $popup[0];\n var dpContainsTarget = $element[0].contains(event.target);\n // The popup node may not be an element node\n // In some browsers (IE) only element nodes have the 'contains' function\n var popupContainsTarget = popup.contains !== undefined && popup.contains(event.target);\n if ($scope.isOpen && !(dpContainsTarget || popupContainsTarget)) {\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n }\n }\n\n function inputKeydownBind(evt) {\n if (evt.which === 27 && $scope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.$apply(function() {\n $scope.isOpen = false;\n });\n $element[0].focus();\n } else if (evt.which === 40 && !$scope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.$apply(function() {\n $scope.isOpen = true;\n });\n }\n }\n\n function positionPopup() {\n if ($scope.isOpen) {\n var dpElement = angular.element($popup[0].querySelector('.uib-datepicker-popup'));\n var placement = $attrs.popupPlacement ? $attrs.popupPlacement : datepickerPopupConfig.placement;\n var position = $position.positionElements($element, dpElement, placement, appendToBody);\n dpElement.css({top: position.top + 'px', left: position.left + 'px'});\n if (dpElement.hasClass('uib-position-measure')) {\n dpElement.removeClass('uib-position-measure');\n }\n }\n }\n\n $scope.$on('uib:datepicker.mode', function() {\n $timeout(positionPopup, 0, false);\n });\n}])\n\n.directive('uibDatepickerPopup', function() {\n return {\n require: ['ngModel', 'uibDatepickerPopup'],\n controller: 'UibDatepickerPopupController',\n scope: {\n datepickerOptions: '=?',\n isOpen: '=?',\n currentText: '@',\n clearText: '@',\n closeText: '@'\n },\n link: function(scope, element, attrs, ctrls) {\n var ngModel = ctrls[0],\n ctrl = ctrls[1];\n\n ctrl.init(ngModel);\n }\n };\n})\n\n.directive('uibDatepickerPopupWrap', function() {\n return {\n replace: true,\n transclude: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/datepickerPopup/popup.html';\n }\n };\n});\n\nangular.module('ui.bootstrap.debounce', [])\n/**\n * A helper, internal service that debounces a function\n */\n .factory('$$debounce', ['$timeout', function($timeout) {\n return function(callback, debounceTime) {\n var timeoutPromise;\n\n return function() {\n var self = this;\n var args = Array.prototype.slice.call(arguments);\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n\n timeoutPromise = $timeout(function() {\n callback.apply(self, args);\n }, debounceTime);\n };\n };\n }]);\n\nangular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])\n\n.constant('uibDropdownConfig', {\n appendToOpenClass: 'uib-dropdown-open',\n openClass: 'open'\n})\n\n.service('uibDropdownService', ['$document', '$rootScope', function($document, $rootScope) {\n var openScope = null;\n\n this.open = function(dropdownScope, element) {\n if (!openScope) {\n $document.on('click', closeDropdown);\n element.on('keydown', keybindFilter);\n }\n\n if (openScope && openScope !== dropdownScope) {\n openScope.isOpen = false;\n }\n\n openScope = dropdownScope;\n };\n\n this.close = function(dropdownScope, element) {\n if (openScope === dropdownScope) {\n openScope = null;\n $document.off('click', closeDropdown);\n element.off('keydown', keybindFilter);\n }\n };\n\n var closeDropdown = function(evt) {\n // This method may still be called during the same mouse event that\n // unbound this event handler. So check openScope before proceeding.\n if (!openScope) { return; }\n\n if (evt && openScope.getAutoClose() === 'disabled') { return; }\n\n if (evt && evt.which === 3) { return; }\n\n var toggleElement = openScope.getToggleElement();\n if (evt && toggleElement && toggleElement[0].contains(evt.target)) {\n return;\n }\n\n var dropdownElement = openScope.getDropdownElement();\n if (evt && openScope.getAutoClose() === 'outsideClick' &&\n dropdownElement && dropdownElement[0].contains(evt.target)) {\n return;\n }\n\n openScope.isOpen = false;\n\n if (!$rootScope.$$phase) {\n openScope.$apply();\n }\n };\n\n var keybindFilter = function(evt) {\n if (evt.which === 27) {\n evt.stopPropagation();\n openScope.focusToggleElement();\n closeDropdown();\n } else if (openScope.isKeynavEnabled() && [38, 40].indexOf(evt.which) !== -1 && openScope.isOpen) {\n evt.preventDefault();\n evt.stopPropagation();\n openScope.focusDropdownEntry(evt.which);\n }\n };\n}])\n\n.controller('UibDropdownController', ['$scope', '$element', '$attrs', '$parse', 'uibDropdownConfig', 'uibDropdownService', '$animate', '$uibPosition', '$document', '$compile', '$templateRequest', function($scope, $element, $attrs, $parse, dropdownConfig, uibDropdownService, $animate, $position, $document, $compile, $templateRequest) {\n var self = this,\n scope = $scope.$new(), // create a child scope so we are not polluting original one\n templateScope,\n appendToOpenClass = dropdownConfig.appendToOpenClass,\n openClass = dropdownConfig.openClass,\n getIsOpen,\n setIsOpen = angular.noop,\n toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop,\n appendToBody = false,\n appendTo = null,\n keynavEnabled = false,\n selectedOption = null,\n body = $document.find('body');\n\n $element.addClass('dropdown');\n\n this.init = function() {\n if ($attrs.isOpen) {\n getIsOpen = $parse($attrs.isOpen);\n setIsOpen = getIsOpen.assign;\n\n $scope.$watch(getIsOpen, function(value) {\n scope.isOpen = !!value;\n });\n }\n\n if (angular.isDefined($attrs.dropdownAppendTo)) {\n var appendToEl = $parse($attrs.dropdownAppendTo)(scope);\n if (appendToEl) {\n appendTo = angular.element(appendToEl);\n }\n }\n\n appendToBody = angular.isDefined($attrs.dropdownAppendToBody);\n keynavEnabled = angular.isDefined($attrs.keyboardNav);\n\n if (appendToBody && !appendTo) {\n appendTo = body;\n }\n\n if (appendTo && self.dropdownMenu) {\n appendTo.append(self.dropdownMenu);\n $element.on('$destroy', function handleDestroyEvent() {\n self.dropdownMenu.remove();\n });\n }\n };\n\n this.toggle = function(open) {\n scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n if (angular.isFunction(setIsOpen)) {\n setIsOpen(scope, scope.isOpen);\n }\n\n return scope.isOpen;\n };\n\n // Allow other directives to watch status\n this.isOpen = function() {\n return scope.isOpen;\n };\n\n scope.getToggleElement = function() {\n return self.toggleElement;\n };\n\n scope.getAutoClose = function() {\n return $attrs.autoClose || 'always'; //or 'outsideClick' or 'disabled'\n };\n\n scope.getElement = function() {\n return $element;\n };\n\n scope.isKeynavEnabled = function() {\n return keynavEnabled;\n };\n\n scope.focusDropdownEntry = function(keyCode) {\n var elems = self.dropdownMenu ? //If append to body is used.\n angular.element(self.dropdownMenu).find('a') :\n $element.find('ul').eq(0).find('a');\n\n switch (keyCode) {\n case 40: {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = 0;\n } else {\n self.selectedOption = self.selectedOption === elems.length - 1 ?\n self.selectedOption :\n self.selectedOption + 1;\n }\n break;\n }\n case 38: {\n if (!angular.isNumber(self.selectedOption)) {\n self.selectedOption = elems.length - 1;\n } else {\n self.selectedOption = self.selectedOption === 0 ?\n 0 : self.selectedOption - 1;\n }\n break;\n }\n }\n elems[self.selectedOption].focus();\n };\n\n scope.getDropdownElement = function() {\n return self.dropdownMenu;\n };\n\n scope.focusToggleElement = function() {\n if (self.toggleElement) {\n self.toggleElement[0].focus();\n }\n };\n\n scope.$watch('isOpen', function(isOpen, wasOpen) {\n if (appendTo && self.dropdownMenu) {\n var pos = $position.positionElements($element, self.dropdownMenu, 'bottom-left', true),\n css,\n rightalign,\n scrollbarWidth;\n\n css = {\n top: pos.top + 'px',\n display: isOpen ? 'block' : 'none'\n };\n\n rightalign = self.dropdownMenu.hasClass('dropdown-menu-right');\n if (!rightalign) {\n css.left = pos.left + 'px';\n css.right = 'auto';\n } else {\n css.left = 'auto';\n scrollbarWidth = $position.scrollbarWidth(true);\n css.right = window.innerWidth - scrollbarWidth -\n (pos.left + $element.prop('offsetWidth')) + 'px';\n }\n\n // Need to adjust our positioning to be relative to the appendTo container\n // if it's not the body element\n if (!appendToBody) {\n var appendOffset = $position.offset(appendTo);\n\n css.top = pos.top - appendOffset.top + 'px';\n\n if (!rightalign) {\n css.left = pos.left - appendOffset.left + 'px';\n } else {\n css.right = window.innerWidth -\n (pos.left - appendOffset.left + $element.prop('offsetWidth')) + 'px';\n }\n }\n\n self.dropdownMenu.css(css);\n }\n\n var openContainer = appendTo ? appendTo : $element;\n var hasOpenClass = openContainer.hasClass(appendTo ? appendToOpenClass : openClass);\n\n if (hasOpenClass === !isOpen) {\n $animate[isOpen ? 'addClass' : 'removeClass'](openContainer, appendTo ? appendToOpenClass : openClass).then(function() {\n if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n toggleInvoker($scope, { open: !!isOpen });\n }\n });\n }\n\n if (isOpen) {\n if (self.dropdownMenuTemplateUrl) {\n $templateRequest(self.dropdownMenuTemplateUrl).then(function(tplContent) {\n templateScope = scope.$new();\n $compile(tplContent.trim())(templateScope, function(dropdownElement) {\n var newEl = dropdownElement;\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n });\n });\n }\n\n scope.focusToggleElement();\n uibDropdownService.open(scope, $element);\n } else {\n if (self.dropdownMenuTemplateUrl) {\n if (templateScope) {\n templateScope.$destroy();\n }\n var newEl = angular.element('');\n self.dropdownMenu.replaceWith(newEl);\n self.dropdownMenu = newEl;\n }\n\n uibDropdownService.close(scope, $element);\n self.selectedOption = null;\n }\n\n if (angular.isFunction(setIsOpen)) {\n setIsOpen($scope, isOpen);\n }\n });\n}])\n\n.directive('uibDropdown', function() {\n return {\n controller: 'UibDropdownController',\n link: function(scope, element, attrs, dropdownCtrl) {\n dropdownCtrl.init();\n }\n };\n})\n\n.directive('uibDropdownMenu', function() {\n return {\n restrict: 'A',\n require: '?^uibDropdown',\n link: function(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl || angular.isDefined(attrs.dropdownNested)) {\n return;\n }\n\n element.addClass('dropdown-menu');\n\n var tplUrl = attrs.templateUrl;\n if (tplUrl) {\n dropdownCtrl.dropdownMenuTemplateUrl = tplUrl;\n }\n\n if (!dropdownCtrl.dropdownMenu) {\n dropdownCtrl.dropdownMenu = element;\n }\n }\n };\n})\n\n.directive('uibDropdownToggle', function() {\n return {\n require: '?^uibDropdown',\n link: function(scope, element, attrs, dropdownCtrl) {\n if (!dropdownCtrl) {\n return;\n }\n\n element.addClass('dropdown-toggle');\n\n dropdownCtrl.toggleElement = element;\n\n var toggleDropdown = function(event) {\n event.preventDefault();\n\n if (!element.hasClass('disabled') && !attrs.disabled) {\n scope.$apply(function() {\n dropdownCtrl.toggle();\n });\n }\n };\n\n element.bind('click', toggleDropdown);\n\n // WAI-ARIA\n element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n scope.$watch(dropdownCtrl.isOpen, function(isOpen) {\n element.attr('aria-expanded', !!isOpen);\n });\n\n scope.$on('$destroy', function() {\n element.unbind('click', toggleDropdown);\n });\n }\n };\n});\n\nangular.module('ui.bootstrap.stackedMap', [])\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n .factory('$$stackedMap', function() {\n return {\n createNew: function() {\n var stack = [];\n\n return {\n add: function(key, value) {\n stack.push({\n key: key,\n value: value\n });\n },\n get: function(key) {\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n return stack[i];\n }\n }\n },\n keys: function() {\n var keys = [];\n for (var i = 0; i < stack.length; i++) {\n keys.push(stack[i].key);\n }\n return keys;\n },\n top: function() {\n return stack[stack.length - 1];\n },\n remove: function(key) {\n var idx = -1;\n for (var i = 0; i < stack.length; i++) {\n if (key === stack[i].key) {\n idx = i;\n break;\n }\n }\n return stack.splice(idx, 1)[0];\n },\n removeTop: function() {\n return stack.splice(stack.length - 1, 1)[0];\n },\n length: function() {\n return stack.length;\n }\n };\n }\n };\n });\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.position'])\n/**\n * A helper, internal data structure that stores all references attached to key\n */\n .factory('$$multiMap', function() {\n return {\n createNew: function() {\n var map = {};\n\n return {\n entries: function() {\n return Object.keys(map).map(function(key) {\n return {\n key: key,\n value: map[key]\n };\n });\n },\n get: function(key) {\n return map[key];\n },\n hasKey: function(key) {\n return !!map[key];\n },\n keys: function() {\n return Object.keys(map);\n },\n put: function(key, value) {\n if (!map[key]) {\n map[key] = [];\n }\n\n map[key].push(value);\n },\n remove: function(key, value) {\n var values = map[key];\n\n if (!values) {\n return;\n }\n\n var idx = values.indexOf(value);\n\n if (idx !== -1) {\n values.splice(idx, 1);\n }\n\n if (!values.length) {\n delete map[key];\n }\n }\n };\n }\n };\n })\n\n/**\n * Pluggable resolve mechanism for the modal resolve resolution\n * Supports UI Router's $resolve service\n */\n .provider('$uibResolve', function() {\n var resolve = this;\n this.resolver = null;\n\n this.setResolver = function(resolver) {\n this.resolver = resolver;\n };\n\n this.$get = ['$injector', '$q', function($injector, $q) {\n var resolver = resolve.resolver ? $injector.get(resolve.resolver) : null;\n return {\n resolve: function(invocables, locals, parent, self) {\n if (resolver) {\n return resolver.resolve(invocables, locals, parent, self);\n }\n\n var promises = [];\n\n angular.forEach(invocables, function(value) {\n if (angular.isFunction(value) || angular.isArray(value)) {\n promises.push($q.resolve($injector.invoke(value)));\n } else if (angular.isString(value)) {\n promises.push($q.resolve($injector.get(value)));\n } else {\n promises.push($q.resolve(value));\n }\n });\n\n return $q.all(promises).then(function(resolves) {\n var resolveObj = {};\n var resolveIter = 0;\n angular.forEach(invocables, function(value, key) {\n resolveObj[key] = resolves[resolveIter++];\n });\n\n return resolveObj;\n });\n }\n };\n }];\n })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n .directive('uibModalBackdrop', ['$animate', '$injector', '$uibModalStack',\n function($animate, $injector, $modalStack) {\n return {\n replace: true,\n templateUrl: 'uib/template/modal/backdrop.html',\n compile: function(tElement, tAttrs) {\n tElement.addClass(tAttrs.backdropClass);\n return linkFn;\n }\n };\n\n function linkFn(scope, element, attrs) {\n if (attrs.modalInClass) {\n $animate.addClass(element, attrs.modalInClass);\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n var done = setIsAsync();\n if (scope.modalOptions.animation) {\n $animate.removeClass(element, attrs.modalInClass).then(done);\n } else {\n done();\n }\n });\n }\n }\n }])\n\n .directive('uibModalWindow', ['$uibModalStack', '$q', '$animateCss', '$document',\n function($modalStack, $q, $animateCss, $document) {\n return {\n scope: {\n index: '@'\n },\n replace: true,\n transclude: true,\n templateUrl: function(tElement, tAttrs) {\n return tAttrs.templateUrl || 'uib/template/modal/window.html';\n },\n link: function(scope, element, attrs) {\n element.addClass(attrs.windowClass || '');\n element.addClass(attrs.windowTopClass || '');\n scope.size = attrs.size;\n\n scope.close = function(evt) {\n var modal = $modalStack.getTop();\n if (modal && modal.value.backdrop &&\n modal.value.backdrop !== 'static' &&\n evt.target === evt.currentTarget) {\n evt.preventDefault();\n evt.stopPropagation();\n $modalStack.dismiss(modal.key, 'backdrop click');\n }\n };\n\n // moved from template to fix issue #2280\n element.on('click', scope.close);\n\n // This property is only added to the scope for the purpose of detecting when this directive is rendered.\n // We can detect that by using this property in the template associated with this directive and then use\n // {@link Attribute#$observe} on it. For more details please see {@link TableColumnResize}.\n scope.$isRendered = true;\n\n // Deferred object that will be resolved when this modal is render.\n var modalRenderDeferObj = $q.defer();\n // Observe function will be called on next digest cycle after compilation, ensuring that the DOM is ready.\n // In order to use this way of finding whether DOM is ready, we need to observe a scope property used in modal's template.\n attrs.$observe('modalRender', function(value) {\n if (value === 'true') {\n modalRenderDeferObj.resolve();\n }\n });\n\n modalRenderDeferObj.promise.then(function() {\n var animationPromise = null;\n\n if (attrs.modalInClass) {\n animationPromise = $animateCss(element, {\n addClass: attrs.modalInClass\n }).start();\n\n scope.$on($modalStack.NOW_CLOSING_EVENT, function(e, setIsAsync) {\n var done = setIsAsync();\n $animateCss(element, {\n removeClass: attrs.modalInClass\n }).start().then(done);\n });\n }\n\n\n $q.when(animationPromise).then(function() {\n // Notify {@link $modalStack} that modal is rendered.\n var modal = $modalStack.getTop();\n if (modal) {\n $modalStack.modalRendered(modal.key);\n }\n\n /**\n * If something within the freshly-opened modal already has focus (perhaps via a\n * directive that causes focus). then no need to try and focus anything.\n */\n if (!($document[0].activeElement && element[0].contains($document[0].activeElement))) {\n var inputWithAutofocus = element[0].querySelector('[autofocus]');\n /**\n * Auto-focusing of a freshly-opened modal element causes any child elements\n * with the autofocus attribute to lose focus. This is an issue on touch\n * based devices which will show and then hide the onscreen keyboard.\n * Attempts to refocus the autofocus element via JavaScript will not reopen\n * the onscreen keyboard. Fixed by updated the focusing logic to only autofocus\n * the modal element if the modal does not contain an autofocus element.\n */\n if (inputWithAutofocus) {\n inputWithAutofocus.focus();\n } else {\n element[0].focus();\n }\n }\n });\n });\n }\n };\n }])\n\n .directive('uibModalAnimationClass', function() {\n return {\n compile: function(tElement, tAttrs) {\n if (tAttrs.modalAnimation) {\n tElement.addClass(tAttrs.uibModalAnimationClass);\n }\n }\n };\n })\n\n .directive('uibModalTransclude', function() {\n return {\n link: function(scope, element, attrs, controller, transclude) {\n transclude(scope.$parent, function(clone) {\n element.empty();\n element.append(clone);\n });\n }\n };\n })\n\n .factory('$uibModalStack', ['$animate', '$animateCss', '$document',\n '$compile', '$rootScope', '$q', '$$multiMap', '$$stackedMap', '$uibPosition',\n function($animate, $animateCss, $document, $compile, $rootScope, $q, $$multiMap, $$stackedMap, $uibPosition) {\n var OPENED_MODAL_CLASS = 'modal-open';\n\n var backdropDomEl, backdropScope;\n var openedWindows = $$stackedMap.createNew();\n var openedClasses = $$multiMap.createNew();\n var $modalStack = {\n NOW_CLOSING_EVENT: 'modal.stack.now-closing'\n };\n var topModalIndex = 0;\n var previousTopOpenedModal = null;\n\n //Modal focus behavior\n var tabableSelector = 'a[href], area[href], input:not([disabled]), ' +\n 'button:not([disabled]),select:not([disabled]), textarea:not([disabled]), ' +\n 'iframe, object, embed, *[tabindex], *[contenteditable=true]';\n var scrollbarPadding;\n\n function isVisible(element) {\n return !!(element.offsetWidth ||\n element.offsetHeight ||\n element.getClientRects().length);\n }\n\n function backdropIndex() {\n var topBackdropIndex = -1;\n var opened = openedWindows.keys();\n for (var i = 0; i < opened.length; i++) {\n if (openedWindows.get(opened[i]).value.backdrop) {\n topBackdropIndex = i;\n }\n }\n\n // If any backdrop exist, ensure that it's index is always\n // right below the top modal\n if (topBackdropIndex > -1 && topBackdropIndex < topModalIndex) {\n topBackdropIndex = topModalIndex;\n }\n return topBackdropIndex;\n }\n\n $rootScope.$watch(backdropIndex, function(newBackdropIndex) {\n if (backdropScope) {\n backdropScope.index = newBackdropIndex;\n }\n });\n\n function removeModalWindow(modalInstance, elementToReceiveFocus) {\n var modalWindow = openedWindows.get(modalInstance).value;\n var appendToElement = modalWindow.appendTo;\n\n //clean up the stack\n openedWindows.remove(modalInstance);\n previousTopOpenedModal = openedWindows.top();\n if (previousTopOpenedModal) {\n topModalIndex = parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10);\n }\n\n removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function() {\n var modalBodyClass = modalWindow.openedClass || OPENED_MODAL_CLASS;\n openedClasses.remove(modalBodyClass, modalInstance);\n var areAnyOpen = openedClasses.hasKey(modalBodyClass);\n appendToElement.toggleClass(modalBodyClass, areAnyOpen);\n if (!areAnyOpen && scrollbarPadding && scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n if (scrollbarPadding.originalRight) {\n appendToElement.css({paddingRight: scrollbarPadding.originalRight + 'px'});\n } else {\n appendToElement.css({paddingRight: ''});\n }\n scrollbarPadding = null;\n }\n toggleTopWindowClass(true);\n }, modalWindow.closedDeferred);\n checkRemoveBackdrop();\n\n //move focus to specified element if available, or else to body\n if (elementToReceiveFocus && elementToReceiveFocus.focus) {\n elementToReceiveFocus.focus();\n } else if (appendToElement.focus) {\n appendToElement.focus();\n }\n }\n\n // Add or remove \"windowTopClass\" from the top window in the stack\n function toggleTopWindowClass(toggleSwitch) {\n var modalWindow;\n\n if (openedWindows.length() > 0) {\n modalWindow = openedWindows.top().value;\n modalWindow.modalDomEl.toggleClass(modalWindow.windowTopClass || '', toggleSwitch);\n }\n }\n\n function checkRemoveBackdrop() {\n //remove backdrop if no longer needed\n if (backdropDomEl && backdropIndex() === -1) {\n var backdropScopeRef = backdropScope;\n removeAfterAnimate(backdropDomEl, backdropScope, function() {\n backdropScopeRef = null;\n });\n backdropDomEl = undefined;\n backdropScope = undefined;\n }\n }\n\n function removeAfterAnimate(domEl, scope, done, closedDeferred) {\n var asyncDeferred;\n var asyncPromise = null;\n var setIsAsync = function() {\n if (!asyncDeferred) {\n asyncDeferred = $q.defer();\n asyncPromise = asyncDeferred.promise;\n }\n\n return function asyncDone() {\n asyncDeferred.resolve();\n };\n };\n scope.$broadcast($modalStack.NOW_CLOSING_EVENT, setIsAsync);\n\n // Note that it's intentional that asyncPromise might be null.\n // That's when setIsAsync has not been called during the\n // NOW_CLOSING_EVENT broadcast.\n return $q.when(asyncPromise).then(afterAnimating);\n\n function afterAnimating() {\n if (afterAnimating.done) {\n return;\n }\n afterAnimating.done = true;\n\n $animate.leave(domEl).then(function() {\n domEl.remove();\n if (closedDeferred) {\n closedDeferred.resolve();\n }\n });\n\n scope.$destroy();\n if (done) {\n done();\n }\n }\n }\n\n $document.on('keydown', keydownListener);\n\n $rootScope.$on('$destroy', function() {\n $document.off('keydown', keydownListener);\n });\n\n function keydownListener(evt) {\n if (evt.isDefaultPrevented()) {\n return evt;\n }\n\n var modal = openedWindows.top();\n if (modal) {\n switch (evt.which) {\n case 27: {\n if (modal.value.keyboard) {\n evt.preventDefault();\n $rootScope.$apply(function() {\n $modalStack.dismiss(modal.key, 'escape key press');\n });\n }\n break;\n }\n case 9: {\n var list = $modalStack.loadFocusElementList(modal);\n var focusChanged = false;\n if (evt.shiftKey) {\n if ($modalStack.isFocusInFirstItem(evt, list) || $modalStack.isModalFocused(evt, modal)) {\n focusChanged = $modalStack.focusLastFocusableElement(list);\n }\n } else {\n if ($modalStack.isFocusInLastItem(evt, list)) {\n focusChanged = $modalStack.focusFirstFocusableElement(list);\n }\n }\n\n if (focusChanged) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n break;\n }\n }\n }\n }\n\n $modalStack.open = function(modalInstance, modal) {\n var modalOpener = $document[0].activeElement,\n modalBodyClass = modal.openedClass || OPENED_MODAL_CLASS;\n\n toggleTopWindowClass(false);\n\n // Store the current top first, to determine what index we ought to use\n // for the current top modal\n previousTopOpenedModal = openedWindows.top();\n\n openedWindows.add(modalInstance, {\n deferred: modal.deferred,\n renderDeferred: modal.renderDeferred,\n closedDeferred: modal.closedDeferred,\n modalScope: modal.scope,\n backdrop: modal.backdrop,\n keyboard: modal.keyboard,\n openedClass: modal.openedClass,\n windowTopClass: modal.windowTopClass,\n animation: modal.animation,\n appendTo: modal.appendTo\n });\n\n openedClasses.put(modalBodyClass, modalInstance);\n\n var appendToElement = modal.appendTo,\n currBackdropIndex = backdropIndex();\n\n if (!appendToElement.length) {\n throw new Error('appendTo element not found. Make sure that the element passed is in DOM.');\n }\n\n if (currBackdropIndex >= 0 && !backdropDomEl) {\n backdropScope = $rootScope.$new(true);\n backdropScope.modalOptions = modal;\n backdropScope.index = currBackdropIndex;\n backdropDomEl = angular.element('
');\n backdropDomEl.attr('backdrop-class', modal.backdropClass);\n if (modal.animation) {\n backdropDomEl.attr('modal-animation', 'true');\n }\n $compile(backdropDomEl)(backdropScope);\n $animate.enter(backdropDomEl, appendToElement);\n scrollbarPadding = $uibPosition.scrollbarPadding(appendToElement);\n if (scrollbarPadding.heightOverflow && scrollbarPadding.scrollbarWidth) {\n appendToElement.css({paddingRight: scrollbarPadding.right + 'px'});\n }\n }\n\n // Set the top modal index based on the index of the previous top modal\n topModalIndex = previousTopOpenedModal ? parseInt(previousTopOpenedModal.value.modalDomEl.attr('index'), 10) + 1 : 0;\n var angularDomEl = angular.element('
');\n angularDomEl.attr({\n 'template-url': modal.windowTemplateUrl,\n 'window-class': modal.windowClass,\n 'window-top-class': modal.windowTopClass,\n 'size': modal.size,\n 'index': topModalIndex,\n 'animate': 'animate'\n }).html(modal.content);\n if (modal.animation) {\n angularDomEl.attr('modal-animation', 'true');\n }\n\n appendToElement.addClass(modalBodyClass);\n $animate.enter($compile(angularDomEl)(modal.scope), appendToElement);\n\n openedWindows.top().value.modalDomEl = angularDomEl;\n openedWindows.top().value.modalOpener = modalOpener;\n };\n\n function broadcastClosing(modalWindow, resultOrReason, closing) {\n return !modalWindow.value.modalScope.$broadcast('modal.closing', resultOrReason, closing).defaultPrevented;\n }\n\n $modalStack.close = function(modalInstance, result) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, result, true)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.resolve(result);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismiss = function(modalInstance, reason) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow && broadcastClosing(modalWindow, reason, false)) {\n modalWindow.value.modalScope.$$uibDestructionScheduled = true;\n modalWindow.value.deferred.reject(reason);\n removeModalWindow(modalInstance, modalWindow.value.modalOpener);\n return true;\n }\n return !modalWindow;\n };\n\n $modalStack.dismissAll = function(reason) {\n var topModal = this.getTop();\n while (topModal && this.dismiss(topModal.key, reason)) {\n topModal = this.getTop();\n }\n };\n\n $modalStack.getTop = function() {\n return openedWindows.top();\n };\n\n $modalStack.modalRendered = function(modalInstance) {\n var modalWindow = openedWindows.get(modalInstance);\n if (modalWindow) {\n modalWindow.value.renderDeferred.resolve();\n }\n };\n\n $modalStack.focusFirstFocusableElement = function(list) {\n if (list.length > 0) {\n list[0].focus();\n return true;\n }\n return false;\n };\n\n $modalStack.focusLastFocusableElement = function(list) {\n if (list.length > 0) {\n list[list.length - 1].focus();\n return true;\n }\n return false;\n };\n\n $modalStack.isModalFocused = function(evt, modalWindow) {\n if (evt && modalWindow) {\n var modalDomEl = modalWindow.value.modalDomEl;\n if (modalDomEl && modalDomEl.length) {\n return (evt.target || evt.srcElement) === modalDomEl[0];\n }\n }\n return false;\n };\n\n $modalStack.isFocusInFirstItem = function(evt, list) {\n if (list.length > 0) {\n return (evt.target || evt.srcElement) === list[0];\n }\n return false;\n };\n\n $modalStack.isFocusInLastItem = function(evt, list) {\n if (list.length > 0) {\n return (evt.target || evt.srcElement) === list[list.length - 1];\n }\n return false;\n };\n\n $modalStack.loadFocusElementList = function(modalWindow) {\n if (modalWindow) {\n var modalDomE1 = modalWindow.value.modalDomEl;\n if (modalDomE1 && modalDomE1.length) {\n var elements = modalDomE1[0].querySelectorAll(tabableSelector);\n return elements ?\n Array.prototype.filter.call(elements, function(element) {\n return isVisible(element);\n }) : elements;\n }\n }\n };\n\n return $modalStack;\n }])\n\n .provider('$uibModal', function() {\n var $modalProvider = {\n options: {\n animation: true,\n backdrop: true, //can also be false or 'static'\n keyboard: true\n },\n $get: ['$rootScope', '$q', '$document', '$templateRequest', '$controller', '$uibResolve', '$uibModalStack',\n function ($rootScope, $q, $document, $templateRequest, $controller, $uibResolve, $modalStack) {\n var $modal = {};\n\n function getTemplatePromise(options) {\n return options.template ? $q.when(options.template) :\n $templateRequest(angular.isFunction(options.templateUrl) ?\n options.templateUrl() : options.templateUrl);\n }\n\n var promiseChain = null;\n $modal.getPromiseChain = function() {\n return promiseChain;\n };\n\n $modal.open = function(modalOptions) {\n var modalResultDeferred = $q.defer();\n var modalOpenedDeferred = $q.defer();\n var modalClosedDeferred = $q.defer();\n var modalRenderDeferred = $q.defer();\n\n //prepare an instance of a modal to be injected into controllers and returned to a caller\n var modalInstance = {\n result: modalResultDeferred.promise,\n opened: modalOpenedDeferred.promise,\n closed: modalClosedDeferred.promise,\n rendered: modalRenderDeferred.promise,\n close: function (result) {\n return $modalStack.close(modalInstance, result);\n },\n dismiss: function (reason) {\n return $modalStack.dismiss(modalInstance, reason);\n }\n };\n\n //merge and clean up options\n modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n modalOptions.resolve = modalOptions.resolve || {};\n modalOptions.appendTo = modalOptions.appendTo || $document.find('body').eq(0);\n\n //verify options\n if (!modalOptions.template && !modalOptions.templateUrl) {\n throw new Error('One of template or templateUrl options is required.');\n }\n\n var templateAndResolvePromise =\n $q.all([getTemplatePromise(modalOptions), $uibResolve.resolve(modalOptions.resolve, {}, null, null)]);\n\n function resolveWithTemplate() {\n return templateAndResolvePromise;\n }\n\n // Wait for the resolution of the existing promise chain.\n // Then switch to our own combined promise dependency (regardless of how the previous modal fared).\n // Then add to $modalStack and resolve opened.\n // Finally clean up the chain variable if no subsequent modal has overwritten it.\n var samePromise;\n samePromise = promiseChain = $q.all([promiseChain])\n .then(resolveWithTemplate, resolveWithTemplate)\n .then(function resolveSuccess(tplAndVars) {\n var providedScope = modalOptions.scope || $rootScope;\n\n var modalScope = providedScope.$new();\n modalScope.$close = modalInstance.close;\n modalScope.$dismiss = modalInstance.dismiss;\n\n modalScope.$on('$destroy', function() {\n if (!modalScope.$$uibDestructionScheduled) {\n modalScope.$dismiss('$uibUnscheduledDestruction');\n }\n });\n\n var ctrlInstance, ctrlInstantiate, ctrlLocals = {};\n\n //controllers\n if (modalOptions.controller) {\n ctrlLocals.$scope = modalScope;\n ctrlLocals.$scope.$resolve = {};\n ctrlLocals.$uibModalInstance = modalInstance;\n angular.forEach(tplAndVars[1], function(value, key) {\n ctrlLocals[key] = value;\n ctrlLocals.$scope.$resolve[key] = value;\n });\n\n // the third param will make the controller instantiate later,private api\n // @see https://github.com/angular/angular.js/blob/master/src/ng/controller.js#L126\n ctrlInstantiate = $controller(modalOptions.controller, ctrlLocals, true, modalOptions.controllerAs);\n if (modalOptions.controllerAs && modalOptions.bindToController) {\n ctrlInstance = ctrlInstantiate.instance;\n ctrlInstance.$close = modalScope.$close;\n ctrlInstance.$dismiss = modalScope.$dismiss;\n angular.extend(ctrlInstance, {\n $resolve: ctrlLocals.$scope.$resolve\n }, providedScope);\n }\n\n ctrlInstance = ctrlInstantiate();\n\n if (angular.isFunction(ctrlInstance.$onInit)) {\n ctrlInstance.$onInit();\n }\n }\n\n $modalStack.open(modalInstance, {\n scope: modalScope,\n deferred: modalResultDeferred,\n renderDeferred: modalRenderDeferred,\n closedDeferred: modalClosedDeferred,\n content: tplAndVars[0],\n animation: modalOptions.animation,\n backdrop: modalOptions.backdrop,\n keyboard: modalOptions.keyboard,\n backdropClass: modalOptions.backdropClass,\n windowTopClass: modalOptions.windowTopClass,\n windowClass: modalOptions.windowClass,\n windowTemplateUrl: modalOptions.windowTemplateUrl,\n size: modalOptions.size,\n openedClass: modalOptions.openedClass,\n appendTo: modalOptions.appendTo\n });\n modalOpenedDeferred.resolve(true);\n\n }, function resolveError(reason) {\n modalOpenedDeferred.reject(reason);\n modalResultDeferred.reject(reason);\n })['finally'](function() {\n if (promiseChain === samePromise) {\n promiseChain = null;\n }\n });\n\n return modalInstance;\n };\n\n return $modal;\n }\n ]\n };\n\n return $modalProvider;\n });\n\nangular.module('ui.bootstrap.paging', [])\n/**\n * Helper internal service for generating common controller code between the\n * pager and pagination components\n */\n.factory('uibPaging', ['$parse', function($parse) {\n return {\n create: function(ctrl, $scope, $attrs) {\n ctrl.setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n ctrl.ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl\n ctrl._watchers = [];\n\n ctrl.init = function(ngModelCtrl, config) {\n ctrl.ngModelCtrl = ngModelCtrl;\n ctrl.config = config;\n\n ngModelCtrl.$render = function() {\n ctrl.render();\n };\n\n if ($attrs.itemsPerPage) {\n ctrl._watchers.push($scope.$parent.$watch($attrs.itemsPerPage, function(value) {\n ctrl.itemsPerPage = parseInt(value, 10);\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }));\n } else {\n ctrl.itemsPerPage = config.itemsPerPage;\n }\n\n $scope.$watch('totalItems', function(newTotal, oldTotal) {\n if (angular.isDefined(newTotal) || newTotal !== oldTotal) {\n $scope.totalPages = ctrl.calculateTotalPages();\n ctrl.updatePage();\n }\n });\n };\n\n ctrl.calculateTotalPages = function() {\n var totalPages = ctrl.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / ctrl.itemsPerPage);\n return Math.max(totalPages || 0, 1);\n };\n\n ctrl.render = function() {\n $scope.page = parseInt(ctrl.ngModelCtrl.$viewValue, 10) || 1;\n };\n\n $scope.selectPage = function(page, evt) {\n if (evt) {\n evt.preventDefault();\n }\n\n var clickAllowed = !$scope.ngDisabled || !evt;\n if (clickAllowed && $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n if (evt && evt.target) {\n evt.target.blur();\n }\n ctrl.ngModelCtrl.$setViewValue(page);\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.getText = function(key) {\n return $scope[key + 'Text'] || ctrl.config[key + 'Text'];\n };\n\n $scope.noPrevious = function() {\n return $scope.page === 1;\n };\n\n $scope.noNext = function() {\n return $scope.page === $scope.totalPages;\n };\n\n ctrl.updatePage = function() {\n ctrl.setNumPages($scope.$parent, $scope.totalPages); // Readonly variable\n\n if ($scope.page > $scope.totalPages) {\n $scope.selectPage($scope.totalPages);\n } else {\n ctrl.ngModelCtrl.$render();\n }\n };\n\n $scope.$on('$destroy', function() {\n while (ctrl._watchers.length) {\n ctrl._watchers.shift()();\n }\n });\n }\n };\n}]);\n\nangular.module('ui.bootstrap.pager', ['ui.bootstrap.paging'])\n\n.controller('UibPagerController', ['$scope', '$attrs', 'uibPaging', 'uibPagerConfig', function($scope, $attrs, uibPaging, uibPagerConfig) {\n $scope.align = angular.isDefined($attrs.align) ? $scope.$parent.$eval($attrs.align) : uibPagerConfig.align;\n\n uibPaging.create(this, $scope, $attrs);\n}])\n\n.constant('uibPagerConfig', {\n itemsPerPage: 10,\n previousText: '« Previous',\n nextText: 'Next »',\n align: true\n})\n\n.directive('uibPager', ['uibPagerConfig', function(uibPagerConfig) {\n return {\n scope: {\n totalItems: '=',\n previousText: '@',\n nextText: '@',\n ngDisabled: '='\n },\n require: ['uibPager', '?ngModel'],\n controller: 'UibPagerController',\n controllerAs: 'pager',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/pager/pager.html';\n },\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (!ngModelCtrl) {\n return; // do nothing if no ng-model\n }\n\n paginationCtrl.init(ngModelCtrl, uibPagerConfig);\n }\n };\n}]);\n\nangular.module('ui.bootstrap.pagination', ['ui.bootstrap.paging'])\n.controller('UibPaginationController', ['$scope', '$attrs', '$parse', 'uibPaging', 'uibPaginationConfig', function($scope, $attrs, $parse, uibPaging, uibPaginationConfig) {\n var ctrl = this;\n // Setup configuration parameters\n var maxSize = angular.isDefined($attrs.maxSize) ? $scope.$parent.$eval($attrs.maxSize) : uibPaginationConfig.maxSize,\n rotate = angular.isDefined($attrs.rotate) ? $scope.$parent.$eval($attrs.rotate) : uibPaginationConfig.rotate,\n forceEllipses = angular.isDefined($attrs.forceEllipses) ? $scope.$parent.$eval($attrs.forceEllipses) : uibPaginationConfig.forceEllipses,\n boundaryLinkNumbers = angular.isDefined($attrs.boundaryLinkNumbers) ? $scope.$parent.$eval($attrs.boundaryLinkNumbers) : uibPaginationConfig.boundaryLinkNumbers,\n pageLabel = angular.isDefined($attrs.pageLabel) ? function(idx) { return $scope.$parent.$eval($attrs.pageLabel, {$page: idx}); } : angular.identity;\n $scope.boundaryLinks = angular.isDefined($attrs.boundaryLinks) ? $scope.$parent.$eval($attrs.boundaryLinks) : uibPaginationConfig.boundaryLinks;\n $scope.directionLinks = angular.isDefined($attrs.directionLinks) ? $scope.$parent.$eval($attrs.directionLinks) : uibPaginationConfig.directionLinks;\n\n uibPaging.create(this, $scope, $attrs);\n\n if ($attrs.maxSize) {\n ctrl._watchers.push($scope.$parent.$watch($parse($attrs.maxSize), function(value) {\n maxSize = parseInt(value, 10);\n ctrl.render();\n }));\n }\n\n // Create page object used in template\n function makePage(number, text, isActive) {\n return {\n number: number,\n text: text,\n active: isActive\n };\n }\n\n function getPages(currentPage, totalPages) {\n var pages = [];\n\n // Default page limits\n var startPage = 1, endPage = totalPages;\n var isMaxSized = angular.isDefined(maxSize) && maxSize < totalPages;\n\n // recompute if maxSize\n if (isMaxSized) {\n if (rotate) {\n // Current page is displayed in the middle of the visible ones\n startPage = Math.max(currentPage - Math.floor(maxSize / 2), 1);\n endPage = startPage + maxSize - 1;\n\n // Adjust if limit is exceeded\n if (endPage > totalPages) {\n endPage = totalPages;\n startPage = endPage - maxSize + 1;\n }\n } else {\n // Visible pages are paginated with maxSize\n startPage = (Math.ceil(currentPage / maxSize) - 1) * maxSize + 1;\n\n // Adjust last page if limit is exceeded\n endPage = Math.min(startPage + maxSize - 1, totalPages);\n }\n }\n\n // Add page number links\n for (var number = startPage; number <= endPage; number++) {\n var page = makePage(number, pageLabel(number), number === currentPage);\n pages.push(page);\n }\n\n // Add links to move between page sets\n if (isMaxSized && maxSize > 0 && (!rotate || forceEllipses || boundaryLinkNumbers)) {\n if (startPage > 1) {\n if (!boundaryLinkNumbers || startPage > 3) { //need ellipsis for all options unless range is too close to beginning\n var previousPageSet = makePage(startPage - 1, '...', false);\n pages.unshift(previousPageSet);\n }\n if (boundaryLinkNumbers) {\n if (startPage === 3) { //need to replace ellipsis when the buttons would be sequential\n var secondPageLink = makePage(2, '2', false);\n pages.unshift(secondPageLink);\n }\n //add the first page\n var firstPageLink = makePage(1, '1', false);\n pages.unshift(firstPageLink);\n }\n }\n\n if (endPage < totalPages) {\n if (!boundaryLinkNumbers || endPage < totalPages - 2) { //need ellipsis for all options unless range is too close to end\n var nextPageSet = makePage(endPage + 1, '...', false);\n pages.push(nextPageSet);\n }\n if (boundaryLinkNumbers) {\n if (endPage === totalPages - 2) { //need to replace ellipsis when the buttons would be sequential\n var secondToLastPageLink = makePage(totalPages - 1, totalPages - 1, false);\n pages.push(secondToLastPageLink);\n }\n //add the last page\n var lastPageLink = makePage(totalPages, totalPages, false);\n pages.push(lastPageLink);\n }\n }\n }\n return pages;\n }\n\n var originalRender = this.render;\n this.render = function() {\n originalRender();\n if ($scope.page > 0 && $scope.page <= $scope.totalPages) {\n $scope.pages = getPages($scope.page, $scope.totalPages);\n }\n };\n}])\n\n.constant('uibPaginationConfig', {\n itemsPerPage: 10,\n boundaryLinks: false,\n boundaryLinkNumbers: false,\n directionLinks: true,\n firstText: 'First',\n previousText: 'Previous',\n nextText: 'Next',\n lastText: 'Last',\n rotate: true,\n forceEllipses: false\n})\n\n.directive('uibPagination', ['$parse', 'uibPaginationConfig', function($parse, uibPaginationConfig) {\n return {\n scope: {\n totalItems: '=',\n firstText: '@',\n previousText: '@',\n nextText: '@',\n lastText: '@',\n ngDisabled:'='\n },\n require: ['uibPagination', '?ngModel'],\n controller: 'UibPaginationController',\n controllerAs: 'pagination',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/pagination/pagination.html';\n },\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (!ngModelCtrl) {\n return; // do nothing if no ng-model\n }\n\n paginationCtrl.init(ngModelCtrl, uibPaginationConfig);\n }\n };\n}]);\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module('ui.bootstrap.tooltip', ['ui.bootstrap.position', 'ui.bootstrap.stackedMap'])\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider('$uibTooltip', function() {\n // The default options tooltip and popover.\n var defaultOptions = {\n placement: 'top',\n placementClassPrefix: '',\n animation: true,\n popupDelay: 0,\n popupCloseDelay: 0,\n useContentExp: false\n };\n\n // Default hide triggers for each show trigger\n var triggerMap = {\n 'mouseenter': 'mouseleave',\n 'click': 'click',\n 'outsideClick': 'outsideClick',\n 'focus': 'blur',\n 'none': ''\n };\n\n // The options specified to the provider globally.\n var globalOptions = {};\n\n /**\n * `options({})` allows global configuration of all tooltips in the\n * application.\n *\n * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n * // place tooltips left instead of top by default\n * $tooltipProvider.options( { placement: 'left' } );\n * });\n */\n\tthis.options = function(value) {\n\t\tangular.extend(globalOptions, value);\n\t};\n\n /**\n * This allows you to extend the set of trigger mappings available. E.g.:\n *\n * $tooltipProvider.setTriggers( { 'openTrigger': 'closeTrigger' } );\n */\n this.setTriggers = function setTriggers(triggers) {\n angular.extend(triggerMap, triggers);\n };\n\n /**\n * This is a helper function for translating camel-case to snake_case.\n */\n function snake_case(name) {\n var regexp = /[A-Z]/g;\n var separator = '-';\n return name.replace(regexp, function(letter, pos) {\n return (pos ? separator : '') + letter.toLowerCase();\n });\n }\n\n /**\n * Returns the actual instance of the $tooltip service.\n * TODO support multiple triggers\n */\n this.$get = ['$window', '$compile', '$timeout', '$document', '$uibPosition', '$interpolate', '$rootScope', '$parse', '$$stackedMap', function($window, $compile, $timeout, $document, $position, $interpolate, $rootScope, $parse, $$stackedMap) {\n var openedTooltips = $$stackedMap.createNew();\n $document.on('keypress', keypressListener);\n\n $rootScope.$on('$destroy', function() {\n $document.off('keypress', keypressListener);\n });\n\n function keypressListener(e) {\n if (e.which === 27) {\n var last = openedTooltips.top();\n if (last) {\n last.value.close();\n openedTooltips.removeTop();\n last = null;\n }\n }\n }\n\n return function $tooltip(ttType, prefix, defaultTriggerShow, options) {\n options = angular.extend({}, defaultOptions, globalOptions, options);\n\n /**\n * Returns an object of show and hide triggers.\n *\n * If a trigger is supplied,\n * it is used to show the tooltip; otherwise, it will use the `trigger`\n * option passed to the `$tooltipProvider.options` method; else it will\n * default to the trigger supplied to this directive factory.\n *\n * The hide trigger is based on the show trigger. If the `trigger` option\n * was passed to the `$tooltipProvider.options` method, it will use the\n * mapped trigger from `triggerMap` or the passed trigger if the map is\n * undefined; otherwise, it uses the `triggerMap` value of the show\n * trigger; else it will just use the show trigger.\n */\n function getTriggers(trigger) {\n var show = (trigger || options.trigger || defaultTriggerShow).split(' ');\n var hide = show.map(function(trigger) {\n return triggerMap[trigger] || trigger;\n });\n return {\n show: show,\n hide: hide\n };\n }\n\n var directiveName = snake_case(ttType);\n\n var startSym = $interpolate.startSymbol();\n var endSym = $interpolate.endSymbol();\n var template =\n '
' +\n '
';\n\n return {\n compile: function(tElem, tAttrs) {\n var tooltipLinker = $compile(template);\n\n return function link(scope, element, attrs, tooltipCtrl) {\n var tooltip;\n var tooltipLinkedScope;\n var transitionTimeout;\n var showTimeout;\n var hideTimeout;\n var positionTimeout;\n var appendToBody = angular.isDefined(options.appendToBody) ? options.appendToBody : false;\n var triggers = getTriggers(undefined);\n var hasEnableExp = angular.isDefined(attrs[prefix + 'Enable']);\n var ttScope = scope.$new(true);\n var repositionScheduled = false;\n var isOpenParse = angular.isDefined(attrs[prefix + 'IsOpen']) ? $parse(attrs[prefix + 'IsOpen']) : false;\n var contentParse = options.useContentExp ? $parse(attrs[ttType]) : false;\n var observers = [];\n var lastPlacement;\n\n var positionTooltip = function() {\n // check if tooltip exists and is not empty\n if (!tooltip || !tooltip.html()) { return; }\n\n if (!positionTimeout) {\n positionTimeout = $timeout(function() {\n var ttPosition = $position.positionElements(element, tooltip, ttScope.placement, appendToBody);\n tooltip.css({ top: ttPosition.top + 'px', left: ttPosition.left + 'px' });\n\n if (!tooltip.hasClass(ttPosition.placement.split('-')[0])) {\n tooltip.removeClass(lastPlacement.split('-')[0]);\n tooltip.addClass(ttPosition.placement.split('-')[0]);\n }\n\n if (!tooltip.hasClass(options.placementClassPrefix + ttPosition.placement)) {\n tooltip.removeClass(options.placementClassPrefix + lastPlacement);\n tooltip.addClass(options.placementClassPrefix + ttPosition.placement);\n }\n\n // first time through tt element will have the\n // uib-position-measure class or if the placement\n // has changed we need to position the arrow.\n if (tooltip.hasClass('uib-position-measure')) {\n $position.positionArrow(tooltip, ttPosition.placement);\n tooltip.removeClass('uib-position-measure');\n } else if (lastPlacement !== ttPosition.placement) {\n $position.positionArrow(tooltip, ttPosition.placement);\n }\n lastPlacement = ttPosition.placement;\n\n positionTimeout = null;\n }, 0, false);\n }\n };\n\n // Set up the correct scope to allow transclusion later\n ttScope.origScope = scope;\n\n // By default, the tooltip is not open.\n // TODO add ability to start tooltip opened\n ttScope.isOpen = false;\n openedTooltips.add(ttScope, {\n close: hide\n });\n\n function toggleTooltipBind() {\n if (!ttScope.isOpen) {\n showTooltipBind();\n } else {\n hideTooltipBind();\n }\n }\n\n // Show the tooltip with delay if specified, otherwise show it immediately\n function showTooltipBind() {\n if (hasEnableExp && !scope.$eval(attrs[prefix + 'Enable'])) {\n return;\n }\n\n cancelHide();\n prepareTooltip();\n\n if (ttScope.popupDelay) {\n // Do nothing if the tooltip was already scheduled to pop-up.\n // This happens if show is triggered multiple times before any hide is triggered.\n if (!showTimeout) {\n showTimeout = $timeout(show, ttScope.popupDelay, false);\n }\n } else {\n show();\n }\n }\n\n function hideTooltipBind() {\n cancelShow();\n\n if (ttScope.popupCloseDelay) {\n if (!hideTimeout) {\n hideTimeout = $timeout(hide, ttScope.popupCloseDelay, false);\n }\n } else {\n hide();\n }\n }\n\n // Show the tooltip popup element.\n function show() {\n cancelShow();\n cancelHide();\n\n // Don't show empty tooltips.\n if (!ttScope.content) {\n return angular.noop;\n }\n\n createTooltip();\n\n // And show the tooltip.\n ttScope.$evalAsync(function() {\n ttScope.isOpen = true;\n assignIsOpen(true);\n positionTooltip();\n });\n }\n\n function cancelShow() {\n if (showTimeout) {\n $timeout.cancel(showTimeout);\n showTimeout = null;\n }\n\n if (positionTimeout) {\n $timeout.cancel(positionTimeout);\n positionTimeout = null;\n }\n }\n\n // Hide the tooltip popup element.\n function hide() {\n if (!ttScope) {\n return;\n }\n\n // First things first: we don't show it anymore.\n ttScope.$evalAsync(function() {\n if (ttScope) {\n ttScope.isOpen = false;\n assignIsOpen(false);\n // And now we remove it from the DOM. However, if we have animation, we\n // need to wait for it to expire beforehand.\n // FIXME: this is a placeholder for a port of the transitions library.\n // The fade transition in TWBS is 150ms.\n if (ttScope.animation) {\n if (!transitionTimeout) {\n transitionTimeout = $timeout(removeTooltip, 150, false);\n }\n } else {\n removeTooltip();\n }\n }\n });\n }\n\n function cancelHide() {\n if (hideTimeout) {\n $timeout.cancel(hideTimeout);\n hideTimeout = null;\n }\n\n if (transitionTimeout) {\n $timeout.cancel(transitionTimeout);\n transitionTimeout = null;\n }\n }\n\n function createTooltip() {\n // There can only be one tooltip element per directive shown at once.\n if (tooltip) {\n return;\n }\n\n tooltipLinkedScope = ttScope.$new();\n tooltip = tooltipLinker(tooltipLinkedScope, function(tooltip) {\n if (appendToBody) {\n $document.find('body').append(tooltip);\n } else {\n element.after(tooltip);\n }\n });\n\n prepObservers();\n }\n\n function removeTooltip() {\n cancelShow();\n cancelHide();\n unregisterObservers();\n\n if (tooltip) {\n tooltip.remove();\n tooltip = null;\n }\n if (tooltipLinkedScope) {\n tooltipLinkedScope.$destroy();\n tooltipLinkedScope = null;\n }\n }\n\n /**\n * Set the initial scope values. Once\n * the tooltip is created, the observers\n * will be added to keep things in sync.\n */\n function prepareTooltip() {\n ttScope.title = attrs[prefix + 'Title'];\n if (contentParse) {\n ttScope.content = contentParse(scope);\n } else {\n ttScope.content = attrs[ttType];\n }\n\n ttScope.popupClass = attrs[prefix + 'Class'];\n ttScope.placement = angular.isDefined(attrs[prefix + 'Placement']) ? attrs[prefix + 'Placement'] : options.placement;\n var placement = $position.parsePlacement(ttScope.placement);\n lastPlacement = placement[1] ? placement[0] + '-' + placement[1] : placement[0];\n\n var delay = parseInt(attrs[prefix + 'PopupDelay'], 10);\n var closeDelay = parseInt(attrs[prefix + 'PopupCloseDelay'], 10);\n ttScope.popupDelay = !isNaN(delay) ? delay : options.popupDelay;\n ttScope.popupCloseDelay = !isNaN(closeDelay) ? closeDelay : options.popupCloseDelay;\n }\n\n function assignIsOpen(isOpen) {\n if (isOpenParse && angular.isFunction(isOpenParse.assign)) {\n isOpenParse.assign(scope, isOpen);\n }\n }\n\n ttScope.contentExp = function() {\n return ttScope.content;\n };\n\n /**\n * Observe the relevant attributes.\n */\n attrs.$observe('disabled', function(val) {\n if (val) {\n cancelShow();\n }\n\n if (val && ttScope.isOpen) {\n hide();\n }\n });\n\n if (isOpenParse) {\n scope.$watch(isOpenParse, function(val) {\n if (ttScope && !val === ttScope.isOpen) {\n toggleTooltipBind();\n }\n });\n }\n\n function prepObservers() {\n observers.length = 0;\n\n if (contentParse) {\n observers.push(\n scope.$watch(contentParse, function(val) {\n ttScope.content = val;\n if (!val && ttScope.isOpen) {\n hide();\n }\n })\n );\n\n observers.push(\n tooltipLinkedScope.$watch(function() {\n if (!repositionScheduled) {\n repositionScheduled = true;\n tooltipLinkedScope.$$postDigest(function() {\n repositionScheduled = false;\n if (ttScope && ttScope.isOpen) {\n positionTooltip();\n }\n });\n }\n })\n );\n } else {\n observers.push(\n attrs.$observe(ttType, function(val) {\n ttScope.content = val;\n if (!val && ttScope.isOpen) {\n hide();\n } else {\n positionTooltip();\n }\n })\n );\n }\n\n observers.push(\n attrs.$observe(prefix + 'Title', function(val) {\n ttScope.title = val;\n if (ttScope.isOpen) {\n positionTooltip();\n }\n })\n );\n\n observers.push(\n attrs.$observe(prefix + 'Placement', function(val) {\n ttScope.placement = val ? val : options.placement;\n if (ttScope.isOpen) {\n positionTooltip();\n }\n })\n );\n }\n\n function unregisterObservers() {\n if (observers.length) {\n angular.forEach(observers, function(observer) {\n observer();\n });\n observers.length = 0;\n }\n }\n\n // hide tooltips/popovers for outsideClick trigger\n function bodyHideTooltipBind(e) {\n if (!ttScope || !ttScope.isOpen || !tooltip) {\n return;\n }\n // make sure the tooltip/popover link or tool tooltip/popover itself were not clicked\n if (!element[0].contains(e.target) && !tooltip[0].contains(e.target)) {\n hideTooltipBind();\n }\n }\n\n var unregisterTriggers = function() {\n triggers.show.forEach(function(trigger) {\n if (trigger === 'outsideClick') {\n element.off('click', toggleTooltipBind);\n } else {\n element.off(trigger, showTooltipBind);\n element.off(trigger, toggleTooltipBind);\n }\n });\n triggers.hide.forEach(function(trigger) {\n if (trigger === 'outsideClick') {\n $document.off('click', bodyHideTooltipBind);\n } else {\n element.off(trigger, hideTooltipBind);\n }\n });\n };\n\n function prepTriggers() {\n var val = attrs[prefix + 'Trigger'];\n unregisterTriggers();\n\n triggers = getTriggers(val);\n\n if (triggers.show !== 'none') {\n triggers.show.forEach(function(trigger, idx) {\n if (trigger === 'outsideClick') {\n element.on('click', toggleTooltipBind);\n $document.on('click', bodyHideTooltipBind);\n } else if (trigger === triggers.hide[idx]) {\n element.on(trigger, toggleTooltipBind);\n } else if (trigger) {\n element.on(trigger, showTooltipBind);\n element.on(triggers.hide[idx], hideTooltipBind);\n }\n\n element.on('keypress', function(e) {\n if (e.which === 27) {\n hideTooltipBind();\n }\n });\n });\n }\n }\n\n prepTriggers();\n\n var animation = scope.$eval(attrs[prefix + 'Animation']);\n ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n var appendToBodyVal;\n var appendKey = prefix + 'AppendToBody';\n if (appendKey in attrs && attrs[appendKey] === undefined) {\n appendToBodyVal = true;\n } else {\n appendToBodyVal = scope.$eval(attrs[appendKey]);\n }\n\n appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody;\n\n // Make sure tooltip is destroyed and removed.\n scope.$on('$destroy', function onDestroyTooltip() {\n unregisterTriggers();\n removeTooltip();\n openedTooltips.remove(ttScope);\n ttScope = null;\n });\n };\n }\n };\n };\n }];\n})\n\n// This is mostly ngInclude code but with a custom scope\n.directive('uibTooltipTemplateTransclude', [\n '$animate', '$sce', '$compile', '$templateRequest',\nfunction ($animate, $sce, $compile, $templateRequest) {\n return {\n link: function(scope, elem, attrs) {\n var origScope = scope.$eval(attrs.tooltipTemplateTranscludeScope);\n\n var changeCounter = 0,\n currentScope,\n previousElement,\n currentElement;\n\n var cleanupLastIncludeContent = function() {\n if (previousElement) {\n previousElement.remove();\n previousElement = null;\n }\n\n if (currentScope) {\n currentScope.$destroy();\n currentScope = null;\n }\n\n if (currentElement) {\n $animate.leave(currentElement).then(function() {\n previousElement = null;\n });\n previousElement = currentElement;\n currentElement = null;\n }\n };\n\n scope.$watch($sce.parseAsResourceUrl(attrs.uibTooltipTemplateTransclude), function(src) {\n var thisChangeId = ++changeCounter;\n\n if (src) {\n //set the 2nd param to true to ignore the template request error so that the inner\n //contents and scope can be cleaned up.\n $templateRequest(src, true).then(function(response) {\n if (thisChangeId !== changeCounter) { return; }\n var newScope = origScope.$new();\n var template = response;\n\n var clone = $compile(template)(newScope, function(clone) {\n cleanupLastIncludeContent();\n $animate.enter(clone, elem);\n });\n\n currentScope = newScope;\n currentElement = clone;\n\n currentScope.$emit('$includeContentLoaded', src);\n }, function() {\n if (thisChangeId === changeCounter) {\n cleanupLastIncludeContent();\n scope.$emit('$includeContentError', src);\n }\n });\n scope.$emit('$includeContentRequested', src);\n } else {\n cleanupLastIncludeContent();\n }\n });\n\n scope.$on('$destroy', cleanupLastIncludeContent);\n }\n };\n}])\n\n/**\n * Note that it's intentional that these classes are *not* applied through $animate.\n * They must not be animated as they're expected to be present on the tooltip on\n * initialization.\n */\n.directive('uibTooltipClasses', ['$uibPosition', function($uibPosition) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n // need to set the primary position so the\n // arrow has space during position measure.\n // tooltip.positionTooltip()\n if (scope.placement) {\n // // There are no top-left etc... classes\n // // in TWBS, so we need the primary position.\n var position = $uibPosition.parsePlacement(scope.placement);\n element.addClass(position[0]);\n }\n\n if (scope.popupClass) {\n element.addClass(scope.popupClass);\n }\n\n if (scope.animation()) {\n element.addClass(attrs.tooltipAnimationClass);\n }\n }\n };\n}])\n\n.directive('uibTooltipPopup', function() {\n return {\n replace: true,\n scope: { content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-popup.html'\n };\n})\n\n.directive('uibTooltip', [ '$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltip', 'tooltip', 'mouseenter');\n}])\n\n.directive('uibTooltipTemplatePopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&',\n originScope: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-template-popup.html'\n };\n})\n\n.directive('uibTooltipTemplate', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltipTemplate', 'tooltip', 'mouseenter', {\n useContentExp: true\n });\n}])\n\n.directive('uibTooltipHtmlPopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/tooltip/tooltip-html-popup.html'\n };\n})\n\n.directive('uibTooltipHtml', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibTooltipHtml', 'tooltip', 'mouseenter', {\n useContentExp: true\n });\n}]);\n\n/**\n * The following features are still outstanding: popup delay, animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, and selector delegatation.\n */\nangular.module('ui.bootstrap.popover', ['ui.bootstrap.tooltip'])\n\n.directive('uibPopoverTemplatePopup', function() {\n return {\n replace: true,\n scope: { uibTitle: '@', contentExp: '&', placement: '@', popupClass: '@', animation: '&', isOpen: '&',\n originScope: '&' },\n templateUrl: 'uib/template/popover/popover-template.html'\n };\n})\n\n.directive('uibPopoverTemplate', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopoverTemplate', 'popover', 'click', {\n useContentExp: true\n });\n}])\n\n.directive('uibPopoverHtmlPopup', function() {\n return {\n replace: true,\n scope: { contentExp: '&', uibTitle: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/popover/popover-html.html'\n };\n})\n\n.directive('uibPopoverHtml', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopoverHtml', 'popover', 'click', {\n useContentExp: true\n });\n}])\n\n.directive('uibPopoverPopup', function() {\n return {\n replace: true,\n scope: { uibTitle: '@', content: '@', placement: '@', popupClass: '@', animation: '&', isOpen: '&' },\n templateUrl: 'uib/template/popover/popover.html'\n };\n})\n\n.directive('uibPopover', ['$uibTooltip', function($uibTooltip) {\n return $uibTooltip('uibPopover', 'popover', 'click');\n}]);\n\nangular.module('ui.bootstrap.progressbar', [])\n\n.constant('uibProgressConfig', {\n animate: true,\n max: 100\n})\n\n.controller('UibProgressController', ['$scope', '$attrs', 'uibProgressConfig', function($scope, $attrs, progressConfig) {\n var self = this,\n animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n this.bars = [];\n $scope.max = getMaxOrDefault();\n\n this.addBar = function(bar, element, attrs) {\n if (!animate) {\n element.css({'transition': 'none'});\n }\n\n this.bars.push(bar);\n\n bar.max = getMaxOrDefault();\n bar.title = attrs && angular.isDefined(attrs.title) ? attrs.title : 'progressbar';\n\n bar.$watch('value', function(value) {\n bar.recalculatePercentage();\n });\n\n bar.recalculatePercentage = function() {\n var totalPercentage = self.bars.reduce(function(total, bar) {\n bar.percent = +(100 * bar.value / bar.max).toFixed(2);\n return total + bar.percent;\n }, 0);\n\n if (totalPercentage > 100) {\n bar.percent -= totalPercentage - 100;\n }\n };\n\n bar.$on('$destroy', function() {\n element = null;\n self.removeBar(bar);\n });\n };\n\n this.removeBar = function(bar) {\n this.bars.splice(this.bars.indexOf(bar), 1);\n this.bars.forEach(function (bar) {\n bar.recalculatePercentage();\n });\n };\n\n //$attrs.$observe('maxParam', function(maxParam) {\n $scope.$watch('maxParam', function(maxParam) {\n self.bars.forEach(function(bar) {\n bar.max = getMaxOrDefault();\n bar.recalculatePercentage();\n });\n });\n\n function getMaxOrDefault () {\n return angular.isDefined($scope.maxParam) ? $scope.maxParam : progressConfig.max;\n }\n}])\n\n.directive('uibProgress', function() {\n return {\n replace: true,\n transclude: true,\n controller: 'UibProgressController',\n require: 'uibProgress',\n scope: {\n maxParam: '=?max'\n },\n templateUrl: 'uib/template/progressbar/progress.html'\n };\n})\n\n.directive('uibBar', function() {\n return {\n replace: true,\n transclude: true,\n require: '^uibProgress',\n scope: {\n value: '=',\n type: '@'\n },\n templateUrl: 'uib/template/progressbar/bar.html',\n link: function(scope, element, attrs, progressCtrl) {\n progressCtrl.addBar(scope, element, attrs);\n }\n };\n})\n\n.directive('uibProgressbar', function() {\n return {\n replace: true,\n transclude: true,\n controller: 'UibProgressController',\n scope: {\n value: '=',\n maxParam: '=?max',\n type: '@'\n },\n templateUrl: 'uib/template/progressbar/progressbar.html',\n link: function(scope, element, attrs, progressCtrl) {\n progressCtrl.addBar(scope, angular.element(element.children()[0]), {title: attrs.title});\n }\n };\n});\n\nangular.module('ui.bootstrap.rating', [])\n\n.constant('uibRatingConfig', {\n max: 5,\n stateOn: null,\n stateOff: null,\n enableReset: true,\n titles : ['one', 'two', 'three', 'four', 'five']\n})\n\n.controller('UibRatingController', ['$scope', '$attrs', 'uibRatingConfig', function($scope, $attrs, ratingConfig) {\n var ngModelCtrl = { $setViewValue: angular.noop },\n self = this;\n\n this.init = function(ngModelCtrl_) {\n ngModelCtrl = ngModelCtrl_;\n ngModelCtrl.$render = this.render;\n\n ngModelCtrl.$formatters.push(function(value) {\n if (angular.isNumber(value) && value << 0 !== value) {\n value = Math.round(value);\n }\n\n return value;\n });\n\n this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;\n this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;\n this.enableReset = angular.isDefined($attrs.enableReset) ?\n $scope.$parent.$eval($attrs.enableReset) : ratingConfig.enableReset;\n var tmpTitles = angular.isDefined($attrs.titles) ? $scope.$parent.$eval($attrs.titles) : ratingConfig.titles;\n this.titles = angular.isArray(tmpTitles) && tmpTitles.length > 0 ?\n tmpTitles : ratingConfig.titles;\n\n var ratingStates = angular.isDefined($attrs.ratingStates) ?\n $scope.$parent.$eval($attrs.ratingStates) :\n new Array(angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max);\n $scope.range = this.buildTemplateObjects(ratingStates);\n };\n\n this.buildTemplateObjects = function(states) {\n for (var i = 0, n = states.length; i < n; i++) {\n states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff, title: this.getTitle(i) }, states[i]);\n }\n return states;\n };\n\n this.getTitle = function(index) {\n if (index >= this.titles.length) {\n return index + 1;\n }\n\n return this.titles[index];\n };\n\n $scope.rate = function(value) {\n if (!$scope.readonly && value >= 0 && value <= $scope.range.length) {\n var newViewValue = self.enableReset && ngModelCtrl.$viewValue === value ? 0 : value;\n ngModelCtrl.$setViewValue(newViewValue);\n ngModelCtrl.$render();\n }\n };\n\n $scope.enter = function(value) {\n if (!$scope.readonly) {\n $scope.value = value;\n }\n $scope.onHover({value: value});\n };\n\n $scope.reset = function() {\n $scope.value = ngModelCtrl.$viewValue;\n $scope.onLeave();\n };\n\n $scope.onKeydown = function(evt) {\n if (/(37|38|39|40)/.test(evt.which)) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.rate($scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1));\n }\n };\n\n this.render = function() {\n $scope.value = ngModelCtrl.$viewValue;\n $scope.title = self.getTitle($scope.value - 1);\n };\n}])\n\n.directive('uibRating', function() {\n return {\n require: ['uibRating', 'ngModel'],\n scope: {\n readonly: '=?readOnly',\n onHover: '&',\n onLeave: '&'\n },\n controller: 'UibRatingController',\n templateUrl: 'uib/template/rating/rating.html',\n replace: true,\n link: function(scope, element, attrs, ctrls) {\n var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n ratingCtrl.init(ngModelCtrl);\n }\n };\n});\n\nangular.module('ui.bootstrap.tabs', [])\n\n.controller('UibTabsetController', ['$scope', function ($scope) {\n var ctrl = this,\n oldIndex;\n ctrl.tabs = [];\n\n ctrl.select = function(index, evt) {\n if (!destroyed) {\n var previousIndex = findTabIndex(oldIndex);\n var previousSelected = ctrl.tabs[previousIndex];\n if (previousSelected) {\n previousSelected.tab.onDeselect({\n $event: evt,\n $selectedIndex: index\n });\n if (evt && evt.isDefaultPrevented()) {\n return;\n }\n previousSelected.tab.active = false;\n }\n\n var selected = ctrl.tabs[index];\n if (selected) {\n selected.tab.onSelect({\n $event: evt\n });\n selected.tab.active = true;\n ctrl.active = selected.index;\n oldIndex = selected.index;\n } else if (!selected && angular.isDefined(oldIndex)) {\n ctrl.active = null;\n oldIndex = null;\n }\n }\n };\n\n ctrl.addTab = function addTab(tab) {\n ctrl.tabs.push({\n tab: tab,\n index: tab.index\n });\n ctrl.tabs.sort(function(t1, t2) {\n if (t1.index > t2.index) {\n return 1;\n }\n\n if (t1.index < t2.index) {\n return -1;\n }\n\n return 0;\n });\n\n if (tab.index === ctrl.active || !angular.isDefined(ctrl.active) && ctrl.tabs.length === 1) {\n var newActiveIndex = findTabIndex(tab.index);\n ctrl.select(newActiveIndex);\n }\n };\n\n ctrl.removeTab = function removeTab(tab) {\n var index;\n for (var i = 0; i < ctrl.tabs.length; i++) {\n if (ctrl.tabs[i].tab === tab) {\n index = i;\n break;\n }\n }\n\n if (ctrl.tabs[index].index === ctrl.active) {\n var newActiveTabIndex = index === ctrl.tabs.length - 1 ?\n index - 1 : index + 1 % ctrl.tabs.length;\n ctrl.select(newActiveTabIndex);\n }\n\n ctrl.tabs.splice(index, 1);\n };\n\n $scope.$watch('tabset.active', function(val) {\n if (angular.isDefined(val) && val !== oldIndex) {\n ctrl.select(findTabIndex(val));\n }\n });\n\n var destroyed;\n $scope.$on('$destroy', function() {\n destroyed = true;\n });\n\n function findTabIndex(index) {\n for (var i = 0; i < ctrl.tabs.length; i++) {\n if (ctrl.tabs[i].index === index) {\n return i;\n }\n }\n }\n}])\n\n.directive('uibTabset', function() {\n return {\n transclude: true,\n replace: true,\n scope: {},\n bindToController: {\n active: '=?',\n type: '@'\n },\n controller: 'UibTabsetController',\n controllerAs: 'tabset',\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/tabs/tabset.html';\n },\n link: function(scope, element, attrs) {\n scope.vertical = angular.isDefined(attrs.vertical) ?\n scope.$parent.$eval(attrs.vertical) : false;\n scope.justified = angular.isDefined(attrs.justified) ?\n scope.$parent.$eval(attrs.justified) : false;\n }\n };\n})\n\n.directive('uibTab', ['$parse', function($parse) {\n return {\n require: '^uibTabset',\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || 'uib/template/tabs/tab.html';\n },\n transclude: true,\n scope: {\n heading: '@',\n index: '=?',\n classes: '@?',\n onSelect: '&select', //This callback is called in contentHeadingTransclude\n //once it inserts the tab's content into the dom\n onDeselect: '&deselect'\n },\n controller: function() {\n //Empty controller so other directives can require being 'under' a tab\n },\n controllerAs: 'tab',\n link: function(scope, elm, attrs, tabsetCtrl, transclude) {\n scope.disabled = false;\n if (attrs.disable) {\n scope.$parent.$watch($parse(attrs.disable), function(value) {\n scope.disabled = !! value;\n });\n }\n\n if (angular.isUndefined(attrs.index)) {\n if (tabsetCtrl.tabs && tabsetCtrl.tabs.length) {\n scope.index = Math.max.apply(null, tabsetCtrl.tabs.map(function(t) { return t.index; })) + 1;\n } else {\n scope.index = 0;\n }\n }\n\n if (angular.isUndefined(attrs.classes)) {\n scope.classes = '';\n }\n\n scope.select = function(evt) {\n if (!scope.disabled) {\n var index;\n for (var i = 0; i < tabsetCtrl.tabs.length; i++) {\n if (tabsetCtrl.tabs[i].tab === scope) {\n index = i;\n break;\n }\n }\n\n tabsetCtrl.select(index, evt);\n }\n };\n\n tabsetCtrl.addTab(scope);\n scope.$on('$destroy', function() {\n tabsetCtrl.removeTab(scope);\n });\n\n //We need to transclude later, once the content container is ready.\n //when this link happens, we're inside a tab heading.\n scope.$transcludeFn = transclude;\n }\n };\n}])\n\n.directive('uibTabHeadingTransclude', function() {\n return {\n restrict: 'A',\n require: '^uibTab',\n link: function(scope, elm) {\n scope.$watch('headingElement', function updateHeadingElement(heading) {\n if (heading) {\n elm.html('');\n elm.append(heading);\n }\n });\n }\n };\n})\n\n.directive('uibTabContentTransclude', function() {\n return {\n restrict: 'A',\n require: '^uibTabset',\n link: function(scope, elm, attrs) {\n var tab = scope.$eval(attrs.uibTabContentTransclude).tab;\n\n //Now our tab is ready to be transcluded: both the tab heading area\n //and the tab content area are loaded. Transclude 'em both.\n tab.$transcludeFn(tab.$parent, function(contents) {\n angular.forEach(contents, function(node) {\n if (isTabHeading(node)) {\n //Let tabHeadingTransclude know.\n tab.headingElement = node;\n } else {\n elm.append(node);\n }\n });\n });\n }\n };\n\n function isTabHeading(node) {\n return node.tagName && (\n node.hasAttribute('uib-tab-heading') ||\n node.hasAttribute('data-uib-tab-heading') ||\n node.hasAttribute('x-uib-tab-heading') ||\n node.tagName.toLowerCase() === 'uib-tab-heading' ||\n node.tagName.toLowerCase() === 'data-uib-tab-heading' ||\n node.tagName.toLowerCase() === 'x-uib-tab-heading' ||\n node.tagName.toLowerCase() === 'uib:tab-heading'\n );\n }\n});\n\nangular.module('ui.bootstrap.timepicker', [])\n\n.constant('uibTimepickerConfig', {\n hourStep: 1,\n minuteStep: 1,\n secondStep: 1,\n showMeridian: true,\n showSeconds: false,\n meridians: null,\n readonlyInput: false,\n mousewheel: true,\n arrowkeys: true,\n showSpinners: true,\n templateUrl: 'uib/template/timepicker/timepicker.html'\n})\n\n.controller('UibTimepickerController', ['$scope', '$element', '$attrs', '$parse', '$log', '$locale', 'uibTimepickerConfig', function($scope, $element, $attrs, $parse, $log, $locale, timepickerConfig) {\n var selected = new Date(),\n watchers = [],\n ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS,\n padHours = angular.isDefined($attrs.padHours) ? $scope.$parent.$eval($attrs.padHours) : true;\n\n $scope.tabindex = angular.isDefined($attrs.tabindex) ? $attrs.tabindex : 0;\n $element.removeAttr('tabindex');\n\n this.init = function(ngModelCtrl_, inputs) {\n ngModelCtrl = ngModelCtrl_;\n ngModelCtrl.$render = this.render;\n\n ngModelCtrl.$formatters.unshift(function(modelValue) {\n return modelValue ? new Date(modelValue) : null;\n });\n\n var hoursInputEl = inputs.eq(0),\n minutesInputEl = inputs.eq(1),\n secondsInputEl = inputs.eq(2);\n\n var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\n\n if (mousewheel) {\n this.setupMousewheelEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n }\n\n var arrowkeys = angular.isDefined($attrs.arrowkeys) ? $scope.$parent.$eval($attrs.arrowkeys) : timepickerConfig.arrowkeys;\n if (arrowkeys) {\n this.setupArrowkeyEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n }\n\n $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\n this.setupInputEvents(hoursInputEl, minutesInputEl, secondsInputEl);\n };\n\n var hourStep = timepickerConfig.hourStep;\n if ($attrs.hourStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.hourStep), function(value) {\n hourStep = +value;\n }));\n }\n\n var minuteStep = timepickerConfig.minuteStep;\n if ($attrs.minuteStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\n minuteStep = +value;\n }));\n }\n\n var min;\n watchers.push($scope.$parent.$watch($parse($attrs.min), function(value) {\n var dt = new Date(value);\n min = isNaN(dt) ? undefined : dt;\n }));\n\n var max;\n watchers.push($scope.$parent.$watch($parse($attrs.max), function(value) {\n var dt = new Date(value);\n max = isNaN(dt) ? undefined : dt;\n }));\n\n var disabled = false;\n if ($attrs.ngDisabled) {\n watchers.push($scope.$parent.$watch($parse($attrs.ngDisabled), function(value) {\n disabled = value;\n }));\n }\n\n $scope.noIncrementHours = function() {\n var incrementedSelected = addMinutes(selected, hourStep * 60);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementHours = function() {\n var decrementedSelected = addMinutes(selected, -hourStep * 60);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noIncrementMinutes = function() {\n var incrementedSelected = addMinutes(selected, minuteStep);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementMinutes = function() {\n var decrementedSelected = addMinutes(selected, -minuteStep);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noIncrementSeconds = function() {\n var incrementedSelected = addSeconds(selected, secondStep);\n return disabled || incrementedSelected > max ||\n incrementedSelected < selected && incrementedSelected < min;\n };\n\n $scope.noDecrementSeconds = function() {\n var decrementedSelected = addSeconds(selected, -secondStep);\n return disabled || decrementedSelected < min ||\n decrementedSelected > selected && decrementedSelected > max;\n };\n\n $scope.noToggleMeridian = function() {\n if (selected.getHours() < 12) {\n return disabled || addMinutes(selected, 12 * 60) > max;\n }\n\n return disabled || addMinutes(selected, -12 * 60) < min;\n };\n\n var secondStep = timepickerConfig.secondStep;\n if ($attrs.secondStep) {\n watchers.push($scope.$parent.$watch($parse($attrs.secondStep), function(value) {\n secondStep = +value;\n }));\n }\n\n $scope.showSeconds = timepickerConfig.showSeconds;\n if ($attrs.showSeconds) {\n watchers.push($scope.$parent.$watch($parse($attrs.showSeconds), function(value) {\n $scope.showSeconds = !!value;\n }));\n }\n\n // 12H / 24H mode\n $scope.showMeridian = timepickerConfig.showMeridian;\n if ($attrs.showMeridian) {\n watchers.push($scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\n $scope.showMeridian = !!value;\n\n if (ngModelCtrl.$error.time) {\n // Evaluate from template\n var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\n if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n selected.setHours(hours);\n refresh();\n }\n } else {\n updateTemplate();\n }\n }));\n }\n\n // Get $scope.hours in 24H mode if valid\n function getHoursFromTemplate() {\n var hours = +$scope.hours;\n var valid = $scope.showMeridian ? hours > 0 && hours < 13 :\n hours >= 0 && hours < 24;\n if (!valid || $scope.hours === '') {\n return undefined;\n }\n\n if ($scope.showMeridian) {\n if (hours === 12) {\n hours = 0;\n }\n if ($scope.meridian === meridians[1]) {\n hours = hours + 12;\n }\n }\n return hours;\n }\n\n function getMinutesFromTemplate() {\n var minutes = +$scope.minutes;\n var valid = minutes >= 0 && minutes < 60;\n if (!valid || $scope.minutes === '') {\n return undefined;\n }\n return minutes;\n }\n\n function getSecondsFromTemplate() {\n var seconds = +$scope.seconds;\n return seconds >= 0 && seconds < 60 ? seconds : undefined;\n }\n\n function pad(value, noPad) {\n if (value === null) {\n return '';\n }\n\n return angular.isDefined(value) && value.toString().length < 2 && !noPad ?\n '0' + value : value.toString();\n }\n\n // Respond on mousewheel spin\n this.setupMousewheelEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n var isScrollingUp = function(e) {\n if (e.originalEvent) {\n e = e.originalEvent;\n }\n //pick correct delta variable depending on event\n var delta = e.wheelDelta ? e.wheelDelta : -e.deltaY;\n return e.detail || delta > 0;\n };\n\n hoursInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementHours() : $scope.decrementHours());\n }\n e.preventDefault();\n });\n\n minutesInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementMinutes() : $scope.decrementMinutes());\n }\n e.preventDefault();\n });\n\n secondsInputEl.bind('mousewheel wheel', function(e) {\n if (!disabled) {\n $scope.$apply(isScrollingUp(e) ? $scope.incrementSeconds() : $scope.decrementSeconds());\n }\n e.preventDefault();\n });\n };\n\n // Respond on up/down arrowkeys\n this.setupArrowkeyEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n hoursInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementHours();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementHours();\n $scope.$apply();\n }\n }\n });\n\n minutesInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementMinutes();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementMinutes();\n $scope.$apply();\n }\n }\n });\n\n secondsInputEl.bind('keydown', function(e) {\n if (!disabled) {\n if (e.which === 38) { // up\n e.preventDefault();\n $scope.incrementSeconds();\n $scope.$apply();\n } else if (e.which === 40) { // down\n e.preventDefault();\n $scope.decrementSeconds();\n $scope.$apply();\n }\n }\n });\n };\n\n this.setupInputEvents = function(hoursInputEl, minutesInputEl, secondsInputEl) {\n if ($scope.readonlyInput) {\n $scope.updateHours = angular.noop;\n $scope.updateMinutes = angular.noop;\n $scope.updateSeconds = angular.noop;\n return;\n }\n\n var invalidate = function(invalidHours, invalidMinutes, invalidSeconds) {\n ngModelCtrl.$setViewValue(null);\n ngModelCtrl.$setValidity('time', false);\n if (angular.isDefined(invalidHours)) {\n $scope.invalidHours = invalidHours;\n }\n\n if (angular.isDefined(invalidMinutes)) {\n $scope.invalidMinutes = invalidMinutes;\n }\n\n if (angular.isDefined(invalidSeconds)) {\n $scope.invalidSeconds = invalidSeconds;\n }\n };\n\n $scope.updateHours = function() {\n var hours = getHoursFromTemplate(),\n minutes = getMinutesFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(hours) && angular.isDefined(minutes)) {\n selected.setHours(hours);\n selected.setMinutes(minutes);\n if (selected < min || selected > max) {\n invalidate(true);\n } else {\n refresh('h');\n }\n } else {\n invalidate(true);\n }\n };\n\n hoursInputEl.bind('blur', function(e) {\n ngModelCtrl.$setTouched();\n if (modelIsEmpty()) {\n makeValid();\n } else if ($scope.hours === null || $scope.hours === '') {\n invalidate(true);\n } else if (!$scope.invalidHours && $scope.hours < 10) {\n $scope.$apply(function() {\n $scope.hours = pad($scope.hours, !padHours);\n });\n }\n });\n\n $scope.updateMinutes = function() {\n var minutes = getMinutesFromTemplate(),\n hours = getHoursFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n selected.setHours(hours);\n selected.setMinutes(minutes);\n if (selected < min || selected > max) {\n invalidate(undefined, true);\n } else {\n refresh('m');\n }\n } else {\n invalidate(undefined, true);\n }\n };\n\n minutesInputEl.bind('blur', function(e) {\n ngModelCtrl.$setTouched();\n if (modelIsEmpty()) {\n makeValid();\n } else if ($scope.minutes === null) {\n invalidate(undefined, true);\n } else if (!$scope.invalidMinutes && $scope.minutes < 10) {\n $scope.$apply(function() {\n $scope.minutes = pad($scope.minutes);\n });\n }\n });\n\n $scope.updateSeconds = function() {\n var seconds = getSecondsFromTemplate();\n\n ngModelCtrl.$setDirty();\n\n if (angular.isDefined(seconds)) {\n selected.setSeconds(seconds);\n refresh('s');\n } else {\n invalidate(undefined, undefined, true);\n }\n };\n\n secondsInputEl.bind('blur', function(e) {\n if (modelIsEmpty()) {\n makeValid();\n } else if (!$scope.invalidSeconds && $scope.seconds < 10) {\n $scope.$apply( function() {\n $scope.seconds = pad($scope.seconds);\n });\n }\n });\n\n };\n\n this.render = function() {\n var date = ngModelCtrl.$viewValue;\n\n if (isNaN(date)) {\n ngModelCtrl.$setValidity('time', false);\n $log.error('Timepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n } else {\n if (date) {\n selected = date;\n }\n\n if (selected < min || selected > max) {\n ngModelCtrl.$setValidity('time', false);\n $scope.invalidHours = true;\n $scope.invalidMinutes = true;\n } else {\n makeValid();\n }\n updateTemplate();\n }\n };\n\n // Call internally when we know that model is valid.\n function refresh(keyboardChange) {\n makeValid();\n ngModelCtrl.$setViewValue(new Date(selected));\n updateTemplate(keyboardChange);\n }\n\n function makeValid() {\n ngModelCtrl.$setValidity('time', true);\n $scope.invalidHours = false;\n $scope.invalidMinutes = false;\n $scope.invalidSeconds = false;\n }\n\n function updateTemplate(keyboardChange) {\n if (!ngModelCtrl.$modelValue) {\n $scope.hours = null;\n $scope.minutes = null;\n $scope.seconds = null;\n $scope.meridian = meridians[0];\n } else {\n var hours = selected.getHours(),\n minutes = selected.getMinutes(),\n seconds = selected.getSeconds();\n\n if ($scope.showMeridian) {\n hours = hours === 0 || hours === 12 ? 12 : hours % 12; // Convert 24 to 12 hour system\n }\n\n $scope.hours = keyboardChange === 'h' ? hours : pad(hours, !padHours);\n if (keyboardChange !== 'm') {\n $scope.minutes = pad(minutes);\n }\n $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n\n if (keyboardChange !== 's') {\n $scope.seconds = pad(seconds);\n }\n $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n }\n }\n\n function addSecondsToSelected(seconds) {\n selected = addSeconds(selected, seconds);\n refresh();\n }\n\n function addMinutes(selected, minutes) {\n return addSeconds(selected, minutes*60);\n }\n\n function addSeconds(date, seconds) {\n var dt = new Date(date.getTime() + seconds * 1000);\n var newDate = new Date(date);\n newDate.setHours(dt.getHours(), dt.getMinutes(), dt.getSeconds());\n return newDate;\n }\n\n function modelIsEmpty() {\n return ($scope.hours === null || $scope.hours === '') &&\n ($scope.minutes === null || $scope.minutes === '') &&\n (!$scope.showSeconds || $scope.showSeconds && ($scope.seconds === null || $scope.seconds === ''));\n }\n\n $scope.showSpinners = angular.isDefined($attrs.showSpinners) ?\n $scope.$parent.$eval($attrs.showSpinners) : timepickerConfig.showSpinners;\n\n $scope.incrementHours = function() {\n if (!$scope.noIncrementHours()) {\n addSecondsToSelected(hourStep * 60 * 60);\n }\n };\n\n $scope.decrementHours = function() {\n if (!$scope.noDecrementHours()) {\n addSecondsToSelected(-hourStep * 60 * 60);\n }\n };\n\n $scope.incrementMinutes = function() {\n if (!$scope.noIncrementMinutes()) {\n addSecondsToSelected(minuteStep * 60);\n }\n };\n\n $scope.decrementMinutes = function() {\n if (!$scope.noDecrementMinutes()) {\n addSecondsToSelected(-minuteStep * 60);\n }\n };\n\n $scope.incrementSeconds = function() {\n if (!$scope.noIncrementSeconds()) {\n addSecondsToSelected(secondStep);\n }\n };\n\n $scope.decrementSeconds = function() {\n if (!$scope.noDecrementSeconds()) {\n addSecondsToSelected(-secondStep);\n }\n };\n\n $scope.toggleMeridian = function() {\n var minutes = getMinutesFromTemplate(),\n hours = getHoursFromTemplate();\n\n if (!$scope.noToggleMeridian()) {\n if (angular.isDefined(minutes) && angular.isDefined(hours)) {\n addSecondsToSelected(12 * 60 * (selected.getHours() < 12 ? 60 : -60));\n } else {\n $scope.meridian = $scope.meridian === meridians[0] ? meridians[1] : meridians[0];\n }\n }\n };\n\n $scope.blur = function() {\n ngModelCtrl.$setTouched();\n };\n\n $scope.$on('$destroy', function() {\n while (watchers.length) {\n watchers.shift()();\n }\n });\n}])\n\n.directive('uibTimepicker', ['uibTimepickerConfig', function(uibTimepickerConfig) {\n return {\n require: ['uibTimepicker', '?^ngModel'],\n controller: 'UibTimepickerController',\n controllerAs: 'timepicker',\n replace: true,\n scope: {},\n templateUrl: function(element, attrs) {\n return attrs.templateUrl || uibTimepickerConfig.templateUrl;\n },\n link: function(scope, element, attrs, ctrls) {\n var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n if (ngModelCtrl) {\n timepickerCtrl.init(ngModelCtrl, element.find('input'));\n }\n }\n };\n}]);\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.debounce', 'ui.bootstrap.position'])\n\n/**\n * A helper service that can parse typeahead's syntax (string provided by users)\n * Extracted to a separate service for ease of unit testing\n */\n .factory('uibTypeaheadParser', ['$parse', function($parse) {\n // 00000111000000000000022200000000000000003333333333333330000000000044000\n var TYPEAHEAD_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+([\\s\\S]+?)$/;\n return {\n parse: function(input) {\n var match = input.match(TYPEAHEAD_REGEXP);\n if (!match) {\n throw new Error(\n 'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\n ' but got \"' + input + '\".');\n }\n\n return {\n itemName: match[3],\n source: $parse(match[4]),\n viewMapper: $parse(match[2] || match[1]),\n modelMapper: $parse(match[1])\n };\n }\n };\n }])\n\n .controller('UibTypeaheadController', ['$scope', '$element', '$attrs', '$compile', '$parse', '$q', '$timeout', '$document', '$window', '$rootScope', '$$debounce', '$uibPosition', 'uibTypeaheadParser',\n function(originalScope, element, attrs, $compile, $parse, $q, $timeout, $document, $window, $rootScope, $$debounce, $position, typeaheadParser) {\n var HOT_KEYS = [9, 13, 27, 38, 40];\n var eventDebounceTime = 200;\n var modelCtrl, ngModelOptions;\n //SUPPORTED ATTRIBUTES (OPTIONS)\n\n //minimal no of characters that needs to be entered before typeahead kicks-in\n var minLength = originalScope.$eval(attrs.typeaheadMinLength);\n if (!minLength && minLength !== 0) {\n minLength = 1;\n }\n\n originalScope.$watch(attrs.typeaheadMinLength, function (newVal) {\n minLength = !newVal && newVal !== 0 ? 1 : newVal;\n });\n\n //minimal wait time after last character typed before typeahead kicks-in\n var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n //should it restrict model values to the ones selected from the popup only?\n var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n originalScope.$watch(attrs.typeaheadEditable, function (newVal) {\n isEditable = newVal !== false;\n });\n\n //binding to a variable that indicates if matches are being retrieved asynchronously\n var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n //a function to determine if an event should cause selection\n var isSelectEvent = attrs.typeaheadShouldSelect ? $parse(attrs.typeaheadShouldSelect) : function(scope, vals) {\n var evt = vals.$event;\n return evt.which === 13 || evt.which === 9;\n };\n\n //a callback executed when a match is selected\n var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n //should it select highlighted popup value when losing focus?\n var isSelectOnBlur = angular.isDefined(attrs.typeaheadSelectOnBlur) ? originalScope.$eval(attrs.typeaheadSelectOnBlur) : false;\n\n //binding to a variable that indicates if there were no results after the query is completed\n var isNoResultsSetter = $parse(attrs.typeaheadNoResults).assign || angular.noop;\n\n var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n var appendTo = attrs.typeaheadAppendTo ?\n originalScope.$eval(attrs.typeaheadAppendTo) : null;\n\n var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;\n\n //If input matches an item of the list exactly, select it automatically\n var selectOnExact = attrs.typeaheadSelectOnExact ? originalScope.$eval(attrs.typeaheadSelectOnExact) : false;\n\n //binding to a variable that indicates if dropdown is open\n var isOpenSetter = $parse(attrs.typeaheadIsOpen).assign || angular.noop;\n\n var showHint = originalScope.$eval(attrs.typeaheadShowHint) || false;\n\n //INTERNAL VARIABLES\n\n //model setter executed upon match selection\n var parsedModel = $parse(attrs.ngModel);\n var invokeModelSetter = $parse(attrs.ngModel + '($$$p)');\n var $setModelValue = function(scope, newValue) {\n if (angular.isFunction(parsedModel(originalScope)) &&\n ngModelOptions && ngModelOptions.$options && ngModelOptions.$options.getterSetter) {\n return invokeModelSetter(scope, {$$$p: newValue});\n }\n\n return parsedModel.assign(scope, newValue);\n };\n\n //expressions used by typeahead\n var parserResult = typeaheadParser.parse(attrs.uibTypeahead);\n\n var hasFocus;\n\n //Used to avoid bug in iOS webview where iOS keyboard does not fire\n //mousedown & mouseup events\n //Issue #3699\n var selected;\n\n //create a child scope for the typeahead directive so we are not polluting original scope\n //with typeahead-specific data (matches, query etc.)\n var scope = originalScope.$new();\n var offDestroy = originalScope.$on('$destroy', function() {\n scope.$destroy();\n });\n scope.$on('$destroy', offDestroy);\n\n // WAI-ARIA\n var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n element.attr({\n 'aria-autocomplete': 'list',\n 'aria-expanded': false,\n 'aria-owns': popupId\n });\n\n var inputsContainer, hintInputElem;\n //add read-only input to show hint\n if (showHint) {\n inputsContainer = angular.element('
');\n inputsContainer.css('position', 'relative');\n element.after(inputsContainer);\n hintInputElem = element.clone();\n hintInputElem.attr('placeholder', '');\n hintInputElem.attr('tabindex', '-1');\n hintInputElem.val('');\n hintInputElem.css({\n 'position': 'absolute',\n 'top': '0px',\n 'left': '0px',\n 'border-color': 'transparent',\n 'box-shadow': 'none',\n 'opacity': 1,\n 'background': 'none 0% 0% / auto repeat scroll padding-box border-box rgb(255, 255, 255)',\n 'color': '#999'\n });\n element.css({\n 'position': 'relative',\n 'vertical-align': 'top',\n 'background-color': 'transparent'\n });\n inputsContainer.append(hintInputElem);\n hintInputElem.after(element);\n }\n\n //pop-up element used to display matches\n var popUpEl = angular.element('
');\n popUpEl.attr({\n id: popupId,\n matches: 'matches',\n active: 'activeIdx',\n select: 'select(activeIdx, evt)',\n 'move-in-progress': 'moveInProgress',\n query: 'query',\n position: 'position',\n 'assign-is-open': 'assignIsOpen(isOpen)',\n debounce: 'debounceUpdate'\n });\n //custom item template\n if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n }\n\n if (angular.isDefined(attrs.typeaheadPopupTemplateUrl)) {\n popUpEl.attr('popup-template-url', attrs.typeaheadPopupTemplateUrl);\n }\n\n var resetHint = function() {\n if (showHint) {\n hintInputElem.val('');\n }\n };\n\n var resetMatches = function() {\n scope.matches = [];\n scope.activeIdx = -1;\n element.attr('aria-expanded', false);\n resetHint();\n };\n\n var getMatchId = function(index) {\n return popupId + '-option-' + index;\n };\n\n // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n // This attribute is added or removed automatically when the `activeIdx` changes.\n scope.$watch('activeIdx', function(index) {\n if (index < 0) {\n element.removeAttr('aria-activedescendant');\n } else {\n element.attr('aria-activedescendant', getMatchId(index));\n }\n });\n\n var inputIsExactMatch = function(inputValue, index) {\n if (scope.matches.length > index && inputValue) {\n return inputValue.toUpperCase() === scope.matches[index].label.toUpperCase();\n }\n\n return false;\n };\n\n var getMatchesAsync = function(inputValue, evt) {\n var locals = {$viewValue: inputValue};\n isLoadingSetter(originalScope, true);\n isNoResultsSetter(originalScope, false);\n $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\n //it might happen that several async queries were in progress if a user were typing fast\n //but we are interested only in responses that correspond to the current view value\n var onCurrentRequest = inputValue === modelCtrl.$viewValue;\n if (onCurrentRequest && hasFocus) {\n if (matches && matches.length > 0) {\n scope.activeIdx = focusFirst ? 0 : -1;\n isNoResultsSetter(originalScope, false);\n scope.matches.length = 0;\n\n //transform labels\n for (var i = 0; i < matches.length; i++) {\n locals[parserResult.itemName] = matches[i];\n scope.matches.push({\n id: getMatchId(i),\n label: parserResult.viewMapper(scope, locals),\n model: matches[i]\n });\n }\n\n scope.query = inputValue;\n //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n //due to other elements being rendered\n recalculatePosition();\n\n element.attr('aria-expanded', true);\n\n //Select the single remaining option if user input matches\n if (selectOnExact && scope.matches.length === 1 && inputIsExactMatch(inputValue, 0)) {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function() {\n scope.select(0, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(0, evt);\n }\n }\n\n if (showHint) {\n var firstLabel = scope.matches[0].label;\n if (angular.isString(inputValue) &&\n inputValue.length > 0 &&\n firstLabel.slice(0, inputValue.length).toUpperCase() === inputValue.toUpperCase()) {\n hintInputElem.val(inputValue + firstLabel.slice(inputValue.length));\n } else {\n hintInputElem.val('');\n }\n }\n } else {\n resetMatches();\n isNoResultsSetter(originalScope, true);\n }\n }\n if (onCurrentRequest) {\n isLoadingSetter(originalScope, false);\n }\n }, function() {\n resetMatches();\n isLoadingSetter(originalScope, false);\n isNoResultsSetter(originalScope, true);\n });\n };\n\n // bind events only if appendToBody params exist - performance feature\n if (appendToBody) {\n angular.element($window).on('resize', fireRecalculating);\n $document.find('body').on('scroll', fireRecalculating);\n }\n\n // Declare the debounced function outside recalculating for\n // proper debouncing\n var debouncedRecalculate = $$debounce(function() {\n // if popup is visible\n if (scope.matches.length) {\n recalculatePosition();\n }\n\n scope.moveInProgress = false;\n }, eventDebounceTime);\n\n // Default progress type\n scope.moveInProgress = false;\n\n function fireRecalculating() {\n if (!scope.moveInProgress) {\n scope.moveInProgress = true;\n scope.$digest();\n }\n\n debouncedRecalculate();\n }\n\n // recalculate actual position and set new values to scope\n // after digest loop is popup in right position\n function recalculatePosition() {\n scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n scope.position.top += element.prop('offsetHeight');\n }\n\n //we need to propagate user's query so we can higlight matches\n scope.query = undefined;\n\n //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later\n var timeoutPromise;\n\n var scheduleSearchWithTimeout = function(inputValue) {\n timeoutPromise = $timeout(function() {\n getMatchesAsync(inputValue);\n }, waitTime);\n };\n\n var cancelPreviousTimeout = function() {\n if (timeoutPromise) {\n $timeout.cancel(timeoutPromise);\n }\n };\n\n resetMatches();\n\n scope.assignIsOpen = function (isOpen) {\n isOpenSetter(originalScope, isOpen);\n };\n\n scope.select = function(activeIdx, evt) {\n //called from within the $digest() cycle\n var locals = {};\n var model, item;\n\n selected = true;\n locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n model = parserResult.modelMapper(originalScope, locals);\n $setModelValue(originalScope, model);\n modelCtrl.$setValidity('editable', true);\n modelCtrl.$setValidity('parse', true);\n\n onSelectCallback(originalScope, {\n $item: item,\n $model: model,\n $label: parserResult.viewMapper(originalScope, locals),\n $event: evt\n });\n\n resetMatches();\n\n //return focus to the input element if a match was selected via a mouse click event\n // use timeout to avoid $rootScope:inprog error\n if (scope.$eval(attrs.typeaheadFocusOnSelect) !== false) {\n $timeout(function() { element[0].focus(); }, 0, false);\n }\n };\n\n //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n element.on('keydown', function(evt) {\n //typeahead is open and an \"interesting\" key was pressed\n if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n return;\n }\n\n var shouldSelect = isSelectEvent(originalScope, {$event: evt});\n\n /**\n * if there's nothing selected (i.e. focusFirst) and enter or tab is hit\n * or\n * shift + tab is pressed to bring focus to the previous element\n * then clear the results\n */\n if (scope.activeIdx === -1 && shouldSelect || evt.which === 9 && !!evt.shiftKey) {\n resetMatches();\n scope.$digest();\n return;\n }\n\n evt.preventDefault();\n var target;\n switch (evt.which) {\n case 27: // escape\n evt.stopPropagation();\n\n resetMatches();\n originalScope.$digest();\n break;\n case 38: // up arrow\n scope.activeIdx = (scope.activeIdx > 0 ? scope.activeIdx : scope.matches.length) - 1;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n case 40: // down arrow\n scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n scope.$digest();\n target = popUpEl.find('li')[scope.activeIdx];\n target.parentNode.scrollTop = target.offsetTop;\n break;\n default:\n if (shouldSelect) {\n scope.$apply(function() {\n if (angular.isNumber(scope.debounceUpdate) || angular.isObject(scope.debounceUpdate)) {\n $$debounce(function() {\n scope.select(scope.activeIdx, evt);\n }, angular.isNumber(scope.debounceUpdate) ? scope.debounceUpdate : scope.debounceUpdate['default']);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n }\n }\n });\n\n element.bind('focus', function (evt) {\n hasFocus = true;\n if (minLength === 0 && !modelCtrl.$viewValue) {\n $timeout(function() {\n getMatchesAsync(modelCtrl.$viewValue, evt);\n }, 0);\n }\n });\n\n element.bind('blur', function(evt) {\n if (isSelectOnBlur && scope.matches.length && scope.activeIdx !== -1 && !selected) {\n selected = true;\n scope.$apply(function() {\n if (angular.isObject(scope.debounceUpdate) && angular.isNumber(scope.debounceUpdate.blur)) {\n $$debounce(function() {\n scope.select(scope.activeIdx, evt);\n }, scope.debounceUpdate.blur);\n } else {\n scope.select(scope.activeIdx, evt);\n }\n });\n }\n if (!isEditable && modelCtrl.$error.editable) {\n modelCtrl.$setViewValue();\n // Reset validity as we are clearing\n modelCtrl.$setValidity('editable', true);\n modelCtrl.$setValidity('parse', true);\n element.val('');\n }\n hasFocus = false;\n selected = false;\n });\n\n // Keep reference to click handler to unbind it.\n var dismissClickHandler = function(evt) {\n // Issue #3973\n // Firefox treats right click as a click on document\n if (element[0] !== evt.target && evt.which !== 3 && scope.matches.length !== 0) {\n resetMatches();\n if (!$rootScope.$$phase) {\n originalScope.$digest();\n }\n }\n };\n\n $document.on('click', dismissClickHandler);\n\n originalScope.$on('$destroy', function() {\n $document.off('click', dismissClickHandler);\n if (appendToBody || appendTo) {\n $popup.remove();\n }\n\n if (appendToBody) {\n angular.element($window).off('resize', fireRecalculating);\n $document.find('body').off('scroll', fireRecalculating);\n }\n // Prevent jQuery cache memory leak\n popUpEl.remove();\n\n if (showHint) {\n inputsContainer.remove();\n }\n });\n\n var $popup = $compile(popUpEl)(scope);\n\n if (appendToBody) {\n $document.find('body').append($popup);\n } else if (appendTo) {\n angular.element(appendTo).eq(0).append($popup);\n } else {\n element.after($popup);\n }\n\n this.init = function(_modelCtrl, _ngModelOptions) {\n modelCtrl = _modelCtrl;\n ngModelOptions = _ngModelOptions;\n\n scope.debounceUpdate = modelCtrl.$options && $parse(modelCtrl.$options.debounce)(originalScope);\n\n //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n modelCtrl.$parsers.unshift(function(inputValue) {\n hasFocus = true;\n\n if (minLength === 0 || inputValue && inputValue.length >= minLength) {\n if (waitTime > 0) {\n cancelPreviousTimeout();\n scheduleSearchWithTimeout(inputValue);\n } else {\n getMatchesAsync(inputValue);\n }\n } else {\n isLoadingSetter(originalScope, false);\n cancelPreviousTimeout();\n resetMatches();\n }\n\n if (isEditable) {\n return inputValue;\n }\n\n if (!inputValue) {\n // Reset in case user had typed something previously.\n modelCtrl.$setValidity('editable', true);\n return null;\n }\n\n modelCtrl.$setValidity('editable', false);\n return undefined;\n });\n\n modelCtrl.$formatters.push(function(modelValue) {\n var candidateViewValue, emptyViewValue;\n var locals = {};\n\n // The validity may be set to false via $parsers (see above) if\n // the model is restricted to selected values. If the model\n // is set manually it is considered to be valid.\n if (!isEditable) {\n modelCtrl.$setValidity('editable', true);\n }\n\n if (inputFormatter) {\n locals.$model = modelValue;\n return inputFormatter(originalScope, locals);\n }\n\n //it might happen that we don't have enough info to properly render input value\n //we need to check for this situation and simply return model value if we can't apply custom formatting\n locals[parserResult.itemName] = modelValue;\n candidateViewValue = parserResult.viewMapper(originalScope, locals);\n locals[parserResult.itemName] = undefined;\n emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n return candidateViewValue !== emptyViewValue ? candidateViewValue : modelValue;\n });\n };\n }])\n\n .directive('uibTypeahead', function() {\n return {\n controller: 'UibTypeaheadController',\n require: ['ngModel', '^?ngModelOptions', 'uibTypeahead'],\n link: function(originalScope, element, attrs, ctrls) {\n ctrls[2].init(ctrls[0], ctrls[1]);\n }\n };\n })\n\n .directive('uibTypeaheadPopup', ['$$debounce', function($$debounce) {\n return {\n scope: {\n matches: '=',\n query: '=',\n active: '=',\n position: '&',\n moveInProgress: '=',\n select: '&',\n assignIsOpen: '&',\n debounce: '&'\n },\n replace: true,\n templateUrl: function(element, attrs) {\n return attrs.popupTemplateUrl || 'uib/template/typeahead/typeahead-popup.html';\n },\n link: function(scope, element, attrs) {\n scope.templateUrl = attrs.templateUrl;\n\n scope.isOpen = function() {\n var isDropdownOpen = scope.matches.length > 0;\n scope.assignIsOpen({ isOpen: isDropdownOpen });\n return isDropdownOpen;\n };\n\n scope.isActive = function(matchIdx) {\n return scope.active === matchIdx;\n };\n\n scope.selectActive = function(matchIdx) {\n scope.active = matchIdx;\n };\n\n scope.selectMatch = function(activeIdx, evt) {\n var debounce = scope.debounce();\n if (angular.isNumber(debounce) || angular.isObject(debounce)) {\n $$debounce(function() {\n scope.select({activeIdx: activeIdx, evt: evt});\n }, angular.isNumber(debounce) ? debounce : debounce['default']);\n } else {\n scope.select({activeIdx: activeIdx, evt: evt});\n }\n };\n }\n };\n }])\n\n .directive('uibTypeaheadMatch', ['$templateRequest', '$compile', '$parse', function($templateRequest, $compile, $parse) {\n return {\n scope: {\n index: '=',\n match: '=',\n query: '='\n },\n link: function(scope, element, attrs) {\n var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'uib/template/typeahead/typeahead-match.html';\n $templateRequest(tplUrl).then(function(tplContent) {\n var tplEl = angular.element(tplContent.trim());\n element.replaceWith(tplEl);\n $compile(tplEl)(scope);\n });\n }\n };\n }])\n\n .filter('uibTypeaheadHighlight', ['$sce', '$injector', '$log', function($sce, $injector, $log) {\n var isSanitizePresent;\n isSanitizePresent = $injector.has('$sanitize');\n\n function escapeRegexp(queryToEscape) {\n // Regex: capture the whole query string and replace it with the string that will be used to match\n // the results, for example if the capture is \"a\" the result will be \\a\n return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n }\n\n function containsHtml(matchItem) {\n return /<.*>/g.test(matchItem);\n }\n\n return function(matchItem, query) {\n if (!isSanitizePresent && containsHtml(matchItem)) {\n $log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger\n }\n matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; // Replaces the capture string with a the same string inside of a \"strong\" tag\n if (!isSanitizePresent) {\n matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive\n }\n return matchItem;\n };\n }]);\n\nangular.module(\"uib/template/accordion/accordion-group.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/accordion/accordion-group.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \" {{heading}}\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/accordion/accordion.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/accordion/accordion.html\",\n \"
\");\n}]);\n\nangular.module(\"uib/template/alert/alert.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/alert/alert.html\",\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/carousel/carousel.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/carousel/carousel.html\",\n \"
\\n\" +\n \"
\\n\" +\n \" 1\\\">\\n\" +\n \" \\n\" +\n \" previous\\n\" +\n \" \\n\" +\n \" 1\\\">\\n\" +\n \" \\n\" +\n \" next\\n\" +\n \" \\n\" +\n \"
    1\\\">\\n\" +\n \"
  1. \\n\" +\n \" slide {{ $index + 1 }} of {{ slides.length }}, currently active\\n\" +\n \"
  2. \\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/carousel/slide.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/carousel/slide.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/datepicker.html\",\n \"
\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/day.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
{{::label.abbr}}
{{ weekNumbers[$index] }}\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/month.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepicker/year.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/datepickerPopup/popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/datepickerPopup/popup.html\",\n \"
\\n\" +\n \" \\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/modal/backdrop.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/modal/backdrop.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/modal/window.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/pager/pager.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/pager/pager.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/pagination/pagination.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/pagination/pagination.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-html-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-html-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tooltip/tooltip-template-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tooltip/tooltip-template-popup.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-html.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover-html.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover-template.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover-template.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/popover/popover.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/popover/popover.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/bar.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/bar.html\",\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/progressbar/progress.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/progress.html\",\n \"
\");\n}]);\n\nangular.module(\"uib/template/progressbar/progressbar.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/progressbar/progressbar.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/rating/rating.html\",\n \"\\n\" +\n \" ({{ $index < value ? '*' : ' ' }})\\n\" +\n \" \\n\" +\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tab.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tabs/tab.html\",\n \"
  • \\n\" +\n \" {{heading}}\\n\" +\n \"
  • \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/tabs/tabset.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/tabs/tabset.html\",\n \"
    \\n\" +\n \" \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"
    \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/timepicker/timepicker.html\",\n \"\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
      
    \\n\" +\n \" \\n\" +\n \" :\\n\" +\n \" \\n\" +\n \" :\\n\" +\n \" \\n\" +\n \"
      
    \\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-match.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/typeahead/typeahead-match.html\",\n \"\\n\" +\n \"\");\n}]);\n\nangular.module(\"uib/template/typeahead/typeahead-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"uib/template/typeahead/typeahead-popup.html\",\n \"\\n\" +\n \"\");\n}]);\nangular.module('ui.bootstrap.carousel').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibCarouselCss && angular.element(document).find('head').prepend(''); angular.$$uibCarouselCss = true; });\nangular.module('ui.bootstrap.datepicker').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibDatepickerCss && angular.element(document).find('head').prepend(''); angular.$$uibDatepickerCss = true; });\nangular.module('ui.bootstrap.position').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibPositionCss && angular.element(document).find('head').prepend(''); angular.$$uibPositionCss = true; });\nangular.module('ui.bootstrap.datepickerPopup').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibDatepickerpopupCss && angular.element(document).find('head').prepend(''); angular.$$uibDatepickerpopupCss = true; });\nangular.module('ui.bootstrap.tooltip').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTooltipCss && angular.element(document).find('head').prepend(''); angular.$$uibTooltipCss = true; });\nangular.module('ui.bootstrap.timepicker').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTimepickerCss && angular.element(document).find('head').prepend(''); angular.$$uibTimepickerCss = true; });\nangular.module('ui.bootstrap.typeahead').run(function() {!angular.$$csp().noInlineStyle && !angular.$$uibTypeaheadCss && angular.element(document).find('head').prepend(''); angular.$$uibTypeaheadCss = true; });"],"sourceRoot":""}