diff --git a/dist/select.css b/dist/select.css
index 0e713bb1b..3b75125a2 100644
--- a/dist/select.css
+++ b/dist/select.css
@@ -1,7 +1,7 @@
 /*!
  * ui-select
  * http://github.com/angular-ui/ui-select
- * Version: 0.19.7 - 2017-04-15T14:28:36.790Z
+ * Version: 0.19.8 - 2018-08-29T07:07:49.833Z
  * License: MIT
  */
 
@@ -21,11 +21,10 @@
   overflow: hidden !important;
   position: absolute !important;
   outline: 0 !important;
-  left: 0px !important;
-  top: 0px !important;
+  left: 0 !important;
+  top: 0 !important;
 }
 
-
 .ui-select-choices-row:hover {
   background-color: #f5f5f5;
 }
@@ -34,68 +33,84 @@
 
 /* Mark invalid Select2 */
 .ng-dirty.ng-invalid > a.select2-choice {
-    border-color: #D44950;
+  border-color: #D44950;
 }
 
 .select2-result-single {
   padding-left: 0;
 }
 
-.select2-locked > .select2-search-choice-close{
-  display:none;
+.select2-locked > .select2-search-choice-close {
+  display: none;
 }
 
-.select-locked > .ui-select-match-close{
-    display:none;
+.select-locked > .ui-select-match-close {
+  display: none;
 }
 
 body > .select2-container.open {
   z-index: 9999; /* The z-index Select2 applies to the select2-drop */
 }
 
+.select2 .ui-select-footer,
+.select2 .ui-select-header {
+  padding: 4px 10px;
+}
+
+.select2 .ui-select-footer {
+  border-top: 1px solid #dfe5eb;
+}
+
+.select2 .ui-select-header {
+  border-bottom: 1px solid #dfe5eb;
+}
+
 /* Handle up direction Select2 */
 .ui-select-container[theme="select2"].direction-up .ui-select-match,
 .ui-select-container.select2.direction-up .ui-select-match {
-    border-radius: 4px; /* FIXME hardcoded value :-/ */
-    border-top-left-radius: 0;
-    border-top-right-radius: 0;
+  border-radius: 4px; /* FIXME hardcoded value :-/ */
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
 }
+
 .ui-select-container[theme="select2"].direction-up .ui-select-dropdown,
 .ui-select-container.select2.direction-up .ui-select-dropdown {
-    border-radius: 4px; /* FIXME hardcoded value :-/ */
-    border-bottom-left-radius: 0;
-    border-bottom-right-radius: 0;
+  border-radius: 4px; /* FIXME hardcoded value :-/ */
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
 
-    border-top-width: 1px;  /* FIXME hardcoded value :-/ */
-    border-top-style: solid;
+  border-top-width: 1px; /* FIXME hardcoded value :-/ */
+  border-top-style: solid;
 
-    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
+  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
 
-    margin-top: -4px; /* FIXME hardcoded value :-/ */
+  margin-top: -4px; /* FIXME hardcoded value :-/ */
 }
+
 .ui-select-container[theme="select2"].direction-up .ui-select-dropdown .select2-search,
 .ui-select-container.select2.direction-up .ui-select-dropdown .select2-search {
-    margin-top: 4px; /* FIXME hardcoded value :-/ */
+  margin-top: 4px; /* FIXME hardcoded value :-/ */
 }
+
 .ui-select-container[theme="select2"].direction-up.select2-dropdown-open .ui-select-match,
 .ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match {
-    border-bottom-color: #5897fb;
+  border-bottom-color: #5897fb;
 }
 
 .ui-select-container[theme="select2"] .ui-select-dropdown .ui-select-search-hidden,
-.ui-select-container[theme="select2"] .ui-select-dropdown .ui-select-search-hidden input{
-    opacity: 0;
-    height: 0;
-    min-height: 0;
-    padding: 0;
-    margin: 0;
-    border:0;
+.ui-select-container[theme="select2"] .ui-select-dropdown .ui-select-search-hidden input {
+  opacity: 0;
+  height: 0;
+  min-height: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
 }
 
 /* Selectize theme */
 
 /* Helper class to show styles when focus */
-.selectize-input.selectize-focus{
+.selectize-input.selectize-focus {
   border-color: #007FBB !important;
 }
 
@@ -114,25 +129,47 @@ body > .select2-container.open {
   width: 100%;
 }
 
+.selectize-dropdown .ui-select-footer,
+.selectize-dropdown .ui-select-header {
+  padding: 5px 8px;
+}
+
+.selectize-dropdown .ui-select-header {
+  border-bottom: 1px solid #b8b8b8;
+}
+
+.selectize-dropdown .ui-select-footer {
+  border-top: 1px solid #b8b8b8;
+}
+
 /* Mark invalid Selectize */
 .ng-dirty.ng-invalid > div.selectize-input {
-    border-color: #D44950;
+  border-color: #D44950;
 }
 
 /* Handle up direction Selectize */
 .ui-select-container[theme="selectize"].direction-up .ui-select-dropdown {
-    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
-    margin-top: -2px; /* FIXME hardcoded value :-/ */
+  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
+  margin-top: -2px; /* FIXME hardcoded value :-/ */
+}
+
+.ui-select-container[theme="selectize"] input.ui-select-search-hidden {
+  opacity: 0;
+  height: 0;
+  min-height: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+  width: 0;
+}
+
+.ui-select-container[theme="selectize"] .ui-select-header-group-selectable:hover {
+    background-color: #f5f5f5;
 }
 
-.ui-select-container[theme="selectize"] input.ui-select-search-hidden{
-    opacity: 0;
-    height: 0;
-    min-height: 0;
-    padding: 0;
-    margin: 0;
-    border:0;
-    width: 0;
+.ui-select-container[theme="selectize"] .ui-select-header-group-selectable {
+    cursor: pointer;
+    padding-left: 15px;
 }
 
 /* Bootstrap theme */
@@ -166,27 +203,38 @@ body > .select2-container.open {
   position: static;
 }
 
+.input-group .ui-select-bootstrap:first-child .form-control {
+  border-top-left-radius: 4px; /* FIXME hardcoded value :-/ */
+  border-bottom-left-radius: 4px; /* FIXME hardcoded value :-/ */
+}
+
+.input-group .ui-select-bootstrap:last-child .form-control {
+  border-top-right-radius: 4px; /* FIXME hardcoded value :-/ */
+  border-bottom-right-radius: 4px; /* FIXME hardcoded value :-/ */
+}
+
 .input-group > .ui-select-bootstrap > input.ui-select-search.form-control {
   border-radius: 4px; /* FIXME hardcoded value :-/ */
   border-top-right-radius: 0;
   border-bottom-right-radius: 0;
 }
+
 .input-group > .ui-select-bootstrap > input.ui-select-search.form-control.direction-up {
   border-radius: 4px !important; /* FIXME hardcoded value :-/ */
   border-top-right-radius: 0 !important;
   border-bottom-right-radius: 0 !important;
 }
 
-.ui-select-bootstrap .ui-select-search-hidden{
-    opacity: 0;
-    height: 0;
-    min-height: 0;
-    padding: 0;
-    margin: 0;
-    border:0;
+.ui-select-bootstrap .ui-select-search-hidden {
+  opacity: 0;
+  height: 0;
+  min-height: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
 }
 
-.ui-select-bootstrap > .ui-select-match > .btn{
+.ui-select-bootstrap > .ui-select-match > .btn {
   /* Instead of center because of .btn */
   text-align: left !important;
 }
@@ -198,7 +246,8 @@ body > .select2-container.open {
 }
 
 /* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */
-.ui-select-bootstrap > .ui-select-choices ,.ui-select-bootstrap > .ui-select-no-choice {
+.ui-select-bootstrap .ui-select-choices,
+.ui-select-bootstrap .ui-select-no-choice {
   width: 100%;
   height: auto;
   max-height: 200px;
@@ -261,6 +310,22 @@ body > .ui-select-bootstrap.open {
   border-right: 1px solid #428bca;
 }
 
+
+.ui-select-bootstrap .ui-select-choices {
+  padding: 5px 0;
+  margin: 0;
+  list-style: none;
+
+.ui-select-bootstrap .ui-select-header-group-selectable:hover {
+    background-color: #f5f5f5;
+}
+
+.ui-select-bootstrap .ui-select-header-group-selectable {
+    color: black;
+    cursor: pointer;
+    padding: 3px 10px;
+}
+
 .ui-select-bootstrap .ui-select-choices-row>span {
     cursor: pointer;
     display: block;
@@ -272,51 +337,87 @@ body > .ui-select-bootstrap.open {
     white-space: nowrap;
 }
 
-.ui-select-bootstrap .ui-select-choices-row>span:hover, .ui-select-bootstrap .ui-select-choices-row>span:focus {
-    text-decoration: none;
-    color: #262626;
-    background-color: #f5f5f5;
+.ui-select-bootstrap .ui-select-choices-row > span {
+  cursor: pointer;
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: 400;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+
+.ui-select-bootstrap .ui-select-choices-row > span:hover, .ui-select-bootstrap .ui-select-choices-row > span:focus {
+  text-decoration: none;
+  color: #262626;
+  background-color: #f5f5f5;
+}
+
+.ui-select-bootstrap .ui-select-choices-row.active > span {
+  color: #fff;
+  text-decoration: none;
+  outline: 0;
+  background-color: #428bca;
+}
+
+.ui-select-bootstrap .ui-select-choices-row.disabled > span,
+.ui-select-bootstrap .ui-select-choices-row.active.disabled > span {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+}
+
+.ui-select-bootstrap .ui-select-footer,
+.ui-select-bootstrap .ui-select-header {
+  display: block;
+  padding: 5px 20px;
+  clear: both;
+  font-weight: 400;
+  line-height: 1.42857143;
+}
+
+.ui-select-bootstrap .ui-select-footer {
+  border-top: 1px solid #dfe5eb;
 }
 
-.ui-select-bootstrap .ui-select-choices-row.active>span {
-    color: #fff;
-    text-decoration: none;
-    outline: 0;
-    background-color: #428bca;
+.ui-select-bootstrap .ui-select-header {
+  border-bottom: 1px solid #dfe5eb;
 }
 
-.ui-select-bootstrap .ui-select-choices-row.disabled>span,
-.ui-select-bootstrap .ui-select-choices-row.active.disabled>span {
-    color: #777;
-    cursor: not-allowed;
-    background-color: #fff;
+.ui-select-bootstrap .ui-select-dropdown {
+  width: 100%;
+  padding: 0;
+  margin-top: -1px;
 }
 
 /* fix hide/show angular animation */
 .ui-select-match.ng-hide-add,
 .ui-select-search.ng-hide-add {
-    display: none !important;
+  display: none !important;
 }
 
 /* Mark invalid Bootstrap */
 .ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {
-    border-color: #D44950;
+  border-color: #D44950;
 }
 
 /* Handle up direction Bootstrap */
 .ui-select-container[theme="bootstrap"].direction-up .ui-select-dropdown {
-    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
+  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);
 }
 
 .ui-select-bootstrap .ui-select-match-text {
-    width: 100%;
-    padding-right: 1em;
+  width: 100%;
+  padding-right: 1em;
 }
+
 .ui-select-bootstrap .ui-select-match-text span {
-    display: inline-block;
-    width: 100%;
-    overflow: hidden;
+  display: inline-block;
+  width: 100%;
+  overflow: hidden;
 }
+
 .ui-select-bootstrap .ui-select-toggle > a.btn {
   position: absolute;
   height: 10px;
@@ -326,10 +427,10 @@ body > .ui-select-bootstrap.open {
 
 /* Spinner */
 .ui-select-refreshing.glyphicon {
-    position: absolute;
-    right: 0;
-    padding: 8px 27px;
- }
+  position: absolute;
+  right: 0;
+  padding: 8px 27px;
+}
 
 @-webkit-keyframes ui-select-spin {
   0% {
@@ -341,6 +442,7 @@ body > .ui-select-bootstrap.open {
     transform: rotate(359deg);
   }
 }
+
 @keyframes ui-select-spin {
   0% {
     -webkit-transform: rotate(0deg);
diff --git a/dist/select.js b/dist/select.js
index 5ac4e0b70..37cb127a4 100644
--- a/dist/select.js
+++ b/dist/select.js
@@ -1,7 +1,7 @@
 /*!
  * ui-select
  * http://github.com/angular-ui/ui-select
- * Version: 0.19.7 - 2017-04-15T14:28:36.649Z
+ * Version: 0.19.8 - 2018-08-29T07:07:49.652Z
  * License: MIT
  */
 
@@ -123,7 +123,8 @@ var uis = angular.module('ui.select', [])
   appendToBody: false,
   spinnerEnabled: false,
   spinnerClass: 'glyphicon glyphicon-refresh ui-select-spin',
-  backspaceReset: true
+  backspaceReset: true,
+  trim: true
 })
 
 // See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913
@@ -184,31 +185,6 @@ var uis = angular.module('ui.select', [])
   };
 }]);
 
-/**
- * Debounces functions
- *
- * Taken from UI Bootstrap $$debounce source code
- * See https://github.com/angular-ui/bootstrap/blob/master/src/debounce/debounce.js
- *
- */
-uis.factory('$$uisDebounce', ['$timeout', function($timeout) {
-  return function(callback, debounceTime) {
-    var timeoutPromise;
-
-    return function() {
-      var self = this;
-      var args = Array.prototype.slice.call(arguments);
-      if (timeoutPromise) {
-        $timeout.cancel(timeoutPromise);
-      }
-
-      timeoutPromise = $timeout(function() {
-        callback.apply(self, args);
-      }, debounceTime);
-    };
-  };
-}]);
-
 uis.directive('uiSelectChoices',
   ['uiSelectConfig', 'uisRepeatParser', 'uiSelectMinErr', '$compile', '$window',
   function(uiSelectConfig, RepeatParser, uiSelectMinErr, $compile, $window) {
@@ -367,6 +343,11 @@ uis.controller('uiSelectCtrl',
     return isNil(ctrl.selected) || ctrl.selected === '' || (ctrl.multiple && ctrl.selected.length === 0);
   };
 
+  ctrl.getPlaceholder = function(){
+    if(ctrl.selected && ctrl.selected.length) return;
+    return ctrl.placeholder;
+  };
+
   function _findIndex(collection, predicate, thisArg){
     if (collection.findIndex){
       return collection.findIndex(predicate, thisArg);
@@ -390,10 +371,14 @@ uis.controller('uiSelectCtrl',
     if (ctrl.resetSearchInput) {
       ctrl.search = EMPTY_SEARCH;
       //reset activeIndex
-      if (ctrl.selected && ctrl.items.length && !ctrl.multiple) {
-        ctrl.activeIndex = _findIndex(ctrl.items, function(item){
-          return angular.equals(this, item);
-        }, ctrl.selected);
+      if (!ctrl.multiple) {
+        if (ctrl.selected && ctrl.items.length) {
+          ctrl.activeIndex = _findIndex(ctrl.items, function(item){
+            return angular.equals(this, item);
+          }, ctrl.selected);
+        } else {
+          ctrl.activeIndex = 0;
+        }
       }
     }
   }
@@ -451,7 +436,7 @@ uis.controller('uiSelectCtrl',
       } else {
         $timeout(function () {
           ctrl.focusSearchInput(initSearchValue);
-          if(!ctrl.tagging.isActivated && ctrl.items.length > 1) {
+          if(!ctrl.tagging.isActivated && ctrl.items.length > 1 && ctrl.open) {
             _ensureHighlightVisible();
           }
         });
@@ -468,9 +453,12 @@ uis.controller('uiSelectCtrl',
     ctrl.searchInput[0].focus();
   };
 
-  ctrl.findGroupByName = function(name) {
+  ctrl.findGroupByName = function(name, noStrict) {
     return ctrl.groups && ctrl.groups.filter(function(group) {
-      return group.name === name;
+      if (noStrict)
+        return group.name == name;
+      else
+        return group.name === name;
     })[0];
   };
 
@@ -767,11 +755,11 @@ uis.controller('uiSelectCtrl',
   ctrl.toggle = function(e) {
     if (ctrl.open) {
       ctrl.close();
-      e.preventDefault();
-      e.stopPropagation();
     } else {
       ctrl.activate();
     }
+    e.preventDefault();
+    e.stopPropagation();
   };
 
   // Set default function for locked choices - avoids unnecessary
@@ -874,11 +862,10 @@ uis.controller('uiSelectCtrl',
         }
         break;
       case KEY.UP:
-        var minActiveIndex = (ctrl.search.length === 0 && ctrl.tagging.isActivated) ? -1 : 0;
         if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode
-        else if (ctrl.activeIndex > minActiveIndex) {
+        else if (ctrl.activeIndex > 0) {
           var idxmin = --ctrl.activeIndex;
-          while(_isItemDisabled(ctrl.items[idxmin]) && idxmin > minActiveIndex) {
+          while(_isItemDisabled(ctrl.items[idxmin]) && idxmin > 0) {
             ctrl.activeIndex = --idxmin;
           }
         }
@@ -1058,8 +1045,8 @@ uis.controller('uiSelectCtrl',
 }]);
 
 uis.directive('uiSelect',
-  ['$document', 'uiSelectConfig', 'uiSelectMinErr', 'uisOffset', '$compile', '$parse', '$timeout',
-  function($document, uiSelectConfig, uiSelectMinErr, uisOffset, $compile, $parse, $timeout) {
+  ['$document', 'uiSelectConfig', 'uiSelectMinErr', 'uisOffset', '$compile', '$parse', '$timeout', '$window',
+  function($document, uiSelectConfig, uiSelectMinErr, uisOffset, $compile, $parse, $timeout, $window) {
 
   return {
     restrict: 'EA',
@@ -1219,6 +1206,10 @@ uis.directive('uiSelect',
           $select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;
         });
 
+        scope.$watch(function () { return scope.$eval(attrs.trim); }, function(newVal) {
+          $select.trim = newVal !== undefined ? newVal : uiSelectConfig.trim;
+        });
+
         //Automatically gets focus when loaded
         if (angular.isDefined(attrs.autofocus)){
           $timeout(function(){
@@ -1265,11 +1256,15 @@ uis.directive('uiSelect',
           $select.clickTriggeredSelect = false;
         }
 
-        // See Click everywhere but here event http://stackoverflow.com/questions/12931369
-        $document.on('click', onDocumentClick);
+        // See Click everywhere but here. Similar approach to http://stackoverflow.com/questions/12931369
+        // but using the capture phase instead of bubble phase of the event propagation.
+        //
+        // Using the capture phase avoids problems that araise when event.stopPropatagion()
+        // is called before the event reaches the `document`.
+        $window.document.addEventListener('click', onDocumentClick, true);
 
         scope.$on('$destroy', function() {
-          $document.off('click', onDocumentClick);
+          $window.document.removeEventListener('click', onDocumentClick, true);
         });
 
         // Move transcluded elements to their correct position in main template
@@ -1303,6 +1298,24 @@ uis.directive('uiSelect',
           if (transcludedNoChoice.length == 1) {
             element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice);
           }
+
+          var transcludedHeader = transcluded.querySelectorAll('.ui-select-header');
+          transcludedHeader.removeAttr('ui-select-header'); // To avoid loop in case directive as attr
+          transcludedHeader.removeAttr('data-ui-select-header'); // Properly handle HTML5 data-attributes
+          if (transcludedHeader.length == 1) {
+            element.querySelectorAll('.ui-select-header').replaceWith(transcludedHeader);
+          } else {
+            element.querySelectorAll('.ui-select-header').remove();
+          }
+
+          var transcludedFooter = transcluded.querySelectorAll('.ui-select-footer');
+          transcludedFooter.removeAttr('ui-select-footer'); // To avoid loop in case directive as attr
+          transcludedFooter.removeAttr('data-ui-select-footer'); // Properly handle HTML5 data-attributes
+          if (transcludedFooter.length == 1) {
+            element.querySelectorAll('.ui-select-footer').replaceWith(transcludedFooter);
+          } else {
+            element.querySelectorAll('.ui-select-footer').remove();
+          }
         });
 
         // Support for appending the select field to the body when its open
@@ -1437,7 +1450,7 @@ uis.directive('uiSelect',
         };
 
         var opened = false;
-        
+
         scope.calculateDropdownPos = function() {
           if ($select.open) {
             dropdown = angular.element(element).querySelectorAll('.ui-select-dropdown');
@@ -1481,6 +1494,117 @@ uis.directive('uiSelect',
   };
 }]);
 
+uis.directive('uiSelectFooter', ['uiSelectConfig', function (uiSelectConfig) {
+  return {
+    templateUrl: function (tElement) {
+      // Needed so the uiSelect can detect the transcluded content
+      tElement.addClass('ui-select-footer');
+
+      // Gets theme attribute from parent (ui-select)
+      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;
+      return theme + '/footer.tpl.html';
+    },
+    restrict: 'EA',
+    transclude: true,
+    replace: true
+  };
+}]);
+
+uis.directive('uiSelectHeader', ['uiSelectConfig', function (uiSelectConfig) {
+  return {
+    templateUrl: function (tElement) {
+      // Needed so the uiSelect can detect the transcluded content
+      tElement.addClass('ui-select-header');
+
+      // Gets theme attribute from parent (ui-select)
+      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;
+      return theme + '/header.tpl.html';
+    },
+    restrict: 'EA',
+    transclude: true,
+    replace: true
+  };
+}]);
+
+uis.directive('uiSelectHeaderGroupSelectable', ['$timeout', function($timeout) {
+  return {
+    restrict: 'EA',
+    require: ['^uiSelect'],
+    scope: {
+      isEnabled: "<?uiSelectHeaderGroupSelectable"
+    },
+    link: function ($scope, $element, attrs, select) {
+      // TODO Why that???
+      var $select = select[0];
+      if (angular.isUndefined($scope.isEnabled)) {
+        $scope.isEnabled = true;
+      }
+
+      function isEnabled() {
+        return angular.isUndefined($scope.isEnabled) || $scope.isEnabled;
+      }
+
+      function getElements() {
+        if ($select.multiple && $select.groups) {
+          return $element.querySelectorAll('.ui-select-choices-group-label');
+        } else {
+          console.error('Use uiSelectHeaderGroupSelectable with no multiple uiSelect or without groupBy');
+          return [];
+        }
+      }
+
+      function enableClick() {
+        if (isEnabled()) {
+          angular.forEach(getElements(), function(e) {
+            var element = angular.element(e);
+
+            // Check the onClick event is not already listen
+            if (!element.hasClass('ui-select-header-group-selectable')) {
+              element.addClass('ui-select-header-group-selectable');
+
+              element.on('click', function () {
+                if (isEnabled()) {
+                  var group = $select.findGroupByName(element.text(), true);
+
+                  angular.forEach(group.items, function(item) {
+                    $timeout(function() {
+                      $select.select(item, false, ' ');
+                    });
+                  });
+                }
+              });
+            }
+          });
+        }
+      }
+
+      function disableClick() {
+        if (!isEnabled()) {
+          angular.forEach(getElements(), function(e) {
+            var element = angular.element(e);
+            element.removeClass('ui-select-header-group-selectable');
+            element.off('click');
+          });
+        }
+      }
+
+      // Watch element to trigger select event
+      $scope.$watch('isEnabled', function() {
+        if (!isEnabled()) {
+          disableClick();
+        } else {
+          enableClick();
+        }
+      });
+
+      $scope.$watch('$select.groups', enableClick);
+      $scope.$watch(function() {
+        return $select.selected && $select.selected.length ? $select.selected.length : -1;
+      }, enableClick);
+    }
+  };
+}]);
+
 uis.directive('uiSelectMatch', ['uiSelectConfig', function(uiSelectConfig) {
   return {
     restrict: 'EA',
@@ -1594,12 +1718,6 @@ uis.directive('uiSelectMultiple', ['uiSelectMinErr','$timeout', function(uiSelec
         return true;
       };
 
-      ctrl.getPlaceholder = function(){
-        //Refactor single?
-        if($select.selected && $select.selected.length) return;
-        return $select.placeholder;
-      };
-
 
     }],
     controllerAs: '$selectMultiple',
@@ -2186,6 +2304,10 @@ uis.directive('uiSelectSort', ['$timeout', 'uiSelectConfig', 'uiSelectMinErr', f
         }
       });
 
+      if (element.data('disallowDrop')) {
+        return;
+      }
+
       element.on('dragstart', function(event) {
         element.addClass(draggingClassName);
 
@@ -2302,6 +2424,31 @@ uis.directive('uiSelectSort', ['$timeout', 'uiSelectConfig', 'uiSelectMinErr', f
   };
 }]);
 
+/**
+ * Debounces functions
+ *
+ * Taken from UI Bootstrap $$debounce source code
+ * See https://github.com/angular-ui/bootstrap/blob/master/src/debounce/debounce.js
+ *
+ */
+uis.factory('$$uisDebounce', ['$timeout', function($timeout) {
+  return function(callback, debounceTime) {
+    var timeoutPromise;
+
+    return function() {
+      var self = this;
+      var args = Array.prototype.slice.call(arguments);
+      if (timeoutPromise) {
+        $timeout.cancel(timeoutPromise);
+      }
+
+      timeoutPromise = $timeout(function() {
+        callback.apply(self, args);
+      }, debounceTime);
+    };
+  };
+}]);
+
 uis.directive('uisOpenClose', ['$parse', '$timeout', function ($parse, $timeout) {
   return {
     restrict: 'A',
@@ -2407,21 +2554,27 @@ uis.service('uisRepeatParser', ['uiSelectMinErr','$parse', function(uiSelectMinE
 }]);
 
 }());
-angular.module("ui.select").run(["$templateCache", function($templateCache) {$templateCache.put("bootstrap/choices.tpl.html","<ul class=\"ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu\" ng-show=\"$select.open && $select.items.length > 0\"><li class=\"ui-select-choices-group\" id=\"ui-select-choices-{{ $select.generatedId }}\"><div class=\"divider\" ng-show=\"$select.isGrouped && $index > 0\"></div><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label dropdown-header\" ng-bind=\"$group.name\"></div><div ng-attr-id=\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\" role=\"option\"><span class=\"ui-select-choices-row-inner\"></span></div></li></ul>");
+angular.module("ui.select").run(["$templateCache", function($templateCache) {$templateCache.put("bootstrap/choices.tpl.html","<ul class=\"ui-select-choices ui-select-choices-content\"><li class=\"ui-select-choices-group\" id=\"ui-select-choices-{{ $select.generatedId }}\"><div class=\"divider\" ng-show=\"$select.isGrouped && $index > 0\"></div><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label dropdown-header\" ng-bind=\"$group.name\"></div><div ng-attr-id=\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\" role=\"option\"><span class=\"ui-select-choices-row-inner\"></span></div></li></ul>");
+$templateCache.put("bootstrap/footer.tpl.html","<div class=\"ui-select-footer\" ng-transclude=\"\"></div>");
+$templateCache.put("bootstrap/header.tpl.html","<div class=\"ui-select-header\" ng-transclude=\"\"></div>");
 $templateCache.put("bootstrap/match-multiple.tpl.html","<span class=\"ui-select-match\"><span ng-repeat=\"$item in $select.selected track by $index\"><span class=\"ui-select-match-item btn btn-default btn-xs\" tabindex=\"-1\" type=\"button\" ng-disabled=\"$select.disabled\" ng-click=\"$selectMultiple.activeMatchIndex = $index;\" ng-class=\"{\'btn-primary\':$selectMultiple.activeMatchIndex === $index, \'select-locked\':$select.isLocked(this, $index)}\" ui-select-sort=\"$select.selected\"><span class=\"close ui-select-match-close\" ng-hide=\"$select.disabled\" ng-click=\"$selectMultiple.removeChoice($index)\">&nbsp;&times;</span> <span uis-transclude-append=\"\"></span></span></span></span>");
 $templateCache.put("bootstrap/match.tpl.html","<div class=\"ui-select-match\" ng-hide=\"$select.open && $select.searchEnabled\" ng-disabled=\"$select.disabled\" ng-class=\"{\'btn-default-focus\':$select.focus}\"><span tabindex=\"-1\" class=\"btn btn-default form-control ui-select-toggle\" aria-label=\"{{ $select.baseTitle }} activate\" ng-disabled=\"$select.disabled\" ng-click=\"$select.activate()\" style=\"outline: 0;\"><span ng-show=\"$select.isEmpty()\" class=\"ui-select-placeholder text-muted\">{{$select.placeholder}}</span> <span ng-hide=\"$select.isEmpty()\" class=\"ui-select-match-text pull-left\" ng-class=\"{\'ui-select-allow-clear\': $select.allowClear && !$select.isEmpty()}\" ng-transclude=\"\"></span> <i class=\"caret pull-right\" ng-click=\"$select.toggle($event)\"></i> <a ng-show=\"$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)\" aria-label=\"{{ $select.baseTitle }} clear\" style=\"margin-right: 10px\" ng-click=\"$select.clear($event)\" class=\"btn btn-xs btn-link pull-right\"><i class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\"></i></a></span></div>");
 $templateCache.put("bootstrap/no-choice.tpl.html","<ul class=\"ui-select-no-choice dropdown-menu\" ng-show=\"$select.items.length == 0\"><li ng-transclude=\"\"></li></ul>");
-$templateCache.put("bootstrap/select-multiple.tpl.html","<div class=\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\" ng-class=\"{open: $select.open}\"><div><div class=\"ui-select-match\"></div><input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" class=\"ui-select-search input-xs\" placeholder=\"{{$selectMultiple.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-click=\"$select.activate()\" ng-model=\"$select.search\" role=\"combobox\" aria-expanded=\"{{$select.open}}\" aria-label=\"{{$select.baseTitle}}\" ng-class=\"{\'spinner\': $select.refreshing}\" ondrop=\"return false;\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div></div>");
-$templateCache.put("bootstrap/select.tpl.html","<div class=\"ui-select-container ui-select-bootstrap dropdown\" ng-class=\"{open: $select.open}\"><div class=\"ui-select-match\"></div><span ng-show=\"$select.open && $select.refreshing && $select.spinnerEnabled\" class=\"ui-select-refreshing {{$select.spinnerClass}}\"></span> <input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" aria-expanded=\"true\" aria-label=\"{{ $select.baseTitle }}\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" class=\"form-control ui-select-search\" ng-class=\"{ \'ui-select-search-hidden\' : !$select.searchEnabled }\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-show=\"$select.open\"><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div></div>");
+$templateCache.put("bootstrap/select-multiple.tpl.html","<div class=\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\" ng-class=\"{open: $select.open}\"><div><div class=\"ui-select-match\"></div><span ng-show=\"$select.open && $select.refreshing && $select.spinnerEnabled\" class=\"ui-select-refreshing {{$select.spinnerClass}}\"></span> <input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" class=\"ui-select-search input-xs\" placeholder=\"{{$select.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-click=\"$select.activate()\" ng-model=\"$select.search\" role=\"combobox\" aria-expanded=\"{{$select.open}}\" aria-label=\"{{$select.baseTitle}}\" ng-class=\"{\'spinner\': $select.refreshing}\" data-disallow-drop=\"data-disallow-drop\"></div><div ng-show=\"$select.open && $select.items.length > 0\" class=\"ui-select-dropdown dropdown-menu\"><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-footer\"></div></div><div class=\"ui-select-no-choice\"></div></div>");
+$templateCache.put("bootstrap/select.tpl.html","<div class=\"ui-select-container ui-select-bootstrap dropdown\" ng-class=\"{open: $select.open}\"><div class=\"ui-select-match\"></div><span ng-show=\"$select.open && $select.refreshing && $select.spinnerEnabled\" class=\"ui-select-refreshing {{$select.spinnerClass}}\"></span> <input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" aria-expanded=\"true\" aria-label=\"{{ $select.baseTitle }}\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" class=\"form-control ui-select-search\" ng-class=\"{ \'ui-select-search-hidden\' : !$select.searchEnabled }\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-show=\"$select.open\" ng-trim=\"{{ $select.trim }}\"><div ng-show=\"$select.open && $select.items.length > 0\" class=\"ui-select-dropdown dropdown-menu\"><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-footer\"></div></div><div class=\"ui-select-no-choice\"></div></div>");
 $templateCache.put("select2/choices.tpl.html","<ul tabindex=\"-1\" class=\"ui-select-choices ui-select-choices-content select2-results\"><li class=\"ui-select-choices-group\" ng-class=\"{\'select2-result-with-children\': $select.choiceGrouped($group) }\"><div ng-show=\"$select.choiceGrouped($group)\" class=\"ui-select-choices-group-label select2-result-label\" ng-bind=\"$group.name\"></div><ul id=\"ui-select-choices-{{ $select.generatedId }}\" ng-class=\"{\'select2-result-sub\': $select.choiceGrouped($group), \'select2-result-single\': !$select.choiceGrouped($group) }\"><li role=\"option\" ng-attr-id=\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\" class=\"ui-select-choices-row\" ng-class=\"{\'select2-highlighted\': $select.isActive(this), \'select2-disabled\': $select.isDisabled(this)}\"><div class=\"select2-result-label ui-select-choices-row-inner\"></div></li></ul></li></ul>");
+$templateCache.put("select2/footer.tpl.html","<div class=\"ui-select-footer\" ng-transclude=\"\"></div>");
+$templateCache.put("select2/header.tpl.html","<div class=\"ui-select-header\" ng-transclude=\"\"></div>");
 $templateCache.put("select2/match-multiple.tpl.html","<span class=\"ui-select-match\"><li class=\"ui-select-match-item select2-search-choice\" ng-repeat=\"$item in $select.selected track by $index\" ng-class=\"{\'select2-search-choice-focus\':$selectMultiple.activeMatchIndex === $index, \'select2-locked\':$select.isLocked(this, $index)}\" ui-select-sort=\"$select.selected\"><span uis-transclude-append=\"\"></span> <a href=\"javascript:;\" class=\"ui-select-match-close select2-search-choice-close\" ng-click=\"$selectMultiple.removeChoice($index)\" tabindex=\"-1\"></a></li></span>");
 $templateCache.put("select2/match.tpl.html","<a class=\"select2-choice ui-select-match\" ng-class=\"{\'select2-default\': $select.isEmpty()}\" ng-click=\"$select.toggle($event)\" aria-label=\"{{ $select.baseTitle }} select\"><span ng-show=\"$select.isEmpty()\" class=\"select2-chosen\">{{$select.placeholder}}</span> <span ng-hide=\"$select.isEmpty()\" class=\"select2-chosen\" ng-transclude=\"\"></span> <abbr ng-if=\"$select.allowClear && !$select.isEmpty()\" class=\"select2-search-choice-close\" ng-click=\"$select.clear($event)\"></abbr> <span class=\"select2-arrow ui-select-toggle\"><b></b></span></a>");
 $templateCache.put("select2/no-choice.tpl.html","<div class=\"ui-select-no-choice dropdown\" ng-show=\"$select.items.length == 0\"><div class=\"dropdown-content\"><div data-selectable=\"\" ng-transclude=\"\"></div></div></div>");
-$templateCache.put("select2/select-multiple.tpl.html","<div class=\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\" ng-class=\"{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled}\"><ul class=\"select2-choices\"><span class=\"ui-select-match\"></span><li class=\"select2-search-field\"><input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" aria-activedescendant=\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\" class=\"select2-input ui-select-search\" placeholder=\"{{$selectMultiple.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-hide=\"$select.disabled\" ng-model=\"$select.search\" ng-click=\"$select.activate()\" style=\"width: 34px;\" ondrop=\"return false;\"></li></ul><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\'select2-display-none\': !$select.open || $select.items.length === 0}\"><div class=\"ui-select-choices\"></div></div></div>");
-$templateCache.put("select2/select.tpl.html","<div class=\"ui-select-container select2 select2-container\" ng-class=\"{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled, \'select2-container-active\': $select.focus, \'select2-allowclear\': $select.allowClear && !$select.isEmpty()}\"><div class=\"ui-select-match\"></div><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\'select2-display-none\': !$select.open}\"><div class=\"search-container\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled, \'select2-search\':$select.searchEnabled}\"><input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" ng-class=\"{\'select2-active\': $select.refreshing}\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" class=\"ui-select-search select2-input\" ng-model=\"$select.search\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div></div></div>");
-$templateCache.put("selectize/choices.tpl.html","<div ng-show=\"$select.open\" class=\"ui-select-choices ui-select-dropdown selectize-dropdown\" ng-class=\"{\'single\': !$select.multiple, \'multi\': $select.multiple}\"><div class=\"ui-select-choices-content selectize-dropdown-content\"><div class=\"ui-select-choices-group optgroup\"><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label optgroup-header\" ng-bind=\"$group.name\"></div><div role=\"option\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\"><div class=\"option ui-select-choices-row-inner\" data-selectable=\"\"></div></div></div></div></div>");
+$templateCache.put("select2/select-multiple.tpl.html","<div class=\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\" ng-class=\"{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled}\"><ul class=\"select2-choices\"><span class=\"ui-select-match\"></span><li class=\"select2-search-field\"><input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" aria-activedescendant=\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\" class=\"select2-input ui-select-search\" placeholder=\"{{$select.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-hide=\"$select.disabled\" ng-model=\"$select.search\" ng-click=\"$select.activate()\" style=\"width: 34px;\" data-disallow-drop=\"data-disallow-drop\"></li></ul><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\'select2-display-none\': !$select.open || $select.items.length === 0}\"><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-footer\"></div></div></div>");
+$templateCache.put("select2/select.tpl.html","<div class=\"ui-select-container select2 select2-container\" ng-class=\"{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled, \'select2-container-active\': $select.focus, \'select2-allowclear\': $select.allowClear && !$select.isEmpty()}\"><div class=\"ui-select-match\"></div><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\'select2-display-none\': !$select.open}\"><div class=\"search-container\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled, \'select2-search\':$select.searchEnabled}\"><input type=\"search\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" ng-class=\"{\'select2-active\': $select.refreshing}\" ng-trim=\"{{ $select.trim }}\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" class=\"ui-select-search select2-input\" ng-model=\"$select.search\"></div><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div><div class=\"ui-select-footer\"></div></div></div>");
+$templateCache.put("selectize/choices.tpl.html","<div class=\"ui-select-choices\"><div class=\"ui-select-choices-content selectize-dropdown-content\"><div class=\"ui-select-choices-group optgroup\"><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label optgroup-header\" ng-bind=\"$group.name\"></div><div role=\"option\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\"><div class=\"option ui-select-choices-row-inner\" data-selectable=\"\"></div></div></div></div></div>");
+$templateCache.put("selectize/footer.tpl.html","<div class=\"ui-select-footer\" ng-transclude=\"\"></div>");
+$templateCache.put("selectize/header.tpl.html","<div class=\"ui-select-header\" ng-transclude=\"\"></div>");
 $templateCache.put("selectize/match-multiple.tpl.html","<div class=\"ui-select-match\" data-value=\"\" ng-repeat=\"$item in $select.selected track by $index\" ng-click=\"$selectMultiple.activeMatchIndex = $index;\" ng-class=\"{\'active\':$selectMultiple.activeMatchIndex === $index}\" ui-select-sort=\"$select.selected\"><span class=\"ui-select-match-item\" ng-class=\"{\'select-locked\':$select.isLocked(this, $index)}\"><span uis-transclude-append=\"\"></span> <span class=\"remove ui-select-match-close\" ng-hide=\"$select.disabled\" ng-click=\"$selectMultiple.removeChoice($index)\">&times;</span></span></div>");
 $templateCache.put("selectize/match.tpl.html","<div ng-hide=\"$select.searchEnabled && ($select.open || $select.isEmpty())\" class=\"ui-select-match\"><span ng-show=\"!$select.searchEnabled && ($select.isEmpty() || $select.open)\" class=\"ui-select-placeholder text-muted\">{{$select.placeholder}}</span> <span ng-hide=\"$select.isEmpty() || $select.open\" ng-transclude=\"\"></span></div>");
 $templateCache.put("selectize/no-choice.tpl.html","<div class=\"ui-select-no-choice selectize-dropdown\" ng-show=\"$select.items.length == 0\"><div class=\"selectize-dropdown-content\"><div data-selectable=\"\" ng-transclude=\"\"></div></div></div>");
-$templateCache.put("selectize/select-multiple.tpl.html","<div class=\"ui-select-container selectize-control multi plugin-remove_button\" ng-class=\"{\'open\': $select.open}\"><div class=\"selectize-input\" ng-class=\"{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}\" ng-click=\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\"><div class=\"ui-select-match\"></div><input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" class=\"ui-select-search\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled}\" placeholder=\"{{$selectMultiple.getPlaceholder()}}\" ng-model=\"$select.search\" ng-disabled=\"$select.disabled\" aria-expanded=\"{{$select.open}}\" aria-label=\"{{ $select.baseTitle }}\" ondrop=\"return false;\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div></div>");
-$templateCache.put("selectize/select.tpl.html","<div class=\"ui-select-container selectize-control single\" ng-class=\"{\'open\': $select.open}\"><div class=\"selectize-input\" ng-class=\"{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}\" ng-click=\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\"><div class=\"ui-select-match\"></div><input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" class=\"ui-select-search ui-select-toggle\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled}\" ng-click=\"$select.toggle($event)\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-hide=\"!$select.isEmpty() && !$select.open\" ng-disabled=\"$select.disabled\" aria-label=\"{{ $select.baseTitle }}\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-no-choice\"></div></div>");}]);
\ No newline at end of file
+$templateCache.put("selectize/select-multiple.tpl.html","<div class=\"ui-select-container selectize-control multi plugin-remove_button\" ng-class=\"{\'open\': $select.open}\"><div class=\"selectize-input\" ng-class=\"{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}\" ng-click=\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\"><div class=\"ui-select-match\"></div><input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" class=\"ui-select-search\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled}\" placeholder=\"{{$select.getPlaceholder()}}\" ng-model=\"$select.search\" ng-disabled=\"$select.disabled\" aria-expanded=\"{{$select.open}}\" aria-label=\"{{ $select.baseTitle }}\" data-disallow-drop=\"data-disallow-drop\"></div><div ng-show=\"$select.open\" class=\"ui-select-dropdown selectize-dropdown\" ng-class=\"{\'single\': !$select.multiple, \'multi\': $select.multiple}\"><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-footer\"></div></div><div class=\"ui-select-no-choice\"></div></div>");
+$templateCache.put("selectize/select.tpl.html","<div class=\"ui-select-container selectize-control single\" ng-class=\"{\'open\': $select.open}\"><div class=\"selectize-input\" ng-class=\"{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}\" ng-click=\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\"><div class=\"ui-select-match\"></div><input type=\"search\" autocomplete=\"off\" tabindex=\"-1\" class=\"ui-select-search ui-select-toggle\" ng-class=\"{\'ui-select-search-hidden\':!$select.searchEnabled}\" ng-click=\"$select.toggle($event)\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-hide=\"!$select.isEmpty() && !$select.open\" ng-disabled=\"$select.disabled\" ng-trim=\"{{ $select.trim }}\" aria-label=\"{{ $select.baseTitle }}\"></div><div ng-show=\"$select.open\" class=\"ui-select-dropdown selectize-dropdown\" ng-class=\"{\'single\': !$select.multiple, \'multi\': $select.multiple}\"><div class=\"ui-select-header\"></div><div class=\"ui-select-choices\"></div><div class=\"ui-select-footer\"></div></div><div class=\"ui-select-no-choice\"></div></div>");}]);
\ No newline at end of file
diff --git a/dist/select.min.css b/dist/select.min.css
index 39a10f4bd..209ab25ec 100644
--- a/dist/select.min.css
+++ b/dist/select.min.css
@@ -1,7 +1,7 @@
 /*!
  * ui-select
  * http://github.com/angular-ui/ui-select
- * Version: 0.19.7 - 2017-04-15T14:28:36.790Z
+ * Version: 0.19.8 - 2018-08-29T07:07:49.833Z
  * License: MIT
- */.ui-select-highlight{font-weight:700}.ui-select-offscreen{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:0!important;top:0!important}.selectize-control.single>.selectize-input>input,.selectize-control>.selectize-dropdown{width:100%}.ui-select-choices-row:hover{background-color:#f5f5f5}.ng-dirty.ng-invalid>a.select2-choice{border-color:#D44950}.select2-result-single{padding-left:0}.select-locked>.ui-select-match-close,.select2-locked>.select2-search-choice-close{display:none}body>.select2-container.open{z-index:9999}.ui-select-container.select2.direction-up .ui-select-match,.ui-select-container[theme=select2].direction-up .ui-select-match{border-radius:0 0 4px 4px}.ui-select-container.select2.direction-up .ui-select-dropdown,.ui-select-container[theme=select2].direction-up .ui-select-dropdown{border-radius:4px 4px 0 0;border-top-width:1px;border-top-style:solid;box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-4px}.ui-select-container.select2.direction-up .ui-select-dropdown .select2-search,.ui-select-container[theme=select2].direction-up .ui-select-dropdown .select2-search{margin-top:4px}.ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match,.ui-select-container[theme=select2].direction-up.select2-dropdown-open .ui-select-match{border-bottom-color:#5897fb}.ui-select-container[theme=select2] .ui-select-dropdown .ui-select-search-hidden,.ui-select-container[theme=select2] .ui-select-dropdown .ui-select-search-hidden input{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0}.selectize-input.selectize-focus{border-color:#007FBB!important}.selectize-control.multi>.selectize-input>input{margin:0!important}.ng-dirty.ng-invalid>div.selectize-input{border-color:#D44950}.ui-select-container[theme=selectize].direction-up .ui-select-dropdown{box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-2px}.ui-select-container[theme=selectize] input.ui-select-search-hidden{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0;width:0}.btn-default-focus{color:#333;background-color:#EBEBEB;border-color:#ADADAD;text-decoration:none;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.ui-select-bootstrap .ui-select-toggle{position:relative}.ui-select-bootstrap .ui-select-toggle>.caret{position:absolute;height:10px;top:50%;right:10px;margin-top:-2px}.input-group>.ui-select-bootstrap.dropdown{position:static}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control{border-radius:4px 0 0 4px}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control.direction-up{border-radius:4px 0 0 4px!important}.ui-select-bootstrap .ui-select-search-hidden{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0}.ui-select-bootstrap>.ui-select-match>.btn{text-align:left!important}.ui-select-bootstrap>.ui-select-match>.caret{position:absolute;top:45%;right:15px}.ui-select-bootstrap>.ui-select-choices,.ui-select-bootstrap>.ui-select-no-choice{width:100%;height:auto;max-height:200px;overflow-x:hidden;margin-top:-1px}body>.ui-select-bootstrap.open{z-index:1000}.ui-select-multiple.ui-select-bootstrap{height:auto;padding:3px 3px 0}.ui-select-multiple.ui-select-bootstrap input.ui-select-search{background-color:transparent!important;border:none;outline:0;height:1.666666em;margin-bottom:3px}.ui-select-multiple.ui-select-bootstrap .ui-select-match .close{font-size:1.6em;line-height:.75}.ui-select-multiple.ui-select-bootstrap .ui-select-match-item{outline:0;margin:0 3px 3px 0}.ui-select-multiple .ui-select-match-item{position:relative}.ui-select-multiple .ui-select-match-item.dropping .ui-select-match-close{pointer-events:none}.ui-select-multiple:hover .ui-select-match-item.dropping-before:before{content:"";position:absolute;top:0;right:100%;height:100%;margin-right:2px;border-left:1px solid #428bca}.ui-select-multiple:hover .ui-select-match-item.dropping-after:after{content:"";position:absolute;top:0;left:100%;height:100%;margin-left:2px;border-right:1px solid #428bca}.ui-select-bootstrap .ui-select-choices-row>span{cursor:pointer;display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.ui-select-bootstrap .ui-select-choices-row>span:focus,.ui-select-bootstrap .ui-select-choices-row>span:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.ui-select-bootstrap .ui-select-choices-row.active>span{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.ui-select-bootstrap .ui-select-choices-row.active.disabled>span,.ui-select-bootstrap .ui-select-choices-row.disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.ui-select-match.ng-hide-add,.ui-select-search.ng-hide-add{display:none!important}.ui-select-bootstrap.ng-dirty.ng-invalid>button.btn.ui-select-match{border-color:#D44950}.ui-select-container[theme=bootstrap].direction-up .ui-select-dropdown{box-shadow:0 -4px 8px rgba(0,0,0,.25)}.ui-select-bootstrap .ui-select-match-text{width:100%;padding-right:1em}.ui-select-bootstrap .ui-select-match-text span{display:inline-block;width:100%;overflow:hidden}.ui-select-bootstrap .ui-select-toggle>a.btn{position:absolute;height:10px;right:10px;margin-top:-2px}.ui-select-refreshing.glyphicon{position:absolute;right:0;padding:8px 27px}@-webkit-keyframes ui-select-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes ui-select-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.ui-select-spin{-webkit-animation:ui-select-spin 2s infinite linear;animation:ui-select-spin 2s infinite linear}.ui-select-refreshing.ng-animate{-webkit-animation:none 0s}
+ */.ui-select-highlight{font-weight:700}.ui-select-offscreen{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:0!important;top:0!important}.selectize-control.single>.selectize-input>input,.selectize-control>.selectize-dropdown{width:100%}.ui-select-choices-row:hover{background-color:#f5f5f5}.ng-dirty.ng-invalid>a.select2-choice{border-color:#D44950}.select2-result-single{padding-left:0}.select-locked>.ui-select-match-close,.select2-locked>.select2-search-choice-close{display:none}body>.select2-container.open{z-index:9999}.select2 .ui-select-footer,.select2 .ui-select-header{padding:4px 10px}.select2 .ui-select-footer{border-top:1px solid #dfe5eb}.select2 .ui-select-header{border-bottom:1px solid #dfe5eb}.ui-select-container.select2.direction-up .ui-select-match,.ui-select-container[theme=select2].direction-up .ui-select-match{border-radius:0 0 4px 4px}.ui-select-container.select2.direction-up .ui-select-dropdown,.ui-select-container[theme=select2].direction-up .ui-select-dropdown{border-radius:4px 4px 0 0;border-top-width:1px;border-top-style:solid;box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-4px}.ui-select-container.select2.direction-up .ui-select-dropdown .select2-search,.ui-select-container[theme=select2].direction-up .ui-select-dropdown .select2-search{margin-top:4px}.ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match,.ui-select-container[theme=select2].direction-up.select2-dropdown-open .ui-select-match{border-bottom-color:#5897fb}.ui-select-container[theme=select2] .ui-select-dropdown .ui-select-search-hidden,.ui-select-container[theme=select2] .ui-select-dropdown .ui-select-search-hidden input{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0}.selectize-input.selectize-focus{border-color:#007FBB!important}.selectize-control.multi>.selectize-input>input{margin:0!important}.selectize-dropdown .ui-select-footer,.selectize-dropdown .ui-select-header{padding:5px 8px}.selectize-dropdown .ui-select-header{border-bottom:1px solid #b8b8b8}.selectize-dropdown .ui-select-footer{border-top:1px solid #b8b8b8}.ng-dirty.ng-invalid>div.selectize-input{border-color:#D44950}.ui-select-container[theme=selectize].direction-up .ui-select-dropdown{box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-2px}.ui-select-container[theme=selectize] input.ui-select-search-hidden{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0;width:0}.ui-select-container[theme=selectize] .ui-select-header-group-selectable:hover{background-color:#f5f5f5}.ui-select-container[theme=selectize] .ui-select-header-group-selectable{cursor:pointer;padding-left:15px}.btn-default-focus{color:#333;background-color:#EBEBEB;border-color:#ADADAD;text-decoration:none;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.ui-select-bootstrap .ui-select-toggle{position:relative}.ui-select-bootstrap .ui-select-toggle>.caret{position:absolute;height:10px;top:50%;right:10px;margin-top:-2px}.input-group>.ui-select-bootstrap.dropdown{position:static}.input-group .ui-select-bootstrap:first-child .form-control{border-top-left-radius:4px;border-bottom-left-radius:4px}.input-group .ui-select-bootstrap:last-child .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control{border-radius:4px 0 0 4px}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control.direction-up{border-radius:4px 0 0 4px!important}.ui-select-bootstrap .ui-select-search-hidden{opacity:0;height:0;min-height:0;padding:0;margin:0;border:0}.ui-select-bootstrap>.ui-select-match>.btn{text-align:left!important}.ui-select-bootstrap>.ui-select-match>.caret{position:absolute;top:45%;right:15px}.ui-select-bootstrap .ui-select-choices,.ui-select-bootstrap .ui-select-no-choice{width:100%;height:auto;max-height:200px;overflow-x:hidden;margin-top:-1px}body>.ui-select-bootstrap.open{z-index:1000}.ui-select-multiple.ui-select-bootstrap{height:auto;padding:3px 3px 0}.ui-select-multiple.ui-select-bootstrap input.ui-select-search{background-color:transparent!important;border:none;outline:0;height:1.666666em;margin-bottom:3px}.ui-select-multiple.ui-select-bootstrap .ui-select-match .close{font-size:1.6em;line-height:.75}.ui-select-multiple.ui-select-bootstrap .ui-select-match-item{outline:0;margin:0 3px 3px 0}.ui-select-multiple .ui-select-match-item{position:relative}.ui-select-multiple .ui-select-match-item.dropping .ui-select-match-close{pointer-events:none}.ui-select-multiple:hover .ui-select-match-item.dropping-before:before{content:"";position:absolute;top:0;right:100%;height:100%;margin-right:2px;border-left:1px solid #428bca}.ui-select-multiple:hover .ui-select-match-item.dropping-after:after{content:"";position:absolute;top:0;left:100%;height:100%;margin-left:2px;border-right:1px solid #428bca}.ui-select-bootstrap .ui-select-choices{padding:5px 0;margin:0;list-style:none;.ui-select-bootstrap .ui-select-header-group-selectable:hover { background-color: #f5f5f5; } .ui-select-bootstrap .ui-select-header-group-selectable { color: black; cursor: pointer; padding: 3px 10px; } .ui-select-bootstrap .ui-select-choices-row>span { cursor: pointer; display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333; white-space: nowrap; } .ui-select-bootstrap .ui-select-choices-row > span { cursor: pointer; display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333; white-space: nowrap; } .ui-select-bootstrap .ui-select-choices-row > span:hover,.ui-select-bootstrap .ui-select-choices-row > span:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .ui-select-bootstrap .ui-select-choices-row.active > span { color: #fff; text-decoration: none; outline: 0; background-color: #428bca; } .ui-select-bootstrap .ui-select-choices-row.disabled > span,.ui-select-bootstrap .ui-select-choices-row.active.disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .ui-select-bootstrap .ui-select-footer,.ui-select-bootstrap .ui-select-header { display: block; padding: 5px 20px; clear: both; font-weight: 400; line-height: 1.42857143; } .ui-select-bootstrap .ui-select-footer { border-top: 1px solid #dfe5eb; } .ui-select-bootstrap .ui-select-header { border-bottom: 1px solid #dfe5eb; } .ui-select-bootstrap .ui-select-dropdown { width: 100%; padding: 0; margin-top: -1px; } .ui-select-match.ng-hide-add,.ui-select-search.ng-hide-add { display: none !important; } .ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match { border-color: #D44950; } .ui-select-container[theme=bootstrap].direction-up .ui-select-dropdown { box-shadow: 0 -4px 8px rgba(0,0,0,.25); } .ui-select-bootstrap .ui-select-match-text { width: 100%; padding-right: 1em; } .ui-select-bootstrap .ui-select-match-text span { display: inline-block; width: 100%; overflow: hidden; } .ui-select-bootstrap .ui-select-toggle > a.btn { position: absolute; height: 10px; right: 10px; margin-top: -2px; } .ui-select-refreshing.glyphicon { position: absolute; right: 0; padding: 8px 27px; } @-webkit-keyframes ui-select-spin { 0 { -webkit-transform: rotate(0); transform: rotate(0); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes ui-select-spin { 0 { -webkit-transform: rotate(0); transform: rotate(0); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .ui-select-spin { -webkit-animation: ui-select-spin 2s infinite linear; animation: ui-select-spin 2s infinite linear; } .ui-select-refreshing.ng-animate { -webkit-animation: none 0s; } __ESCAPED_SOURCE_END_CLEAN_CSS_}
 /*# sourceMappingURL=select.min.css.map */
diff --git a/dist/select.min.css.map b/dist/select.min.css.map
index 477a68739..260ee982f 100644
--- a/dist/select.min.css.map
+++ b/dist/select.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["select.css","common.css"],"names":[],"mappings":"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","file":"select.min.css","sourcesContent":["/*!\n * ui-select\n * http://github.com/angular-ui/ui-select\n * Version: 0.19.7 - 2017-04-15T14:28:36.790Z\n * License: MIT\n */\n\n\n/* Style when highlighting a search. */\n.ui-select-highlight {\n  font-weight: bold;\n}\n\n.ui-select-offscreen {\n  clip: rect(0 0 0 0) !important;\n  width: 1px !important;\n  height: 1px !important;\n  border: 0 !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  position: absolute !important;\n  outline: 0 !important;\n  left: 0px !important;\n  top: 0px !important;\n}\n\n\n.ui-select-choices-row:hover {\n  background-color: #f5f5f5;\n}\n\n/* Select2 theme */\n\n/* Mark invalid Select2 */\n.ng-dirty.ng-invalid > a.select2-choice {\n    border-color: #D44950;\n}\n\n.select2-result-single {\n  padding-left: 0;\n}\n\n.select2-locked > .select2-search-choice-close{\n  display:none;\n}\n\n.select-locked > .ui-select-match-close{\n    display:none;\n}\n\nbody > .select2-container.open {\n  z-index: 9999; /* The z-index Select2 applies to the select2-drop */\n}\n\n/* Handle up direction Select2 */\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-match,\n.ui-select-container.select2.direction-up .ui-select-match {\n    border-radius: 4px; /* FIXME hardcoded value :-/ */\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n}\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown,\n.ui-select-container.select2.direction-up .ui-select-dropdown {\n    border-radius: 4px; /* FIXME hardcoded value :-/ */\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n\n    border-top-width: 1px;  /* FIXME hardcoded value :-/ */\n    border-top-style: solid;\n\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n\n    margin-top: -4px; /* FIXME hardcoded value :-/ */\n}\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown .select2-search,\n.ui-select-container.select2.direction-up .ui-select-dropdown .select2-search {\n    margin-top: 4px; /* FIXME hardcoded value :-/ */\n}\n.ui-select-container[theme=\"select2\"].direction-up.select2-dropdown-open .ui-select-match,\n.ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match {\n    border-bottom-color: #5897fb;\n}\n\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden,\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden input{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n}\n\n/* Selectize theme */\n\n/* Helper class to show styles when focus */\n.selectize-input.selectize-focus{\n  border-color: #007FBB !important;\n}\n\n/* Fix input width for Selectize theme */\n.selectize-control.single > .selectize-input > input {\n  width: 100%;\n}\n\n/* Fix line break when there's at least one item selected with the Selectize theme */\n.selectize-control.multi > .selectize-input > input {\n  margin: 0 !important;\n}\n\n/* Fix dropdown width for Selectize theme */\n.selectize-control > .selectize-dropdown {\n  width: 100%;\n}\n\n/* Mark invalid Selectize */\n.ng-dirty.ng-invalid > div.selectize-input {\n    border-color: #D44950;\n}\n\n/* Handle up direction Selectize */\n.ui-select-container[theme=\"selectize\"].direction-up .ui-select-dropdown {\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n    margin-top: -2px; /* FIXME hardcoded value :-/ */\n}\n\n.ui-select-container[theme=\"selectize\"] input.ui-select-search-hidden{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n    width: 0;\n}\n\n/* Bootstrap theme */\n\n/* Helper class to show styles when focus */\n.btn-default-focus {\n  color: #333;\n  background-color: #EBEBEB;\n  border-color: #ADADAD;\n  text-decoration: none;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.ui-select-bootstrap .ui-select-toggle {\n  position: relative;\n}\n\n.ui-select-bootstrap .ui-select-toggle > .caret {\n  position: absolute;\n  height: 10px;\n  top: 50%;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Fix Bootstrap dropdown position when inside a input-group */\n.input-group > .ui-select-bootstrap.dropdown {\n  /* Instead of relative */\n  position: static;\n}\n\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control {\n  border-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control.direction-up {\n  border-radius: 4px !important; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.ui-select-bootstrap .ui-select-search-hidden{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n}\n\n.ui-select-bootstrap > .ui-select-match > .btn{\n  /* Instead of center because of .btn */\n  text-align: left !important;\n}\n\n.ui-select-bootstrap > .ui-select-match > .caret {\n  position: absolute;\n  top: 45%;\n  right: 15px;\n}\n\n/* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */\n.ui-select-bootstrap > .ui-select-choices ,.ui-select-bootstrap > .ui-select-no-choice {\n  width: 100%;\n  height: auto;\n  max-height: 200px;\n  overflow-x: hidden;\n  margin-top: -1px;\n}\n\nbody > .ui-select-bootstrap.open {\n  z-index: 1000; /* Standard Bootstrap dropdown z-index */\n}\n\n.ui-select-multiple.ui-select-bootstrap {\n  height: auto;\n  padding: 3px 3px 0 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap input.ui-select-search {\n  background-color: transparent !important; /* To prevent double background when disabled */\n  border: none;\n  outline: none;\n  height: 1.666666em;\n  margin-bottom: 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match .close {\n  font-size: 1.6em;\n  line-height: 0.75;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match-item {\n  outline: 0;\n  margin: 0 3px 3px 0;\n}\n\n.ui-select-multiple .ui-select-match-item {\n  position: relative;\n}\n\n.ui-select-multiple .ui-select-match-item.dropping .ui-select-match-close {\n  pointer-events: none;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-before:before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  right: 100%;\n  height: 100%;\n  margin-right: 2px;\n  border-left: 1px solid #428bca;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-after:after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 100%;\n  height: 100%;\n  margin-left: 2px;\n  border-right: 1px solid #428bca;\n}\n\n.ui-select-bootstrap .ui-select-choices-row>span {\n    cursor: pointer;\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: 400;\n    line-height: 1.42857143;\n    color: #333;\n    white-space: nowrap;\n}\n\n.ui-select-bootstrap .ui-select-choices-row>span:hover, .ui-select-bootstrap .ui-select-choices-row>span:focus {\n    text-decoration: none;\n    color: #262626;\n    background-color: #f5f5f5;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.active>span {\n    color: #fff;\n    text-decoration: none;\n    outline: 0;\n    background-color: #428bca;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.disabled>span,\n.ui-select-bootstrap .ui-select-choices-row.active.disabled>span {\n    color: #777;\n    cursor: not-allowed;\n    background-color: #fff;\n}\n\n/* fix hide/show angular animation */\n.ui-select-match.ng-hide-add,\n.ui-select-search.ng-hide-add {\n    display: none !important;\n}\n\n/* Mark invalid Bootstrap */\n.ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {\n    border-color: #D44950;\n}\n\n/* Handle up direction Bootstrap */\n.ui-select-container[theme=\"bootstrap\"].direction-up .ui-select-dropdown {\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n}\n\n.ui-select-bootstrap .ui-select-match-text {\n    width: 100%;\n    padding-right: 1em;\n}\n.ui-select-bootstrap .ui-select-match-text span {\n    display: inline-block;\n    width: 100%;\n    overflow: hidden;\n}\n.ui-select-bootstrap .ui-select-toggle > a.btn {\n  position: absolute;\n  height: 10px;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Spinner */\n.ui-select-refreshing.glyphicon {\n    position: absolute;\n    right: 0;\n    padding: 8px 27px;\n }\n\n@-webkit-keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n.ui-select-spin {\n  -webkit-animation: ui-select-spin 2s infinite linear;\n  animation: ui-select-spin 2s infinite linear;\n}\n\n.ui-select-refreshing.ng-animate {\n  -webkit-animation: none 0s;\n}\n","/* Style when highlighting a search. */\n.ui-select-highlight {\n  font-weight: bold;\n}\n\n.ui-select-offscreen {\n  clip: rect(0 0 0 0) !important;\n  width: 1px !important;\n  height: 1px !important;\n  border: 0 !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  position: absolute !important;\n  outline: 0 !important;\n  left: 0px !important;\n  top: 0px !important;\n}\n\n\n.ui-select-choices-row:hover {\n  background-color: #f5f5f5;\n}\n\n/* Select2 theme */\n\n/* Mark invalid Select2 */\n.ng-dirty.ng-invalid > a.select2-choice {\n    border-color: #D44950;\n}\n\n.select2-result-single {\n  padding-left: 0;\n}\n\n.select2-locked > .select2-search-choice-close{\n  display:none;\n}\n\n.select-locked > .ui-select-match-close{\n    display:none;\n}\n\nbody > .select2-container.open {\n  z-index: 9999; /* The z-index Select2 applies to the select2-drop */\n}\n\n/* Handle up direction Select2 */\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-match,\n.ui-select-container.select2.direction-up .ui-select-match {\n    border-radius: 4px; /* FIXME hardcoded value :-/ */\n    border-top-left-radius: 0;\n    border-top-right-radius: 0;\n}\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown,\n.ui-select-container.select2.direction-up .ui-select-dropdown {\n    border-radius: 4px; /* FIXME hardcoded value :-/ */\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n\n    border-top-width: 1px;  /* FIXME hardcoded value :-/ */\n    border-top-style: solid;\n\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n\n    margin-top: -4px; /* FIXME hardcoded value :-/ */\n}\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown .select2-search,\n.ui-select-container.select2.direction-up .ui-select-dropdown .select2-search {\n    margin-top: 4px; /* FIXME hardcoded value :-/ */\n}\n.ui-select-container[theme=\"select2\"].direction-up.select2-dropdown-open .ui-select-match,\n.ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match {\n    border-bottom-color: #5897fb;\n}\n\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden,\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden input{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n}\n\n/* Selectize theme */\n\n/* Helper class to show styles when focus */\n.selectize-input.selectize-focus{\n  border-color: #007FBB !important;\n}\n\n/* Fix input width for Selectize theme */\n.selectize-control.single > .selectize-input > input {\n  width: 100%;\n}\n\n/* Fix line break when there's at least one item selected with the Selectize theme */\n.selectize-control.multi > .selectize-input > input {\n  margin: 0 !important;\n}\n\n/* Fix dropdown width for Selectize theme */\n.selectize-control > .selectize-dropdown {\n  width: 100%;\n}\n\n/* Mark invalid Selectize */\n.ng-dirty.ng-invalid > div.selectize-input {\n    border-color: #D44950;\n}\n\n/* Handle up direction Selectize */\n.ui-select-container[theme=\"selectize\"].direction-up .ui-select-dropdown {\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n    margin-top: -2px; /* FIXME hardcoded value :-/ */\n}\n\n.ui-select-container[theme=\"selectize\"] input.ui-select-search-hidden{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n    width: 0;\n}\n\n/* Bootstrap theme */\n\n/* Helper class to show styles when focus */\n.btn-default-focus {\n  color: #333;\n  background-color: #EBEBEB;\n  border-color: #ADADAD;\n  text-decoration: none;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.ui-select-bootstrap .ui-select-toggle {\n  position: relative;\n}\n\n.ui-select-bootstrap .ui-select-toggle > .caret {\n  position: absolute;\n  height: 10px;\n  top: 50%;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Fix Bootstrap dropdown position when inside a input-group */\n.input-group > .ui-select-bootstrap.dropdown {\n  /* Instead of relative */\n  position: static;\n}\n\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control {\n  border-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control.direction-up {\n  border-radius: 4px !important; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.ui-select-bootstrap .ui-select-search-hidden{\n    opacity: 0;\n    height: 0;\n    min-height: 0;\n    padding: 0;\n    margin: 0;\n    border:0;\n}\n\n.ui-select-bootstrap > .ui-select-match > .btn{\n  /* Instead of center because of .btn */\n  text-align: left !important;\n}\n\n.ui-select-bootstrap > .ui-select-match > .caret {\n  position: absolute;\n  top: 45%;\n  right: 15px;\n}\n\n/* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */\n.ui-select-bootstrap > .ui-select-choices ,.ui-select-bootstrap > .ui-select-no-choice {\n  width: 100%;\n  height: auto;\n  max-height: 200px;\n  overflow-x: hidden;\n  margin-top: -1px;\n}\n\nbody > .ui-select-bootstrap.open {\n  z-index: 1000; /* Standard Bootstrap dropdown z-index */\n}\n\n.ui-select-multiple.ui-select-bootstrap {\n  height: auto;\n  padding: 3px 3px 0 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap input.ui-select-search {\n  background-color: transparent !important; /* To prevent double background when disabled */\n  border: none;\n  outline: none;\n  height: 1.666666em;\n  margin-bottom: 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match .close {\n  font-size: 1.6em;\n  line-height: 0.75;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match-item {\n  outline: 0;\n  margin: 0 3px 3px 0;\n}\n\n.ui-select-multiple .ui-select-match-item {\n  position: relative;\n}\n\n.ui-select-multiple .ui-select-match-item.dropping .ui-select-match-close {\n  pointer-events: none;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-before:before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  right: 100%;\n  height: 100%;\n  margin-right: 2px;\n  border-left: 1px solid #428bca;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-after:after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 100%;\n  height: 100%;\n  margin-left: 2px;\n  border-right: 1px solid #428bca;\n}\n\n.ui-select-bootstrap .ui-select-choices-row>span {\n    cursor: pointer;\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: 400;\n    line-height: 1.42857143;\n    color: #333;\n    white-space: nowrap;\n}\n\n.ui-select-bootstrap .ui-select-choices-row>span:hover, .ui-select-bootstrap .ui-select-choices-row>span:focus {\n    text-decoration: none;\n    color: #262626;\n    background-color: #f5f5f5;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.active>span {\n    color: #fff;\n    text-decoration: none;\n    outline: 0;\n    background-color: #428bca;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.disabled>span,\n.ui-select-bootstrap .ui-select-choices-row.active.disabled>span {\n    color: #777;\n    cursor: not-allowed;\n    background-color: #fff;\n}\n\n/* fix hide/show angular animation */\n.ui-select-match.ng-hide-add,\n.ui-select-search.ng-hide-add {\n    display: none !important;\n}\n\n/* Mark invalid Bootstrap */\n.ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {\n    border-color: #D44950;\n}\n\n/* Handle up direction Bootstrap */\n.ui-select-container[theme=\"bootstrap\"].direction-up .ui-select-dropdown {\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n}\n\n.ui-select-bootstrap .ui-select-match-text {\n    width: 100%;\n    padding-right: 1em;\n}\n.ui-select-bootstrap .ui-select-match-text span {\n    display: inline-block;\n    width: 100%;\n    overflow: hidden;\n}\n.ui-select-bootstrap .ui-select-toggle > a.btn {\n  position: absolute;\n  height: 10px;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Spinner */\n.ui-select-refreshing.glyphicon {\n    position: absolute;\n    right: 0;\n    padding: 8px 27px;\n }\n\n@-webkit-keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n.ui-select-spin {\n  -webkit-animation: ui-select-spin 2s infinite linear;\n  animation: ui-select-spin 2s infinite linear;\n}\n\n.ui-select-refreshing.ng-animate {\n  -webkit-animation: none 0s;\n}\n"]}
\ No newline at end of file
+{"version":3,"sources":["common.css"],"names":[],"mappings":"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","file":"select.min.css","sourcesContent":["/* Style when highlighting a search. */\n.ui-select-highlight {\n  font-weight: bold;\n}\n\n.ui-select-offscreen {\n  clip: rect(0 0 0 0) !important;\n  width: 1px !important;\n  height: 1px !important;\n  border: 0 !important;\n  margin: 0 !important;\n  padding: 0 !important;\n  overflow: hidden !important;\n  position: absolute !important;\n  outline: 0 !important;\n  left: 0 !important;\n  top: 0 !important;\n}\n\n.ui-select-choices-row:hover {\n  background-color: #f5f5f5;\n}\n\n/* Select2 theme */\n\n/* Mark invalid Select2 */\n.ng-dirty.ng-invalid > a.select2-choice {\n  border-color: #D44950;\n}\n\n.select2-result-single {\n  padding-left: 0;\n}\n\n.select2-locked > .select2-search-choice-close {\n  display: none;\n}\n\n.select-locked > .ui-select-match-close {\n  display: none;\n}\n\nbody > .select2-container.open {\n  z-index: 9999; /* The z-index Select2 applies to the select2-drop */\n}\n\n.select2 .ui-select-footer,\n.select2 .ui-select-header {\n  padding: 4px 10px;\n}\n\n.select2 .ui-select-footer {\n  border-top: 1px solid #dfe5eb;\n}\n\n.select2 .ui-select-header {\n  border-bottom: 1px solid #dfe5eb;\n}\n\n/* Handle up direction Select2 */\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-match,\n.ui-select-container.select2.direction-up .ui-select-match {\n  border-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown,\n.ui-select-container.select2.direction-up .ui-select-dropdown {\n  border-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n\n  border-top-width: 1px; /* FIXME hardcoded value :-/ */\n  border-top-style: solid;\n\n  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n\n  margin-top: -4px; /* FIXME hardcoded value :-/ */\n}\n\n.ui-select-container[theme=\"select2\"].direction-up .ui-select-dropdown .select2-search,\n.ui-select-container.select2.direction-up .ui-select-dropdown .select2-search {\n  margin-top: 4px; /* FIXME hardcoded value :-/ */\n}\n\n.ui-select-container[theme=\"select2\"].direction-up.select2-dropdown-open .ui-select-match,\n.ui-select-container.select2.direction-up.select2-dropdown-open .ui-select-match {\n  border-bottom-color: #5897fb;\n}\n\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden,\n.ui-select-container[theme=\"select2\"] .ui-select-dropdown .ui-select-search-hidden input {\n  opacity: 0;\n  height: 0;\n  min-height: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\n/* Selectize theme */\n\n/* Helper class to show styles when focus */\n.selectize-input.selectize-focus {\n  border-color: #007FBB !important;\n}\n\n/* Fix input width for Selectize theme */\n.selectize-control.single > .selectize-input > input {\n  width: 100%;\n}\n\n/* Fix line break when there's at least one item selected with the Selectize theme */\n.selectize-control.multi > .selectize-input > input {\n  margin: 0 !important;\n}\n\n/* Fix dropdown width for Selectize theme */\n.selectize-control > .selectize-dropdown {\n  width: 100%;\n}\n\n.selectize-dropdown .ui-select-footer,\n.selectize-dropdown .ui-select-header {\n  padding: 5px 8px;\n}\n\n.selectize-dropdown .ui-select-header {\n  border-bottom: 1px solid #b8b8b8;\n}\n\n.selectize-dropdown .ui-select-footer {\n  border-top: 1px solid #b8b8b8;\n}\n\n/* Mark invalid Selectize */\n.ng-dirty.ng-invalid > div.selectize-input {\n  border-color: #D44950;\n}\n\n/* Handle up direction Selectize */\n.ui-select-container[theme=\"selectize\"].direction-up .ui-select-dropdown {\n  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n  margin-top: -2px; /* FIXME hardcoded value :-/ */\n}\n\n.ui-select-container[theme=\"selectize\"] input.ui-select-search-hidden {\n  opacity: 0;\n  height: 0;\n  min-height: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n  width: 0;\n}\n\n.ui-select-container[theme=\"selectize\"] .ui-select-header-group-selectable:hover {\n    background-color: #f5f5f5;\n}\n\n.ui-select-container[theme=\"selectize\"] .ui-select-header-group-selectable {\n    cursor: pointer;\n    padding-left: 15px;\n}\n\n/* Bootstrap theme */\n\n/* Helper class to show styles when focus */\n.btn-default-focus {\n  color: #333;\n  background-color: #EBEBEB;\n  border-color: #ADADAD;\n  text-decoration: none;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.ui-select-bootstrap .ui-select-toggle {\n  position: relative;\n}\n\n.ui-select-bootstrap .ui-select-toggle > .caret {\n  position: absolute;\n  height: 10px;\n  top: 50%;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Fix Bootstrap dropdown position when inside a input-group */\n.input-group > .ui-select-bootstrap.dropdown {\n  /* Instead of relative */\n  position: static;\n}\n\n.input-group .ui-select-bootstrap:first-child .form-control {\n  border-top-left-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-bottom-left-radius: 4px; /* FIXME hardcoded value :-/ */\n}\n\n.input-group .ui-select-bootstrap:last-child .form-control {\n  border-top-right-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-bottom-right-radius: 4px; /* FIXME hardcoded value :-/ */\n}\n\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control {\n  border-radius: 4px; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .ui-select-bootstrap > input.ui-select-search.form-control.direction-up {\n  border-radius: 4px !important; /* FIXME hardcoded value :-/ */\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.ui-select-bootstrap .ui-select-search-hidden {\n  opacity: 0;\n  height: 0;\n  min-height: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\n.ui-select-bootstrap > .ui-select-match > .btn {\n  /* Instead of center because of .btn */\n  text-align: left !important;\n}\n\n.ui-select-bootstrap > .ui-select-match > .caret {\n  position: absolute;\n  top: 45%;\n  right: 15px;\n}\n\n/* See Scrollable Menu with Bootstrap 3 http://stackoverflow.com/questions/19227496 */\n.ui-select-bootstrap .ui-select-choices,\n.ui-select-bootstrap .ui-select-no-choice {\n  width: 100%;\n  height: auto;\n  max-height: 200px;\n  overflow-x: hidden;\n  margin-top: -1px;\n}\n\nbody > .ui-select-bootstrap.open {\n  z-index: 1000; /* Standard Bootstrap dropdown z-index */\n}\n\n.ui-select-multiple.ui-select-bootstrap {\n  height: auto;\n  padding: 3px 3px 0 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap input.ui-select-search {\n  background-color: transparent !important; /* To prevent double background when disabled */\n  border: none;\n  outline: none;\n  height: 1.666666em;\n  margin-bottom: 3px;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match .close {\n  font-size: 1.6em;\n  line-height: 0.75;\n}\n\n.ui-select-multiple.ui-select-bootstrap .ui-select-match-item {\n  outline: 0;\n  margin: 0 3px 3px 0;\n}\n\n.ui-select-multiple .ui-select-match-item {\n  position: relative;\n}\n\n.ui-select-multiple .ui-select-match-item.dropping .ui-select-match-close {\n  pointer-events: none;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-before:before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  right: 100%;\n  height: 100%;\n  margin-right: 2px;\n  border-left: 1px solid #428bca;\n}\n\n.ui-select-multiple:hover .ui-select-match-item.dropping-after:after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 100%;\n  height: 100%;\n  margin-left: 2px;\n  border-right: 1px solid #428bca;\n}\n\n\n.ui-select-bootstrap .ui-select-choices {\n  padding: 5px 0;\n  margin: 0;\n  list-style: none;\n\n.ui-select-bootstrap .ui-select-header-group-selectable:hover {\n    background-color: #f5f5f5;\n}\n\n.ui-select-bootstrap .ui-select-header-group-selectable {\n    color: black;\n    cursor: pointer;\n    padding: 3px 10px;\n}\n\n.ui-select-bootstrap .ui-select-choices-row>span {\n    cursor: pointer;\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: 400;\n    line-height: 1.42857143;\n    color: #333;\n    white-space: nowrap;\n}\n\n.ui-select-bootstrap .ui-select-choices-row > span {\n  cursor: pointer;\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: 400;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n\n.ui-select-bootstrap .ui-select-choices-row > span:hover, .ui-select-bootstrap .ui-select-choices-row > span:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.active > span {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #428bca;\n}\n\n.ui-select-bootstrap .ui-select-choices-row.disabled > span,\n.ui-select-bootstrap .ui-select-choices-row.active.disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n\n.ui-select-bootstrap .ui-select-footer,\n.ui-select-bootstrap .ui-select-header {\n  display: block;\n  padding: 5px 20px;\n  clear: both;\n  font-weight: 400;\n  line-height: 1.42857143;\n}\n\n.ui-select-bootstrap .ui-select-footer {\n  border-top: 1px solid #dfe5eb;\n}\n\n.ui-select-bootstrap .ui-select-header {\n  border-bottom: 1px solid #dfe5eb;\n}\n\n.ui-select-bootstrap .ui-select-dropdown {\n  width: 100%;\n  padding: 0;\n  margin-top: -1px;\n}\n\n/* fix hide/show angular animation */\n.ui-select-match.ng-hide-add,\n.ui-select-search.ng-hide-add {\n  display: none !important;\n}\n\n/* Mark invalid Bootstrap */\n.ui-select-bootstrap.ng-dirty.ng-invalid > button.btn.ui-select-match {\n  border-color: #D44950;\n}\n\n/* Handle up direction Bootstrap */\n.ui-select-container[theme=\"bootstrap\"].direction-up .ui-select-dropdown {\n  box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.25);\n}\n\n.ui-select-bootstrap .ui-select-match-text {\n  width: 100%;\n  padding-right: 1em;\n}\n\n.ui-select-bootstrap .ui-select-match-text span {\n  display: inline-block;\n  width: 100%;\n  overflow: hidden;\n}\n\n.ui-select-bootstrap .ui-select-toggle > a.btn {\n  position: absolute;\n  height: 10px;\n  right: 10px;\n  margin-top: -2px;\n}\n\n/* Spinner */\n.ui-select-refreshing.glyphicon {\n  position: absolute;\n  right: 0;\n  padding: 8px 27px;\n}\n\n@-webkit-keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n@keyframes ui-select-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n\n.ui-select-spin {\n  -webkit-animation: ui-select-spin 2s infinite linear;\n  animation: ui-select-spin 2s infinite linear;\n}\n\n.ui-select-refreshing.ng-animate {\n  -webkit-animation: none 0s;\n}\n"]}
\ No newline at end of file
diff --git a/dist/select.min.js b/dist/select.min.js
index 61be14d25..54102e9b3 100644
--- a/dist/select.min.js
+++ b/dist/select.min.js
@@ -1,9 +1,9 @@
 /*!
  * ui-select
  * http://github.com/angular-ui/ui-select
- * Version: 0.19.7 - 2017-04-15T14:28:36.649Z
+ * Version: 0.19.8 - 2018-08-29T07:07:49.652Z
  * License: MIT
  */
-!function(){"use strict";function e(e){return angular.isUndefined(e)||null===e}var t={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,COMMAND:91,MAP:{91:"COMMAND",8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSEBREAK",20:"CAPSLOCK",27:"ESC",32:"SPACE",33:"PAGE_UP",34:"PAGE_DOWN",35:"END",36:"HOME",37:"LEFT",38:"UP",39:"RIGHT",40:"DOWN",43:"+",44:"PRINTSCREEN",45:"INSERT",46:"DELETE",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUMLOCK",145:"SCROLLLOCK",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},isControl:function(e){var s=e.which;switch(s){case t.COMMAND:case t.SHIFT:case t.CTRL:case t.ALT:return!0}return!!(e.metaKey||e.ctrlKey||e.altKey)},isFunctionKey:function(e){return e=e.which?e.which:e,e>=112&&e<=123},isVerticalMovement:function(e){return~[t.UP,t.DOWN].indexOf(e)},isHorizontalMovement:function(e){return~[t.LEFT,t.RIGHT,t.BACKSPACE,t.DELETE].indexOf(e)},toSeparator:function(e){var s={ENTER:"\n",TAB:"\t",SPACE:" "}[e];return s?s:t[e]?void 0:e}};void 0===angular.element.prototype.querySelectorAll&&(angular.element.prototype.querySelectorAll=function(e){return angular.element(this[0].querySelectorAll(e))}),void 0===angular.element.prototype.closest&&(angular.element.prototype.closest=function(e){for(var t=this[0],s=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector;t;){if(s.bind(t)(e))return t;t=t.parentElement}return!1});var s=0,i=angular.module("ui.select",[]).constant("uiSelectConfig",{theme:"bootstrap",searchEnabled:!0,sortable:!1,placeholder:"",refreshDelay:1e3,closeOnSelect:!0,skipFocusser:!1,dropdownPosition:"auto",removeSelected:!0,resetSearchInput:!0,generateId:function(){return s++},appendToBody:!1,spinnerEnabled:!1,spinnerClass:"glyphicon glyphicon-refresh ui-select-spin",backspaceReset:!0}).service("uiSelectMinErr",function(){var e=angular.$$minErr("ui.select");return function(){var t=e.apply(this,arguments),s=t.message.replace(new RegExp("\nhttp://errors.angularjs.org/.*"),"");return new Error(s)}}).directive("uisTranscludeAppend",function(){return{link:function(e,t,s,i,c){c(e,function(e){t.append(e)})}}}).filter("highlight",function(){function e(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(t,s){return s&&t?(""+t).replace(new RegExp(e(s),"gi"),'<span class="ui-select-highlight">$&</span>'):t}}).factory("uisOffset",["$document","$window",function(e,t){return function(s){var i=s[0].getBoundingClientRect();return{width:i.width||s.prop("offsetWidth"),height:i.height||s.prop("offsetHeight"),top:i.top+(t.pageYOffset||e[0].documentElement.scrollTop),left:i.left+(t.pageXOffset||e[0].documentElement.scrollLeft)}}}]);i.factory("$$uisDebounce",["$timeout",function(e){return function(t,s){var i;return function(){var c=this,n=Array.prototype.slice.call(arguments);i&&e.cancel(i),i=e(function(){t.apply(c,n)},s)}}}]),i.directive("uiSelectChoices",["uiSelectConfig","uisRepeatParser","uiSelectMinErr","$compile","$window",function(e,t,s,i,c){return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(t){t.addClass("ui-select-choices");var s=t.parent().attr("theme")||e.theme;return s+"/choices.tpl.html"},compile:function(i,n){if(!n.repeat)throw s("repeat","Expected 'repeat' expression.");var l=n.groupBy,a=n.groupFilter;if(l){var r=i.querySelectorAll(".ui-select-choices-group");if(1!==r.length)throw s("rows","Expected 1 .ui-select-choices-group but got '{0}'.",r.length);r.attr("ng-repeat",t.getGroupNgRepeatExpression())}var o=t.parse(n.repeat),u=i.querySelectorAll(".ui-select-choices-row");if(1!==u.length)throw s("rows","Expected 1 .ui-select-choices-row but got '{0}'.",u.length);u.attr("ng-repeat",o.repeatExpression(l)).attr("ng-if","$select.open");var d=i.querySelectorAll(".ui-select-choices-row-inner");if(1!==d.length)throw s("rows","Expected 1 .ui-select-choices-row-inner but got '{0}'.",d.length);d.attr("uis-transclude-append","");var p=c.document.addEventListener?u:d;return p.attr("ng-click","$select.select("+o.itemName+",$select.skipFocusser,$event)"),function(t,s,c,n){n.parseRepeatAttr(c.repeat,l,a),n.disableChoiceExpression=c.uiDisableChoice,n.onHighlightCallback=c.onHighlight,n.minimumInputLength=parseInt(c.minimumInputLength)||0,n.dropdownPosition=c.position?c.position.toLowerCase():e.dropdownPosition,t.$watch("$select.search",function(e){e&&!n.open&&n.multiple&&n.activate(!1,!0),n.activeIndex=n.tagging.isActivated?-1:0,!c.minimumInputLength||n.search.length>=c.minimumInputLength?n.refresh(c.refresh):n.items=[]}),c.$observe("refreshDelay",function(){var s=t.$eval(c.refreshDelay);n.refreshDelay=void 0!==s?s:e.refreshDelay}),t.$watch("$select.open",function(e){e?(i.attr("role","listbox"),n.refresh(c.refresh)):s.removeAttr("role")})}}}}]),i.controller("uiSelectCtrl",["$scope","$element","$timeout","$filter","$$uisDebounce","uisRepeatParser","uiSelectMinErr","uiSelectConfig","$parse","$injector","$window",function(s,i,c,n,l,a,r,o,u,d,p){function h(e,t,s){if(e.findIndex)return e.findIndex(t,s);for(var i,c=Object(e),n=c.length>>>0,l=0;l<n;l++)if(i=c[l],t.call(s,i,l,c))return l;return-1}function g(){y.resetSearchInput&&(y.search=x,y.selected&&y.items.length&&!y.multiple&&(y.activeIndex=h(y.items,function(e){return angular.equals(this,e)},y.selected)))}function f(e,t){var s,i,c=[];for(s=0;s<t.length;s++)for(i=0;i<e.length;i++)e[i].name==[t[s]]&&c.push(e[i]);return c}function v(e,t){var s=I.indexOf(e);t&&s===-1&&I.push(e),!t&&s>-1&&I.splice(s,1)}function m(e){return I.indexOf(e)>-1}function $(e){function t(e,t){var s=i.indexOf(e);t&&s===-1&&i.push(e),!t&&s>-1&&i.splice(s,1)}function s(e){return i.indexOf(e)>-1}if(e){var i=[];y.isLocked=function(e,i){var c=!1,n=y.selected[i];return n&&(e?(c=!!e.$eval(y.lockChoiceExpression),t(n,c)):c=s(n)),c}}}function b(e){var s=!0;switch(e){case t.DOWN:if(!y.open&&y.multiple)y.activate(!1,!0);else if(y.activeIndex<y.items.length-1)for(var i=++y.activeIndex;m(y.items[i])&&i<y.items.length;)y.activeIndex=++i;break;case t.UP:var c=0===y.search.length&&y.tagging.isActivated?-1:0;if(!y.open&&y.multiple)y.activate(!1,!0);else if(y.activeIndex>c)for(var n=--y.activeIndex;m(y.items[n])&&n>c;)y.activeIndex=--n;break;case t.TAB:y.multiple&&!y.open||y.select(y.items[y.activeIndex],!0);break;case t.ENTER:y.open&&(y.tagging.isActivated||y.activeIndex>=0)?y.select(y.items[y.activeIndex],y.skipFocusser):y.activate(!1,!0);break;case t.ESC:y.close();break;default:s=!1}return s}function w(){var e=i.querySelectorAll(".ui-select-choices-content"),t=e.querySelectorAll(".ui-select-choices-row");if(t.length<1)throw r("choices","Expected multiple .ui-select-choices-row but got '{0}'.",t.length);if(!(y.activeIndex<0)){var s=t[y.activeIndex],c=s.offsetTop+s.clientHeight-e[0].scrollTop,n=e[0].offsetHeight;c>n?e[0].scrollTop+=c-n:c<s.clientHeight&&(y.isGrouped&&0===y.activeIndex?e[0].scrollTop=0:e[0].scrollTop-=s.clientHeight-c)}}var y=this,x="";if(y.placeholder=o.placeholder,y.searchEnabled=o.searchEnabled,y.sortable=o.sortable,y.refreshDelay=o.refreshDelay,y.paste=o.paste,y.resetSearchInput=o.resetSearchInput,y.refreshing=!1,y.spinnerEnabled=o.spinnerEnabled,y.spinnerClass=o.spinnerClass,y.removeSelected=o.removeSelected,y.closeOnSelect=!0,y.skipFocusser=!1,y.search=x,y.activeIndex=0,y.items=[],y.open=!1,y.focus=!1,y.disabled=!1,y.selected=void 0,y.dropdownPosition="auto",y.focusser=void 0,y.multiple=void 0,y.disableChoiceExpression=void 0,y.tagging={isActivated:!1,fct:void 0},y.taggingTokens={isActivated:!1,tokens:void 0},y.lockChoiceExpression=void 0,y.clickTriggeredSelect=!1,y.$filter=n,y.$element=i,y.$animate=function(){try{return d.get("$animate")}catch(e){return null}}(),y.searchInput=i.querySelectorAll("input.ui-select-search"),1!==y.searchInput.length)throw r("searchInput","Expected 1 input.ui-select-search but got '{0}'.",y.searchInput.length);y.isEmpty=function(){return e(y.selected)||""===y.selected||y.multiple&&0===y.selected.length},y.activate=function(e,t){if(y.disabled||y.open)y.open&&!y.searchEnabled&&y.close();else{t||g(),s.$broadcast("uis:activate"),y.open=!0,y.activeIndex=y.activeIndex>=y.items.length?0:y.activeIndex,y.activeIndex===-1&&y.taggingLabel!==!1&&(y.activeIndex=0);var n=i.querySelectorAll(".ui-select-choices-content"),l=i.querySelectorAll(".ui-select-search");if(y.$animate&&y.$animate.on&&y.$animate.enabled(n[0])){var a=function(t,s){"start"===s&&0===y.items.length?(y.$animate.off("removeClass",l[0],a),c(function(){y.focusSearchInput(e)})):"close"===s&&(y.$animate.off("enter",n[0],a),c(function(){y.focusSearchInput(e)}))};y.items.length>0?y.$animate.on("enter",n[0],a):y.$animate.on("removeClass",l[0],a)}else c(function(){y.focusSearchInput(e),!y.tagging.isActivated&&y.items.length>1&&w()})}},y.focusSearchInput=function(e){y.search=e||y.search,y.searchInput[0].focus()},y.findGroupByName=function(e){return y.groups&&y.groups.filter(function(t){return t.name===e})[0]},y.parseRepeatAttr=function(e,t,i){function c(e){var c=s.$eval(t);if(y.groups=[],angular.forEach(e,function(e){var t=angular.isFunction(c)?c(e):e[c],s=y.findGroupByName(t);s?s.items.push(e):y.groups.push({name:t,items:[e]})}),i){var n=s.$eval(i);angular.isFunction(n)?y.groups=n(y.groups):angular.isArray(n)&&(y.groups=f(y.groups,n))}y.items=[],y.groups.forEach(function(e){y.items=y.items.concat(e.items)})}function n(e){y.items=e||[]}y.setItemsFn=t?c:n,y.parserResult=a.parse(e),y.isGrouped=!!t,y.itemProperty=y.parserResult.itemName;var l=y.parserResult.source,o=function(){var e=l(s);s.$uisSource=Object.keys(e).map(function(t){var s={};return s[y.parserResult.keyName]=t,s.value=e[t],s})};y.parserResult.keyName&&(o(),y.parserResult.source=u("$uisSource"+y.parserResult.filters),s.$watch(l,function(e,t){e!==t&&o()},!0)),y.refreshItems=function(e){e=e||y.parserResult.source(s);var t=y.selected;if(y.isEmpty()||angular.isArray(t)&&!t.length||!y.multiple||!y.removeSelected)y.setItemsFn(e);else if(void 0!==e&&null!==e){var i=e.filter(function(e){return angular.isArray(t)?t.every(function(t){return!angular.equals(e,t)}):!angular.equals(e,t)});y.setItemsFn(i)}"auto"!==y.dropdownPosition&&"up"!==y.dropdownPosition||s.calculateDropdownPos(),s.$broadcast("uis:refresh")},s.$watchCollection(y.parserResult.source,function(e){if(void 0===e||null===e)y.items=[];else{if(!angular.isArray(e))throw r("items","Expected an array but got '{0}'.",e);y.refreshItems(e),angular.isDefined(y.ngModel.$modelValue)&&(y.ngModel.$modelValue=null)}})};var E;y.refresh=function(e){void 0!==e&&(E&&c.cancel(E),E=c(function(){if(s.$select.search.length>=s.$select.minimumInputLength){var t=s.$eval(e);t&&angular.isFunction(t.then)&&!y.refreshing&&(y.refreshing=!0,t["finally"](function(){y.refreshing=!1}))}},y.refreshDelay))},y.isActive=function(e){if(!y.open)return!1;var t=y.items.indexOf(e[y.itemProperty]),s=t==y.activeIndex;return!(!s||t<0)&&(s&&!angular.isUndefined(y.onHighlightCallback)&&e.$eval(y.onHighlightCallback),s)};var S=function(e){return y.selected&&angular.isArray(y.selected)&&y.selected.filter(function(t){return angular.equals(t,e)}).length>0},I=[];y.isDisabled=function(e){if(y.open){var t=e[y.itemProperty],s=y.items.indexOf(t),i=!1;if(s>=0&&(angular.isDefined(y.disableChoiceExpression)||y.multiple)){if(t.isTag)return!1;y.multiple&&(i=S(t)),!i&&angular.isDefined(y.disableChoiceExpression)&&(i=!!e.$eval(y.disableChoiceExpression)),v(t,i)}return i}},y.select=function(t,i,c){if(e(t)||!m(t)){if(!y.items&&!y.search&&!y.tagging.isActivated)return;if(!t||!m(t)){if(y.clickTriggeredSelect=!1,c&&("click"===c.type||"touchend"===c.type)&&t&&(y.clickTriggeredSelect=!0),y.tagging.isActivated&&y.clickTriggeredSelect===!1){if(y.taggingLabel===!1)if(y.activeIndex<0){if(void 0===t&&(t=void 0!==y.tagging.fct?y.tagging.fct(y.search):y.search),!t||angular.equals(y.items[0],t))return}else t=y.items[y.activeIndex];else if(0===y.activeIndex){if(void 0===t)return;if(void 0!==y.tagging.fct&&"string"==typeof t){if(t=y.tagging.fct(t),!t)return}else"string"==typeof t&&(t=t.replace(y.taggingLabel,"").trim())}if(S(t))return void y.close(i)}g(),s.$broadcast("uis:select",t),y.closeOnSelect&&y.close(i)}}},y.close=function(e){y.open&&(y.ngModel&&y.ngModel.$setTouched&&y.ngModel.$setTouched(),y.open=!1,g(),s.$broadcast("uis:close",e))},y.setFocus=function(){y.focus||y.focusInput[0].focus()},y.clear=function(e){y.select(null),e.stopPropagation(),c(function(){y.focusser[0].focus()},0,!1)},y.toggle=function(e){y.open?(y.close(),e.preventDefault(),e.stopPropagation()):y.activate()},y.isLocked=function(){return!1},s.$watch(function(){return angular.isDefined(y.lockChoiceExpression)&&""!==y.lockChoiceExpression},$);var C=null,k=!1;y.sizeSearchInput=function(){var e=y.searchInput[0],t=y.$element[0],i=function(){return t.clientWidth*!!e.offsetParent},n=function(t){if(0===t)return!1;var s=t-e.offsetLeft;return s<50&&(s=t),y.searchInput.css("width",s+"px"),!0};y.searchInput.css("width","10px"),c(function(){null!==C||n(i())||(C=s.$watch(function(){k||(k=!0,s.$$postDigest(function(){k=!1,n(i())&&(C(),C=null)}))},angular.noop))})},y.searchInput.on("keydown",function(e){var i=e.which;~[t.ENTER,t.ESC].indexOf(i)&&(e.preventDefault(),e.stopPropagation()),s.$apply(function(){var s=!1;if((y.items.length>0||y.tagging.isActivated)&&(b(i)||y.searchEnabled||(e.preventDefault(),e.stopPropagation()),y.taggingTokens.isActivated)){for(var n=0;n<y.taggingTokens.tokens.length;n++)y.taggingTokens.tokens[n]===t.MAP[e.keyCode]&&y.search.length>0&&(s=!0);s&&c(function(){y.searchInput.triggerHandler("tagged");var s=y.search.replace(t.MAP[e.keyCode],"").trim();y.tagging.fct&&(s=y.tagging.fct(s)),s&&y.select(s,!0)})}}),t.isVerticalMovement(i)&&y.items.length>0&&w(),i!==t.ENTER&&i!==t.ESC||(e.preventDefault(),e.stopPropagation())}),y.searchInput.on("paste",function(e){var s;if(s=window.clipboardData&&window.clipboardData.getData?window.clipboardData.getData("Text"):(e.originalEvent||e).clipboardData.getData("text/plain"),s=y.search+s,s&&s.length>0)if(y.taggingTokens.isActivated){for(var i=[],c=0;c<y.taggingTokens.tokens.length;c++){var n=t.toSeparator(y.taggingTokens.tokens[c])||y.taggingTokens.tokens[c];if(s.indexOf(n)>-1){i=s.split(n);break}}0===i.length&&(i=[s]);var l=y.search;angular.forEach(i,function(e){var t=y.tagging.fct?y.tagging.fct(e):e;t&&y.select(t,!0)}),y.search=l||x,e.preventDefault(),e.stopPropagation()}else y.paste&&(y.paste(s),y.search=x,e.preventDefault(),e.stopPropagation())}),y.searchInput.on("tagged",function(){c(function(){g()})});var A=l(function(){y.sizeSearchInput()},50);angular.element(p).bind("resize",A),s.$on("$destroy",function(){y.searchInput.off("keyup keydown tagged blur paste"),angular.element(p).off("resize",A)}),s.$watch("$select.activeIndex",function(e){e&&i.find("input").attr("aria-activedescendant","ui-select-choices-row-"+y.generatedId+"-"+e)}),s.$watch("$select.open",function(e){e||i.find("input").removeAttr("aria-activedescendant")})}]),i.directive("uiSelect",["$document","uiSelectConfig","uiSelectMinErr","uisOffset","$compile","$parse","$timeout",function(e,t,s,i,c,n,l){return{restrict:"EA",templateUrl:function(e,s){var i=s.theme||t.theme;return i+(angular.isDefined(s.multiple)?"/select-multiple.tpl.html":"/select.tpl.html")},replace:!0,transclude:!0,require:["uiSelect","^ngModel"],scope:!0,controller:"uiSelectCtrl",controllerAs:"$select",compile:function(c,a){var r=/{(.*)}\s*{(.*)}/.exec(a.ngClass);if(r){var o="{"+r[1]+", "+r[2]+"}";a.ngClass=o,c.attr("ng-class",o)}return angular.isDefined(a.multiple)?c.append("<ui-select-multiple/>").removeAttr("multiple"):c.append("<ui-select-single/>"),a.inputId&&(c.querySelectorAll("input.ui-select-search")[0].id=a.inputId),function(c,a,r,o,u){function d(e){if(g.open){var t=!1;if(t=window.jQuery?window.jQuery.contains(a[0],e.target):a[0].contains(e.target),!t&&!g.clickTriggeredSelect){var s;if(g.skipFocusser)s=!0;else{var i=["input","button","textarea","select"],n=angular.element(e.target).controller("uiSelect");s=n&&n!==g,s||(s=~i.indexOf(e.target.tagName.toLowerCase()))}g.close(s),c.$digest()}g.clickTriggeredSelect=!1}}function p(){var t=i(a);m=angular.element('<div class="ui-select-placeholder"></div>'),m[0].style.width=t.width+"px",m[0].style.height=t.height+"px",a.after(m),$=a[0].style.width,e.find("body").append(a),a[0].style.position="absolute",a[0].style.left=t.left+"px",a[0].style.top=t.top+"px",a[0].style.width=t.width+"px"}function h(){null!==m&&(m.replaceWith(a),m=null,a[0].style.position="",a[0].style.left="",a[0].style.top="",a[0].style.width=$,g.setFocus())}var g=o[0],f=o[1];g.generatedId=t.generateId(),g.baseTitle=r.title||"Select box",g.focusserTitle=g.baseTitle+" focus",g.focusserId="focusser-"+g.generatedId,g.closeOnSelect=function(){return angular.isDefined(r.closeOnSelect)?n(r.closeOnSelect)():t.closeOnSelect}(),c.$watch("skipFocusser",function(){var e=c.$eval(r.skipFocusser);g.skipFocusser=void 0!==e?e:t.skipFocusser}),g.onSelectCallback=n(r.onSelect),g.onRemoveCallback=n(r.onRemove),g.ngModel=f,g.choiceGrouped=function(e){return g.isGrouped&&e&&e.name},r.tabindex&&r.$observe("tabindex",function(e){g.focusInput.attr("tabindex",e),a.removeAttr("tabindex")}),c.$watch(function(){return c.$eval(r.searchEnabled)},function(e){g.searchEnabled=void 0!==e?e:t.searchEnabled}),c.$watch("sortable",function(){var e=c.$eval(r.sortable);g.sortable=void 0!==e?e:t.sortable}),r.$observe("backspaceReset",function(){var e=c.$eval(r.backspaceReset);g.backspaceReset=void 0===e||e}),r.$observe("limit",function(){g.limit=angular.isDefined(r.limit)?parseInt(r.limit,10):void 0}),c.$watch("removeSelected",function(){var e=c.$eval(r.removeSelected);g.removeSelected=void 0!==e?e:t.removeSelected}),r.$observe("disabled",function(){g.disabled=void 0!==r.disabled&&r.disabled}),r.$observe("resetSearchInput",function(){var e=c.$eval(r.resetSearchInput);g.resetSearchInput=void 0===e||e}),r.$observe("paste",function(){g.paste=c.$eval(r.paste)}),r.$observe("tagging",function(){if(void 0!==r.tagging){var e=c.$eval(r.tagging);g.tagging={isActivated:!0,fct:e!==!0?e:void 0}}else g.tagging={isActivated:!1,fct:void 0}}),r.$observe("taggingLabel",function(){void 0!==r.tagging&&("false"===r.taggingLabel?g.taggingLabel=!1:g.taggingLabel=void 0!==r.taggingLabel?r.taggingLabel:"(new)")}),r.$observe("taggingTokens",function(){if(void 0!==r.tagging){var e=void 0!==r.taggingTokens?r.taggingTokens.split("|"):[",","ENTER"];g.taggingTokens={isActivated:!0,tokens:e}}}),r.$observe("spinnerEnabled",function(){var e=c.$eval(r.spinnerEnabled);g.spinnerEnabled=void 0!==e?e:t.spinnerEnabled}),r.$observe("spinnerClass",function(){var e=r.spinnerClass;g.spinnerClass=void 0!==e?r.spinnerClass:t.spinnerClass}),angular.isDefined(r.autofocus)&&l(function(){g.setFocus()}),angular.isDefined(r.focusOn)&&c.$on(r.focusOn,function(){l(function(){g.setFocus()})}),e.on("click",d),c.$on("$destroy",function(){e.off("click",d)}),u(c,function(e){var t=angular.element("<div>").append(e),i=t.querySelectorAll(".ui-select-match");if(i.removeAttr("ui-select-match"),i.removeAttr("data-ui-select-match"),1!==i.length)throw s("transcluded","Expected 1 .ui-select-match but got '{0}'.",i.length);a.querySelectorAll(".ui-select-match").replaceWith(i);var c=t.querySelectorAll(".ui-select-choices");if(c.removeAttr("ui-select-choices"),c.removeAttr("data-ui-select-choices"),1!==c.length)throw s("transcluded","Expected 1 .ui-select-choices but got '{0}'.",c.length);a.querySelectorAll(".ui-select-choices").replaceWith(c);var n=t.querySelectorAll(".ui-select-no-choice");n.removeAttr("ui-select-no-choice"),n.removeAttr("data-ui-select-no-choice"),1==n.length&&a.querySelectorAll(".ui-select-no-choice").replaceWith(n)});var v=c.$eval(r.appendToBody);(void 0!==v?v:t.appendToBody)&&(c.$watch("$select.open",function(e){e?p():h()}),c.$on("$destroy",function(){h()}));var m=null,$="",b=null,w="direction-up";c.$watch("$select.open",function(){"auto"!==g.dropdownPosition&&"up"!==g.dropdownPosition||c.calculateDropdownPos()});var y=function(e,t){e=e||i(a),t=t||i(b),b[0].style.position="absolute",b[0].style.top=t.height*-1+"px",a.addClass(w)},x=function(e,t){a.removeClass(w),e=e||i(a),t=t||i(b),b[0].style.position="",b[0].style.top=""},E=function(){l(function(){if("up"===g.dropdownPosition)y();else{a.removeClass(w);var t=i(a),s=i(b),c=e[0].documentElement.scrollTop||e[0].body.scrollTop;t.top+t.height+s.height>c+e[0].documentElement.clientHeight?y(t,s):x(t,s)}b[0].style.opacity=1})},S=!1;c.calculateDropdownPos=function(){if(g.open){if(b=angular.element(a).querySelectorAll(".ui-select-dropdown"),0===b.length)return;if(""!==g.search||S||(b[0].style.opacity=0,S=!0),!i(b).height&&g.$animate&&g.$animate.on&&g.$animate.enabled(b)){var e=!0;g.$animate.on("enter",b,function(t,s){"close"===s&&e&&(E(),e=!1)})}else E()}else{if(null===b||0===b.length)return;b[0].style.opacity=0,b[0].style.position="",b[0].style.top="",a.removeClass(w)}}}}}}]),i.directive("uiSelectMatch",["uiSelectConfig",function(e){function t(e,t){return e[0].hasAttribute(t)?e.attr(t):e[0].hasAttribute("data-"+t)?e.attr("data-"+t):e[0].hasAttribute("x-"+t)?e.attr("x-"+t):void 0}return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(s){s.addClass("ui-select-match");var i=s.parent(),c=t(i,"theme")||e.theme,n=angular.isDefined(t(i,"multiple"));return c+(n?"/match-multiple.tpl.html":"/match.tpl.html")},link:function(t,s,i,c){function n(e){c.allowClear=!!angular.isDefined(e)&&(""===e||"true"===e.toLowerCase())}c.lockChoiceExpression=i.uiLockChoice,i.$observe("placeholder",function(t){c.placeholder=void 0!==t?t:e.placeholder}),i.$observe("allowClear",n),n(i.allowClear),c.multiple&&c.sizeSearchInput()}}}]),i.directive("uiSelectMultiple",["uiSelectMinErr","$timeout",function(s,i){return{restrict:"EA",require:["^uiSelect","^ngModel"],controller:["$scope","$timeout",function(e,t){var s,i=this,c=e.$select;angular.isUndefined(c.selected)&&(c.selected=[]),e.$evalAsync(function(){s=e.ngModel}),i.activeMatchIndex=-1,i.updateModel=function(){s.$setViewValue(Date.now()),i.refreshComponent()},i.refreshComponent=function(){c.refreshItems&&c.refreshItems(),c.sizeSearchInput&&c.sizeSearchInput()},i.removeChoice=function(s){if(c.isLocked(null,s))return!1;var n=c.selected[s],l={};return l[c.parserResult.itemName]=n,c.selected.splice(s,1),i.activeMatchIndex=-1,c.sizeSearchInput(),t(function(){c.onRemoveCallback(e,{$item:n,$model:c.parserResult.modelMapper(e,l)})}),i.updateModel(),!0},i.getPlaceholder=function(){if(!c.selected||!c.selected.length)return c.placeholder}}],controllerAs:"$selectMultiple",link:function(c,n,l,a){function r(e){return angular.isNumber(e.selectionStart)?e.selectionStart:e.value.length}function o(e){function s(){switch(e){case t.LEFT:return~g.activeMatchIndex?u:l;case t.RIGHT:return~g.activeMatchIndex&&a!==l?o:(p.activate(),!1);case t.BACKSPACE:return~g.activeMatchIndex?g.removeChoice(a)?u:a:l;case t.DELETE:return!!~g.activeMatchIndex&&(g.removeChoice(g.activeMatchIndex),a)}}var i=r(p.searchInput[0]),c=p.selected.length,n=0,l=c-1,a=g.activeMatchIndex,o=g.activeMatchIndex+1,u=g.activeMatchIndex-1,d=a;return!(i>0||p.search.length&&e==t.RIGHT)&&(p.close(),d=s(),p.selected.length&&d!==!1?g.activeMatchIndex=Math.min(l,Math.max(n,d)):g.activeMatchIndex=-1,!0)}function u(e){if(void 0===e||void 0===p.search)return!1;var t=e.filter(function(e){return void 0!==p.search.toUpperCase()&&void 0!==e&&e.toUpperCase()===p.search.toUpperCase()}).length>0;return t}function d(e,t){var s=-1;if(angular.isArray(e))for(var i=angular.copy(e),c=0;c<i.length;c++)if(void 0===p.tagging.fct)i[c]+" "+p.taggingLabel===t&&(s=c);else{var n=i[c];angular.isObject(n)&&(n.isTag=!0),angular.equals(n,t)&&(s=c)}return s}var p=a[0],h=c.ngModel=a[1],g=c.$selectMultiple;p.multiple=!0,p.focusInput=p.searchInput,h.$isEmpty=function(e){return!e||0===e.length},h.$parsers.unshift(function(){for(var e,t={},s=[],i=p.selected.length-1;i>=0;i--)t={},t[p.parserResult.itemName]=p.selected[i],e=p.parserResult.modelMapper(c,t),s.unshift(e);return s}),h.$formatters.unshift(function(e){var t,s=p.parserResult&&p.parserResult.source(c,{$select:{search:""}}),i={};if(!s)return e;var n=[],l=function(e,s){if(e&&e.length){for(var l=e.length-1;l>=0;l--){if(i[p.parserResult.itemName]=e[l],t=p.parserResult.modelMapper(c,i),p.parserResult.trackByExp){var a=/(\w*)\./.exec(p.parserResult.trackByExp),r=/\.([^\s]+)/.exec(p.parserResult.trackByExp);if(a&&a.length>0&&a[1]==p.parserResult.itemName&&r&&r.length>0&&t[r[1]]==s[r[1]])return n.unshift(e[l]),!0}if(angular.equals(t,s))return n.unshift(e[l]),!0}return!1}};if(!e)return n;for(var a=e.length-1;a>=0;a--)l(p.selected,e[a])||l(s,e[a])||n.unshift(e[a]);return n}),c.$watchCollection(function(){return h.$modelValue},function(e,t){t!=e&&(angular.isDefined(h.$modelValue)&&(h.$modelValue=null),g.refreshComponent())}),h.$render=function(){if(!angular.isArray(h.$viewValue)){if(!e(h.$viewValue))throw s("multiarr","Expected model value to be array but got '{0}'",h.$viewValue);h.$viewValue=[]}p.selected=h.$viewValue,g.refreshComponent(),c.$evalAsync()},c.$on("uis:select",function(e,t){if(!(p.selected.length>=p.limit)){p.selected.push(t);var s={};s[p.parserResult.itemName]=t,i(function(){p.onSelectCallback(c,{$item:t,$model:p.parserResult.modelMapper(c,s)})}),g.updateModel()}}),c.$on("uis:activate",function(){g.activeMatchIndex=-1}),c.$watch("$select.disabled",function(e,t){t&&!e&&p.sizeSearchInput()}),p.searchInput.on("keydown",function(e){var s=e.which;c.$apply(function(){var i=!1;t.isHorizontalMovement(s)&&(i=o(s)),i&&s!=t.TAB&&(e.preventDefault(),e.stopPropagation())})}),p.searchInput.on("keyup",function(e){if(t.isVerticalMovement(e.which)||c.$evalAsync(function(){p.activeIndex=p.taggingLabel===!1?-1:0}),p.tagging.isActivated&&p.search.length>0){if(e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||t.isVerticalMovement(e.which))return;if(p.activeIndex=p.taggingLabel===!1?-1:0,p.taggingLabel===!1)return;var s,i,n,l,a=angular.copy(p.items),r=angular.copy(p.items),o=!1,h=-1;if(void 0!==p.tagging.fct){if(n=p.$filter("filter")(a,{isTag:!0}),n.length>0&&(l=n[0]),a.length>0&&l&&(o=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),s=p.tagging.fct(p.search),r.some(function(e){return angular.equals(e,s)})||p.selected.some(function(e){return angular.equals(e,s)}))return void c.$evalAsync(function(){p.activeIndex=0,p.items=a});s&&(s.isTag=!0)}else{if(n=p.$filter("filter")(a,function(e){return e.match(p.taggingLabel)}),n.length>0&&(l=n[0]),i=a[0],void 0!==i&&a.length>0&&l&&(o=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),s=p.search+" "+p.taggingLabel,d(p.selected,p.search)>-1)return;if(u(r.concat(p.selected)))return void(o&&(a=r,c.$evalAsync(function(){p.activeIndex=0,p.items=a})));if(u(r))return void(o&&(p.items=r.slice(1,r.length)))}o&&(h=d(p.selected,s)),h>-1?a=a.slice(h+1,a.length-1):(a=[],s&&a.push(s),a=a.concat(r)),c.$evalAsync(function(){if(p.activeIndex=0,p.items=a,p.isGrouped){var e=s?a.slice(1):a;p.setItemsFn(e),s&&(p.items.unshift(s),p.groups.unshift({name:"",items:[s],tagging:!0}))}})}}),p.searchInput.on("blur",function(){i(function(){g.activeMatchIndex=-1})})}}}]),i.directive("uiSelectNoChoice",["uiSelectConfig",function(e){return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(t){t.addClass("ui-select-no-choice");var s=t.parent().attr("theme")||e.theme;return s+"/no-choice.tpl.html"}}}]),i.directive("uiSelectSingle",["$timeout","$compile",function(s,i){return{restrict:"EA",require:["^uiSelect","^ngModel"],link:function(c,n,l,a){var r=a[0],o=a[1];o.$parsers.unshift(function(t){if(e(t))return t;var s,i={};return i[r.parserResult.itemName]=t,s=r.parserResult.modelMapper(c,i)}),o.$formatters.unshift(function(t){if(e(t))return t;var s,i=r.parserResult&&r.parserResult.source(c,{$select:{search:""}}),n={};if(i){var l=function(e){return n[r.parserResult.itemName]=e,s=r.parserResult.modelMapper(c,n),s===t};if(r.selected&&l(r.selected))return r.selected;for(var a=i.length-1;a>=0;a--)if(l(i[a]))return i[a]}return t}),c.$watch("$select.selected",function(e){o.$viewValue!==e&&o.$setViewValue(e)}),o.$render=function(){r.selected=o.$viewValue},c.$on("uis:select",function(t,i){r.selected=i;var n={};n[r.parserResult.itemName]=i,s(function(){r.onSelectCallback(c,{$item:i,$model:e(i)?i:r.parserResult.modelMapper(c,n)})})}),c.$on("uis:close",function(e,t){s(function(){r.focusser.prop("disabled",!1),t||r.focusser[0].focus()},0,!1)}),c.$on("uis:activate",function(){u.prop("disabled",!0)});var u=angular.element("<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />");i(u)(c),r.focusser=u,r.focusInput=u,n.parent().append(u),u.bind("focus",function(){c.$evalAsync(function(){r.focus=!0})}),u.bind("blur",function(){c.$evalAsync(function(){r.focus=!1})}),u.bind("keydown",function(e){return e.which===t.BACKSPACE&&r.backspaceReset!==!1?(e.preventDefault(),e.stopPropagation(),r.select(void 0),void c.$apply()):void(e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||(e.which!=t.DOWN&&e.which!=t.UP&&e.which!=t.ENTER&&e.which!=t.SPACE||(e.preventDefault(),e.stopPropagation(),r.activate()),c.$digest()))}),u.bind("keyup input",function(e){e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||e.which==t.ENTER||e.which===t.BACKSPACE||(r.activate(u.val()),u.val(""),c.$digest())})}}}]),i.directive("uiSelectSort",["$timeout","uiSelectConfig","uiSelectMinErr",function(e,t,s){return{require:["^^uiSelect","^ngModel"],link:function(t,i,c,n){if(null===t[c.uiSelectSort])throw s("sort","Expected a list to sort");var l=n[0],a=n[1],r=angular.extend({axis:"horizontal"},t.$eval(c.uiSelectSortOptions)),o=r.axis,u="dragging",d="dropping",p="dropping-before",h="dropping-after";t.$watch(function(){return l.sortable},function(e){e?i.attr("draggable",!0):i.removeAttr("draggable")}),i.on("dragstart",function(e){i.addClass(u),(e.dataTransfer||e.originalEvent.dataTransfer).setData("text",t.$index.toString())}),i.on("dragend",function(){v(u)});var g,f=function(e,t){this.splice(t,0,this.splice(e,1)[0])},v=function(e){angular.forEach(l.$element.querySelectorAll("."+e),function(t){angular.element(t).removeClass(e)})},m=function(e){e.preventDefault();var t="vertical"===o?e.offsetY||e.layerY||(e.originalEvent?e.originalEvent.offsetY:0):e.offsetX||e.layerX||(e.originalEvent?e.originalEvent.offsetX:0);t<this["vertical"===o?"offsetHeight":"offsetWidth"]/2?(v(h),i.addClass(p)):(v(p),i.addClass(h))},$=function(t){t.preventDefault();var s=parseInt((t.dataTransfer||t.originalEvent.dataTransfer).getData("text"),10);e.cancel(g),g=e(function(){b(s)},20)},b=function(e){var s=t.$eval(c.uiSelectSort),n=s[e],l=null;l=i.hasClass(p)?e<t.$index?t.$index-1:t.$index:e<t.$index?t.$index:t.$index+1,f.apply(s,[e,l]),a.$setViewValue(Date.now()),t.$apply(function(){t.$emit("uiSelectSort:change",{array:s,item:n,from:e,to:l})}),v(d),v(p),v(h),i.off("drop",$)};i.on("dragenter",function(){i.hasClass(u)||(i.addClass(d),i.on("dragover",m),i.on("drop",$))}),i.on("dragleave",function(e){e.target==i&&(v(d),v(p),v(h),i.off("dragover",m),i.off("drop",$))})}}}]),i.directive("uisOpenClose",["$parse","$timeout",function(e,t){return{restrict:"A",require:"uiSelect",link:function(s,i,c,n){n.onOpenCloseCallback=e(c.uisOpenClose),s.$watch("$select.open",function(e,i){e!==i&&t(function(){n.onOpenCloseCallback(s,{isOpen:e});
-})})}}}]),i.service("uisRepeatParser",["uiSelectMinErr","$parse",function(e,t){var s=this;s.parse=function(s){var i;if(i=s.match(/^\s*(?:([\s\S]+?)\s+as\s+)?(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(\s*[\s\S]+?)?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),!i)throw e("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",s);var c=i[5],n="";if(i[3]){c=i[5].replace(/(^\()|(\)$)/g,"");var l=i[5].match(/^\s*(?:[\s\S]+?)(?:[^\|]|\|\|)+([\s\S]*)\s*$/);l&&l[1].trim()&&(n=l[1],c=c.replace(n,""))}return{itemName:i[4]||i[2],keyName:i[3],source:t(c),filters:n,trackByExp:i[6],modelMapper:t(i[1]||i[4]||i[2]),repeatExpression:function(e){var t=this.itemName+" in "+(e?"$group.items":"$select.items");return this.trackByExp&&(t+=" track by "+this.trackByExp),t}}},s.getGroupNgRepeatExpression=function(){return"$group in $select.groups track by $group.name"}}])}(),angular.module("ui.select").run(["$templateCache",function(e){e.put("bootstrap/choices.tpl.html",'<ul class="ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu" ng-show="$select.open && $select.items.length > 0"><li class="ui-select-choices-group" id="ui-select-choices-{{ $select.generatedId }}"><div class="divider" ng-show="$select.isGrouped && $index > 0"></div><div ng-show="$select.isGrouped" class="ui-select-choices-group-label dropdown-header" ng-bind="$group.name"></div><div ng-attr-id="ui-select-choices-row-{{ $select.generatedId }}-{{$index}}" class="ui-select-choices-row" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" role="option"><span class="ui-select-choices-row-inner"></span></div></li></ul>'),e.put("bootstrap/match-multiple.tpl.html",'<span class="ui-select-match"><span ng-repeat="$item in $select.selected track by $index"><span class="ui-select-match-item btn btn-default btn-xs" tabindex="-1" type="button" ng-disabled="$select.disabled" ng-click="$selectMultiple.activeMatchIndex = $index;" ng-class="{\'btn-primary\':$selectMultiple.activeMatchIndex === $index, \'select-locked\':$select.isLocked(this, $index)}" ui-select-sort="$select.selected"><span class="close ui-select-match-close" ng-hide="$select.disabled" ng-click="$selectMultiple.removeChoice($index)">&nbsp;&times;</span> <span uis-transclude-append=""></span></span></span></span>'),e.put("bootstrap/match.tpl.html",'<div class="ui-select-match" ng-hide="$select.open && $select.searchEnabled" ng-disabled="$select.disabled" ng-class="{\'btn-default-focus\':$select.focus}"><span tabindex="-1" class="btn btn-default form-control ui-select-toggle" aria-label="{{ $select.baseTitle }} activate" ng-disabled="$select.disabled" ng-click="$select.activate()" style="outline: 0;"><span ng-show="$select.isEmpty()" class="ui-select-placeholder text-muted">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty()" class="ui-select-match-text pull-left" ng-class="{\'ui-select-allow-clear\': $select.allowClear && !$select.isEmpty()}" ng-transclude=""></span> <i class="caret pull-right" ng-click="$select.toggle($event)"></i> <a ng-show="$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)" aria-label="{{ $select.baseTitle }} clear" style="margin-right: 10px" ng-click="$select.clear($event)" class="btn btn-xs btn-link pull-right"><i class="glyphicon glyphicon-remove" aria-hidden="true"></i></a></span></div>'),e.put("bootstrap/no-choice.tpl.html",'<ul class="ui-select-no-choice dropdown-menu" ng-show="$select.items.length == 0"><li ng-transclude=""></li></ul>'),e.put("bootstrap/select-multiple.tpl.html",'<div class="ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control" ng-class="{open: $select.open}"><div><div class="ui-select-match"></div><input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="ui-select-search input-xs" placeholder="{{$selectMultiple.getPlaceholder()}}" ng-disabled="$select.disabled" ng-click="$select.activate()" ng-model="$select.search" role="combobox" aria-expanded="{{$select.open}}" aria-label="{{$select.baseTitle}}" ng-class="{\'spinner\': $select.refreshing}" ondrop="return false;"></div><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div></div>'),e.put("bootstrap/select.tpl.html",'<div class="ui-select-container ui-select-bootstrap dropdown" ng-class="{open: $select.open}"><div class="ui-select-match"></div><span ng-show="$select.open && $select.refreshing && $select.spinnerEnabled" class="ui-select-refreshing {{$select.spinnerClass}}"></span> <input type="search" autocomplete="off" tabindex="-1" aria-expanded="true" aria-label="{{ $select.baseTitle }}" aria-owns="ui-select-choices-{{ $select.generatedId }}" class="form-control ui-select-search" ng-class="{ \'ui-select-search-hidden\' : !$select.searchEnabled }" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-show="$select.open"><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div></div>'),e.put("select2/choices.tpl.html",'<ul tabindex="-1" class="ui-select-choices ui-select-choices-content select2-results"><li class="ui-select-choices-group" ng-class="{\'select2-result-with-children\': $select.choiceGrouped($group) }"><div ng-show="$select.choiceGrouped($group)" class="ui-select-choices-group-label select2-result-label" ng-bind="$group.name"></div><ul id="ui-select-choices-{{ $select.generatedId }}" ng-class="{\'select2-result-sub\': $select.choiceGrouped($group), \'select2-result-single\': !$select.choiceGrouped($group) }"><li role="option" ng-attr-id="ui-select-choices-row-{{ $select.generatedId }}-{{$index}}" class="ui-select-choices-row" ng-class="{\'select2-highlighted\': $select.isActive(this), \'select2-disabled\': $select.isDisabled(this)}"><div class="select2-result-label ui-select-choices-row-inner"></div></li></ul></li></ul>'),e.put("select2/match-multiple.tpl.html",'<span class="ui-select-match"><li class="ui-select-match-item select2-search-choice" ng-repeat="$item in $select.selected track by $index" ng-class="{\'select2-search-choice-focus\':$selectMultiple.activeMatchIndex === $index, \'select2-locked\':$select.isLocked(this, $index)}" ui-select-sort="$select.selected"><span uis-transclude-append=""></span> <a href="javascript:;" class="ui-select-match-close select2-search-choice-close" ng-click="$selectMultiple.removeChoice($index)" tabindex="-1"></a></li></span>'),e.put("select2/match.tpl.html",'<a class="select2-choice ui-select-match" ng-class="{\'select2-default\': $select.isEmpty()}" ng-click="$select.toggle($event)" aria-label="{{ $select.baseTitle }} select"><span ng-show="$select.isEmpty()" class="select2-chosen">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty()" class="select2-chosen" ng-transclude=""></span> <abbr ng-if="$select.allowClear && !$select.isEmpty()" class="select2-search-choice-close" ng-click="$select.clear($event)"></abbr> <span class="select2-arrow ui-select-toggle"><b></b></span></a>'),e.put("select2/no-choice.tpl.html",'<div class="ui-select-no-choice dropdown" ng-show="$select.items.length == 0"><div class="dropdown-content"><div data-selectable="" ng-transclude=""></div></div></div>'),e.put("select2/select-multiple.tpl.html",'<div class="ui-select-container ui-select-multiple select2 select2-container select2-container-multi" ng-class="{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled}"><ul class="select2-choices"><span class="ui-select-match"></span><li class="select2-search-field"><input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="combobox" aria-expanded="true" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-label="{{ $select.baseTitle }}" aria-activedescendant="ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}" class="select2-input ui-select-search" placeholder="{{$selectMultiple.getPlaceholder()}}" ng-disabled="$select.disabled" ng-hide="$select.disabled" ng-model="$select.search" ng-click="$select.activate()" style="width: 34px;" ondrop="return false;"></li></ul><div class="ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active" ng-class="{\'select2-display-none\': !$select.open || $select.items.length === 0}"><div class="ui-select-choices"></div></div></div>'),e.put("select2/select.tpl.html",'<div class="ui-select-container select2 select2-container" ng-class="{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled, \'select2-container-active\': $select.focus, \'select2-allowclear\': $select.allowClear && !$select.isEmpty()}"><div class="ui-select-match"></div><div class="ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active" ng-class="{\'select2-display-none\': !$select.open}"><div class="search-container" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled, \'select2-search\':$select.searchEnabled}"><input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" ng-class="{\'select2-active\': $select.refreshing}" role="combobox" aria-expanded="true" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-label="{{ $select.baseTitle }}" class="ui-select-search select2-input" ng-model="$select.search"></div><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div></div></div>'),e.put("selectize/choices.tpl.html",'<div ng-show="$select.open" class="ui-select-choices ui-select-dropdown selectize-dropdown" ng-class="{\'single\': !$select.multiple, \'multi\': $select.multiple}"><div class="ui-select-choices-content selectize-dropdown-content"><div class="ui-select-choices-group optgroup"><div ng-show="$select.isGrouped" class="ui-select-choices-group-label optgroup-header" ng-bind="$group.name"></div><div role="option" class="ui-select-choices-row" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"><div class="option ui-select-choices-row-inner" data-selectable=""></div></div></div></div></div>'),e.put("selectize/match-multiple.tpl.html",'<div class="ui-select-match" data-value="" ng-repeat="$item in $select.selected track by $index" ng-click="$selectMultiple.activeMatchIndex = $index;" ng-class="{\'active\':$selectMultiple.activeMatchIndex === $index}" ui-select-sort="$select.selected"><span class="ui-select-match-item" ng-class="{\'select-locked\':$select.isLocked(this, $index)}"><span uis-transclude-append=""></span> <span class="remove ui-select-match-close" ng-hide="$select.disabled" ng-click="$selectMultiple.removeChoice($index)">&times;</span></span></div>'),e.put("selectize/match.tpl.html",'<div ng-hide="$select.searchEnabled && ($select.open || $select.isEmpty())" class="ui-select-match"><span ng-show="!$select.searchEnabled && ($select.isEmpty() || $select.open)" class="ui-select-placeholder text-muted">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty() || $select.open" ng-transclude=""></span></div>'),e.put("selectize/no-choice.tpl.html",'<div class="ui-select-no-choice selectize-dropdown" ng-show="$select.items.length == 0"><div class="selectize-dropdown-content"><div data-selectable="" ng-transclude=""></div></div></div>'),e.put("selectize/select-multiple.tpl.html",'<div class="ui-select-container selectize-control multi plugin-remove_button" ng-class="{\'open\': $select.open}"><div class="selectize-input" ng-class="{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}" ng-click="$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()"><div class="ui-select-match"></div><input type="search" autocomplete="off" tabindex="-1" class="ui-select-search" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled}" placeholder="{{$selectMultiple.getPlaceholder()}}" ng-model="$select.search" ng-disabled="$select.disabled" aria-expanded="{{$select.open}}" aria-label="{{ $select.baseTitle }}" ondrop="return false;"></div><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div></div>'),e.put("selectize/select.tpl.html",'<div class="ui-select-container selectize-control single" ng-class="{\'open\': $select.open}"><div class="selectize-input" ng-class="{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}" ng-click="$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()"><div class="ui-select-match"></div><input type="search" autocomplete="off" tabindex="-1" class="ui-select-search ui-select-toggle" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled}" ng-click="$select.toggle($event)" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-hide="!$select.isEmpty() && !$select.open" ng-disabled="$select.disabled" aria-label="{{ $select.baseTitle }}"></div><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div></div>')}]);
+!function(){"use strict";function e(e){return angular.isUndefined(e)||null===e}var t={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,COMMAND:91,MAP:{91:"COMMAND",8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSEBREAK",20:"CAPSLOCK",27:"ESC",32:"SPACE",33:"PAGE_UP",34:"PAGE_DOWN",35:"END",36:"HOME",37:"LEFT",38:"UP",39:"RIGHT",40:"DOWN",43:"+",44:"PRINTSCREEN",45:"INSERT",46:"DELETE",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUMLOCK",145:"SCROLLLOCK",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},isControl:function(e){var s=e.which;switch(s){case t.COMMAND:case t.SHIFT:case t.CTRL:case t.ALT:return!0}return!!(e.metaKey||e.ctrlKey||e.altKey)},isFunctionKey:function(e){return e=e.which?e.which:e,e>=112&&e<=123},isVerticalMovement:function(e){return~[t.UP,t.DOWN].indexOf(e)},isHorizontalMovement:function(e){return~[t.LEFT,t.RIGHT,t.BACKSPACE,t.DELETE].indexOf(e)},toSeparator:function(e){var s={ENTER:"\n",TAB:"\t",SPACE:" "}[e];return s?s:t[e]?void 0:e}};void 0===angular.element.prototype.querySelectorAll&&(angular.element.prototype.querySelectorAll=function(e){return angular.element(this[0].querySelectorAll(e))}),void 0===angular.element.prototype.closest&&(angular.element.prototype.closest=function(e){for(var t=this[0],s=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector;t;){if(s.bind(t)(e))return t;t=t.parentElement}return!1});var s=0,i=angular.module("ui.select",[]).constant("uiSelectConfig",{theme:"bootstrap",searchEnabled:!0,sortable:!1,placeholder:"",refreshDelay:1e3,closeOnSelect:!0,skipFocusser:!1,dropdownPosition:"auto",removeSelected:!0,resetSearchInput:!0,generateId:function(){return s++},appendToBody:!1,spinnerEnabled:!1,spinnerClass:"glyphicon glyphicon-refresh ui-select-spin",backspaceReset:!0,trim:!0}).service("uiSelectMinErr",function(){var e=angular.$$minErr("ui.select");return function(){var t=e.apply(this,arguments),s=t.message.replace(new RegExp("\nhttp://errors.angularjs.org/.*"),"");return new Error(s)}}).directive("uisTranscludeAppend",function(){return{link:function(e,t,s,i,l){l(e,function(e){t.append(e)})}}}).filter("highlight",function(){function e(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(t,s){return s&&t?(""+t).replace(new RegExp(e(s),"gi"),'<span class="ui-select-highlight">$&</span>'):t}}).factory("uisOffset",["$document","$window",function(e,t){return function(s){var i=s[0].getBoundingClientRect();return{width:i.width||s.prop("offsetWidth"),height:i.height||s.prop("offsetHeight"),top:i.top+(t.pageYOffset||e[0].documentElement.scrollTop),left:i.left+(t.pageXOffset||e[0].documentElement.scrollLeft)}}}]);i.directive("uiSelectChoices",["uiSelectConfig","uisRepeatParser","uiSelectMinErr","$compile","$window",function(e,t,s,i,l){return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(t){t.addClass("ui-select-choices");var s=t.parent().attr("theme")||e.theme;return s+"/choices.tpl.html"},compile:function(i,c){if(!c.repeat)throw s("repeat","Expected 'repeat' expression.");var n=c.groupBy,a=c.groupFilter;if(n){var r=i.querySelectorAll(".ui-select-choices-group");if(1!==r.length)throw s("rows","Expected 1 .ui-select-choices-group but got '{0}'.",r.length);r.attr("ng-repeat",t.getGroupNgRepeatExpression())}var o=t.parse(c.repeat),u=i.querySelectorAll(".ui-select-choices-row");if(1!==u.length)throw s("rows","Expected 1 .ui-select-choices-row but got '{0}'.",u.length);u.attr("ng-repeat",o.repeatExpression(n)).attr("ng-if","$select.open");var d=i.querySelectorAll(".ui-select-choices-row-inner");if(1!==d.length)throw s("rows","Expected 1 .ui-select-choices-row-inner but got '{0}'.",d.length);d.attr("uis-transclude-append","");var p=l.document.addEventListener?u:d;return p.attr("ng-click","$select.select("+o.itemName+",$select.skipFocusser,$event)"),function(t,s,l,c){c.parseRepeatAttr(l.repeat,n,a),c.disableChoiceExpression=l.uiDisableChoice,c.onHighlightCallback=l.onHighlight,c.minimumInputLength=parseInt(l.minimumInputLength)||0,c.dropdownPosition=l.position?l.position.toLowerCase():e.dropdownPosition,t.$watch("$select.search",function(e){e&&!c.open&&c.multiple&&c.activate(!1,!0),c.activeIndex=c.tagging.isActivated?-1:0,!l.minimumInputLength||c.search.length>=l.minimumInputLength?c.refresh(l.refresh):c.items=[]}),l.$observe("refreshDelay",function(){var s=t.$eval(l.refreshDelay);c.refreshDelay=void 0!==s?s:e.refreshDelay}),t.$watch("$select.open",function(e){e?(i.attr("role","listbox"),c.refresh(l.refresh)):s.removeAttr("role")})}}}}]),i.controller("uiSelectCtrl",["$scope","$element","$timeout","$filter","$$uisDebounce","uisRepeatParser","uiSelectMinErr","uiSelectConfig","$parse","$injector","$window",function(s,i,l,c,n,a,r,o,u,d,p){function h(e,t,s){if(e.findIndex)return e.findIndex(t,s);for(var i,l=Object(e),c=l.length>>>0,n=0;n<c;n++)if(i=l[n],t.call(s,i,n,l))return n;return-1}function g(){E.resetSearchInput&&(E.search=y,E.multiple||(E.selected&&E.items.length?E.activeIndex=h(E.items,function(e){return angular.equals(this,e)},E.selected):E.activeIndex=0))}function f(e,t){var s,i,l=[];for(s=0;s<t.length;s++)for(i=0;i<e.length;i++)e[i].name==[t[s]]&&l.push(e[i]);return l}function v(e,t){var s=C.indexOf(e);t&&s===-1&&C.push(e),!t&&s>-1&&C.splice(s,1)}function m(e){return C.indexOf(e)>-1}function $(e){function t(e,t){var s=i.indexOf(e);t&&s===-1&&i.push(e),!t&&s>-1&&i.splice(s,1)}function s(e){return i.indexOf(e)>-1}if(e){var i=[];E.isLocked=function(e,i){var l=!1,c=E.selected[i];return c&&(e?(l=!!e.$eval(E.lockChoiceExpression),t(c,l)):l=s(c)),l}}}function b(e){var s=!0;switch(e){case t.DOWN:if(!E.open&&E.multiple)E.activate(!1,!0);else if(E.activeIndex<E.items.length-1)for(var i=++E.activeIndex;m(E.items[i])&&i<E.items.length;)E.activeIndex=++i;break;case t.UP:if(!E.open&&E.multiple)E.activate(!1,!0);else if(E.activeIndex>0)for(var l=--E.activeIndex;m(E.items[l])&&l>0;)E.activeIndex=--l;break;case t.TAB:E.multiple&&!E.open||E.select(E.items[E.activeIndex],!0);break;case t.ENTER:E.open&&(E.tagging.isActivated||E.activeIndex>=0)?E.select(E.items[E.activeIndex],E.skipFocusser):E.activate(!1,!0);break;case t.ESC:E.close();break;default:s=!1}return s}function w(){var e=i.querySelectorAll(".ui-select-choices-content"),t=e.querySelectorAll(".ui-select-choices-row");if(t.length<1)throw r("choices","Expected multiple .ui-select-choices-row but got '{0}'.",t.length);if(!(E.activeIndex<0)){var s=t[E.activeIndex],l=s.offsetTop+s.clientHeight-e[0].scrollTop,c=e[0].offsetHeight;l>c?e[0].scrollTop+=l-c:l<s.clientHeight&&(E.isGrouped&&0===E.activeIndex?e[0].scrollTop=0:e[0].scrollTop-=s.clientHeight-l)}}var E=this,y="";if(E.placeholder=o.placeholder,E.searchEnabled=o.searchEnabled,E.sortable=o.sortable,E.refreshDelay=o.refreshDelay,E.paste=o.paste,E.resetSearchInput=o.resetSearchInput,E.refreshing=!1,E.spinnerEnabled=o.spinnerEnabled,E.spinnerClass=o.spinnerClass,E.removeSelected=o.removeSelected,E.closeOnSelect=!0,E.skipFocusser=!1,E.search=y,E.activeIndex=0,E.items=[],E.open=!1,E.focus=!1,E.disabled=!1,E.selected=void 0,E.dropdownPosition="auto",E.focusser=void 0,E.multiple=void 0,E.disableChoiceExpression=void 0,E.tagging={isActivated:!1,fct:void 0},E.taggingTokens={isActivated:!1,tokens:void 0},E.lockChoiceExpression=void 0,E.clickTriggeredSelect=!1,E.$filter=c,E.$element=i,E.$animate=function(){try{return d.get("$animate")}catch(e){return null}}(),E.searchInput=i.querySelectorAll("input.ui-select-search"),1!==E.searchInput.length)throw r("searchInput","Expected 1 input.ui-select-search but got '{0}'.",E.searchInput.length);E.isEmpty=function(){return e(E.selected)||""===E.selected||E.multiple&&0===E.selected.length},E.getPlaceholder=function(){if(!E.selected||!E.selected.length)return E.placeholder},E.activate=function(e,t){if(E.disabled||E.open)E.open&&!E.searchEnabled&&E.close();else{t||g(),s.$broadcast("uis:activate"),E.open=!0,E.activeIndex=E.activeIndex>=E.items.length?0:E.activeIndex,E.activeIndex===-1&&E.taggingLabel!==!1&&(E.activeIndex=0);var c=i.querySelectorAll(".ui-select-choices-content"),n=i.querySelectorAll(".ui-select-search");if(E.$animate&&E.$animate.on&&E.$animate.enabled(c[0])){var a=function(t,s){"start"===s&&0===E.items.length?(E.$animate.off("removeClass",n[0],a),l(function(){E.focusSearchInput(e)})):"close"===s&&(E.$animate.off("enter",c[0],a),l(function(){E.focusSearchInput(e)}))};E.items.length>0?E.$animate.on("enter",c[0],a):E.$animate.on("removeClass",n[0],a)}else l(function(){E.focusSearchInput(e),!E.tagging.isActivated&&E.items.length>1&&E.open&&w()})}},E.focusSearchInput=function(e){E.search=e||E.search,E.searchInput[0].focus()},E.findGroupByName=function(e,t){return E.groups&&E.groups.filter(function(s){return t?s.name==e:s.name===e})[0]},E.parseRepeatAttr=function(e,t,i){function l(e){var l=s.$eval(t);if(E.groups=[],angular.forEach(e,function(e){var t=angular.isFunction(l)?l(e):e[l],s=E.findGroupByName(t);s?s.items.push(e):E.groups.push({name:t,items:[e]})}),i){var c=s.$eval(i);angular.isFunction(c)?E.groups=c(E.groups):angular.isArray(c)&&(E.groups=f(E.groups,c))}E.items=[],E.groups.forEach(function(e){E.items=E.items.concat(e.items)})}function c(e){E.items=e||[]}E.setItemsFn=t?l:c,E.parserResult=a.parse(e),E.isGrouped=!!t,E.itemProperty=E.parserResult.itemName;var n=E.parserResult.source,o=function(){var e=n(s);s.$uisSource=Object.keys(e).map(function(t){var s={};return s[E.parserResult.keyName]=t,s.value=e[t],s})};E.parserResult.keyName&&(o(),E.parserResult.source=u("$uisSource"+E.parserResult.filters),s.$watch(n,function(e,t){e!==t&&o()},!0)),E.refreshItems=function(e){e=e||E.parserResult.source(s);var t=E.selected;if(E.isEmpty()||angular.isArray(t)&&!t.length||!E.multiple||!E.removeSelected)E.setItemsFn(e);else if(void 0!==e&&null!==e){var i=e.filter(function(e){return angular.isArray(t)?t.every(function(t){return!angular.equals(e,t)}):!angular.equals(e,t)});E.setItemsFn(i)}"auto"!==E.dropdownPosition&&"up"!==E.dropdownPosition||s.calculateDropdownPos(),s.$broadcast("uis:refresh")},s.$watchCollection(E.parserResult.source,function(e){if(void 0===e||null===e)E.items=[];else{if(!angular.isArray(e))throw r("items","Expected an array but got '{0}'.",e);E.refreshItems(e),angular.isDefined(E.ngModel.$modelValue)&&(E.ngModel.$modelValue=null)}})};var x;E.refresh=function(e){void 0!==e&&(x&&l.cancel(x),x=l(function(){if(s.$select.search.length>=s.$select.minimumInputLength){var t=s.$eval(e);t&&angular.isFunction(t.then)&&!E.refreshing&&(E.refreshing=!0,t["finally"](function(){E.refreshing=!1}))}},E.refreshDelay))},E.isActive=function(e){if(!E.open)return!1;var t=E.items.indexOf(e[E.itemProperty]),s=t==E.activeIndex;return!(!s||t<0)&&(s&&!angular.isUndefined(E.onHighlightCallback)&&e.$eval(E.onHighlightCallback),s)};var S=function(e){return E.selected&&angular.isArray(E.selected)&&E.selected.filter(function(t){return angular.equals(t,e)}).length>0},C=[];E.isDisabled=function(e){if(E.open){var t=e[E.itemProperty],s=E.items.indexOf(t),i=!1;if(s>=0&&(angular.isDefined(E.disableChoiceExpression)||E.multiple)){if(t.isTag)return!1;E.multiple&&(i=S(t)),!i&&angular.isDefined(E.disableChoiceExpression)&&(i=!!e.$eval(E.disableChoiceExpression)),v(t,i)}return i}},E.select=function(t,i,l){if(e(t)||!m(t)){if(!E.items&&!E.search&&!E.tagging.isActivated)return;if(!t||!m(t)){if(E.clickTriggeredSelect=!1,l&&("click"===l.type||"touchend"===l.type)&&t&&(E.clickTriggeredSelect=!0),E.tagging.isActivated&&E.clickTriggeredSelect===!1){if(E.taggingLabel===!1)if(E.activeIndex<0){if(void 0===t&&(t=void 0!==E.tagging.fct?E.tagging.fct(E.search):E.search),!t||angular.equals(E.items[0],t))return}else t=E.items[E.activeIndex];else if(0===E.activeIndex){if(void 0===t)return;if(void 0!==E.tagging.fct&&"string"==typeof t){if(t=E.tagging.fct(t),!t)return}else"string"==typeof t&&(t=t.replace(E.taggingLabel,"").trim())}if(S(t))return void E.close(i)}g(),s.$broadcast("uis:select",t),E.closeOnSelect&&E.close(i)}}},E.close=function(e){E.open&&(E.ngModel&&E.ngModel.$setTouched&&E.ngModel.$setTouched(),E.open=!1,g(),s.$broadcast("uis:close",e))},E.setFocus=function(){E.focus||E.focusInput[0].focus()},E.clear=function(e){E.select(null),e.stopPropagation(),l(function(){E.focusser[0].focus()},0,!1)},E.toggle=function(e){E.open?E.close():E.activate(),e.preventDefault(),e.stopPropagation()},E.isLocked=function(){return!1},s.$watch(function(){return angular.isDefined(E.lockChoiceExpression)&&""!==E.lockChoiceExpression},$);var I=null,A=!1;E.sizeSearchInput=function(){var e=E.searchInput[0],t=E.$element[0],i=function(){return t.clientWidth*!!e.offsetParent},c=function(t){if(0===t)return!1;var s=t-e.offsetLeft;return s<50&&(s=t),E.searchInput.css("width",s+"px"),!0};E.searchInput.css("width","10px"),l(function(){null!==I||c(i())||(I=s.$watch(function(){A||(A=!0,s.$$postDigest(function(){A=!1,c(i())&&(I(),I=null)}))},angular.noop))})},E.searchInput.on("keydown",function(e){var i=e.which;~[t.ENTER,t.ESC].indexOf(i)&&(e.preventDefault(),e.stopPropagation()),s.$apply(function(){var s=!1;if((E.items.length>0||E.tagging.isActivated)&&(b(i)||E.searchEnabled||(e.preventDefault(),e.stopPropagation()),E.taggingTokens.isActivated)){for(var c=0;c<E.taggingTokens.tokens.length;c++)E.taggingTokens.tokens[c]===t.MAP[e.keyCode]&&E.search.length>0&&(s=!0);s&&l(function(){E.searchInput.triggerHandler("tagged");var s=E.search.replace(t.MAP[e.keyCode],"").trim();E.tagging.fct&&(s=E.tagging.fct(s)),s&&E.select(s,!0)})}}),t.isVerticalMovement(i)&&E.items.length>0&&w(),i!==t.ENTER&&i!==t.ESC||(e.preventDefault(),e.stopPropagation())}),E.searchInput.on("paste",function(e){var s;if(s=window.clipboardData&&window.clipboardData.getData?window.clipboardData.getData("Text"):(e.originalEvent||e).clipboardData.getData("text/plain"),s=E.search+s,s&&s.length>0)if(E.taggingTokens.isActivated){for(var i=[],l=0;l<E.taggingTokens.tokens.length;l++){var c=t.toSeparator(E.taggingTokens.tokens[l])||E.taggingTokens.tokens[l];if(s.indexOf(c)>-1){i=s.split(c);break}}0===i.length&&(i=[s]);var n=E.search;angular.forEach(i,function(e){var t=E.tagging.fct?E.tagging.fct(e):e;t&&E.select(t,!0)}),E.search=n||y,e.preventDefault(),e.stopPropagation()}else E.paste&&(E.paste(s),E.search=y,e.preventDefault(),e.stopPropagation())}),E.searchInput.on("tagged",function(){l(function(){g()})});var k=n(function(){E.sizeSearchInput()},50);angular.element(p).bind("resize",k),s.$on("$destroy",function(){E.searchInput.off("keyup keydown tagged blur paste"),angular.element(p).off("resize",k)}),s.$watch("$select.activeIndex",function(e){e&&i.find("input").attr("aria-activedescendant","ui-select-choices-row-"+E.generatedId+"-"+e)}),s.$watch("$select.open",function(e){e||i.find("input").removeAttr("aria-activedescendant")})}]),i.directive("uiSelect",["$document","uiSelectConfig","uiSelectMinErr","uisOffset","$compile","$parse","$timeout","$window",function(e,t,s,i,l,c,n,a){return{restrict:"EA",templateUrl:function(e,s){var i=s.theme||t.theme;return i+(angular.isDefined(s.multiple)?"/select-multiple.tpl.html":"/select.tpl.html")},replace:!0,transclude:!0,require:["uiSelect","^ngModel"],scope:!0,controller:"uiSelectCtrl",controllerAs:"$select",compile:function(l,r){var o=/{(.*)}\s*{(.*)}/.exec(r.ngClass);if(o){var u="{"+o[1]+", "+o[2]+"}";r.ngClass=u,l.attr("ng-class",u)}return angular.isDefined(r.multiple)?l.append("<ui-select-multiple/>").removeAttr("multiple"):l.append("<ui-select-single/>"),r.inputId&&(l.querySelectorAll("input.ui-select-search")[0].id=r.inputId),function(l,r,o,u,d){function p(e){if(f.open){var t=!1;if(t=window.jQuery?window.jQuery.contains(r[0],e.target):r[0].contains(e.target),!t&&!f.clickTriggeredSelect){var s;if(f.skipFocusser)s=!0;else{var i=["input","button","textarea","select"],c=angular.element(e.target).controller("uiSelect");s=c&&c!==f,s||(s=~i.indexOf(e.target.tagName.toLowerCase()))}f.close(s),l.$digest()}f.clickTriggeredSelect=!1}}function h(){var t=i(r);$=angular.element('<div class="ui-select-placeholder"></div>'),$[0].style.width=t.width+"px",$[0].style.height=t.height+"px",r.after($),b=r[0].style.width,e.find("body").append(r),r[0].style.position="absolute",r[0].style.left=t.left+"px",r[0].style.top=t.top+"px",r[0].style.width=t.width+"px"}function g(){null!==$&&($.replaceWith(r),$=null,r[0].style.position="",r[0].style.left="",r[0].style.top="",r[0].style.width=b,f.setFocus())}var f=u[0],v=u[1];f.generatedId=t.generateId(),f.baseTitle=o.title||"Select box",f.focusserTitle=f.baseTitle+" focus",f.focusserId="focusser-"+f.generatedId,f.closeOnSelect=function(){return angular.isDefined(o.closeOnSelect)?c(o.closeOnSelect)():t.closeOnSelect}(),l.$watch("skipFocusser",function(){var e=l.$eval(o.skipFocusser);f.skipFocusser=void 0!==e?e:t.skipFocusser}),f.onSelectCallback=c(o.onSelect),f.onRemoveCallback=c(o.onRemove),f.ngModel=v,f.choiceGrouped=function(e){return f.isGrouped&&e&&e.name},o.tabindex&&o.$observe("tabindex",function(e){f.focusInput.attr("tabindex",e),r.removeAttr("tabindex")}),l.$watch(function(){return l.$eval(o.searchEnabled)},function(e){f.searchEnabled=void 0!==e?e:t.searchEnabled}),l.$watch("sortable",function(){var e=l.$eval(o.sortable);f.sortable=void 0!==e?e:t.sortable}),o.$observe("backspaceReset",function(){var e=l.$eval(o.backspaceReset);f.backspaceReset=void 0===e||e}),o.$observe("limit",function(){f.limit=angular.isDefined(o.limit)?parseInt(o.limit,10):void 0}),l.$watch("removeSelected",function(){var e=l.$eval(o.removeSelected);f.removeSelected=void 0!==e?e:t.removeSelected}),o.$observe("disabled",function(){f.disabled=void 0!==o.disabled&&o.disabled}),o.$observe("resetSearchInput",function(){var e=l.$eval(o.resetSearchInput);f.resetSearchInput=void 0===e||e}),o.$observe("paste",function(){f.paste=l.$eval(o.paste)}),o.$observe("tagging",function(){if(void 0!==o.tagging){var e=l.$eval(o.tagging);f.tagging={isActivated:!0,fct:e!==!0?e:void 0}}else f.tagging={isActivated:!1,fct:void 0}}),o.$observe("taggingLabel",function(){void 0!==o.tagging&&("false"===o.taggingLabel?f.taggingLabel=!1:f.taggingLabel=void 0!==o.taggingLabel?o.taggingLabel:"(new)")}),o.$observe("taggingTokens",function(){if(void 0!==o.tagging){var e=void 0!==o.taggingTokens?o.taggingTokens.split("|"):[",","ENTER"];f.taggingTokens={isActivated:!0,tokens:e}}}),o.$observe("spinnerEnabled",function(){var e=l.$eval(o.spinnerEnabled);f.spinnerEnabled=void 0!==e?e:t.spinnerEnabled}),o.$observe("spinnerClass",function(){var e=o.spinnerClass;f.spinnerClass=void 0!==e?o.spinnerClass:t.spinnerClass}),l.$watch(function(){return l.$eval(o.trim)},function(e){f.trim=void 0!==e?e:t.trim}),angular.isDefined(o.autofocus)&&n(function(){f.setFocus()}),angular.isDefined(o.focusOn)&&l.$on(o.focusOn,function(){n(function(){f.setFocus()})}),a.document.addEventListener("click",p,!0),l.$on("$destroy",function(){a.document.removeEventListener("click",p,!0)}),d(l,function(e){var t=angular.element("<div>").append(e),i=t.querySelectorAll(".ui-select-match");if(i.removeAttr("ui-select-match"),i.removeAttr("data-ui-select-match"),1!==i.length)throw s("transcluded","Expected 1 .ui-select-match but got '{0}'.",i.length);r.querySelectorAll(".ui-select-match").replaceWith(i);var l=t.querySelectorAll(".ui-select-choices");if(l.removeAttr("ui-select-choices"),l.removeAttr("data-ui-select-choices"),1!==l.length)throw s("transcluded","Expected 1 .ui-select-choices but got '{0}'.",l.length);r.querySelectorAll(".ui-select-choices").replaceWith(l);var c=t.querySelectorAll(".ui-select-no-choice");c.removeAttr("ui-select-no-choice"),c.removeAttr("data-ui-select-no-choice"),1==c.length&&r.querySelectorAll(".ui-select-no-choice").replaceWith(c);var n=t.querySelectorAll(".ui-select-header");n.removeAttr("ui-select-header"),n.removeAttr("data-ui-select-header"),1==n.length?r.querySelectorAll(".ui-select-header").replaceWith(n):r.querySelectorAll(".ui-select-header").remove();var a=t.querySelectorAll(".ui-select-footer");a.removeAttr("ui-select-footer"),a.removeAttr("data-ui-select-footer"),1==a.length?r.querySelectorAll(".ui-select-footer").replaceWith(a):r.querySelectorAll(".ui-select-footer").remove()});var m=l.$eval(o.appendToBody);(void 0!==m?m:t.appendToBody)&&(l.$watch("$select.open",function(e){e?h():g()}),l.$on("$destroy",function(){g()}));var $=null,b="",w=null,E="direction-up";l.$watch("$select.open",function(){"auto"!==f.dropdownPosition&&"up"!==f.dropdownPosition||l.calculateDropdownPos()});var y=function(e,t){e=e||i(r),t=t||i(w),w[0].style.position="absolute",w[0].style.top=t.height*-1+"px",r.addClass(E)},x=function(e,t){r.removeClass(E),e=e||i(r),t=t||i(w),w[0].style.position="",w[0].style.top=""},S=function(){n(function(){if("up"===f.dropdownPosition)y();else{r.removeClass(E);var t=i(r),s=i(w),l=e[0].documentElement.scrollTop||e[0].body.scrollTop;t.top+t.height+s.height>l+e[0].documentElement.clientHeight?y(t,s):x(t,s)}w[0].style.opacity=1})},C=!1;l.calculateDropdownPos=function(){if(f.open){if(w=angular.element(r).querySelectorAll(".ui-select-dropdown"),0===w.length)return;if(""!==f.search||C||(w[0].style.opacity=0,C=!0),!i(w).height&&f.$animate&&f.$animate.on&&f.$animate.enabled(w)){var e=!0;f.$animate.on("enter",w,function(t,s){"close"===s&&e&&(S(),e=!1)})}else S()}else{if(null===w||0===w.length)return;w[0].style.opacity=0,w[0].style.position="",w[0].style.top="",r.removeClass(E)}}}}}}]),i.directive("uiSelectFooter",["uiSelectConfig",function(e){return{templateUrl:function(t){t.addClass("ui-select-footer");var s=t.parent().attr("theme")||e.theme;return s+"/footer.tpl.html"},restrict:"EA",transclude:!0,replace:!0}}]),i.directive("uiSelectHeader",["uiSelectConfig",function(e){return{templateUrl:function(t){t.addClass("ui-select-header");var s=t.parent().attr("theme")||e.theme;return s+"/header.tpl.html"},restrict:"EA",transclude:!0,replace:!0}}]),i.directive("uiSelectHeaderGroupSelectable",["$timeout",function(e){return{restrict:"EA",require:["^uiSelect"],scope:{isEnabled:"<?uiSelectHeaderGroupSelectable"},link:function(t,s,i,l){function c(){return angular.isUndefined(t.isEnabled)||t.isEnabled}function n(){return o.multiple&&o.groups?s.querySelectorAll(".ui-select-choices-group-label"):(console.error("Use uiSelectHeaderGroupSelectable with no multiple uiSelect or without groupBy"),[])}function a(){c()&&angular.forEach(n(),function(t){var s=angular.element(t);s.hasClass("ui-select-header-group-selectable")||(s.addClass("ui-select-header-group-selectable"),s.on("click",function(){if(c()){var t=o.findGroupByName(s.text(),!0);angular.forEach(t.items,function(t){e(function(){o.select(t,!1," ")})})}}))})}function r(){c()||angular.forEach(n(),function(e){var t=angular.element(e);t.removeClass("ui-select-header-group-selectable"),t.off("click")})}var o=l[0];angular.isUndefined(t.isEnabled)&&(t.isEnabled=!0),t.$watch("isEnabled",function(){c()?a():r()}),t.$watch("$select.groups",a),t.$watch(function(){return o.selected&&o.selected.length?o.selected.length:-1},a)}}}]),i.directive("uiSelectMatch",["uiSelectConfig",function(e){function t(e,t){return e[0].hasAttribute(t)?e.attr(t):e[0].hasAttribute("data-"+t)?e.attr("data-"+t):e[0].hasAttribute("x-"+t)?e.attr("x-"+t):void 0}return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(s){s.addClass("ui-select-match");var i=s.parent(),l=t(i,"theme")||e.theme,c=angular.isDefined(t(i,"multiple"));return l+(c?"/match-multiple.tpl.html":"/match.tpl.html")},link:function(t,s,i,l){function c(e){l.allowClear=!!angular.isDefined(e)&&(""===e||"true"===e.toLowerCase())}l.lockChoiceExpression=i.uiLockChoice,i.$observe("placeholder",function(t){l.placeholder=void 0!==t?t:e.placeholder}),i.$observe("allowClear",c),c(i.allowClear),l.multiple&&l.sizeSearchInput()}}}]),i.directive("uiSelectMultiple",["uiSelectMinErr","$timeout",function(s,i){return{restrict:"EA",require:["^uiSelect","^ngModel"],controller:["$scope","$timeout",function(e,t){var s,i=this,l=e.$select;angular.isUndefined(l.selected)&&(l.selected=[]),e.$evalAsync(function(){s=e.ngModel}),i.activeMatchIndex=-1,i.updateModel=function(){s.$setViewValue(Date.now()),i.refreshComponent()},i.refreshComponent=function(){l.refreshItems&&l.refreshItems(),l.sizeSearchInput&&l.sizeSearchInput()},i.removeChoice=function(s){if(l.isLocked(null,s))return!1;var c=l.selected[s],n={};return n[l.parserResult.itemName]=c,l.selected.splice(s,1),i.activeMatchIndex=-1,l.sizeSearchInput(),t(function(){l.onRemoveCallback(e,{$item:c,$model:l.parserResult.modelMapper(e,n)})}),i.updateModel(),!0}}],controllerAs:"$selectMultiple",link:function(l,c,n,a){function r(e){return angular.isNumber(e.selectionStart)?e.selectionStart:e.value.length}function o(e){function s(){switch(e){case t.LEFT:return~g.activeMatchIndex?u:n;case t.RIGHT:return~g.activeMatchIndex&&a!==n?o:(p.activate(),!1);case t.BACKSPACE:return~g.activeMatchIndex?g.removeChoice(a)?u:a:n;case t.DELETE:return!!~g.activeMatchIndex&&(g.removeChoice(g.activeMatchIndex),a)}}var i=r(p.searchInput[0]),l=p.selected.length,c=0,n=l-1,a=g.activeMatchIndex,o=g.activeMatchIndex+1,u=g.activeMatchIndex-1,d=a;return!(i>0||p.search.length&&e==t.RIGHT)&&(p.close(),d=s(),p.selected.length&&d!==!1?g.activeMatchIndex=Math.min(n,Math.max(c,d)):g.activeMatchIndex=-1,!0)}function u(e){if(void 0===e||void 0===p.search)return!1;var t=e.filter(function(e){return void 0!==p.search.toUpperCase()&&void 0!==e&&e.toUpperCase()===p.search.toUpperCase()}).length>0;return t}function d(e,t){var s=-1;if(angular.isArray(e))for(var i=angular.copy(e),l=0;l<i.length;l++)if(void 0===p.tagging.fct)i[l]+" "+p.taggingLabel===t&&(s=l);else{var c=i[l];angular.isObject(c)&&(c.isTag=!0),angular.equals(c,t)&&(s=l)}return s}var p=a[0],h=l.ngModel=a[1],g=l.$selectMultiple;p.multiple=!0,p.focusInput=p.searchInput,h.$isEmpty=function(e){return!e||0===e.length},h.$parsers.unshift(function(){for(var e,t={},s=[],i=p.selected.length-1;i>=0;i--)t={},t[p.parserResult.itemName]=p.selected[i],e=p.parserResult.modelMapper(l,t),s.unshift(e);return s}),h.$formatters.unshift(function(e){var t,s=p.parserResult&&p.parserResult.source(l,{$select:{search:""}}),i={};if(!s)return e;var c=[],n=function(e,s){if(e&&e.length){for(var n=e.length-1;n>=0;n--){if(i[p.parserResult.itemName]=e[n],t=p.parserResult.modelMapper(l,i),p.parserResult.trackByExp){var a=/(\w*)\./.exec(p.parserResult.trackByExp),r=/\.([^\s]+)/.exec(p.parserResult.trackByExp);if(a&&a.length>0&&a[1]==p.parserResult.itemName&&r&&r.length>0&&t[r[1]]==s[r[1]])return c.unshift(e[n]),!0}if(angular.equals(t,s))return c.unshift(e[n]),!0}return!1}};if(!e)return c;for(var a=e.length-1;a>=0;a--)n(p.selected,e[a])||n(s,e[a])||c.unshift(e[a]);return c}),l.$watchCollection(function(){return h.$modelValue},function(e,t){t!=e&&(angular.isDefined(h.$modelValue)&&(h.$modelValue=null),g.refreshComponent())}),h.$render=function(){if(!angular.isArray(h.$viewValue)){if(!e(h.$viewValue))throw s("multiarr","Expected model value to be array but got '{0}'",h.$viewValue);h.$viewValue=[]}p.selected=h.$viewValue,g.refreshComponent(),l.$evalAsync()},l.$on("uis:select",function(e,t){if(!(p.selected.length>=p.limit)){p.selected.push(t);var s={};s[p.parserResult.itemName]=t,i(function(){p.onSelectCallback(l,{$item:t,$model:p.parserResult.modelMapper(l,s)})}),g.updateModel()}}),l.$on("uis:activate",function(){g.activeMatchIndex=-1}),l.$watch("$select.disabled",function(e,t){t&&!e&&p.sizeSearchInput()}),p.searchInput.on("keydown",function(e){var s=e.which;l.$apply(function(){var i=!1;t.isHorizontalMovement(s)&&(i=o(s)),i&&s!=t.TAB&&(e.preventDefault(),e.stopPropagation())})}),p.searchInput.on("keyup",function(e){if(t.isVerticalMovement(e.which)||l.$evalAsync(function(){p.activeIndex=p.taggingLabel===!1?-1:0}),p.tagging.isActivated&&p.search.length>0){if(e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||t.isVerticalMovement(e.which))return;if(p.activeIndex=p.taggingLabel===!1?-1:0,p.taggingLabel===!1)return;var s,i,c,n,a=angular.copy(p.items),r=angular.copy(p.items),o=!1,h=-1;if(void 0!==p.tagging.fct){if(c=p.$filter("filter")(a,{isTag:!0}),c.length>0&&(n=c[0]),a.length>0&&n&&(o=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),s=p.tagging.fct(p.search),r.some(function(e){return angular.equals(e,s)})||p.selected.some(function(e){return angular.equals(e,s)}))return void l.$evalAsync(function(){p.activeIndex=0,p.items=a});s&&(s.isTag=!0)}else{if(c=p.$filter("filter")(a,function(e){return e.match(p.taggingLabel)}),c.length>0&&(n=c[0]),i=a[0],void 0!==i&&a.length>0&&n&&(o=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),s=p.search+" "+p.taggingLabel,d(p.selected,p.search)>-1)return;if(u(r.concat(p.selected)))return void(o&&(a=r,l.$evalAsync(function(){p.activeIndex=0,p.items=a})));if(u(r))return void(o&&(p.items=r.slice(1,r.length)))}o&&(h=d(p.selected,s)),h>-1?a=a.slice(h+1,a.length-1):(a=[],s&&a.push(s),a=a.concat(r)),l.$evalAsync(function(){if(p.activeIndex=0,p.items=a,p.isGrouped){var e=s?a.slice(1):a;p.setItemsFn(e),s&&(p.items.unshift(s),p.groups.unshift({name:"",items:[s],tagging:!0}))}})}}),p.searchInput.on("blur",function(){i(function(){g.activeMatchIndex=-1})})}}}]),i.directive("uiSelectNoChoice",["uiSelectConfig",function(e){return{restrict:"EA",require:"^uiSelect",replace:!0,transclude:!0,templateUrl:function(t){t.addClass("ui-select-no-choice");var s=t.parent().attr("theme")||e.theme;return s+"/no-choice.tpl.html"}}}]),i.directive("uiSelectSingle",["$timeout","$compile",function(s,i){return{restrict:"EA",require:["^uiSelect","^ngModel"],link:function(l,c,n,a){var r=a[0],o=a[1];o.$parsers.unshift(function(t){if(e(t))return t;var s,i={};return i[r.parserResult.itemName]=t,s=r.parserResult.modelMapper(l,i)}),o.$formatters.unshift(function(t){if(e(t))return t;var s,i=r.parserResult&&r.parserResult.source(l,{$select:{search:""}}),c={};if(i){var n=function(e){return c[r.parserResult.itemName]=e,s=r.parserResult.modelMapper(l,c),s===t};if(r.selected&&n(r.selected))return r.selected;for(var a=i.length-1;a>=0;a--)if(n(i[a]))return i[a]}return t}),l.$watch("$select.selected",function(e){o.$viewValue!==e&&o.$setViewValue(e)}),o.$render=function(){r.selected=o.$viewValue},l.$on("uis:select",function(t,i){r.selected=i;var c={};c[r.parserResult.itemName]=i,s(function(){r.onSelectCallback(l,{$item:i,$model:e(i)?i:r.parserResult.modelMapper(l,c)})})}),l.$on("uis:close",function(e,t){s(function(){r.focusser.prop("disabled",!1),t||r.focusser[0].focus()},0,!1)}),l.$on("uis:activate",function(){u.prop("disabled",!0)});var u=angular.element("<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />");i(u)(l),r.focusser=u,r.focusInput=u,c.parent().append(u),u.bind("focus",function(){l.$evalAsync(function(){r.focus=!0})}),u.bind("blur",function(){l.$evalAsync(function(){r.focus=!1})}),u.bind("keydown",function(e){return e.which===t.BACKSPACE&&r.backspaceReset!==!1?(e.preventDefault(),e.stopPropagation(),r.select(void 0),void l.$apply()):void(e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||(e.which!=t.DOWN&&e.which!=t.UP&&e.which!=t.ENTER&&e.which!=t.SPACE||(e.preventDefault(),e.stopPropagation(),r.activate()),l.$digest()))}),u.bind("keyup input",function(e){e.which===t.TAB||t.isControl(e)||t.isFunctionKey(e)||e.which===t.ESC||e.which==t.ENTER||e.which===t.BACKSPACE||(r.activate(u.val()),u.val(""),l.$digest())})}}}]),
+i.directive("uiSelectSort",["$timeout","uiSelectConfig","uiSelectMinErr",function(e,t,s){return{require:["^^uiSelect","^ngModel"],link:function(t,i,l,c){if(null===t[l.uiSelectSort])throw s("sort","Expected a list to sort");var n=c[0],a=c[1],r=angular.extend({axis:"horizontal"},t.$eval(l.uiSelectSortOptions)),o=r.axis,u="dragging",d="dropping",p="dropping-before",h="dropping-after";if(t.$watch(function(){return n.sortable},function(e){e?i.attr("draggable",!0):i.removeAttr("draggable")}),!i.data("disallowDrop")){i.on("dragstart",function(e){i.addClass(u),(e.dataTransfer||e.originalEvent.dataTransfer).setData("text",t.$index.toString())}),i.on("dragend",function(){v(u)});var g,f=function(e,t){this.splice(t,0,this.splice(e,1)[0])},v=function(e){angular.forEach(n.$element.querySelectorAll("."+e),function(t){angular.element(t).removeClass(e)})},m=function(e){e.preventDefault();var t="vertical"===o?e.offsetY||e.layerY||(e.originalEvent?e.originalEvent.offsetY:0):e.offsetX||e.layerX||(e.originalEvent?e.originalEvent.offsetX:0);t<this["vertical"===o?"offsetHeight":"offsetWidth"]/2?(v(h),i.addClass(p)):(v(p),i.addClass(h))},$=function(t){t.preventDefault();var s=parseInt((t.dataTransfer||t.originalEvent.dataTransfer).getData("text"),10);e.cancel(g),g=e(function(){b(s)},20)},b=function(e){var s=t.$eval(l.uiSelectSort),c=s[e],n=null;n=i.hasClass(p)?e<t.$index?t.$index-1:t.$index:e<t.$index?t.$index:t.$index+1,f.apply(s,[e,n]),a.$setViewValue(Date.now()),t.$apply(function(){t.$emit("uiSelectSort:change",{array:s,item:c,from:e,to:n})}),v(d),v(p),v(h),i.off("drop",$)};i.on("dragenter",function(){i.hasClass(u)||(i.addClass(d),i.on("dragover",m),i.on("drop",$))}),i.on("dragleave",function(e){e.target==i&&(v(d),v(p),v(h),i.off("dragover",m),i.off("drop",$))})}}}}]),i.factory("$$uisDebounce",["$timeout",function(e){return function(t,s){var i;return function(){var l=this,c=Array.prototype.slice.call(arguments);i&&e.cancel(i),i=e(function(){t.apply(l,c)},s)}}}]),i.directive("uisOpenClose",["$parse","$timeout",function(e,t){return{restrict:"A",require:"uiSelect",link:function(s,i,l,c){c.onOpenCloseCallback=e(l.uisOpenClose),s.$watch("$select.open",function(e,i){e!==i&&t(function(){c.onOpenCloseCallback(s,{isOpen:e})})})}}}]),i.service("uisRepeatParser",["uiSelectMinErr","$parse",function(e,t){var s=this;s.parse=function(s){var i;if(i=s.match(/^\s*(?:([\s\S]+?)\s+as\s+)?(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(\s*[\s\S]+?)?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),!i)throw e("iexp","Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",s);var l=i[5],c="";if(i[3]){l=i[5].replace(/(^\()|(\)$)/g,"");var n=i[5].match(/^\s*(?:[\s\S]+?)(?:[^\|]|\|\|)+([\s\S]*)\s*$/);n&&n[1].trim()&&(c=n[1],l=l.replace(c,""))}return{itemName:i[4]||i[2],keyName:i[3],source:t(l),filters:c,trackByExp:i[6],modelMapper:t(i[1]||i[4]||i[2]),repeatExpression:function(e){var t=this.itemName+" in "+(e?"$group.items":"$select.items");return this.trackByExp&&(t+=" track by "+this.trackByExp),t}}},s.getGroupNgRepeatExpression=function(){return"$group in $select.groups track by $group.name"}}])}(),angular.module("ui.select").run(["$templateCache",function(e){e.put("bootstrap/choices.tpl.html",'<ul class="ui-select-choices ui-select-choices-content"><li class="ui-select-choices-group" id="ui-select-choices-{{ $select.generatedId }}"><div class="divider" ng-show="$select.isGrouped && $index > 0"></div><div ng-show="$select.isGrouped" class="ui-select-choices-group-label dropdown-header" ng-bind="$group.name"></div><div ng-attr-id="ui-select-choices-row-{{ $select.generatedId }}-{{$index}}" class="ui-select-choices-row" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}" role="option"><span class="ui-select-choices-row-inner"></span></div></li></ul>'),e.put("bootstrap/footer.tpl.html",'<div class="ui-select-footer" ng-transclude=""></div>'),e.put("bootstrap/header.tpl.html",'<div class="ui-select-header" ng-transclude=""></div>'),e.put("bootstrap/match-multiple.tpl.html",'<span class="ui-select-match"><span ng-repeat="$item in $select.selected track by $index"><span class="ui-select-match-item btn btn-default btn-xs" tabindex="-1" type="button" ng-disabled="$select.disabled" ng-click="$selectMultiple.activeMatchIndex = $index;" ng-class="{\'btn-primary\':$selectMultiple.activeMatchIndex === $index, \'select-locked\':$select.isLocked(this, $index)}" ui-select-sort="$select.selected"><span class="close ui-select-match-close" ng-hide="$select.disabled" ng-click="$selectMultiple.removeChoice($index)">&nbsp;&times;</span> <span uis-transclude-append=""></span></span></span></span>'),e.put("bootstrap/match.tpl.html",'<div class="ui-select-match" ng-hide="$select.open && $select.searchEnabled" ng-disabled="$select.disabled" ng-class="{\'btn-default-focus\':$select.focus}"><span tabindex="-1" class="btn btn-default form-control ui-select-toggle" aria-label="{{ $select.baseTitle }} activate" ng-disabled="$select.disabled" ng-click="$select.activate()" style="outline: 0;"><span ng-show="$select.isEmpty()" class="ui-select-placeholder text-muted">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty()" class="ui-select-match-text pull-left" ng-class="{\'ui-select-allow-clear\': $select.allowClear && !$select.isEmpty()}" ng-transclude=""></span> <i class="caret pull-right" ng-click="$select.toggle($event)"></i> <a ng-show="$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)" aria-label="{{ $select.baseTitle }} clear" style="margin-right: 10px" ng-click="$select.clear($event)" class="btn btn-xs btn-link pull-right"><i class="glyphicon glyphicon-remove" aria-hidden="true"></i></a></span></div>'),e.put("bootstrap/no-choice.tpl.html",'<ul class="ui-select-no-choice dropdown-menu" ng-show="$select.items.length == 0"><li ng-transclude=""></li></ul>'),e.put("bootstrap/select-multiple.tpl.html",'<div class="ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control" ng-class="{open: $select.open}"><div><div class="ui-select-match"></div><span ng-show="$select.open && $select.refreshing && $select.spinnerEnabled" class="ui-select-refreshing {{$select.spinnerClass}}"></span> <input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" class="ui-select-search input-xs" placeholder="{{$select.getPlaceholder()}}" ng-disabled="$select.disabled" ng-click="$select.activate()" ng-model="$select.search" role="combobox" aria-expanded="{{$select.open}}" aria-label="{{$select.baseTitle}}" ng-class="{\'spinner\': $select.refreshing}" data-disallow-drop="data-disallow-drop"></div><div ng-show="$select.open && $select.items.length > 0" class="ui-select-dropdown dropdown-menu"><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-footer"></div></div><div class="ui-select-no-choice"></div></div>'),e.put("bootstrap/select.tpl.html",'<div class="ui-select-container ui-select-bootstrap dropdown" ng-class="{open: $select.open}"><div class="ui-select-match"></div><span ng-show="$select.open && $select.refreshing && $select.spinnerEnabled" class="ui-select-refreshing {{$select.spinnerClass}}"></span> <input type="search" autocomplete="off" tabindex="-1" aria-expanded="true" aria-label="{{ $select.baseTitle }}" aria-owns="ui-select-choices-{{ $select.generatedId }}" class="form-control ui-select-search" ng-class="{ \'ui-select-search-hidden\' : !$select.searchEnabled }" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-show="$select.open" ng-trim="{{ $select.trim }}"><div ng-show="$select.open && $select.items.length > 0" class="ui-select-dropdown dropdown-menu"><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-footer"></div></div><div class="ui-select-no-choice"></div></div>'),e.put("select2/choices.tpl.html",'<ul tabindex="-1" class="ui-select-choices ui-select-choices-content select2-results"><li class="ui-select-choices-group" ng-class="{\'select2-result-with-children\': $select.choiceGrouped($group) }"><div ng-show="$select.choiceGrouped($group)" class="ui-select-choices-group-label select2-result-label" ng-bind="$group.name"></div><ul id="ui-select-choices-{{ $select.generatedId }}" ng-class="{\'select2-result-sub\': $select.choiceGrouped($group), \'select2-result-single\': !$select.choiceGrouped($group) }"><li role="option" ng-attr-id="ui-select-choices-row-{{ $select.generatedId }}-{{$index}}" class="ui-select-choices-row" ng-class="{\'select2-highlighted\': $select.isActive(this), \'select2-disabled\': $select.isDisabled(this)}"><div class="select2-result-label ui-select-choices-row-inner"></div></li></ul></li></ul>'),e.put("select2/footer.tpl.html",'<div class="ui-select-footer" ng-transclude=""></div>'),e.put("select2/header.tpl.html",'<div class="ui-select-header" ng-transclude=""></div>'),e.put("select2/match-multiple.tpl.html",'<span class="ui-select-match"><li class="ui-select-match-item select2-search-choice" ng-repeat="$item in $select.selected track by $index" ng-class="{\'select2-search-choice-focus\':$selectMultiple.activeMatchIndex === $index, \'select2-locked\':$select.isLocked(this, $index)}" ui-select-sort="$select.selected"><span uis-transclude-append=""></span> <a href="javascript:;" class="ui-select-match-close select2-search-choice-close" ng-click="$selectMultiple.removeChoice($index)" tabindex="-1"></a></li></span>'),e.put("select2/match.tpl.html",'<a class="select2-choice ui-select-match" ng-class="{\'select2-default\': $select.isEmpty()}" ng-click="$select.toggle($event)" aria-label="{{ $select.baseTitle }} select"><span ng-show="$select.isEmpty()" class="select2-chosen">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty()" class="select2-chosen" ng-transclude=""></span> <abbr ng-if="$select.allowClear && !$select.isEmpty()" class="select2-search-choice-close" ng-click="$select.clear($event)"></abbr> <span class="select2-arrow ui-select-toggle"><b></b></span></a>'),e.put("select2/no-choice.tpl.html",'<div class="ui-select-no-choice dropdown" ng-show="$select.items.length == 0"><div class="dropdown-content"><div data-selectable="" ng-transclude=""></div></div></div>'),e.put("select2/select-multiple.tpl.html",'<div class="ui-select-container ui-select-multiple select2 select2-container select2-container-multi" ng-class="{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled}"><ul class="select2-choices"><span class="ui-select-match"></span><li class="select2-search-field"><input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="combobox" aria-expanded="true" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-label="{{ $select.baseTitle }}" aria-activedescendant="ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}" class="select2-input ui-select-search" placeholder="{{$select.getPlaceholder()}}" ng-disabled="$select.disabled" ng-hide="$select.disabled" ng-model="$select.search" ng-click="$select.activate()" style="width: 34px;" data-disallow-drop="data-disallow-drop"></li></ul><div class="ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active" ng-class="{\'select2-display-none\': !$select.open || $select.items.length === 0}"><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-footer"></div></div></div>'),e.put("select2/select.tpl.html",'<div class="ui-select-container select2 select2-container" ng-class="{\'select2-container-active select2-dropdown-open open\': $select.open, \'select2-container-disabled\': $select.disabled, \'select2-container-active\': $select.focus, \'select2-allowclear\': $select.allowClear && !$select.isEmpty()}"><div class="ui-select-match"></div><div class="ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active" ng-class="{\'select2-display-none\': !$select.open}"><div class="search-container" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled, \'select2-search\':$select.searchEnabled}"><input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" ng-class="{\'select2-active\': $select.refreshing}" ng-trim="{{ $select.trim }}" role="combobox" aria-expanded="true" aria-owns="ui-select-choices-{{ $select.generatedId }}" aria-label="{{ $select.baseTitle }}" class="ui-select-search select2-input" ng-model="$select.search"></div><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-no-choice"></div><div class="ui-select-footer"></div></div></div>'),e.put("selectize/choices.tpl.html",'<div class="ui-select-choices"><div class="ui-select-choices-content selectize-dropdown-content"><div class="ui-select-choices-group optgroup"><div ng-show="$select.isGrouped" class="ui-select-choices-group-label optgroup-header" ng-bind="$group.name"></div><div role="option" class="ui-select-choices-row" ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"><div class="option ui-select-choices-row-inner" data-selectable=""></div></div></div></div></div>'),e.put("selectize/footer.tpl.html",'<div class="ui-select-footer" ng-transclude=""></div>'),e.put("selectize/header.tpl.html",'<div class="ui-select-header" ng-transclude=""></div>'),e.put("selectize/match-multiple.tpl.html",'<div class="ui-select-match" data-value="" ng-repeat="$item in $select.selected track by $index" ng-click="$selectMultiple.activeMatchIndex = $index;" ng-class="{\'active\':$selectMultiple.activeMatchIndex === $index}" ui-select-sort="$select.selected"><span class="ui-select-match-item" ng-class="{\'select-locked\':$select.isLocked(this, $index)}"><span uis-transclude-append=""></span> <span class="remove ui-select-match-close" ng-hide="$select.disabled" ng-click="$selectMultiple.removeChoice($index)">&times;</span></span></div>'),e.put("selectize/match.tpl.html",'<div ng-hide="$select.searchEnabled && ($select.open || $select.isEmpty())" class="ui-select-match"><span ng-show="!$select.searchEnabled && ($select.isEmpty() || $select.open)" class="ui-select-placeholder text-muted">{{$select.placeholder}}</span> <span ng-hide="$select.isEmpty() || $select.open" ng-transclude=""></span></div>'),e.put("selectize/no-choice.tpl.html",'<div class="ui-select-no-choice selectize-dropdown" ng-show="$select.items.length == 0"><div class="selectize-dropdown-content"><div data-selectable="" ng-transclude=""></div></div></div>'),e.put("selectize/select-multiple.tpl.html",'<div class="ui-select-container selectize-control multi plugin-remove_button" ng-class="{\'open\': $select.open}"><div class="selectize-input" ng-class="{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}" ng-click="$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()"><div class="ui-select-match"></div><input type="search" autocomplete="off" tabindex="-1" class="ui-select-search" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled}" placeholder="{{$select.getPlaceholder()}}" ng-model="$select.search" ng-disabled="$select.disabled" aria-expanded="{{$select.open}}" aria-label="{{ $select.baseTitle }}" data-disallow-drop="data-disallow-drop"></div><div ng-show="$select.open" class="ui-select-dropdown selectize-dropdown" ng-class="{\'single\': !$select.multiple, \'multi\': $select.multiple}"><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-footer"></div></div><div class="ui-select-no-choice"></div></div>'),e.put("selectize/select.tpl.html",'<div class="ui-select-container selectize-control single" ng-class="{\'open\': $select.open}"><div class="selectize-input" ng-class="{\'focus\': $select.open, \'disabled\': $select.disabled, \'selectize-focus\' : $select.focus}" ng-click="$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()"><div class="ui-select-match"></div><input type="search" autocomplete="off" tabindex="-1" class="ui-select-search ui-select-toggle" ng-class="{\'ui-select-search-hidden\':!$select.searchEnabled}" ng-click="$select.toggle($event)" placeholder="{{$select.placeholder}}" ng-model="$select.search" ng-hide="!$select.isEmpty() && !$select.open" ng-disabled="$select.disabled" ng-trim="{{ $select.trim }}" aria-label="{{ $select.baseTitle }}"></div><div ng-show="$select.open" class="ui-select-dropdown selectize-dropdown" ng-class="{\'single\': !$select.multiple, \'multi\': $select.multiple}"><div class="ui-select-header"></div><div class="ui-select-choices"></div><div class="ui-select-footer"></div></div><div class="ui-select-no-choice"></div></div>')}]);
 //# sourceMappingURL=select.min.js.map
diff --git a/dist/select.min.js.map b/dist/select.min.js.map
index 04891040c..4e41cd117 100644
--- a/dist/select.min.js.map
+++ b/dist/select.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["select.js","select_without_templates.js","templates.js"],"names":["isNil","value","angular","isUndefined","KEY","TAB","ENTER","ESC","SPACE","LEFT","UP","RIGHT","DOWN","SHIFT","CTRL","ALT","PAGE_UP","PAGE_DOWN","HOME","END","BACKSPACE","DELETE","COMMAND","MAP","91","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","43","44","45","46","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","186","187","188","189","190","191","192","219","220","221","222","isControl","e","k","which","metaKey","ctrlKey","altKey","isFunctionKey","isVerticalMovement","indexOf","isHorizontalMovement","toSeparator","sep","undefined","element","prototype","querySelectorAll","selector","this","closest","elem","matchesSelector","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","bind","parentElement","latestId","uis","module","constant","theme","searchEnabled","sortable","placeholder","refreshDelay","closeOnSelect","skipFocusser","dropdownPosition","removeSelected","resetSearchInput","generateId","appendToBody","spinnerEnabled","spinnerClass","backspaceReset","service","minErr","$$minErr","error","apply","arguments","message","replace","RegExp","Error","directive","link","scope","attrs","ctrl","transclude","clone","append","filter","escapeRegexp","queryToEscape","matchItem","query","factory","$document","$window","boundingClientRect","getBoundingClientRect","width","prop","height","top","pageYOffset","documentElement","scrollTop","left","pageXOffset","scrollLeft","$timeout","callback","debounceTime","timeoutPromise","self","args","Array","slice","call","cancel","uiSelectConfig","RepeatParser","uiSelectMinErr","$compile","restrict","require","templateUrl","tElement","addClass","parent","attr","compile","tAttrs","repeat","groupByExp","groupBy","groupFilterExp","groupFilter","groups","length","getGroupNgRepeatExpression","parserResult","parse","choices","repeatExpression","rowsInner","clickTarget","document","addEventListener","itemName","$select","parseRepeatAttr","disableChoiceExpression","uiDisableChoice","onHighlightCallback","onHighlight","minimumInputLength","parseInt","position","toLowerCase","$watch","newValue","open","multiple","activate","activeIndex","tagging","isActivated","search","refresh","items","$observe","$eval","removeAttr","controller","$scope","$element","$filter","$$uisDebounce","$parse","$injector","_findIndex","collection","predicate","thisArg","findIndex","list","Object","i","_resetSearchInput","EMPTY_SEARCH","selected","item","equals","_groupsFilter","groupNames","j","result","name","push","_updateItemDisabled","isDisabled","disabledItemIndex","disabledItems","splice","_isItemDisabled","_initaliseLockedChoices","doInitalise","_updateItemLocked","isLocked","lockedItemIndex","lockedItems","_isItemlocked","itemScope","itemIndex","lockChoiceExpression","_handleDropDownSelection","key","processed","idx","minActiveIndex","idxmin","select","close","_ensureHighlightVisible","container","highlighted","posY","offsetTop","clientHeight","offsetHeight","isGrouped","paste","refreshing","focus","disabled","focusser","fct","taggingTokens","tokens","clickTriggeredSelect","$animate","get","err","searchInput","isEmpty","initSearchValue","avoidReset","$broadcast","taggingLabel","on","enabled","animateHandler","phase","off","focusSearchInput","findGroupByName","group","repeatAttr","updateGroups","groupFn","forEach","groupName","isFunction","groupFilterFn","isArray","concat","setPlainItems","setItemsFn","itemProperty","originalSource","source","createArrayFromObject","origSrc","$uisSource","keys","map","v","keyName","filters","newVal","oldVal","refreshItems","data","selectedItems","filteredItems","every","selectedItem","calculateDropdownPos","$watchCollection","isDefined","ngModel","$modelValue","_refreshDelayPromise","refreshAttr","refreshPromise","then","isActive","_isItemSelected","selection","isTag","$event","type","trim","$setTouched","setFocus","focusInput","clear","stopPropagation","toggle","preventDefault","sizeWatch","updaterScheduled","sizeSearchInput","input","calculateContainerWidth","clientWidth","offsetParent","updateIfVisible","containerWidth","inputWidth","offsetLeft","css","$$postDigest","noop","$apply","tagged","keyCode","triggerHandler","newItem","window","clipboardData","getData","originalEvent","separator","split","oldsearch","onResize","$on","find","generatedId","uisOffset","controllerAs","match","exec","ngClass","combined","inputId","id","ctrls","transcludeFn","onDocumentClick","contains","jQuery","target","focusableControls","targetController","tagName","$digest","positionDropdown","offset","style","after","originalWidth","resetDropdown","replaceWith","baseTitle","title","focusserTitle","focusserId","onSelectCallback","onSelect","onRemoveCallback","onRemove","choiceGrouped","tabindex","limit","taggingEval","autofocus","focusOn","transcluded","transcludedMatch","transcludedChoices","transcludedNoChoice","isOpen","dropdown","directionUpClassName","setDropdownPosUp","offsetDropdown","setDropdownPosDown","removeClass","calculateDropdownPosAfterAnimation","body","opacity","opened","needsCalculated","getAttribute","attribute","hasAttribute","multi","setAllowClear","allow","allowClear","uiLockChoice","$evalAsync","activeMatchIndex","updateModel","$setViewValue","Date","now","refreshComponent","removeChoice","index","removedChoice","locals","$item","$model","modelMapper","getPlaceholder","_getCaretPosition","el","isNumber","selectionStart","_handleMatchSelection","getNewActiveMatchIndex","$selectMultiple","prev","last","curr","next","caretPosition","first","newIndex","Math","min","max","_findCaseInsensitiveDupe","arr","hasDupe","origItem","toUpperCase","_findApproxDupe","haystack","needle","dupeIndex","tempArr","copy","mockObj","isObject","$isEmpty","$parsers","unshift","resultMultiple","$formatters","inputValue","checkFnMultiple","p","trackByExp","propsItemNameMatches","oldValue","$render","$viewValue","event","tagItems","tagItem","stashArr","hasTag","some","itemsWithoutTag","checkFnSingle","d","val","uiSelectSort","$ngModel","options","extend","axis","uiSelectSortOptions","draggingClassName","droppingClassName","droppingBeforeClassName","droppingAfterClassName","dataTransfer","setData","$index","toString","dropTimeout","move","from","to","className","dragOverHandler","offsetY","layerY","offsetX","layerX","dropHandler","droppedItemIndex","_dropHandler","theList","itemToMove","hasClass","$emit","array","onOpenCloseCallback","uisOpenClose","previousState","expression","filterMatch","grouped","run","$templateCache","put"],"mappings":"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","file":"select.min.js","sourcesContent":["/*!\n * ui-select\n * http://github.com/angular-ui/ui-select\n * Version: 0.19.7 - 2017-04-15T14:28:36.649Z\n * License: MIT\n */\n\n\n(function () { \n\"use strict\";\nvar KEY = {\n    TAB: 9,\n    ENTER: 13,\n    ESC: 27,\n    SPACE: 32,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    HOME: 36,\n    END: 35,\n    BACKSPACE: 8,\n    DELETE: 46,\n    COMMAND: 91,\n\n    MAP: { 91 : \"COMMAND\", 8 : \"BACKSPACE\" , 9 : \"TAB\" , 13 : \"ENTER\" , 16 : \"SHIFT\" , 17 : \"CTRL\" , 18 : \"ALT\" , 19 : \"PAUSEBREAK\" , 20 : \"CAPSLOCK\" , 27 : \"ESC\" , 32 : \"SPACE\" , 33 : \"PAGE_UP\", 34 : \"PAGE_DOWN\" , 35 : \"END\" , 36 : \"HOME\" , 37 : \"LEFT\" , 38 : \"UP\" , 39 : \"RIGHT\" , 40 : \"DOWN\" , 43 : \"+\" , 44 : \"PRINTSCREEN\" , 45 : \"INSERT\" , 46 : \"DELETE\", 48 : \"0\" , 49 : \"1\" , 50 : \"2\" , 51 : \"3\" , 52 : \"4\" , 53 : \"5\" , 54 : \"6\" , 55 : \"7\" , 56 : \"8\" , 57 : \"9\" , 59 : \";\", 61 : \"=\" , 65 : \"A\" , 66 : \"B\" , 67 : \"C\" , 68 : \"D\" , 69 : \"E\" , 70 : \"F\" , 71 : \"G\" , 72 : \"H\" , 73 : \"I\" , 74 : \"J\" , 75 : \"K\" , 76 : \"L\", 77 : \"M\" , 78 : \"N\" , 79 : \"O\" , 80 : \"P\" , 81 : \"Q\" , 82 : \"R\" , 83 : \"S\" , 84 : \"T\" , 85 : \"U\" , 86 : \"V\" , 87 : \"W\" , 88 : \"X\" , 89 : \"Y\" , 90 : \"Z\", 96 : \"0\" , 97 : \"1\" , 98 : \"2\" , 99 : \"3\" , 100 : \"4\" , 101 : \"5\" , 102 : \"6\" , 103 : \"7\" , 104 : \"8\" , 105 : \"9\", 106 : \"*\" , 107 : \"+\" , 109 : \"-\" , 110 : \".\" , 111 : \"/\", 112 : \"F1\" , 113 : \"F2\" , 114 : \"F3\" , 115 : \"F4\" , 116 : \"F5\" , 117 : \"F6\" , 118 : \"F7\" , 119 : \"F8\" , 120 : \"F9\" , 121 : \"F10\" , 122 : \"F11\" , 123 : \"F12\", 144 : \"NUMLOCK\" , 145 : \"SCROLLLOCK\" , 186 : \";\" , 187 : \"=\" , 188 : \",\" , 189 : \"-\" , 190 : \".\" , 191 : \"/\" , 192 : \"`\" , 219 : \"[\" , 220 : \"\\\\\" , 221 : \"]\" , 222 : \"'\"\n    },\n\n    isControl: function (e) {\n        var k = e.which;\n        switch (k) {\n        case KEY.COMMAND:\n        case KEY.SHIFT:\n        case KEY.CTRL:\n        case KEY.ALT:\n            return true;\n        }\n\n        if (e.metaKey || e.ctrlKey || e.altKey) return true;\n\n        return false;\n    },\n    isFunctionKey: function (k) {\n        k = k.which ? k.which : k;\n        return k >= 112 && k <= 123;\n    },\n    isVerticalMovement: function (k){\n      return ~[KEY.UP, KEY.DOWN].indexOf(k);\n    },\n    isHorizontalMovement: function (k){\n      return ~[KEY.LEFT,KEY.RIGHT,KEY.BACKSPACE,KEY.DELETE].indexOf(k);\n    },\n    toSeparator: function (k) {\n      var sep = {ENTER:\"\\n\",TAB:\"\\t\",SPACE:\" \"}[k];\n      if (sep) return sep;\n      // return undefined for special keys other than enter, tab or space.\n      // no way to use them to cut strings.\n      return KEY[k] ? undefined : k;\n    }\n  };\n\nfunction isNil(value) {\n  return angular.isUndefined(value) || value === null;\n}\n\n/**\n * Add querySelectorAll() to jqLite.\n *\n * jqLite find() is limited to lookups by tag name.\n * TODO This will change with future versions of AngularJS, to be removed when this happens\n *\n * See jqLite.find - why not use querySelectorAll? https://github.com/angular/angular.js/issues/3586\n * See feat(jqLite): use querySelectorAll instead of getElementsByTagName in jqLite.find https://github.com/angular/angular.js/pull/3598\n */\nif (angular.element.prototype.querySelectorAll === undefined) {\n  angular.element.prototype.querySelectorAll = function(selector) {\n    return angular.element(this[0].querySelectorAll(selector));\n  };\n}\n\n/**\n * Add closest() to jqLite.\n */\nif (angular.element.prototype.closest === undefined) {\n  angular.element.prototype.closest = function( selector) {\n    var elem = this[0];\n    var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;\n\n    while (elem) {\n      if (matchesSelector.bind(elem)(selector)) {\n        return elem;\n      } else {\n        elem = elem.parentElement;\n      }\n    }\n    return false;\n  };\n}\n\nvar latestId = 0;\n\nvar uis = angular.module('ui.select', [])\n\n.constant('uiSelectConfig', {\n  theme: 'bootstrap',\n  searchEnabled: true,\n  sortable: false,\n  placeholder: '', // Empty by default, like HTML tag <select>\n  refreshDelay: 1000, // In milliseconds\n  closeOnSelect: true,\n  skipFocusser: false,\n  dropdownPosition: 'auto',\n  removeSelected: true,\n  resetSearchInput: true,\n  generateId: function() {\n    return latestId++;\n  },\n  appendToBody: false,\n  spinnerEnabled: false,\n  spinnerClass: 'glyphicon glyphicon-refresh ui-select-spin',\n  backspaceReset: true\n})\n\n// See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913\n.service('uiSelectMinErr', function() {\n  var minErr = angular.$$minErr('ui.select');\n  return function() {\n    var error = minErr.apply(this, arguments);\n    var message = error.message.replace(new RegExp('\\nhttp://errors.angularjs.org/.*'), '');\n    return new Error(message);\n  };\n})\n\n// Recreates old behavior of ng-transclude. Used internally.\n.directive('uisTranscludeAppend', function () {\n  return {\n    link: function (scope, element, attrs, ctrl, transclude) {\n        transclude(scope, function (clone) {\n          element.append(clone);\n        });\n      }\n    };\n})\n\n/**\n * Highlights text that matches $select.search.\n *\n * Taken from AngularUI Bootstrap Typeahead\n * See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L340\n */\n.filter('highlight', function() {\n  function escapeRegexp(queryToEscape) {\n    return ('' + queryToEscape).replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n  }\n\n  return function(matchItem, query) {\n    return query && matchItem ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<span class=\"ui-select-highlight\">$&</span>') : matchItem;\n  };\n})\n\n/**\n * A read-only equivalent of jQuery's offset function: http://api.jquery.com/offset/\n *\n * Taken from AngularUI Bootstrap Position:\n * See https://github.com/angular-ui/bootstrap/blob/master/src/position/position.js#L70\n */\n.factory('uisOffset',\n  ['$document', '$window',\n  function ($document, $window) {\n\n  return function(element) {\n    var boundingClientRect = element[0].getBoundingClientRect();\n    return {\n      width: boundingClientRect.width || element.prop('offsetWidth'),\n      height: boundingClientRect.height || element.prop('offsetHeight'),\n      top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n      left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n    };\n  };\n}]);\n\n/**\n * Debounces functions\n *\n * Taken from UI Bootstrap $$debounce source code\n * See https://github.com/angular-ui/bootstrap/blob/master/src/debounce/debounce.js\n *\n */\nuis.factory('$$uisDebounce', ['$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\nuis.directive('uiSelectChoices',\n  ['uiSelectConfig', 'uisRepeatParser', 'uiSelectMinErr', '$compile', '$window',\n  function(uiSelectConfig, RepeatParser, uiSelectMinErr, $compile, $window) {\n\n  return {\n    restrict: 'EA',\n    require: '^uiSelect',\n    replace: true,\n    transclude: true,\n    templateUrl: function(tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-choices');\n\n      // Gets theme attribute from parent (ui-select)\n      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n      return theme + '/choices.tpl.html';\n    },\n\n    compile: function(tElement, tAttrs) {\n\n      if (!tAttrs.repeat) throw uiSelectMinErr('repeat', \"Expected 'repeat' expression.\");\n\n      // var repeat = RepeatParser.parse(attrs.repeat);\n      var groupByExp = tAttrs.groupBy;\n      var groupFilterExp = tAttrs.groupFilter;\n\n      if (groupByExp) {\n        var groups = tElement.querySelectorAll('.ui-select-choices-group');\n        if (groups.length !== 1) throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-group but got '{0}'.\", groups.length);\n        groups.attr('ng-repeat', RepeatParser.getGroupNgRepeatExpression());\n      }\n\n      var parserResult = RepeatParser.parse(tAttrs.repeat);\n\n      var choices = tElement.querySelectorAll('.ui-select-choices-row');\n      if (choices.length !== 1) {\n        throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row but got '{0}'.\", choices.length);\n      }\n\n      choices.attr('ng-repeat', parserResult.repeatExpression(groupByExp))\n             .attr('ng-if', '$select.open'); //Prevent unnecessary watches when dropdown is closed\n\n\n      var rowsInner = tElement.querySelectorAll('.ui-select-choices-row-inner');\n      if (rowsInner.length !== 1) {\n        throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row-inner but got '{0}'.\", rowsInner.length);\n      }\n      rowsInner.attr('uis-transclude-append', ''); //Adding uisTranscludeAppend directive to row element after choices element has ngRepeat\n\n      // If IE8 then need to target rowsInner to apply the ng-click attr as choices will not capture the event.\n      var clickTarget = $window.document.addEventListener ? choices : rowsInner;\n      clickTarget.attr('ng-click', '$select.select(' + parserResult.itemName + ',$select.skipFocusser,$event)');\n\n      return function link(scope, element, attrs, $select) {\n\n\n        $select.parseRepeatAttr(attrs.repeat, groupByExp, groupFilterExp); //Result ready at $select.parserResult\n        $select.disableChoiceExpression = attrs.uiDisableChoice;\n        $select.onHighlightCallback = attrs.onHighlight;\n        $select.minimumInputLength = parseInt(attrs.minimumInputLength) || 0;\n        $select.dropdownPosition = attrs.position ? attrs.position.toLowerCase() : uiSelectConfig.dropdownPosition;\n\n        scope.$watch('$select.search', function(newValue) {\n          if(newValue && !$select.open && $select.multiple) $select.activate(false, true);\n          $select.activeIndex = $select.tagging.isActivated ? -1 : 0;\n          if (!attrs.minimumInputLength || $select.search.length >= attrs.minimumInputLength) {\n            $select.refresh(attrs.refresh);\n          } else {\n            $select.items = [];\n          }\n        });\n\n        attrs.$observe('refreshDelay', function() {\n          // $eval() is needed otherwise we get a string instead of a number\n          var refreshDelay = scope.$eval(attrs.refreshDelay);\n          $select.refreshDelay = refreshDelay !== undefined ? refreshDelay : uiSelectConfig.refreshDelay;\n        });\n\n        scope.$watch('$select.open', function(open) {\n          if (open) {\n            tElement.attr('role', 'listbox');\n            $select.refresh(attrs.refresh);\n          } else {\n            element.removeAttr('role');\n          }\n        });\n      };\n    }\n  };\n}]);\n\n/**\n * Contains ui-select \"intelligence\".\n *\n * The goal is to limit dependency on the DOM whenever possible and\n * put as much logic in the controller (instead of the link functions) as possible so it can be easily tested.\n */\nuis.controller('uiSelectCtrl',\n  ['$scope', '$element', '$timeout', '$filter', '$$uisDebounce', 'uisRepeatParser', 'uiSelectMinErr', 'uiSelectConfig', '$parse', '$injector', '$window',\n  function($scope, $element, $timeout, $filter, $$uisDebounce, RepeatParser, uiSelectMinErr, uiSelectConfig, $parse, $injector, $window) {\n\n  var ctrl = this;\n\n  var EMPTY_SEARCH = '';\n\n  ctrl.placeholder = uiSelectConfig.placeholder;\n  ctrl.searchEnabled = uiSelectConfig.searchEnabled;\n  ctrl.sortable = uiSelectConfig.sortable;\n  ctrl.refreshDelay = uiSelectConfig.refreshDelay;\n  ctrl.paste = uiSelectConfig.paste;\n  ctrl.resetSearchInput = uiSelectConfig.resetSearchInput;\n  ctrl.refreshing = false;\n  ctrl.spinnerEnabled = uiSelectConfig.spinnerEnabled;\n  ctrl.spinnerClass = uiSelectConfig.spinnerClass;\n  ctrl.removeSelected = uiSelectConfig.removeSelected; //If selected item(s) should be removed from dropdown list\n  ctrl.closeOnSelect = true; //Initialized inside uiSelect directive link function\n  ctrl.skipFocusser = false; //Set to true to avoid returning focus to ctrl when item is selected\n  ctrl.search = EMPTY_SEARCH;\n\n  ctrl.activeIndex = 0; //Dropdown of choices\n  ctrl.items = []; //All available choices\n\n  ctrl.open = false;\n  ctrl.focus = false;\n  ctrl.disabled = false;\n  ctrl.selected = undefined;\n\n  ctrl.dropdownPosition = 'auto';\n\n  ctrl.focusser = undefined; //Reference to input element used to handle focus events\n  ctrl.multiple = undefined; // Initialized inside uiSelect directive link function\n  ctrl.disableChoiceExpression = undefined; // Initialized inside uiSelectChoices directive link function\n  ctrl.tagging = {isActivated: false, fct: undefined};\n  ctrl.taggingTokens = {isActivated: false, tokens: undefined};\n  ctrl.lockChoiceExpression = undefined; // Initialized inside uiSelectMatch directive link function\n  ctrl.clickTriggeredSelect = false;\n  ctrl.$filter = $filter;\n  ctrl.$element = $element;\n\n  // Use $injector to check for $animate and store a reference to it\n  ctrl.$animate = (function () {\n    try {\n      return $injector.get('$animate');\n    } catch (err) {\n      // $animate does not exist\n      return null;\n    }\n  })();\n\n  ctrl.searchInput = $element.querySelectorAll('input.ui-select-search');\n  if (ctrl.searchInput.length !== 1) {\n    throw uiSelectMinErr('searchInput', \"Expected 1 input.ui-select-search but got '{0}'.\", ctrl.searchInput.length);\n  }\n\n  ctrl.isEmpty = function() {\n    return isNil(ctrl.selected) || ctrl.selected === '' || (ctrl.multiple && ctrl.selected.length === 0);\n  };\n\n  function _findIndex(collection, predicate, thisArg){\n    if (collection.findIndex){\n      return collection.findIndex(predicate, thisArg);\n    } else {\n      var list = Object(collection);\n      var length = list.length >>> 0;\n      var value;\n\n      for (var i = 0; i < length; i++) {\n        value = list[i];\n        if (predicate.call(thisArg, value, i, list)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n  }\n\n  // Most of the time the user does not want to empty the search input when in typeahead mode\n  function _resetSearchInput() {\n    if (ctrl.resetSearchInput) {\n      ctrl.search = EMPTY_SEARCH;\n      //reset activeIndex\n      if (ctrl.selected && ctrl.items.length && !ctrl.multiple) {\n        ctrl.activeIndex = _findIndex(ctrl.items, function(item){\n          return angular.equals(this, item);\n        }, ctrl.selected);\n      }\n    }\n  }\n\n    function _groupsFilter(groups, groupNames) {\n      var i, j, result = [];\n      for(i = 0; i < groupNames.length ;i++){\n        for(j = 0; j < groups.length ;j++){\n          if(groups[j].name == [groupNames[i]]){\n            result.push(groups[j]);\n          }\n        }\n      }\n      return result;\n    }\n\n  // When the user clicks on ui-select, displays the dropdown list\n  ctrl.activate = function(initSearchValue, avoidReset) {\n    if (!ctrl.disabled  && !ctrl.open) {\n      if(!avoidReset) _resetSearchInput();\n\n      $scope.$broadcast('uis:activate');\n      ctrl.open = true;\n      ctrl.activeIndex = ctrl.activeIndex >= ctrl.items.length ? 0 : ctrl.activeIndex;\n      // ensure that the index is set to zero for tagging variants\n      // that where first option is auto-selected\n      if ( ctrl.activeIndex === -1 && ctrl.taggingLabel !== false ) {\n        ctrl.activeIndex = 0;\n      }\n\n      var container = $element.querySelectorAll('.ui-select-choices-content');\n      var searchInput = $element.querySelectorAll('.ui-select-search');\n      if (ctrl.$animate && ctrl.$animate.on && ctrl.$animate.enabled(container[0])) {\n        var animateHandler = function(elem, phase) {\n          if (phase === 'start' && ctrl.items.length === 0) {\n            // Only focus input after the animation has finished\n            ctrl.$animate.off('removeClass', searchInput[0], animateHandler);\n            $timeout(function () {\n              ctrl.focusSearchInput(initSearchValue);\n            });\n          } else if (phase === 'close') {\n            // Only focus input after the animation has finished\n            ctrl.$animate.off('enter', container[0], animateHandler);\n            $timeout(function () {\n              ctrl.focusSearchInput(initSearchValue);\n            });\n          }\n        };\n\n        if (ctrl.items.length > 0) {\n          ctrl.$animate.on('enter', container[0], animateHandler);\n        } else {\n          ctrl.$animate.on('removeClass', searchInput[0], animateHandler);\n        }\n      } else {\n        $timeout(function () {\n          ctrl.focusSearchInput(initSearchValue);\n          if(!ctrl.tagging.isActivated && ctrl.items.length > 1) {\n            _ensureHighlightVisible();\n          }\n        });\n      }\n    }\n    else if (ctrl.open && !ctrl.searchEnabled) {\n      // Close the selection if we don't have search enabled, and we click on the select again\n      ctrl.close();\n    }\n  };\n\n  ctrl.focusSearchInput = function (initSearchValue) {\n    ctrl.search = initSearchValue || ctrl.search;\n    ctrl.searchInput[0].focus();\n  };\n\n  ctrl.findGroupByName = function(name) {\n    return ctrl.groups && ctrl.groups.filter(function(group) {\n      return group.name === name;\n    })[0];\n  };\n\n  ctrl.parseRepeatAttr = function(repeatAttr, groupByExp, groupFilterExp) {\n    function updateGroups(items) {\n      var groupFn = $scope.$eval(groupByExp);\n      ctrl.groups = [];\n      angular.forEach(items, function(item) {\n        var groupName = angular.isFunction(groupFn) ? groupFn(item) : item[groupFn];\n        var group = ctrl.findGroupByName(groupName);\n        if(group) {\n          group.items.push(item);\n        }\n        else {\n          ctrl.groups.push({name: groupName, items: [item]});\n        }\n      });\n      if(groupFilterExp){\n        var groupFilterFn = $scope.$eval(groupFilterExp);\n        if( angular.isFunction(groupFilterFn)){\n          ctrl.groups = groupFilterFn(ctrl.groups);\n        } else if(angular.isArray(groupFilterFn)){\n          ctrl.groups = _groupsFilter(ctrl.groups, groupFilterFn);\n        }\n      }\n      ctrl.items = [];\n      ctrl.groups.forEach(function(group) {\n        ctrl.items = ctrl.items.concat(group.items);\n      });\n    }\n\n    function setPlainItems(items) {\n      ctrl.items = items || [];\n    }\n\n    ctrl.setItemsFn = groupByExp ? updateGroups : setPlainItems;\n\n    ctrl.parserResult = RepeatParser.parse(repeatAttr);\n\n    ctrl.isGrouped = !!groupByExp;\n    ctrl.itemProperty = ctrl.parserResult.itemName;\n\n    //If collection is an Object, convert it to Array\n\n    var originalSource = ctrl.parserResult.source;\n\n    //When an object is used as source, we better create an array and use it as 'source'\n    var createArrayFromObject = function(){\n      var origSrc = originalSource($scope);\n      $scope.$uisSource = Object.keys(origSrc).map(function(v){\n        var result = {};\n        result[ctrl.parserResult.keyName] = v;\n        result.value = origSrc[v];\n        return result;\n      });\n    };\n\n    if (ctrl.parserResult.keyName){ // Check for (key,value) syntax\n      createArrayFromObject();\n      ctrl.parserResult.source = $parse('$uisSource' + ctrl.parserResult.filters);\n      $scope.$watch(originalSource, function(newVal, oldVal){\n        if (newVal !== oldVal) createArrayFromObject();\n      }, true);\n    }\n\n    ctrl.refreshItems = function (data){\n      data = data || ctrl.parserResult.source($scope);\n      var selectedItems = ctrl.selected;\n      //TODO should implement for single mode removeSelected\n      if (ctrl.isEmpty() || (angular.isArray(selectedItems) && !selectedItems.length) || !ctrl.multiple || !ctrl.removeSelected) {\n        ctrl.setItemsFn(data);\n      }else{\n        if ( data !== undefined && data !== null ) {\n          var filteredItems = data.filter(function(i) {\n            return angular.isArray(selectedItems) ? selectedItems.every(function(selectedItem) {\n              return !angular.equals(i, selectedItem);\n            }) : !angular.equals(i, selectedItems);\n          });\n          ctrl.setItemsFn(filteredItems);\n        }\n      }\n      if (ctrl.dropdownPosition === 'auto' || ctrl.dropdownPosition === 'up'){\n        $scope.calculateDropdownPos();\n      }\n      $scope.$broadcast('uis:refresh');\n    };\n\n    // See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L259\n    $scope.$watchCollection(ctrl.parserResult.source, function(items) {\n      if (items === undefined || items === null) {\n        // If the user specifies undefined or null => reset the collection\n        // Special case: items can be undefined if the user did not initialized the collection on the scope\n        // i.e $scope.addresses = [] is missing\n        ctrl.items = [];\n      } else {\n        if (!angular.isArray(items)) {\n          throw uiSelectMinErr('items', \"Expected an array but got '{0}'.\", items);\n        } else {\n          //Remove already selected items (ex: while searching)\n          //TODO Should add a test\n          ctrl.refreshItems(items);\n\n          //update the view value with fresh data from items, if there is a valid model value\n          if(angular.isDefined(ctrl.ngModel.$modelValue)) {\n            ctrl.ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n          }\n        }\n      }\n    });\n\n  };\n\n  var _refreshDelayPromise;\n\n  /**\n   * Typeahead mode: lets the user refresh the collection using his own function.\n   *\n   * See Expose $select.search for external / remote filtering https://github.com/angular-ui/ui-select/pull/31\n   */\n  ctrl.refresh = function(refreshAttr) {\n    if (refreshAttr !== undefined) {\n      // Debounce\n      // See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155\n      // FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177\n      if (_refreshDelayPromise) {\n        $timeout.cancel(_refreshDelayPromise);\n      }\n      _refreshDelayPromise = $timeout(function() {\n        if ($scope.$select.search.length >= $scope.$select.minimumInputLength) {\n          var refreshPromise = $scope.$eval(refreshAttr);\n          if (refreshPromise && angular.isFunction(refreshPromise.then) && !ctrl.refreshing) {\n            ctrl.refreshing = true;\n            refreshPromise.finally(function() {\n              ctrl.refreshing = false;\n            });\n          }\n        }\n      }, ctrl.refreshDelay);\n    }\n  };\n\n  ctrl.isActive = function(itemScope) {\n    if ( !ctrl.open ) {\n      return false;\n    }\n    var itemIndex = ctrl.items.indexOf(itemScope[ctrl.itemProperty]);\n    var isActive =  itemIndex == ctrl.activeIndex;\n\n    if ( !isActive || itemIndex < 0 ) {\n      return false;\n    }\n\n    if (isActive && !angular.isUndefined(ctrl.onHighlightCallback)) {\n      itemScope.$eval(ctrl.onHighlightCallback);\n    }\n\n    return isActive;\n  };\n\n  var _isItemSelected = function (item) {\n    return (ctrl.selected && angular.isArray(ctrl.selected) &&\n        ctrl.selected.filter(function (selection) { return angular.equals(selection, item); }).length > 0);\n  };\n\n  var disabledItems = [];\n\n  function _updateItemDisabled(item, isDisabled) {\n    var disabledItemIndex = disabledItems.indexOf(item);\n    if (isDisabled && disabledItemIndex === -1) {\n      disabledItems.push(item);\n    }\n\n    if (!isDisabled && disabledItemIndex > -1) {\n      disabledItems.splice(disabledItemIndex, 1);\n    }\n  }\n\n  function _isItemDisabled(item) {\n    return disabledItems.indexOf(item) > -1;\n  }\n\n  ctrl.isDisabled = function(itemScope) {\n\n    if (!ctrl.open) return;\n\n    var item = itemScope[ctrl.itemProperty];\n    var itemIndex = ctrl.items.indexOf(item);\n    var isDisabled = false;\n\n    if (itemIndex >= 0 && (angular.isDefined(ctrl.disableChoiceExpression) || ctrl.multiple)) {\n\n      if (item.isTag) return false;\n\n      if (ctrl.multiple) {\n        isDisabled = _isItemSelected(item);\n      }\n\n      if (!isDisabled && angular.isDefined(ctrl.disableChoiceExpression)) {\n        isDisabled = !!(itemScope.$eval(ctrl.disableChoiceExpression));\n      }\n\n      _updateItemDisabled(item, isDisabled);\n    }\n\n    return isDisabled;\n  };\n\n\n  // When the user selects an item with ENTER or clicks the dropdown\n  ctrl.select = function(item, skipFocusser, $event) {\n    if (isNil(item) || !_isItemDisabled(item)) {\n\n      if ( ! ctrl.items && ! ctrl.search && ! ctrl.tagging.isActivated) return;\n\n      if (!item || !_isItemDisabled(item)) {\n        // if click is made on existing item, prevent from tagging, ctrl.search does not matter\n        ctrl.clickTriggeredSelect = false;\n        if($event && ($event.type === 'click' || $event.type === 'touchend') && item)\n          ctrl.clickTriggeredSelect = true;\n\n        if(ctrl.tagging.isActivated && ctrl.clickTriggeredSelect === false) {\n          // if taggingLabel is disabled and item is undefined we pull from ctrl.search\n          if ( ctrl.taggingLabel === false ) {\n            if ( ctrl.activeIndex < 0 ) {\n              if (item === undefined) {\n                item = ctrl.tagging.fct !== undefined ? ctrl.tagging.fct(ctrl.search) : ctrl.search;\n              }\n              if (!item || angular.equals( ctrl.items[0], item ) ) {\n                return;\n              }\n            } else {\n              // keyboard nav happened first, user selected from dropdown\n              item = ctrl.items[ctrl.activeIndex];\n            }\n          } else {\n            // tagging always operates at index zero, taggingLabel === false pushes\n            // the ctrl.search value without having it injected\n            if ( ctrl.activeIndex === 0 ) {\n              // ctrl.tagging pushes items to ctrl.items, so we only have empty val\n              // for `item` if it is a detected duplicate\n              if ( item === undefined ) return;\n\n              // create new item on the fly if we don't already have one;\n              // use tagging function if we have one\n              if ( ctrl.tagging.fct !== undefined && typeof item === 'string' ) {\n                item = ctrl.tagging.fct(item);\n                if (!item) return;\n              // if item type is 'string', apply the tagging label\n              } else if ( typeof item === 'string' ) {\n                // trim the trailing space\n                item = item.replace(ctrl.taggingLabel,'').trim();\n              }\n            }\n          }\n          // search ctrl.selected for dupes potentially caused by tagging and return early if found\n          if (_isItemSelected(item)) {\n            ctrl.close(skipFocusser);\n            return;\n          }\n        }\n        _resetSearchInput();\n        $scope.$broadcast('uis:select', item);\n\n        if (ctrl.closeOnSelect) {\n          ctrl.close(skipFocusser);\n        }\n      }\n    }\n  };\n\n  // Closes the dropdown\n  ctrl.close = function(skipFocusser) {\n    if (!ctrl.open) return;\n    if (ctrl.ngModel && ctrl.ngModel.$setTouched) ctrl.ngModel.$setTouched();\n    ctrl.open = false;\n    _resetSearchInput();\n    $scope.$broadcast('uis:close', skipFocusser);\n\n  };\n\n  ctrl.setFocus = function(){\n    if (!ctrl.focus) ctrl.focusInput[0].focus();\n  };\n\n  ctrl.clear = function($event) {\n    ctrl.select(null);\n    $event.stopPropagation();\n    $timeout(function() {\n      ctrl.focusser[0].focus();\n    }, 0, false);\n  };\n\n  // Toggle dropdown\n  ctrl.toggle = function(e) {\n    if (ctrl.open) {\n      ctrl.close();\n      e.preventDefault();\n      e.stopPropagation();\n    } else {\n      ctrl.activate();\n    }\n  };\n\n  // Set default function for locked choices - avoids unnecessary\n  // logic if functionality is not being used\n  ctrl.isLocked = function () {\n    return false;\n  };\n\n  $scope.$watch(function () {\n    return angular.isDefined(ctrl.lockChoiceExpression) && ctrl.lockChoiceExpression !== \"\";\n  }, _initaliseLockedChoices);\n\n  function _initaliseLockedChoices(doInitalise) {\n    if(!doInitalise) return;\n\n    var lockedItems = [];\n\n    function _updateItemLocked(item, isLocked) {\n      var lockedItemIndex = lockedItems.indexOf(item);\n      if (isLocked && lockedItemIndex === -1) {\n        lockedItems.push(item);\n        }\n\n      if (!isLocked && lockedItemIndex > -1) {\n        lockedItems.splice(lockedItemIndex, 1);\n      }\n    }\n\n    function _isItemlocked(item) {\n      return lockedItems.indexOf(item) > -1;\n    }\n\n    ctrl.isLocked = function (itemScope, itemIndex) {\n      var isLocked = false,\n          item = ctrl.selected[itemIndex];\n\n      if(item) {\n        if (itemScope) {\n          isLocked = !!(itemScope.$eval(ctrl.lockChoiceExpression));\n          _updateItemLocked(item, isLocked);\n        } else {\n          isLocked = _isItemlocked(item);\n        }\n      }\n\n      return isLocked;\n    };\n  }\n\n\n  var sizeWatch = null;\n  var updaterScheduled = false;\n  ctrl.sizeSearchInput = function() {\n\n    var input = ctrl.searchInput[0],\n        container = ctrl.$element[0],\n        calculateContainerWidth = function() {\n          // Return the container width only if the search input is visible\n          return container.clientWidth * !!input.offsetParent;\n        },\n        updateIfVisible = function(containerWidth) {\n          if (containerWidth === 0) {\n            return false;\n          }\n          var inputWidth = containerWidth - input.offsetLeft;\n          if (inputWidth < 50) inputWidth = containerWidth;\n          ctrl.searchInput.css('width', inputWidth+'px');\n          return true;\n        };\n\n    ctrl.searchInput.css('width', '10px');\n    $timeout(function() { //Give tags time to render correctly\n      if (sizeWatch === null && !updateIfVisible(calculateContainerWidth())) {\n        sizeWatch = $scope.$watch(function() {\n          if (!updaterScheduled) {\n            updaterScheduled = true;\n            $scope.$$postDigest(function() {\n              updaterScheduled = false;\n              if (updateIfVisible(calculateContainerWidth())) {\n                sizeWatch();\n                sizeWatch = null;\n              }\n            });\n          }\n        }, angular.noop);\n      }\n    });\n  };\n\n  function _handleDropDownSelection(key) {\n    var processed = true;\n    switch (key) {\n      case KEY.DOWN:\n        if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        else if (ctrl.activeIndex < ctrl.items.length - 1) {\n          var idx = ++ctrl.activeIndex;\n          while(_isItemDisabled(ctrl.items[idx]) && idx < ctrl.items.length) {\n            ctrl.activeIndex = ++idx;\n          }\n        }\n        break;\n      case KEY.UP:\n        var minActiveIndex = (ctrl.search.length === 0 && ctrl.tagging.isActivated) ? -1 : 0;\n        if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        else if (ctrl.activeIndex > minActiveIndex) {\n          var idxmin = --ctrl.activeIndex;\n          while(_isItemDisabled(ctrl.items[idxmin]) && idxmin > minActiveIndex) {\n            ctrl.activeIndex = --idxmin;\n          }\n        }\n        break;\n      case KEY.TAB:\n        if (!ctrl.multiple || ctrl.open) ctrl.select(ctrl.items[ctrl.activeIndex], true);\n        break;\n      case KEY.ENTER:\n        if(ctrl.open && (ctrl.tagging.isActivated || ctrl.activeIndex >= 0)){\n          ctrl.select(ctrl.items[ctrl.activeIndex], ctrl.skipFocusser); // Make sure at least one dropdown item is highlighted before adding if not in tagging mode\n        } else {\n          ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        }\n        break;\n      case KEY.ESC:\n        ctrl.close();\n        break;\n      default:\n        processed = false;\n    }\n    return processed;\n  }\n\n  // Bind to keyboard shortcuts\n  ctrl.searchInput.on('keydown', function(e) {\n\n    var key = e.which;\n\n    if (~[KEY.ENTER,KEY.ESC].indexOf(key)){\n      e.preventDefault();\n      e.stopPropagation();\n    }\n\n    $scope.$apply(function() {\n\n      var tagged = false;\n\n      if (ctrl.items.length > 0 || ctrl.tagging.isActivated) {\n        if(!_handleDropDownSelection(key) && !ctrl.searchEnabled) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n        if ( ctrl.taggingTokens.isActivated ) {\n          for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) {\n            if ( ctrl.taggingTokens.tokens[i] === KEY.MAP[e.keyCode] ) {\n              // make sure there is a new value to push via tagging\n              if ( ctrl.search.length > 0 ) {\n                tagged = true;\n              }\n            }\n          }\n          if ( tagged ) {\n            $timeout(function() {\n              ctrl.searchInput.triggerHandler('tagged');\n              var newItem = ctrl.search.replace(KEY.MAP[e.keyCode],'').trim();\n              if ( ctrl.tagging.fct ) {\n                newItem = ctrl.tagging.fct( newItem );\n              }\n              if (newItem) ctrl.select(newItem, true);\n            });\n          }\n        }\n      }\n\n    });\n\n    if(KEY.isVerticalMovement(key) && ctrl.items.length > 0){\n      _ensureHighlightVisible();\n    }\n\n    if (key === KEY.ENTER || key === KEY.ESC) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n\n  });\n\n  ctrl.searchInput.on('paste', function (e) {\n    var data;\n\n    if (window.clipboardData && window.clipboardData.getData) { // IE\n      data = window.clipboardData.getData('Text');\n    } else {\n      data = (e.originalEvent || e).clipboardData.getData('text/plain');\n    }\n\n    // Prepend the current input field text to the paste buffer.\n    data = ctrl.search + data;\n\n    if (data && data.length > 0) {\n      // If tagging try to split by tokens and add items\n      if (ctrl.taggingTokens.isActivated) {\n        var items = [];\n        for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) {  // split by first token that is contained in data\n          var separator = KEY.toSeparator(ctrl.taggingTokens.tokens[i]) || ctrl.taggingTokens.tokens[i];\n          if (data.indexOf(separator) > -1) {\n            items = data.split(separator);\n            break;  // only split by one token\n          }\n        }\n        if (items.length === 0) {\n          items = [data];\n        }\n        var oldsearch = ctrl.search;\n        angular.forEach(items, function (item) {\n          var newItem = ctrl.tagging.fct ? ctrl.tagging.fct(item) : item;\n          if (newItem) {\n            ctrl.select(newItem, true);\n          }\n        });\n        ctrl.search = oldsearch || EMPTY_SEARCH;\n        e.preventDefault();\n        e.stopPropagation();\n      } else if (ctrl.paste) {\n        ctrl.paste(data);\n        ctrl.search = EMPTY_SEARCH;\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    }\n  });\n\n  ctrl.searchInput.on('tagged', function() {\n    $timeout(function() {\n      _resetSearchInput();\n    });\n  });\n\n  // See https://github.com/ivaynberg/select2/blob/3.4.6/select2.js#L1431\n  function _ensureHighlightVisible() {\n    var container = $element.querySelectorAll('.ui-select-choices-content');\n    var choices = container.querySelectorAll('.ui-select-choices-row');\n    if (choices.length < 1) {\n      throw uiSelectMinErr('choices', \"Expected multiple .ui-select-choices-row but got '{0}'.\", choices.length);\n    }\n\n    if (ctrl.activeIndex < 0) {\n      return;\n    }\n\n    var highlighted = choices[ctrl.activeIndex];\n    var posY = highlighted.offsetTop + highlighted.clientHeight - container[0].scrollTop;\n    var height = container[0].offsetHeight;\n\n    if (posY > height) {\n      container[0].scrollTop += posY - height;\n    } else if (posY < highlighted.clientHeight) {\n      if (ctrl.isGrouped && ctrl.activeIndex === 0)\n        container[0].scrollTop = 0; //To make group header visible when going all the way up\n      else\n        container[0].scrollTop -= highlighted.clientHeight - posY;\n    }\n  }\n\n  var onResize = $$uisDebounce(function() {\n    ctrl.sizeSearchInput();\n  }, 50);\n\n  angular.element($window).bind('resize', onResize);\n\n  $scope.$on('$destroy', function() {\n    ctrl.searchInput.off('keyup keydown tagged blur paste');\n    angular.element($window).off('resize', onResize);\n  });\n\n  $scope.$watch('$select.activeIndex', function(activeIndex) {\n    if (activeIndex)\n      $element.find('input').attr(\n        'aria-activedescendant',\n        'ui-select-choices-row-' + ctrl.generatedId + '-' + activeIndex);\n  });\n\n  $scope.$watch('$select.open', function(open) {\n    if (!open)\n      $element.find('input').removeAttr('aria-activedescendant');\n  });\n}]);\n\nuis.directive('uiSelect',\n  ['$document', 'uiSelectConfig', 'uiSelectMinErr', 'uisOffset', '$compile', '$parse', '$timeout',\n  function($document, uiSelectConfig, uiSelectMinErr, uisOffset, $compile, $parse, $timeout) {\n\n  return {\n    restrict: 'EA',\n    templateUrl: function(tElement, tAttrs) {\n      var theme = tAttrs.theme || uiSelectConfig.theme;\n      return theme + (angular.isDefined(tAttrs.multiple) ? '/select-multiple.tpl.html' : '/select.tpl.html');\n    },\n    replace: true,\n    transclude: true,\n    require: ['uiSelect', '^ngModel'],\n    scope: true,\n\n    controller: 'uiSelectCtrl',\n    controllerAs: '$select',\n    compile: function(tElement, tAttrs) {\n\n      // Allow setting ngClass on uiSelect\n      var match = /{(.*)}\\s*{(.*)}/.exec(tAttrs.ngClass);\n      if(match) {\n        var combined = '{'+ match[1] +', '+ match[2] +'}';\n        tAttrs.ngClass = combined;\n        tElement.attr('ng-class', combined);\n      }\n\n      //Multiple or Single depending if multiple attribute presence\n      if (angular.isDefined(tAttrs.multiple))\n        tElement.append('<ui-select-multiple/>').removeAttr('multiple');\n      else\n        tElement.append('<ui-select-single/>');\n\n      if (tAttrs.inputId)\n        tElement.querySelectorAll('input.ui-select-search')[0].id = tAttrs.inputId;\n\n      return function(scope, element, attrs, ctrls, transcludeFn) {\n\n        var $select = ctrls[0];\n        var ngModel = ctrls[1];\n\n        $select.generatedId = uiSelectConfig.generateId();\n        $select.baseTitle = attrs.title || 'Select box';\n        $select.focusserTitle = $select.baseTitle + ' focus';\n        $select.focusserId = 'focusser-' + $select.generatedId;\n\n        $select.closeOnSelect = function() {\n          if (angular.isDefined(attrs.closeOnSelect)) {\n            return $parse(attrs.closeOnSelect)();\n          } else {\n            return uiSelectConfig.closeOnSelect;\n          }\n        }();\n\n        scope.$watch('skipFocusser', function() {\n            var skipFocusser = scope.$eval(attrs.skipFocusser);\n            $select.skipFocusser = skipFocusser !== undefined ? skipFocusser : uiSelectConfig.skipFocusser;\n        });\n\n        $select.onSelectCallback = $parse(attrs.onSelect);\n        $select.onRemoveCallback = $parse(attrs.onRemove);\n\n        //Set reference to ngModel from uiSelectCtrl\n        $select.ngModel = ngModel;\n\n        $select.choiceGrouped = function(group){\n          return $select.isGrouped && group && group.name;\n        };\n\n        if(attrs.tabindex){\n          attrs.$observe('tabindex', function(value) {\n            $select.focusInput.attr('tabindex', value);\n            element.removeAttr('tabindex');\n          });\n        }\n\n        scope.$watch(function () { return scope.$eval(attrs.searchEnabled); }, function(newVal) {\n          $select.searchEnabled = newVal !== undefined ? newVal : uiSelectConfig.searchEnabled;\n        });\n\n        scope.$watch('sortable', function() {\n            var sortable = scope.$eval(attrs.sortable);\n            $select.sortable = sortable !== undefined ? sortable : uiSelectConfig.sortable;\n        });\n\n        attrs.$observe('backspaceReset', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var backspaceReset = scope.$eval(attrs.backspaceReset);\n          $select.backspaceReset = backspaceReset !== undefined ? backspaceReset : true;\n        });\n\n        attrs.$observe('limit', function() {\n          //Limit the number of selections allowed\n          $select.limit = (angular.isDefined(attrs.limit)) ? parseInt(attrs.limit, 10) : undefined;\n        });\n\n        scope.$watch('removeSelected', function() {\n            var removeSelected = scope.$eval(attrs.removeSelected);\n            $select.removeSelected = removeSelected !== undefined ? removeSelected : uiSelectConfig.removeSelected;\n        });\n\n        attrs.$observe('disabled', function() {\n          // No need to use $eval() (thanks to ng-disabled) since we already get a boolean instead of a string\n          $select.disabled = attrs.disabled !== undefined ? attrs.disabled : false;\n        });\n\n        attrs.$observe('resetSearchInput', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var resetSearchInput = scope.$eval(attrs.resetSearchInput);\n          $select.resetSearchInput = resetSearchInput !== undefined ? resetSearchInput : true;\n        });\n\n        attrs.$observe('paste', function() {\n          $select.paste = scope.$eval(attrs.paste);\n        });\n\n        attrs.$observe('tagging', function() {\n          if(attrs.tagging !== undefined)\n          {\n            // $eval() is needed otherwise we get a string instead of a boolean\n            var taggingEval = scope.$eval(attrs.tagging);\n            $select.tagging = {isActivated: true, fct: taggingEval !== true ? taggingEval : undefined};\n          }\n          else\n          {\n            $select.tagging = {isActivated: false, fct: undefined};\n          }\n        });\n\n        attrs.$observe('taggingLabel', function() {\n          if(attrs.tagging !== undefined )\n          {\n            // check eval for FALSE, in this case, we disable the labels\n            // associated with tagging\n            if ( attrs.taggingLabel === 'false' ) {\n              $select.taggingLabel = false;\n            }\n            else\n            {\n              $select.taggingLabel = attrs.taggingLabel !== undefined ? attrs.taggingLabel : '(new)';\n            }\n          }\n        });\n\n        attrs.$observe('taggingTokens', function() {\n          if (attrs.tagging !== undefined) {\n            var tokens = attrs.taggingTokens !== undefined ? attrs.taggingTokens.split('|') : [',','ENTER'];\n            $select.taggingTokens = {isActivated: true, tokens: tokens };\n          }\n        });\n\n        attrs.$observe('spinnerEnabled', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var spinnerEnabled = scope.$eval(attrs.spinnerEnabled);\n          $select.spinnerEnabled = spinnerEnabled !== undefined ? spinnerEnabled : uiSelectConfig.spinnerEnabled;\n        });\n\n        attrs.$observe('spinnerClass', function() {\n          var spinnerClass = attrs.spinnerClass;\n          $select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;\n        });\n\n        //Automatically gets focus when loaded\n        if (angular.isDefined(attrs.autofocus)){\n          $timeout(function(){\n            $select.setFocus();\n          });\n        }\n\n        //Gets focus based on scope event name (e.g. focus-on='SomeEventName')\n        if (angular.isDefined(attrs.focusOn)){\n          scope.$on(attrs.focusOn, function() {\n              $timeout(function(){\n                $select.setFocus();\n              });\n          });\n        }\n\n        function onDocumentClick(e) {\n          if (!$select.open) return; //Skip it if dropdown is close\n\n          var contains = false;\n\n          if (window.jQuery) {\n            // Firefox 3.6 does not support element.contains()\n            // See Node.contains https://developer.mozilla.org/en-US/docs/Web/API/Node.contains\n            contains = window.jQuery.contains(element[0], e.target);\n          } else {\n            contains = element[0].contains(e.target);\n          }\n\n          if (!contains && !$select.clickTriggeredSelect) {\n            var skipFocusser;\n            if (!$select.skipFocusser) {\n              //Will lose focus only with certain targets\n              var focusableControls = ['input','button','textarea','select'];\n              var targetController = angular.element(e.target).controller('uiSelect'); //To check if target is other ui-select\n              skipFocusser = targetController && targetController !== $select; //To check if target is other ui-select\n              if (!skipFocusser) skipFocusser =  ~focusableControls.indexOf(e.target.tagName.toLowerCase()); //Check if target is input, button or textarea\n            } else {\n              skipFocusser = true;\n            }\n            $select.close(skipFocusser);\n            scope.$digest();\n          }\n          $select.clickTriggeredSelect = false;\n        }\n\n        // See Click everywhere but here event http://stackoverflow.com/questions/12931369\n        $document.on('click', onDocumentClick);\n\n        scope.$on('$destroy', function() {\n          $document.off('click', onDocumentClick);\n        });\n\n        // Move transcluded elements to their correct position in main template\n        transcludeFn(scope, function(clone) {\n          // See Transclude in AngularJS http://blog.omkarpatil.com/2012/11/transclude-in-angularjs.html\n\n          // One day jqLite will be replaced by jQuery and we will be able to write:\n          // var transcludedElement = clone.filter('.my-class')\n          // instead of creating a hackish DOM element:\n          var transcluded = angular.element('<div>').append(clone);\n\n          var transcludedMatch = transcluded.querySelectorAll('.ui-select-match');\n          transcludedMatch.removeAttr('ui-select-match'); //To avoid loop in case directive as attr\n          transcludedMatch.removeAttr('data-ui-select-match'); // Properly handle HTML5 data-attributes\n          if (transcludedMatch.length !== 1) {\n            throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-match but got '{0}'.\", transcludedMatch.length);\n          }\n          element.querySelectorAll('.ui-select-match').replaceWith(transcludedMatch);\n\n          var transcludedChoices = transcluded.querySelectorAll('.ui-select-choices');\n          transcludedChoices.removeAttr('ui-select-choices'); //To avoid loop in case directive as attr\n          transcludedChoices.removeAttr('data-ui-select-choices'); // Properly handle HTML5 data-attributes\n          if (transcludedChoices.length !== 1) {\n            throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-choices but got '{0}'.\", transcludedChoices.length);\n          }\n          element.querySelectorAll('.ui-select-choices').replaceWith(transcludedChoices);\n\n          var transcludedNoChoice = transcluded.querySelectorAll('.ui-select-no-choice');\n          transcludedNoChoice.removeAttr('ui-select-no-choice'); //To avoid loop in case directive as attr\n          transcludedNoChoice.removeAttr('data-ui-select-no-choice'); // Properly handle HTML5 data-attributes\n          if (transcludedNoChoice.length == 1) {\n            element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice);\n          }\n        });\n\n        // Support for appending the select field to the body when its open\n        var appendToBody = scope.$eval(attrs.appendToBody);\n        if (appendToBody !== undefined ? appendToBody : uiSelectConfig.appendToBody) {\n          scope.$watch('$select.open', function(isOpen) {\n            if (isOpen) {\n              positionDropdown();\n            } else {\n              resetDropdown();\n            }\n          });\n\n          // Move the dropdown back to its original location when the scope is destroyed. Otherwise\n          // it might stick around when the user routes away or the select field is otherwise removed\n          scope.$on('$destroy', function() {\n            resetDropdown();\n          });\n        }\n\n        // Hold on to a reference to the .ui-select-container element for appendToBody support\n        var placeholder = null,\n            originalWidth = '';\n\n        function positionDropdown() {\n          // Remember the absolute position of the element\n          var offset = uisOffset(element);\n\n          // Clone the element into a placeholder element to take its original place in the DOM\n          placeholder = angular.element('<div class=\"ui-select-placeholder\"></div>');\n          placeholder[0].style.width = offset.width + 'px';\n          placeholder[0].style.height = offset.height + 'px';\n          element.after(placeholder);\n\n          // Remember the original value of the element width inline style, so it can be restored\n          // when the dropdown is closed\n          originalWidth = element[0].style.width;\n\n          // Now move the actual dropdown element to the end of the body\n          $document.find('body').append(element);\n\n          element[0].style.position = 'absolute';\n          element[0].style.left = offset.left + 'px';\n          element[0].style.top = offset.top + 'px';\n          element[0].style.width = offset.width + 'px';\n        }\n\n        function resetDropdown() {\n          if (placeholder === null) {\n            // The dropdown has not actually been display yet, so there's nothing to reset\n            return;\n          }\n\n          // Move the dropdown element back to its original location in the DOM\n          placeholder.replaceWith(element);\n          placeholder = null;\n\n          element[0].style.position = '';\n          element[0].style.left = '';\n          element[0].style.top = '';\n          element[0].style.width = originalWidth;\n\n          // Set focus back on to the moved element\n          $select.setFocus();\n        }\n\n        // Hold on to a reference to the .ui-select-dropdown element for direction support.\n        var dropdown = null,\n            directionUpClassName = 'direction-up';\n\n        // Support changing the direction of the dropdown if there isn't enough space to render it.\n        scope.$watch('$select.open', function() {\n\n          if ($select.dropdownPosition === 'auto' || $select.dropdownPosition === 'up'){\n            scope.calculateDropdownPos();\n          }\n\n        });\n\n        var setDropdownPosUp = function(offset, offsetDropdown){\n\n          offset = offset || uisOffset(element);\n          offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n          dropdown[0].style.position = 'absolute';\n          dropdown[0].style.top = (offsetDropdown.height * -1) + 'px';\n          element.addClass(directionUpClassName);\n\n        };\n\n        var setDropdownPosDown = function(offset, offsetDropdown){\n\n          element.removeClass(directionUpClassName);\n\n          offset = offset || uisOffset(element);\n          offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n          dropdown[0].style.position = '';\n          dropdown[0].style.top = '';\n\n        };\n\n        var calculateDropdownPosAfterAnimation = function() {\n          // Delay positioning the dropdown until all choices have been added so its height is correct.\n          $timeout(function() {\n            if ($select.dropdownPosition === 'up') {\n              //Go UP\n              setDropdownPosUp();\n            } else {\n              //AUTO\n              element.removeClass(directionUpClassName);\n\n              var offset = uisOffset(element);\n              var offsetDropdown = uisOffset(dropdown);\n\n              //https://code.google.com/p/chromium/issues/detail?id=342307#c4\n              var scrollTop = $document[0].documentElement.scrollTop || $document[0].body.scrollTop; //To make it cross browser (blink, webkit, IE, Firefox).\n\n              // Determine if the direction of the dropdown needs to be changed.\n              if (offset.top + offset.height + offsetDropdown.height > scrollTop + $document[0].documentElement.clientHeight) {\n                //Go UP\n                setDropdownPosUp(offset, offsetDropdown);\n              }else{\n                //Go DOWN\n                setDropdownPosDown(offset, offsetDropdown);\n              }\n            }\n\n            // Display the dropdown once it has been positioned.\n            dropdown[0].style.opacity = 1;\n          });\n        };\n\n        var opened = false;\n        \n        scope.calculateDropdownPos = function() {\n          if ($select.open) {\n            dropdown = angular.element(element).querySelectorAll('.ui-select-dropdown');\n\n            if (dropdown.length === 0) {\n              return;\n            }\n\n           // Hide the dropdown so there is no flicker until $timeout is done executing.\n           if ($select.search === '' && !opened) {\n              dropdown[0].style.opacity = 0;\n              opened = true;\n           }\n\n            if (!uisOffset(dropdown).height && $select.$animate && $select.$animate.on && $select.$animate.enabled(dropdown)) {\n              var needsCalculated = true;\n\n              $select.$animate.on('enter', dropdown, function (elem, phase) {\n                if (phase === 'close' && needsCalculated) {\n                  calculateDropdownPosAfterAnimation();\n                  needsCalculated = false;\n                }\n              });\n            } else {\n              calculateDropdownPosAfterAnimation();\n            }\n          } else {\n            if (dropdown === null || dropdown.length === 0) {\n              return;\n            }\n\n            // Reset the position of the dropdown.\n            dropdown[0].style.opacity = 0;\n            dropdown[0].style.position = '';\n            dropdown[0].style.top = '';\n            element.removeClass(directionUpClassName);\n          }\n        };\n      };\n    }\n  };\n}]);\n\nuis.directive('uiSelectMatch', ['uiSelectConfig', function(uiSelectConfig) {\n  return {\n    restrict: 'EA',\n    require: '^uiSelect',\n    replace: true,\n    transclude: true,\n    templateUrl: function(tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-match');\n\n      var parent = tElement.parent();\n      // Gets theme attribute from parent (ui-select)\n      var theme = getAttribute(parent, 'theme') || uiSelectConfig.theme;\n      var multi = angular.isDefined(getAttribute(parent, 'multiple'));\n\n      return theme + (multi ? '/match-multiple.tpl.html' : '/match.tpl.html');      \n    },\n    link: function(scope, element, attrs, $select) {\n      $select.lockChoiceExpression = attrs.uiLockChoice;\n      attrs.$observe('placeholder', function(placeholder) {\n        $select.placeholder = placeholder !== undefined ? placeholder : uiSelectConfig.placeholder;\n      });\n\n      function setAllowClear(allow) {\n        $select.allowClear = (angular.isDefined(allow)) ? (allow === '') ? true : (allow.toLowerCase() === 'true') : false;\n      }\n\n      attrs.$observe('allowClear', setAllowClear);\n      setAllowClear(attrs.allowClear);\n\n      if($select.multiple){\n        $select.sizeSearchInput();\n      }\n\n    }\n  };\n\n  function getAttribute(elem, attribute) {\n    if (elem[0].hasAttribute(attribute))\n      return elem.attr(attribute);\n\n    if (elem[0].hasAttribute('data-' + attribute))\n      return elem.attr('data-' + attribute);\n\n    if (elem[0].hasAttribute('x-' + attribute))\n      return elem.attr('x-' + attribute);\n  }\n}]);\n\nuis.directive('uiSelectMultiple', ['uiSelectMinErr','$timeout', function(uiSelectMinErr, $timeout) {\n  return {\n    restrict: 'EA',\n    require: ['^uiSelect', '^ngModel'],\n\n    controller: ['$scope','$timeout', function($scope, $timeout){\n\n      var ctrl = this,\n          $select = $scope.$select,\n          ngModel;\n\n      if (angular.isUndefined($select.selected))\n        $select.selected = [];\n\n      //Wait for link fn to inject it\n      $scope.$evalAsync(function(){ ngModel = $scope.ngModel; });\n\n      ctrl.activeMatchIndex = -1;\n\n      ctrl.updateModel = function(){\n        ngModel.$setViewValue(Date.now()); //Set timestamp as a unique string to force changes\n        ctrl.refreshComponent();\n      };\n\n      ctrl.refreshComponent = function(){\n        //Remove already selected items\n        //e.g. When user clicks on a selection, the selected array changes and\n        //the dropdown should remove that item\n        if($select.refreshItems){\n          $select.refreshItems();\n        }\n        if($select.sizeSearchInput){\n          $select.sizeSearchInput();\n        }\n      };\n\n      // Remove item from multiple select\n      ctrl.removeChoice = function(index){\n\n        // if the choice is locked, don't remove it\n        if($select.isLocked(null, index)) return false;\n\n        var removedChoice = $select.selected[index];\n\n        var locals = {};\n        locals[$select.parserResult.itemName] = removedChoice;\n\n        $select.selected.splice(index, 1);\n        ctrl.activeMatchIndex = -1;\n        $select.sizeSearchInput();\n\n        // Give some time for scope propagation.\n        $timeout(function(){\n          $select.onRemoveCallback($scope, {\n            $item: removedChoice,\n            $model: $select.parserResult.modelMapper($scope, locals)\n          });\n        });\n\n        ctrl.updateModel();\n\n        return true;\n      };\n\n      ctrl.getPlaceholder = function(){\n        //Refactor single?\n        if($select.selected && $select.selected.length) return;\n        return $select.placeholder;\n      };\n\n\n    }],\n    controllerAs: '$selectMultiple',\n\n    link: function(scope, element, attrs, ctrls) {\n\n      var $select = ctrls[0];\n      var ngModel = scope.ngModel = ctrls[1];\n      var $selectMultiple = scope.$selectMultiple;\n\n      //$select.selected = raw selected objects (ignoring any property binding)\n\n      $select.multiple = true;\n\n      //Input that will handle focus\n      $select.focusInput = $select.searchInput;\n\n      //Properly check for empty if set to multiple\n      ngModel.$isEmpty = function(value) {\n        return !value || value.length === 0;\n      };\n\n      //From view --> model\n      ngModel.$parsers.unshift(function () {\n        var locals = {},\n            result,\n            resultMultiple = [];\n        for (var j = $select.selected.length - 1; j >= 0; j--) {\n          locals = {};\n          locals[$select.parserResult.itemName] = $select.selected[j];\n          result = $select.parserResult.modelMapper(scope, locals);\n          resultMultiple.unshift(result);\n        }\n        return resultMultiple;\n      });\n\n      // From model --> view\n      ngModel.$formatters.unshift(function (inputValue) {\n        var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n            locals = {},\n            result;\n        if (!data) return inputValue;\n        var resultMultiple = [];\n        var checkFnMultiple = function(list, value){\n          if (!list || !list.length) return;\n          for (var p = list.length - 1; p >= 0; p--) {\n            locals[$select.parserResult.itemName] = list[p];\n            result = $select.parserResult.modelMapper(scope, locals);\n            if($select.parserResult.trackByExp){\n                var propsItemNameMatches = /(\\w*)\\./.exec($select.parserResult.trackByExp);\n                var matches = /\\.([^\\s]+)/.exec($select.parserResult.trackByExp);\n                if(propsItemNameMatches && propsItemNameMatches.length > 0 && propsItemNameMatches[1] == $select.parserResult.itemName){\n                  if(matches && matches.length>0 && result[matches[1]] == value[matches[1]]){\n                      resultMultiple.unshift(list[p]);\n                      return true;\n                  }\n                }\n            }\n            if (angular.equals(result,value)){\n              resultMultiple.unshift(list[p]);\n              return true;\n            }\n          }\n          return false;\n        };\n        if (!inputValue) return resultMultiple; //If ngModel was undefined\n        for (var k = inputValue.length - 1; k >= 0; k--) {\n          //Check model array of currently selected items\n          if (!checkFnMultiple($select.selected, inputValue[k])){\n            //Check model array of all items available\n            if (!checkFnMultiple(data, inputValue[k])){\n              //If not found on previous lists, just add it directly to resultMultiple\n              resultMultiple.unshift(inputValue[k]);\n            }\n          }\n        }\n        return resultMultiple;\n      });\n\n      //Watch for external model changes\n      scope.$watchCollection(function(){ return ngModel.$modelValue; }, function(newValue, oldValue) {\n        if (oldValue != newValue){\n          //update the view value with fresh data from items, if there is a valid model value\n          if(angular.isDefined(ngModel.$modelValue)) {\n            ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n          }\n          $selectMultiple.refreshComponent();\n        }\n      });\n\n      ngModel.$render = function() {\n        // Make sure that model value is array\n        if(!angular.isArray(ngModel.$viewValue)){\n          // Have tolerance for null or undefined values\n          if (isNil(ngModel.$viewValue)){\n            ngModel.$viewValue = [];\n          } else {\n            throw uiSelectMinErr('multiarr', \"Expected model value to be array but got '{0}'\", ngModel.$viewValue);\n          }\n        }\n        $select.selected = ngModel.$viewValue;\n        $selectMultiple.refreshComponent();\n        scope.$evalAsync(); //To force $digest\n      };\n\n      scope.$on('uis:select', function (event, item) {\n        if($select.selected.length >= $select.limit) {\n          return;\n        }\n        $select.selected.push(item);\n        var locals = {};\n        locals[$select.parserResult.itemName] = item;\n\n        $timeout(function(){\n          $select.onSelectCallback(scope, {\n            $item: item,\n            $model: $select.parserResult.modelMapper(scope, locals)\n          });\n        });\n        $selectMultiple.updateModel();\n      });\n\n      scope.$on('uis:activate', function () {\n        $selectMultiple.activeMatchIndex = -1;\n      });\n\n      scope.$watch('$select.disabled', function(newValue, oldValue) {\n        // As the search input field may now become visible, it may be necessary to recompute its size\n        if (oldValue && !newValue) $select.sizeSearchInput();\n      });\n\n      $select.searchInput.on('keydown', function(e) {\n        var key = e.which;\n        scope.$apply(function() {\n          var processed = false;\n          // var tagged = false; //Checkme\n          if(KEY.isHorizontalMovement(key)){\n            processed = _handleMatchSelection(key);\n          }\n          if (processed  && key != KEY.TAB) {\n            //TODO Check si el tab selecciona aun correctamente\n            //Crear test\n            e.preventDefault();\n            e.stopPropagation();\n          }\n        });\n      });\n      function _getCaretPosition(el) {\n        if(angular.isNumber(el.selectionStart)) return el.selectionStart;\n        // selectionStart is not supported in IE8 and we don't want hacky workarounds so we compromise\n        else return el.value.length;\n      }\n      // Handles selected options in \"multiple\" mode\n      function _handleMatchSelection(key){\n        var caretPosition = _getCaretPosition($select.searchInput[0]),\n            length = $select.selected.length,\n            // none  = -1,\n            first = 0,\n            last  = length-1,\n            curr  = $selectMultiple.activeMatchIndex,\n            next  = $selectMultiple.activeMatchIndex+1,\n            prev  = $selectMultiple.activeMatchIndex-1,\n            newIndex = curr;\n\n        if(caretPosition > 0 || ($select.search.length && key == KEY.RIGHT)) return false;\n\n        $select.close();\n\n        function getNewActiveMatchIndex(){\n          switch(key){\n            case KEY.LEFT:\n              // Select previous/first item\n              if(~$selectMultiple.activeMatchIndex) return prev;\n              // Select last item\n              else return last;\n              break;\n            case KEY.RIGHT:\n              // Open drop-down\n              if(!~$selectMultiple.activeMatchIndex || curr === last){\n                $select.activate();\n                return false;\n              }\n              // Select next/last item\n              else return next;\n              break;\n            case KEY.BACKSPACE:\n              // Remove selected item and select previous/first\n              if(~$selectMultiple.activeMatchIndex){\n                if($selectMultiple.removeChoice(curr)) {\n                  return prev;\n                } else {\n                  return curr;\n                }\n\n              } else {\n                // If nothing yet selected, select last item\n                return last;\n              }\n              break;\n            case KEY.DELETE:\n              // Remove selected item and select next item\n              if(~$selectMultiple.activeMatchIndex){\n                $selectMultiple.removeChoice($selectMultiple.activeMatchIndex);\n                return curr;\n              }\n              else return false;\n          }\n        }\n\n        newIndex = getNewActiveMatchIndex();\n\n        if(!$select.selected.length || newIndex === false) $selectMultiple.activeMatchIndex = -1;\n        else $selectMultiple.activeMatchIndex = Math.min(last,Math.max(first,newIndex));\n\n        return true;\n      }\n\n      $select.searchInput.on('keyup', function(e) {\n\n        if ( ! KEY.isVerticalMovement(e.which) ) {\n          scope.$evalAsync( function () {\n            $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n          });\n        }\n        // Push a \"create new\" item into array if there is a search string\n        if ( $select.tagging.isActivated && $select.search.length > 0 ) {\n\n          // return early with these keys\n          if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || KEY.isVerticalMovement(e.which) ) {\n            return;\n          }\n          // always reset the activeIndex to the first item when tagging\n          $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n          // taggingLabel === false bypasses all of this\n          if ($select.taggingLabel === false) return;\n\n          var items = angular.copy( $select.items );\n          var stashArr = angular.copy( $select.items );\n          var newItem;\n          var item;\n          var hasTag = false;\n          var dupeIndex = -1;\n          var tagItems;\n          var tagItem;\n\n          // case for object tagging via transform `$select.tagging.fct` function\n          if ( $select.tagging.fct !== undefined) {\n            tagItems = $select.$filter('filter')(items,{'isTag': true});\n            if ( tagItems.length > 0 ) {\n              tagItem = tagItems[0];\n            }\n            // remove the first element, if it has the `isTag` prop we generate a new one with each keyup, shaving the previous\n            if ( items.length > 0 && tagItem ) {\n              hasTag = true;\n              items = items.slice(1,items.length);\n              stashArr = stashArr.slice(1,stashArr.length);\n            }\n            newItem = $select.tagging.fct($select.search);\n            // verify the new tag doesn't match the value of a possible selection choice or an already selected item.\n            if (\n              stashArr.some(function (origItem) {\n                 return angular.equals(origItem, newItem);\n              }) ||\n              $select.selected.some(function (origItem) {\n                return angular.equals(origItem, newItem);\n              })\n            ) {\n              scope.$evalAsync(function () {\n                $select.activeIndex = 0;\n                $select.items = items;\n              });\n              return;\n            }\n            if (newItem) newItem.isTag = true;\n          // handle newItem string and stripping dupes in tagging string context\n          } else {\n            // find any tagging items already in the $select.items array and store them\n            tagItems = $select.$filter('filter')(items,function (item) {\n              return item.match($select.taggingLabel);\n            });\n            if ( tagItems.length > 0 ) {\n              tagItem = tagItems[0];\n            }\n            item = items[0];\n            // remove existing tag item if found (should only ever be one tag item)\n            if ( item !== undefined && items.length > 0 && tagItem ) {\n              hasTag = true;\n              items = items.slice(1,items.length);\n              stashArr = stashArr.slice(1,stashArr.length);\n            }\n            newItem = $select.search+' '+$select.taggingLabel;\n            if ( _findApproxDupe($select.selected, $select.search) > -1 ) {\n              return;\n            }\n            // verify the the tag doesn't match the value of an existing item from\n            // the searched data set or the items already selected\n            if ( _findCaseInsensitiveDupe(stashArr.concat($select.selected)) ) {\n              // if there is a tag from prev iteration, strip it / queue the change\n              // and return early\n              if ( hasTag ) {\n                items = stashArr;\n                scope.$evalAsync( function () {\n                  $select.activeIndex = 0;\n                  $select.items = items;\n                });\n              }\n              return;\n            }\n            if ( _findCaseInsensitiveDupe(stashArr) ) {\n              // if there is a tag from prev iteration, strip it\n              if ( hasTag ) {\n                $select.items = stashArr.slice(1,stashArr.length);\n              }\n              return;\n            }\n          }\n          if ( hasTag ) dupeIndex = _findApproxDupe($select.selected, newItem);\n          // dupe found, shave the first item\n          if ( dupeIndex > -1 ) {\n            items = items.slice(dupeIndex+1,items.length-1);\n          } else {\n            items = [];\n            if (newItem) items.push(newItem);\n            items = items.concat(stashArr);\n          }\n          scope.$evalAsync( function () {\n            $select.activeIndex = 0;\n            $select.items = items;\n\n            if ($select.isGrouped) {\n              // update item references in groups, so that indexOf will work after angular.copy\n              var itemsWithoutTag = newItem ? items.slice(1) : items;\n              $select.setItemsFn(itemsWithoutTag);\n              if (newItem) {\n                // add tag item as a new group\n                $select.items.unshift(newItem);\n                $select.groups.unshift({name: '', items: [newItem], tagging: true});\n              }\n            }\n          });\n        }\n      });\n      function _findCaseInsensitiveDupe(arr) {\n        if ( arr === undefined || $select.search === undefined ) {\n          return false;\n        }\n        var hasDupe = arr.filter( function (origItem) {\n          if ( $select.search.toUpperCase() === undefined || origItem === undefined ) {\n            return false;\n          }\n          return origItem.toUpperCase() === $select.search.toUpperCase();\n        }).length > 0;\n\n        return hasDupe;\n      }\n      function _findApproxDupe(haystack, needle) {\n        var dupeIndex = -1;\n        if(angular.isArray(haystack)) {\n          var tempArr = angular.copy(haystack);\n          for (var i = 0; i <tempArr.length; i++) {\n            // handle the simple string version of tagging\n            if ( $select.tagging.fct === undefined ) {\n              // search the array for the match\n              if ( tempArr[i]+' '+$select.taggingLabel === needle ) {\n              dupeIndex = i;\n              }\n            // handle the object tagging implementation\n            } else {\n              var mockObj = tempArr[i];\n              if (angular.isObject(mockObj)) {\n                mockObj.isTag = true;\n              }\n              if ( angular.equals(mockObj, needle) ) {\n                dupeIndex = i;\n              }\n            }\n          }\n        }\n        return dupeIndex;\n      }\n\n      $select.searchInput.on('blur', function() {\n        $timeout(function() {\n          $selectMultiple.activeMatchIndex = -1;\n        });\n      });\n\n    }\n  };\n}]);\n\nuis.directive('uiSelectNoChoice',\n    ['uiSelectConfig', function (uiSelectConfig) {\n        return {\n            restrict: 'EA',\n            require: '^uiSelect',\n            replace: true,\n            transclude: true,\n            templateUrl: function (tElement) {\n                // Needed so the uiSelect can detect the transcluded content\n                tElement.addClass('ui-select-no-choice');\n      \n                // Gets theme attribute from parent (ui-select)\n                var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n                return theme + '/no-choice.tpl.html';\n            }\n        };\n    }]);\n\nuis.directive('uiSelectSingle', ['$timeout','$compile', function($timeout, $compile) {\n  return {\n    restrict: 'EA',\n    require: ['^uiSelect', '^ngModel'],\n    link: function(scope, element, attrs, ctrls) {\n\n      var $select = ctrls[0];\n      var ngModel = ctrls[1];\n\n      //From view --> model\n      ngModel.$parsers.unshift(function (inputValue) {\n        // Keep original value for undefined and null\n        if (isNil(inputValue)) {\n          return inputValue;\n        }\n\n        var locals = {},\n            result;\n        locals[$select.parserResult.itemName] = inputValue;\n        result = $select.parserResult.modelMapper(scope, locals);\n        return result;\n      });\n\n      //From model --> view\n      ngModel.$formatters.unshift(function (inputValue) {\n        // Keep original value for undefined and null\n        if (isNil(inputValue)) {\n          return inputValue;\n        }\n\n        var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n            locals = {},\n            result;\n        if (data){\n          var checkFnSingle = function(d){\n            locals[$select.parserResult.itemName] = d;\n            result = $select.parserResult.modelMapper(scope, locals);\n            return result === inputValue;\n          };\n          //If possible pass same object stored in $select.selected\n          if ($select.selected && checkFnSingle($select.selected)) {\n            return $select.selected;\n          }\n          for (var i = data.length - 1; i >= 0; i--) {\n            if (checkFnSingle(data[i])) return data[i];\n          }\n        }\n        return inputValue;\n      });\n\n      //Update viewValue if model change\n      scope.$watch('$select.selected', function(newValue) {\n        if (ngModel.$viewValue !== newValue) {\n          ngModel.$setViewValue(newValue);\n        }\n      });\n\n      ngModel.$render = function() {\n        $select.selected = ngModel.$viewValue;\n      };\n\n      scope.$on('uis:select', function (event, item) {\n        $select.selected = item;\n        var locals = {};\n        locals[$select.parserResult.itemName] = item;\n\n        $timeout(function() {\n          $select.onSelectCallback(scope, {\n            $item: item,\n            $model: isNil(item) ? item : $select.parserResult.modelMapper(scope, locals)\n          });\n        });\n      });\n\n      scope.$on('uis:close', function (event, skipFocusser) {\n        $timeout(function(){\n          $select.focusser.prop('disabled', false);\n          if (!skipFocusser) $select.focusser[0].focus();\n        },0,false);\n      });\n\n      scope.$on('uis:activate', function () {\n        focusser.prop('disabled', true); //Will reactivate it on .close()\n      });\n\n      //Idea from: https://github.com/ivaynberg/select2/blob/79b5bf6db918d7560bdd959109b7bcfb47edaf43/select2.js#L1954\n      var focusser = angular.element(\"<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />\");\n      $compile(focusser)(scope);\n      $select.focusser = focusser;\n\n      //Input that will handle focus\n      $select.focusInput = focusser;\n\n      element.parent().append(focusser);\n      focusser.bind(\"focus\", function(){\n        scope.$evalAsync(function(){\n          $select.focus = true;\n        });\n      });\n      focusser.bind(\"blur\", function(){\n        scope.$evalAsync(function(){\n          $select.focus = false;\n        });\n      });\n      focusser.bind(\"keydown\", function(e){\n\n        if (e.which === KEY.BACKSPACE && $select.backspaceReset !== false) {\n          e.preventDefault();\n          e.stopPropagation();\n          $select.select(undefined);\n          scope.$apply();\n          return;\n        }\n\n        if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n          return;\n        }\n\n        if (e.which == KEY.DOWN  || e.which == KEY.UP || e.which == KEY.ENTER || e.which == KEY.SPACE){\n          e.preventDefault();\n          e.stopPropagation();\n          $select.activate();\n        }\n\n        scope.$digest();\n      });\n\n      focusser.bind(\"keyup input\", function(e){\n\n        if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || e.which == KEY.ENTER || e.which === KEY.BACKSPACE) {\n          return;\n        }\n\n        $select.activate(focusser.val()); //User pressed some regular key, so we pass it to the search input\n        focusser.val('');\n        scope.$digest();\n\n      });\n\n\n    }\n  };\n}]);\n\n// Make multiple matches sortable\nuis.directive('uiSelectSort', ['$timeout', 'uiSelectConfig', 'uiSelectMinErr', function($timeout, uiSelectConfig, uiSelectMinErr) {\n  return {\n    require: ['^^uiSelect', '^ngModel'],\n    link: function(scope, element, attrs, ctrls) {\n      if (scope[attrs.uiSelectSort] === null) {\n        throw uiSelectMinErr('sort', 'Expected a list to sort');\n      }\n\n      var $select = ctrls[0];\n      var $ngModel = ctrls[1];\n\n      var options = angular.extend({\n          axis: 'horizontal'\n        },\n        scope.$eval(attrs.uiSelectSortOptions));\n\n      var axis = options.axis;\n      var draggingClassName = 'dragging';\n      var droppingClassName = 'dropping';\n      var droppingBeforeClassName = 'dropping-before';\n      var droppingAfterClassName = 'dropping-after';\n\n      scope.$watch(function(){\n        return $select.sortable;\n      }, function(newValue){\n        if (newValue) {\n          element.attr('draggable', true);\n        } else {\n          element.removeAttr('draggable');\n        }\n      });\n\n      element.on('dragstart', function(event) {\n        element.addClass(draggingClassName);\n\n        (event.dataTransfer || event.originalEvent.dataTransfer).setData('text', scope.$index.toString());\n      });\n\n      element.on('dragend', function() {\n        removeClass(draggingClassName);\n      });\n\n      var move = function(from, to) {\n        /*jshint validthis: true */\n        this.splice(to, 0, this.splice(from, 1)[0]);\n      };\n\n      var removeClass = function(className) {\n        angular.forEach($select.$element.querySelectorAll('.' + className), function(el){\n          angular.element(el).removeClass(className);\n        });\n      };\n\n      var dragOverHandler = function(event) {\n        event.preventDefault();\n\n        var offset = axis === 'vertical' ? event.offsetY || event.layerY || (event.originalEvent ? event.originalEvent.offsetY : 0) : event.offsetX || event.layerX || (event.originalEvent ? event.originalEvent.offsetX : 0);\n\n        if (offset < (this[axis === 'vertical' ? 'offsetHeight' : 'offsetWidth'] / 2)) {\n          removeClass(droppingAfterClassName);\n          element.addClass(droppingBeforeClassName);\n\n        } else {\n          removeClass(droppingBeforeClassName);\n          element.addClass(droppingAfterClassName);\n        }\n      };\n\n      var dropTimeout;\n\n      var dropHandler = function(event) {\n        event.preventDefault();\n\n        var droppedItemIndex = parseInt((event.dataTransfer || event.originalEvent.dataTransfer).getData('text'), 10);\n\n        // prevent event firing multiple times in firefox\n        $timeout.cancel(dropTimeout);\n        dropTimeout = $timeout(function() {\n          _dropHandler(droppedItemIndex);\n        }, 20);\n      };\n\n      var _dropHandler = function(droppedItemIndex) {\n        var theList = scope.$eval(attrs.uiSelectSort);\n        var itemToMove = theList[droppedItemIndex];\n        var newIndex = null;\n\n        if (element.hasClass(droppingBeforeClassName)) {\n          if (droppedItemIndex < scope.$index) {\n            newIndex = scope.$index - 1;\n          } else {\n            newIndex = scope.$index;\n          }\n        } else {\n          if (droppedItemIndex < scope.$index) {\n            newIndex = scope.$index;\n          } else {\n            newIndex = scope.$index + 1;\n          }\n        }\n\n        move.apply(theList, [droppedItemIndex, newIndex]);\n\n        $ngModel.$setViewValue(Date.now());\n\n        scope.$apply(function() {\n          scope.$emit('uiSelectSort:change', {\n            array: theList,\n            item: itemToMove,\n            from: droppedItemIndex,\n            to: newIndex\n          });\n        });\n\n        removeClass(droppingClassName);\n        removeClass(droppingBeforeClassName);\n        removeClass(droppingAfterClassName);\n\n        element.off('drop', dropHandler);\n      };\n\n      element.on('dragenter', function() {\n        if (element.hasClass(draggingClassName)) {\n          return;\n        }\n\n        element.addClass(droppingClassName);\n\n        element.on('dragover', dragOverHandler);\n        element.on('drop', dropHandler);\n      });\n\n      element.on('dragleave', function(event) {\n        if (event.target != element) {\n          return;\n        }\n\n        removeClass(droppingClassName);\n        removeClass(droppingBeforeClassName);\n        removeClass(droppingAfterClassName);\n\n        element.off('dragover', dragOverHandler);\n        element.off('drop', dropHandler);\n      });\n    }\n  };\n}]);\n\nuis.directive('uisOpenClose', ['$parse', '$timeout', function ($parse, $timeout) {\n  return {\n    restrict: 'A',\n    require: 'uiSelect',\n    link: function (scope, element, attrs, $select) {\n      $select.onOpenCloseCallback = $parse(attrs.uisOpenClose);\n\n      scope.$watch('$select.open', function (isOpen, previousState) {\n        if (isOpen !== previousState) {\n          $timeout(function () {\n            $select.onOpenCloseCallback(scope, {\n              isOpen: isOpen\n            });\n          });\n        }\n      });\n    }\n  };\n}]);\n\n/**\n * Parses \"repeat\" attribute.\n *\n * Taken from AngularJS ngRepeat source code\n * See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L211\n *\n * Original discussion about parsing \"repeat\" attribute instead of fully relying on ng-repeat:\n * https://github.com/angular-ui/ui-select/commit/5dd63ad#commitcomment-5504697\n */\n\nuis.service('uisRepeatParser', ['uiSelectMinErr','$parse', function(uiSelectMinErr, $parse) {\n  var self = this;\n\n  /**\n   * Example:\n   * expression = \"address in addresses | filter: {street: $select.search} track by $index\"\n   * itemName = \"address\",\n   * source = \"addresses | filter: {street: $select.search}\",\n   * trackByExp = \"$index\",\n   */\n  self.parse = function(expression) {\n\n\n    var match;\n    //var isObjectCollection = /\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)/.test(expression);\n    // If an array is used as collection\n\n    // if (isObjectCollection){\n    // 000000000000000000000000000000111111111000000000000000222222222222220033333333333333333333330000444444444444444444000000000000000055555555555000000000000000000000066666666600000000\n    match = expression.match(/^\\s*(?:([\\s\\S]+?)\\s+as\\s+)?(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(\\s*[\\s\\S]+?)?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n    // 1 Alias\n    // 2 Item\n    // 3 Key on (key,value)\n    // 4 Value on (key,value)\n    // 5 Source expression (including filters)\n    // 6 Track by\n\n    if (!match) {\n      throw uiSelectMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n              expression);\n    }\n    \n    var source = match[5], \n        filters = '';\n\n    // When using (key,value) ui-select requires filters to be extracted, since the object\n    // is converted to an array for $select.items \n    // (in which case the filters need to be reapplied)\n    if (match[3]) {\n      // Remove any enclosing parenthesis\n      source = match[5].replace(/(^\\()|(\\)$)/g, '');\n      // match all after | but not after ||\n      var filterMatch = match[5].match(/^\\s*(?:[\\s\\S]+?)(?:[^\\|]|\\|\\|)+([\\s\\S]*)\\s*$/);\n      if(filterMatch && filterMatch[1].trim()) {\n        filters = filterMatch[1];\n        source = source.replace(filters, '');\n      }      \n    }\n\n    return {\n      itemName: match[4] || match[2], // (lhs) Left-hand side,\n      keyName: match[3], //for (key, value) syntax\n      source: $parse(source),\n      filters: filters,\n      trackByExp: match[6],\n      modelMapper: $parse(match[1] || match[4] || match[2]),\n      repeatExpression: function (grouped) {\n        var expression = this.itemName + ' in ' + (grouped ? '$group.items' : '$select.items');\n        if (this.trackByExp) {\n          expression += ' track by ' + this.trackByExp;\n        }\n        return expression;\n      } \n    };\n\n  };\n\n  self.getGroupNgRepeatExpression = function() {\n    return '$group in $select.groups track by $group.name';\n  };\n\n}]);\n\n}());\nangular.module(\"ui.select\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"bootstrap/choices.tpl.html\",\"<ul class=\\\"ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu\\\" ng-show=\\\"$select.open && $select.items.length > 0\\\"><li class=\\\"ui-select-choices-group\\\" id=\\\"ui-select-choices-{{ $select.generatedId }}\\\"><div class=\\\"divider\\\" ng-show=\\\"$select.isGrouped && $index > 0\\\"></div><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label dropdown-header\\\" ng-bind=\\\"$group.name\\\"></div><div ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\" role=\\\"option\\\"><span class=\\\"ui-select-choices-row-inner\\\"></span></div></li></ul>\");\n$templateCache.put(\"bootstrap/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><span ng-repeat=\\\"$item in $select.selected track by $index\\\"><span class=\\\"ui-select-match-item btn btn-default btn-xs\\\" tabindex=\\\"-1\\\" type=\\\"button\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'btn-primary\\':$selectMultiple.activeMatchIndex === $index, \\'select-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"close ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&nbsp;&times;</span> <span uis-transclude-append=\\\"\\\"></span></span></span></span>\");\n$templateCache.put(\"bootstrap/match.tpl.html\",\"<div class=\\\"ui-select-match\\\" ng-hide=\\\"$select.open && $select.searchEnabled\\\" ng-disabled=\\\"$select.disabled\\\" ng-class=\\\"{\\'btn-default-focus\\':$select.focus}\\\"><span tabindex=\\\"-1\\\" class=\\\"btn btn-default form-control ui-select-toggle\\\" aria-label=\\\"{{ $select.baseTitle }} activate\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" style=\\\"outline: 0;\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"ui-select-match-text pull-left\\\" ng-class=\\\"{\\'ui-select-allow-clear\\': $select.allowClear && !$select.isEmpty()}\\\" ng-transclude=\\\"\\\"></span> <i class=\\\"caret pull-right\\\" ng-click=\\\"$select.toggle($event)\\\"></i> <a ng-show=\\\"$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)\\\" aria-label=\\\"{{ $select.baseTitle }} clear\\\" style=\\\"margin-right: 10px\\\" ng-click=\\\"$select.clear($event)\\\" class=\\\"btn btn-xs btn-link pull-right\\\"><i class=\\\"glyphicon glyphicon-remove\\\" aria-hidden=\\\"true\\\"></i></a></span></div>\");\n$templateCache.put(\"bootstrap/no-choice.tpl.html\",\"<ul class=\\\"ui-select-no-choice dropdown-menu\\\" ng-show=\\\"$select.items.length == 0\\\"><li ng-transclude=\\\"\\\"></li></ul>\");\n$templateCache.put(\"bootstrap/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\\\" ng-class=\\\"{open: $select.open}\\\"><div><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" class=\\\"ui-select-search input-xs\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" ng-model=\\\"$select.search\\\" role=\\\"combobox\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{$select.baseTitle}}\\\" ng-class=\\\"{\\'spinner\\': $select.refreshing}\\\" ondrop=\\\"return false;\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"bootstrap/select.tpl.html\",\"<div class=\\\"ui-select-container ui-select-bootstrap dropdown\\\" ng-class=\\\"{open: $select.open}\\\"><div class=\\\"ui-select-match\\\"></div><span ng-show=\\\"$select.open && $select.refreshing && $select.spinnerEnabled\\\" class=\\\"ui-select-refreshing {{$select.spinnerClass}}\\\"></span> <input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" aria-expanded=\\\"true\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" class=\\\"form-control ui-select-search\\\" ng-class=\\\"{ \\'ui-select-search-hidden\\' : !$select.searchEnabled }\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-show=\\\"$select.open\\\"><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"select2/choices.tpl.html\",\"<ul tabindex=\\\"-1\\\" class=\\\"ui-select-choices ui-select-choices-content select2-results\\\"><li class=\\\"ui-select-choices-group\\\" ng-class=\\\"{\\'select2-result-with-children\\': $select.choiceGrouped($group) }\\\"><div ng-show=\\\"$select.choiceGrouped($group)\\\" class=\\\"ui-select-choices-group-label select2-result-label\\\" ng-bind=\\\"$group.name\\\"></div><ul id=\\\"ui-select-choices-{{ $select.generatedId }}\\\" ng-class=\\\"{\\'select2-result-sub\\': $select.choiceGrouped($group), \\'select2-result-single\\': !$select.choiceGrouped($group) }\\\"><li role=\\\"option\\\" ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{\\'select2-highlighted\\': $select.isActive(this), \\'select2-disabled\\': $select.isDisabled(this)}\\\"><div class=\\\"select2-result-label ui-select-choices-row-inner\\\"></div></li></ul></li></ul>\");\n$templateCache.put(\"select2/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><li class=\\\"ui-select-match-item select2-search-choice\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-class=\\\"{\\'select2-search-choice-focus\\':$selectMultiple.activeMatchIndex === $index, \\'select2-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span uis-transclude-append=\\\"\\\"></span> <a href=\\\"javascript:;\\\" class=\\\"ui-select-match-close select2-search-choice-close\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\" tabindex=\\\"-1\\\"></a></li></span>\");\n$templateCache.put(\"select2/match.tpl.html\",\"<a class=\\\"select2-choice ui-select-match\\\" ng-class=\\\"{\\'select2-default\\': $select.isEmpty()}\\\" ng-click=\\\"$select.toggle($event)\\\" aria-label=\\\"{{ $select.baseTitle }} select\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\" ng-transclude=\\\"\\\"></span> <abbr ng-if=\\\"$select.allowClear && !$select.isEmpty()\\\" class=\\\"select2-search-choice-close\\\" ng-click=\\\"$select.clear($event)\\\"></abbr> <span class=\\\"select2-arrow ui-select-toggle\\\"><b></b></span></a>\");\n$templateCache.put(\"select2/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"select2/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled}\\\"><ul class=\\\"select2-choices\\\"><span class=\\\"ui-select-match\\\"></span><li class=\\\"select2-search-field\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-activedescendant=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\\\" class=\\\"select2-input ui-select-search\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-hide=\\\"$select.disabled\\\" ng-model=\\\"$select.search\\\" ng-click=\\\"$select.activate()\\\" style=\\\"width: 34px;\\\" ondrop=\\\"return false;\\\"></li></ul><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open || $select.items.length === 0}\\\"><div class=\\\"ui-select-choices\\\"></div></div></div>\");\n$templateCache.put(\"select2/select.tpl.html\",\"<div class=\\\"ui-select-container select2 select2-container\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled, \\'select2-container-active\\': $select.focus, \\'select2-allowclear\\': $select.allowClear && !$select.isEmpty()}\\\"><div class=\\\"ui-select-match\\\"></div><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open}\\\"><div class=\\\"search-container\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled, \\'select2-search\\':$select.searchEnabled}\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" ng-class=\\\"{\\'select2-active\\': $select.refreshing}\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" class=\\\"ui-select-search select2-input\\\" ng-model=\\\"$select.search\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div></div>\");\n$templateCache.put(\"selectize/choices.tpl.html\",\"<div ng-show=\\\"$select.open\\\" class=\\\"ui-select-choices ui-select-dropdown selectize-dropdown\\\" ng-class=\\\"{\\'single\\': !$select.multiple, \\'multi\\': $select.multiple}\\\"><div class=\\\"ui-select-choices-content selectize-dropdown-content\\\"><div class=\\\"ui-select-choices-group optgroup\\\"><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label optgroup-header\\\" ng-bind=\\\"$group.name\\\"></div><div role=\\\"option\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\"><div class=\\\"option ui-select-choices-row-inner\\\" data-selectable=\\\"\\\"></div></div></div></div></div>\");\n$templateCache.put(\"selectize/match-multiple.tpl.html\",\"<div class=\\\"ui-select-match\\\" data-value=\\\"\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'active\\':$selectMultiple.activeMatchIndex === $index}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"ui-select-match-item\\\" ng-class=\\\"{\\'select-locked\\':$select.isLocked(this, $index)}\\\"><span uis-transclude-append=\\\"\\\"></span> <span class=\\\"remove ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&times;</span></span></div>\");\n$templateCache.put(\"selectize/match.tpl.html\",\"<div ng-hide=\\\"$select.searchEnabled && ($select.open || $select.isEmpty())\\\" class=\\\"ui-select-match\\\"><span ng-show=\\\"!$select.searchEnabled && ($select.isEmpty() || $select.open)\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty() || $select.open\\\" ng-transclude=\\\"\\\"></span></div>\");\n$templateCache.put(\"selectize/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice selectize-dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"selectize-dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"selectize/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container selectize-control multi plugin-remove_button\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" placeholder=\\\"{{$selectMultiple.getPlaceholder()}}\\\" ng-model=\\\"$select.search\\\" ng-disabled=\\\"$select.disabled\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" ondrop=\\\"return false;\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"selectize/select.tpl.html\",\"<div class=\\\"ui-select-container selectize-control single\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search ui-select-toggle\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" ng-click=\\\"$select.toggle($event)\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-hide=\\\"!$select.isEmpty() && !$select.open\\\" ng-disabled=\\\"$select.disabled\\\" aria-label=\\\"{{ $select.baseTitle }}\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");}]);",null,null]}
\ No newline at end of file
+{"version":3,"sources":["select.js","select_without_templates.js","templates.js"],"names":["isNil","value","angular","isUndefined","KEY","TAB","ENTER","ESC","SPACE","LEFT","UP","RIGHT","DOWN","SHIFT","CTRL","ALT","PAGE_UP","PAGE_DOWN","HOME","END","BACKSPACE","DELETE","COMMAND","MAP","91","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","43","44","45","46","48","49","50","51","52","53","54","55","56","57","59","61","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","186","187","188","189","190","191","192","219","220","221","222","isControl","e","k","which","metaKey","ctrlKey","altKey","isFunctionKey","isVerticalMovement","indexOf","isHorizontalMovement","toSeparator","sep","undefined","element","prototype","querySelectorAll","selector","this","closest","elem","matchesSelector","matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","bind","parentElement","latestId","uis","module","constant","theme","searchEnabled","sortable","placeholder","refreshDelay","closeOnSelect","skipFocusser","dropdownPosition","removeSelected","resetSearchInput","generateId","appendToBody","spinnerEnabled","spinnerClass","backspaceReset","trim","service","minErr","$$minErr","error","apply","arguments","message","replace","RegExp","Error","directive","link","scope","attrs","ctrl","transclude","clone","append","filter","escapeRegexp","queryToEscape","matchItem","query","factory","$document","$window","boundingClientRect","getBoundingClientRect","width","prop","height","top","pageYOffset","documentElement","scrollTop","left","pageXOffset","scrollLeft","uiSelectConfig","RepeatParser","uiSelectMinErr","$compile","restrict","require","templateUrl","tElement","addClass","parent","attr","compile","tAttrs","repeat","groupByExp","groupBy","groupFilterExp","groupFilter","groups","length","getGroupNgRepeatExpression","parserResult","parse","choices","repeatExpression","rowsInner","clickTarget","document","addEventListener","itemName","$select","parseRepeatAttr","disableChoiceExpression","uiDisableChoice","onHighlightCallback","onHighlight","minimumInputLength","parseInt","position","toLowerCase","$watch","newValue","open","multiple","activate","activeIndex","tagging","isActivated","search","refresh","items","$observe","$eval","removeAttr","controller","$scope","$element","$timeout","$filter","$$uisDebounce","$parse","$injector","_findIndex","collection","predicate","thisArg","findIndex","list","Object","i","call","_resetSearchInput","EMPTY_SEARCH","selected","item","equals","_groupsFilter","groupNames","j","result","name","push","_updateItemDisabled","isDisabled","disabledItemIndex","disabledItems","splice","_isItemDisabled","_initaliseLockedChoices","doInitalise","_updateItemLocked","isLocked","lockedItemIndex","lockedItems","_isItemlocked","itemScope","itemIndex","lockChoiceExpression","_handleDropDownSelection","key","processed","idx","idxmin","select","close","_ensureHighlightVisible","container","highlighted","posY","offsetTop","clientHeight","offsetHeight","isGrouped","paste","refreshing","focus","disabled","focusser","fct","taggingTokens","tokens","clickTriggeredSelect","$animate","get","err","searchInput","isEmpty","getPlaceholder","initSearchValue","avoidReset","$broadcast","taggingLabel","on","enabled","animateHandler","phase","off","focusSearchInput","findGroupByName","noStrict","group","repeatAttr","updateGroups","groupFn","forEach","groupName","isFunction","groupFilterFn","isArray","concat","setPlainItems","setItemsFn","itemProperty","originalSource","source","createArrayFromObject","origSrc","$uisSource","keys","map","v","keyName","filters","newVal","oldVal","refreshItems","data","selectedItems","filteredItems","every","selectedItem","calculateDropdownPos","$watchCollection","isDefined","ngModel","$modelValue","_refreshDelayPromise","refreshAttr","cancel","refreshPromise","then","isActive","_isItemSelected","selection","isTag","$event","type","$setTouched","setFocus","focusInput","clear","stopPropagation","toggle","preventDefault","sizeWatch","updaterScheduled","sizeSearchInput","input","calculateContainerWidth","clientWidth","offsetParent","updateIfVisible","containerWidth","inputWidth","offsetLeft","css","$$postDigest","noop","$apply","tagged","keyCode","triggerHandler","newItem","window","clipboardData","getData","originalEvent","separator","split","oldsearch","onResize","$on","find","generatedId","uisOffset","controllerAs","match","exec","ngClass","combined","inputId","id","ctrls","transcludeFn","onDocumentClick","contains","jQuery","target","focusableControls","targetController","tagName","$digest","positionDropdown","offset","style","after","originalWidth","resetDropdown","replaceWith","baseTitle","title","focusserTitle","focusserId","onSelectCallback","onSelect","onRemoveCallback","onRemove","choiceGrouped","tabindex","limit","taggingEval","autofocus","focusOn","removeEventListener","transcluded","transcludedMatch","transcludedChoices","transcludedNoChoice","transcludedHeader","remove","transcludedFooter","isOpen","dropdown","directionUpClassName","setDropdownPosUp","offsetDropdown","setDropdownPosDown","removeClass","calculateDropdownPosAfterAnimation","body","opacity","opened","needsCalculated","isEnabled","getElements","console","enableClick","hasClass","text","disableClick","getAttribute","attribute","hasAttribute","multi","setAllowClear","allow","allowClear","uiLockChoice","$evalAsync","activeMatchIndex","updateModel","$setViewValue","Date","now","refreshComponent","removeChoice","index","removedChoice","locals","$item","$model","modelMapper","_getCaretPosition","el","isNumber","selectionStart","_handleMatchSelection","getNewActiveMatchIndex","$selectMultiple","prev","last","curr","next","caretPosition","first","newIndex","Math","min","max","_findCaseInsensitiveDupe","arr","hasDupe","origItem","toUpperCase","_findApproxDupe","haystack","needle","dupeIndex","tempArr","copy","mockObj","isObject","$isEmpty","$parsers","unshift","resultMultiple","$formatters","inputValue","checkFnMultiple","p","trackByExp","propsItemNameMatches","oldValue","$render","$viewValue","event","tagItems","tagItem","stashArr","hasTag","slice","some","itemsWithoutTag","checkFnSingle","d","val","uiSelectSort","$ngModel","options","extend","axis","uiSelectSortOptions","draggingClassName","droppingClassName","droppingBeforeClassName","droppingAfterClassName","dataTransfer","setData","$index","toString","dropTimeout","move","from","to","className","dragOverHandler","offsetY","layerY","offsetX","layerX","dropHandler","droppedItemIndex","_dropHandler","theList","itemToMove","$emit","array","callback","debounceTime","timeoutPromise","self","args","Array","onOpenCloseCallback","uisOpenClose","previousState","expression","filterMatch","grouped","run","$templateCache","put"],"mappings":"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","file":"select.min.js","sourcesContent":["/*!\n * ui-select\n * http://github.com/angular-ui/ui-select\n * Version: 0.19.8 - 2018-08-29T07:07:49.652Z\n * License: MIT\n */\n\n\n(function () { \n\"use strict\";\nvar KEY = {\n    TAB: 9,\n    ENTER: 13,\n    ESC: 27,\n    SPACE: 32,\n    LEFT: 37,\n    UP: 38,\n    RIGHT: 39,\n    DOWN: 40,\n    SHIFT: 16,\n    CTRL: 17,\n    ALT: 18,\n    PAGE_UP: 33,\n    PAGE_DOWN: 34,\n    HOME: 36,\n    END: 35,\n    BACKSPACE: 8,\n    DELETE: 46,\n    COMMAND: 91,\n\n    MAP: { 91 : \"COMMAND\", 8 : \"BACKSPACE\" , 9 : \"TAB\" , 13 : \"ENTER\" , 16 : \"SHIFT\" , 17 : \"CTRL\" , 18 : \"ALT\" , 19 : \"PAUSEBREAK\" , 20 : \"CAPSLOCK\" , 27 : \"ESC\" , 32 : \"SPACE\" , 33 : \"PAGE_UP\", 34 : \"PAGE_DOWN\" , 35 : \"END\" , 36 : \"HOME\" , 37 : \"LEFT\" , 38 : \"UP\" , 39 : \"RIGHT\" , 40 : \"DOWN\" , 43 : \"+\" , 44 : \"PRINTSCREEN\" , 45 : \"INSERT\" , 46 : \"DELETE\", 48 : \"0\" , 49 : \"1\" , 50 : \"2\" , 51 : \"3\" , 52 : \"4\" , 53 : \"5\" , 54 : \"6\" , 55 : \"7\" , 56 : \"8\" , 57 : \"9\" , 59 : \";\", 61 : \"=\" , 65 : \"A\" , 66 : \"B\" , 67 : \"C\" , 68 : \"D\" , 69 : \"E\" , 70 : \"F\" , 71 : \"G\" , 72 : \"H\" , 73 : \"I\" , 74 : \"J\" , 75 : \"K\" , 76 : \"L\", 77 : \"M\" , 78 : \"N\" , 79 : \"O\" , 80 : \"P\" , 81 : \"Q\" , 82 : \"R\" , 83 : \"S\" , 84 : \"T\" , 85 : \"U\" , 86 : \"V\" , 87 : \"W\" , 88 : \"X\" , 89 : \"Y\" , 90 : \"Z\", 96 : \"0\" , 97 : \"1\" , 98 : \"2\" , 99 : \"3\" , 100 : \"4\" , 101 : \"5\" , 102 : \"6\" , 103 : \"7\" , 104 : \"8\" , 105 : \"9\", 106 : \"*\" , 107 : \"+\" , 109 : \"-\" , 110 : \".\" , 111 : \"/\", 112 : \"F1\" , 113 : \"F2\" , 114 : \"F3\" , 115 : \"F4\" , 116 : \"F5\" , 117 : \"F6\" , 118 : \"F7\" , 119 : \"F8\" , 120 : \"F9\" , 121 : \"F10\" , 122 : \"F11\" , 123 : \"F12\", 144 : \"NUMLOCK\" , 145 : \"SCROLLLOCK\" , 186 : \";\" , 187 : \"=\" , 188 : \",\" , 189 : \"-\" , 190 : \".\" , 191 : \"/\" , 192 : \"`\" , 219 : \"[\" , 220 : \"\\\\\" , 221 : \"]\" , 222 : \"'\"\n    },\n\n    isControl: function (e) {\n        var k = e.which;\n        switch (k) {\n        case KEY.COMMAND:\n        case KEY.SHIFT:\n        case KEY.CTRL:\n        case KEY.ALT:\n            return true;\n        }\n\n        if (e.metaKey || e.ctrlKey || e.altKey) return true;\n\n        return false;\n    },\n    isFunctionKey: function (k) {\n        k = k.which ? k.which : k;\n        return k >= 112 && k <= 123;\n    },\n    isVerticalMovement: function (k){\n      return ~[KEY.UP, KEY.DOWN].indexOf(k);\n    },\n    isHorizontalMovement: function (k){\n      return ~[KEY.LEFT,KEY.RIGHT,KEY.BACKSPACE,KEY.DELETE].indexOf(k);\n    },\n    toSeparator: function (k) {\n      var sep = {ENTER:\"\\n\",TAB:\"\\t\",SPACE:\" \"}[k];\n      if (sep) return sep;\n      // return undefined for special keys other than enter, tab or space.\n      // no way to use them to cut strings.\n      return KEY[k] ? undefined : k;\n    }\n  };\n\nfunction isNil(value) {\n  return angular.isUndefined(value) || value === null;\n}\n\n/**\n * Add querySelectorAll() to jqLite.\n *\n * jqLite find() is limited to lookups by tag name.\n * TODO This will change with future versions of AngularJS, to be removed when this happens\n *\n * See jqLite.find - why not use querySelectorAll? https://github.com/angular/angular.js/issues/3586\n * See feat(jqLite): use querySelectorAll instead of getElementsByTagName in jqLite.find https://github.com/angular/angular.js/pull/3598\n */\nif (angular.element.prototype.querySelectorAll === undefined) {\n  angular.element.prototype.querySelectorAll = function(selector) {\n    return angular.element(this[0].querySelectorAll(selector));\n  };\n}\n\n/**\n * Add closest() to jqLite.\n */\nif (angular.element.prototype.closest === undefined) {\n  angular.element.prototype.closest = function( selector) {\n    var elem = this[0];\n    var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector;\n\n    while (elem) {\n      if (matchesSelector.bind(elem)(selector)) {\n        return elem;\n      } else {\n        elem = elem.parentElement;\n      }\n    }\n    return false;\n  };\n}\n\nvar latestId = 0;\n\nvar uis = angular.module('ui.select', [])\n\n.constant('uiSelectConfig', {\n  theme: 'bootstrap',\n  searchEnabled: true,\n  sortable: false,\n  placeholder: '', // Empty by default, like HTML tag <select>\n  refreshDelay: 1000, // In milliseconds\n  closeOnSelect: true,\n  skipFocusser: false,\n  dropdownPosition: 'auto',\n  removeSelected: true,\n  resetSearchInput: true,\n  generateId: function() {\n    return latestId++;\n  },\n  appendToBody: false,\n  spinnerEnabled: false,\n  spinnerClass: 'glyphicon glyphicon-refresh ui-select-spin',\n  backspaceReset: true,\n  trim: true\n})\n\n// See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913\n.service('uiSelectMinErr', function() {\n  var minErr = angular.$$minErr('ui.select');\n  return function() {\n    var error = minErr.apply(this, arguments);\n    var message = error.message.replace(new RegExp('\\nhttp://errors.angularjs.org/.*'), '');\n    return new Error(message);\n  };\n})\n\n// Recreates old behavior of ng-transclude. Used internally.\n.directive('uisTranscludeAppend', function () {\n  return {\n    link: function (scope, element, attrs, ctrl, transclude) {\n        transclude(scope, function (clone) {\n          element.append(clone);\n        });\n      }\n    };\n})\n\n/**\n * Highlights text that matches $select.search.\n *\n * Taken from AngularUI Bootstrap Typeahead\n * See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L340\n */\n.filter('highlight', function() {\n  function escapeRegexp(queryToEscape) {\n    return ('' + queryToEscape).replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n  }\n\n  return function(matchItem, query) {\n    return query && matchItem ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<span class=\"ui-select-highlight\">$&</span>') : matchItem;\n  };\n})\n\n/**\n * A read-only equivalent of jQuery's offset function: http://api.jquery.com/offset/\n *\n * Taken from AngularUI Bootstrap Position:\n * See https://github.com/angular-ui/bootstrap/blob/master/src/position/position.js#L70\n */\n.factory('uisOffset',\n  ['$document', '$window',\n  function ($document, $window) {\n\n  return function(element) {\n    var boundingClientRect = element[0].getBoundingClientRect();\n    return {\n      width: boundingClientRect.width || element.prop('offsetWidth'),\n      height: boundingClientRect.height || element.prop('offsetHeight'),\n      top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n      left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n    };\n  };\n}]);\n\nuis.directive('uiSelectChoices',\n  ['uiSelectConfig', 'uisRepeatParser', 'uiSelectMinErr', '$compile', '$window',\n  function(uiSelectConfig, RepeatParser, uiSelectMinErr, $compile, $window) {\n\n  return {\n    restrict: 'EA',\n    require: '^uiSelect',\n    replace: true,\n    transclude: true,\n    templateUrl: function(tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-choices');\n\n      // Gets theme attribute from parent (ui-select)\n      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n      return theme + '/choices.tpl.html';\n    },\n\n    compile: function(tElement, tAttrs) {\n\n      if (!tAttrs.repeat) throw uiSelectMinErr('repeat', \"Expected 'repeat' expression.\");\n\n      // var repeat = RepeatParser.parse(attrs.repeat);\n      var groupByExp = tAttrs.groupBy;\n      var groupFilterExp = tAttrs.groupFilter;\n\n      if (groupByExp) {\n        var groups = tElement.querySelectorAll('.ui-select-choices-group');\n        if (groups.length !== 1) throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-group but got '{0}'.\", groups.length);\n        groups.attr('ng-repeat', RepeatParser.getGroupNgRepeatExpression());\n      }\n\n      var parserResult = RepeatParser.parse(tAttrs.repeat);\n\n      var choices = tElement.querySelectorAll('.ui-select-choices-row');\n      if (choices.length !== 1) {\n        throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row but got '{0}'.\", choices.length);\n      }\n\n      choices.attr('ng-repeat', parserResult.repeatExpression(groupByExp))\n             .attr('ng-if', '$select.open'); //Prevent unnecessary watches when dropdown is closed\n\n\n      var rowsInner = tElement.querySelectorAll('.ui-select-choices-row-inner');\n      if (rowsInner.length !== 1) {\n        throw uiSelectMinErr('rows', \"Expected 1 .ui-select-choices-row-inner but got '{0}'.\", rowsInner.length);\n      }\n      rowsInner.attr('uis-transclude-append', ''); //Adding uisTranscludeAppend directive to row element after choices element has ngRepeat\n\n      // If IE8 then need to target rowsInner to apply the ng-click attr as choices will not capture the event.\n      var clickTarget = $window.document.addEventListener ? choices : rowsInner;\n      clickTarget.attr('ng-click', '$select.select(' + parserResult.itemName + ',$select.skipFocusser,$event)');\n\n      return function link(scope, element, attrs, $select) {\n\n\n        $select.parseRepeatAttr(attrs.repeat, groupByExp, groupFilterExp); //Result ready at $select.parserResult\n        $select.disableChoiceExpression = attrs.uiDisableChoice;\n        $select.onHighlightCallback = attrs.onHighlight;\n        $select.minimumInputLength = parseInt(attrs.minimumInputLength) || 0;\n        $select.dropdownPosition = attrs.position ? attrs.position.toLowerCase() : uiSelectConfig.dropdownPosition;\n\n        scope.$watch('$select.search', function(newValue) {\n          if(newValue && !$select.open && $select.multiple) $select.activate(false, true);\n          $select.activeIndex = $select.tagging.isActivated ? -1 : 0;\n          if (!attrs.minimumInputLength || $select.search.length >= attrs.minimumInputLength) {\n            $select.refresh(attrs.refresh);\n          } else {\n            $select.items = [];\n          }\n        });\n\n        attrs.$observe('refreshDelay', function() {\n          // $eval() is needed otherwise we get a string instead of a number\n          var refreshDelay = scope.$eval(attrs.refreshDelay);\n          $select.refreshDelay = refreshDelay !== undefined ? refreshDelay : uiSelectConfig.refreshDelay;\n        });\n\n        scope.$watch('$select.open', function(open) {\n          if (open) {\n            tElement.attr('role', 'listbox');\n            $select.refresh(attrs.refresh);\n          } else {\n            element.removeAttr('role');\n          }\n        });\n      };\n    }\n  };\n}]);\n\n/**\n * Contains ui-select \"intelligence\".\n *\n * The goal is to limit dependency on the DOM whenever possible and\n * put as much logic in the controller (instead of the link functions) as possible so it can be easily tested.\n */\nuis.controller('uiSelectCtrl',\n  ['$scope', '$element', '$timeout', '$filter', '$$uisDebounce', 'uisRepeatParser', 'uiSelectMinErr', 'uiSelectConfig', '$parse', '$injector', '$window',\n  function($scope, $element, $timeout, $filter, $$uisDebounce, RepeatParser, uiSelectMinErr, uiSelectConfig, $parse, $injector, $window) {\n\n  var ctrl = this;\n\n  var EMPTY_SEARCH = '';\n\n  ctrl.placeholder = uiSelectConfig.placeholder;\n  ctrl.searchEnabled = uiSelectConfig.searchEnabled;\n  ctrl.sortable = uiSelectConfig.sortable;\n  ctrl.refreshDelay = uiSelectConfig.refreshDelay;\n  ctrl.paste = uiSelectConfig.paste;\n  ctrl.resetSearchInput = uiSelectConfig.resetSearchInput;\n  ctrl.refreshing = false;\n  ctrl.spinnerEnabled = uiSelectConfig.spinnerEnabled;\n  ctrl.spinnerClass = uiSelectConfig.spinnerClass;\n  ctrl.removeSelected = uiSelectConfig.removeSelected; //If selected item(s) should be removed from dropdown list\n  ctrl.closeOnSelect = true; //Initialized inside uiSelect directive link function\n  ctrl.skipFocusser = false; //Set to true to avoid returning focus to ctrl when item is selected\n  ctrl.search = EMPTY_SEARCH;\n\n  ctrl.activeIndex = 0; //Dropdown of choices\n  ctrl.items = []; //All available choices\n\n  ctrl.open = false;\n  ctrl.focus = false;\n  ctrl.disabled = false;\n  ctrl.selected = undefined;\n\n  ctrl.dropdownPosition = 'auto';\n\n  ctrl.focusser = undefined; //Reference to input element used to handle focus events\n  ctrl.multiple = undefined; // Initialized inside uiSelect directive link function\n  ctrl.disableChoiceExpression = undefined; // Initialized inside uiSelectChoices directive link function\n  ctrl.tagging = {isActivated: false, fct: undefined};\n  ctrl.taggingTokens = {isActivated: false, tokens: undefined};\n  ctrl.lockChoiceExpression = undefined; // Initialized inside uiSelectMatch directive link function\n  ctrl.clickTriggeredSelect = false;\n  ctrl.$filter = $filter;\n  ctrl.$element = $element;\n\n  // Use $injector to check for $animate and store a reference to it\n  ctrl.$animate = (function () {\n    try {\n      return $injector.get('$animate');\n    } catch (err) {\n      // $animate does not exist\n      return null;\n    }\n  })();\n\n  ctrl.searchInput = $element.querySelectorAll('input.ui-select-search');\n  if (ctrl.searchInput.length !== 1) {\n    throw uiSelectMinErr('searchInput', \"Expected 1 input.ui-select-search but got '{0}'.\", ctrl.searchInput.length);\n  }\n\n  ctrl.isEmpty = function() {\n    return isNil(ctrl.selected) || ctrl.selected === '' || (ctrl.multiple && ctrl.selected.length === 0);\n  };\n\n  ctrl.getPlaceholder = function(){\n    if(ctrl.selected && ctrl.selected.length) return;\n    return ctrl.placeholder;\n  };\n\n  function _findIndex(collection, predicate, thisArg){\n    if (collection.findIndex){\n      return collection.findIndex(predicate, thisArg);\n    } else {\n      var list = Object(collection);\n      var length = list.length >>> 0;\n      var value;\n\n      for (var i = 0; i < length; i++) {\n        value = list[i];\n        if (predicate.call(thisArg, value, i, list)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n  }\n\n  // Most of the time the user does not want to empty the search input when in typeahead mode\n  function _resetSearchInput() {\n    if (ctrl.resetSearchInput) {\n      ctrl.search = EMPTY_SEARCH;\n      //reset activeIndex\n      if (!ctrl.multiple) {\n        if (ctrl.selected && ctrl.items.length) {\n          ctrl.activeIndex = _findIndex(ctrl.items, function(item){\n            return angular.equals(this, item);\n          }, ctrl.selected);\n        } else {\n          ctrl.activeIndex = 0;\n        }\n      }\n    }\n  }\n\n    function _groupsFilter(groups, groupNames) {\n      var i, j, result = [];\n      for(i = 0; i < groupNames.length ;i++){\n        for(j = 0; j < groups.length ;j++){\n          if(groups[j].name == [groupNames[i]]){\n            result.push(groups[j]);\n          }\n        }\n      }\n      return result;\n    }\n\n  // When the user clicks on ui-select, displays the dropdown list\n  ctrl.activate = function(initSearchValue, avoidReset) {\n    if (!ctrl.disabled  && !ctrl.open) {\n      if(!avoidReset) _resetSearchInput();\n\n      $scope.$broadcast('uis:activate');\n      ctrl.open = true;\n      ctrl.activeIndex = ctrl.activeIndex >= ctrl.items.length ? 0 : ctrl.activeIndex;\n      // ensure that the index is set to zero for tagging variants\n      // that where first option is auto-selected\n      if ( ctrl.activeIndex === -1 && ctrl.taggingLabel !== false ) {\n        ctrl.activeIndex = 0;\n      }\n\n      var container = $element.querySelectorAll('.ui-select-choices-content');\n      var searchInput = $element.querySelectorAll('.ui-select-search');\n      if (ctrl.$animate && ctrl.$animate.on && ctrl.$animate.enabled(container[0])) {\n        var animateHandler = function(elem, phase) {\n          if (phase === 'start' && ctrl.items.length === 0) {\n            // Only focus input after the animation has finished\n            ctrl.$animate.off('removeClass', searchInput[0], animateHandler);\n            $timeout(function () {\n              ctrl.focusSearchInput(initSearchValue);\n            });\n          } else if (phase === 'close') {\n            // Only focus input after the animation has finished\n            ctrl.$animate.off('enter', container[0], animateHandler);\n            $timeout(function () {\n              ctrl.focusSearchInput(initSearchValue);\n            });\n          }\n        };\n\n        if (ctrl.items.length > 0) {\n          ctrl.$animate.on('enter', container[0], animateHandler);\n        } else {\n          ctrl.$animate.on('removeClass', searchInput[0], animateHandler);\n        }\n      } else {\n        $timeout(function () {\n          ctrl.focusSearchInput(initSearchValue);\n          if(!ctrl.tagging.isActivated && ctrl.items.length > 1 && ctrl.open) {\n            _ensureHighlightVisible();\n          }\n        });\n      }\n    }\n    else if (ctrl.open && !ctrl.searchEnabled) {\n      // Close the selection if we don't have search enabled, and we click on the select again\n      ctrl.close();\n    }\n  };\n\n  ctrl.focusSearchInput = function (initSearchValue) {\n    ctrl.search = initSearchValue || ctrl.search;\n    ctrl.searchInput[0].focus();\n  };\n\n  ctrl.findGroupByName = function(name, noStrict) {\n    return ctrl.groups && ctrl.groups.filter(function(group) {\n      if (noStrict)\n        return group.name == name;\n      else\n        return group.name === name;\n    })[0];\n  };\n\n  ctrl.parseRepeatAttr = function(repeatAttr, groupByExp, groupFilterExp) {\n    function updateGroups(items) {\n      var groupFn = $scope.$eval(groupByExp);\n      ctrl.groups = [];\n      angular.forEach(items, function(item) {\n        var groupName = angular.isFunction(groupFn) ? groupFn(item) : item[groupFn];\n        var group = ctrl.findGroupByName(groupName);\n        if(group) {\n          group.items.push(item);\n        }\n        else {\n          ctrl.groups.push({name: groupName, items: [item]});\n        }\n      });\n      if(groupFilterExp){\n        var groupFilterFn = $scope.$eval(groupFilterExp);\n        if( angular.isFunction(groupFilterFn)){\n          ctrl.groups = groupFilterFn(ctrl.groups);\n        } else if(angular.isArray(groupFilterFn)){\n          ctrl.groups = _groupsFilter(ctrl.groups, groupFilterFn);\n        }\n      }\n      ctrl.items = [];\n      ctrl.groups.forEach(function(group) {\n        ctrl.items = ctrl.items.concat(group.items);\n      });\n    }\n\n    function setPlainItems(items) {\n      ctrl.items = items || [];\n    }\n\n    ctrl.setItemsFn = groupByExp ? updateGroups : setPlainItems;\n\n    ctrl.parserResult = RepeatParser.parse(repeatAttr);\n\n    ctrl.isGrouped = !!groupByExp;\n    ctrl.itemProperty = ctrl.parserResult.itemName;\n\n    //If collection is an Object, convert it to Array\n\n    var originalSource = ctrl.parserResult.source;\n\n    //When an object is used as source, we better create an array and use it as 'source'\n    var createArrayFromObject = function(){\n      var origSrc = originalSource($scope);\n      $scope.$uisSource = Object.keys(origSrc).map(function(v){\n        var result = {};\n        result[ctrl.parserResult.keyName] = v;\n        result.value = origSrc[v];\n        return result;\n      });\n    };\n\n    if (ctrl.parserResult.keyName){ // Check for (key,value) syntax\n      createArrayFromObject();\n      ctrl.parserResult.source = $parse('$uisSource' + ctrl.parserResult.filters);\n      $scope.$watch(originalSource, function(newVal, oldVal){\n        if (newVal !== oldVal) createArrayFromObject();\n      }, true);\n    }\n\n    ctrl.refreshItems = function (data){\n      data = data || ctrl.parserResult.source($scope);\n      var selectedItems = ctrl.selected;\n      //TODO should implement for single mode removeSelected\n      if (ctrl.isEmpty() || (angular.isArray(selectedItems) && !selectedItems.length) || !ctrl.multiple || !ctrl.removeSelected) {\n        ctrl.setItemsFn(data);\n      }else{\n        if ( data !== undefined && data !== null ) {\n          var filteredItems = data.filter(function(i) {\n            return angular.isArray(selectedItems) ? selectedItems.every(function(selectedItem) {\n              return !angular.equals(i, selectedItem);\n            }) : !angular.equals(i, selectedItems);\n          });\n          ctrl.setItemsFn(filteredItems);\n        }\n      }\n      if (ctrl.dropdownPosition === 'auto' || ctrl.dropdownPosition === 'up'){\n        $scope.calculateDropdownPos();\n      }\n      $scope.$broadcast('uis:refresh');\n    };\n\n    // See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L259\n    $scope.$watchCollection(ctrl.parserResult.source, function(items) {\n      if (items === undefined || items === null) {\n        // If the user specifies undefined or null => reset the collection\n        // Special case: items can be undefined if the user did not initialized the collection on the scope\n        // i.e $scope.addresses = [] is missing\n        ctrl.items = [];\n      } else {\n        if (!angular.isArray(items)) {\n          throw uiSelectMinErr('items', \"Expected an array but got '{0}'.\", items);\n        } else {\n          //Remove already selected items (ex: while searching)\n          //TODO Should add a test\n          ctrl.refreshItems(items);\n\n          //update the view value with fresh data from items, if there is a valid model value\n          if(angular.isDefined(ctrl.ngModel.$modelValue)) {\n            ctrl.ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n          }\n        }\n      }\n    });\n\n  };\n\n  var _refreshDelayPromise;\n\n  /**\n   * Typeahead mode: lets the user refresh the collection using his own function.\n   *\n   * See Expose $select.search for external / remote filtering https://github.com/angular-ui/ui-select/pull/31\n   */\n  ctrl.refresh = function(refreshAttr) {\n    if (refreshAttr !== undefined) {\n      // Debounce\n      // See https://github.com/angular-ui/bootstrap/blob/0.10.0/src/typeahead/typeahead.js#L155\n      // FYI AngularStrap typeahead does not have debouncing: https://github.com/mgcrea/angular-strap/blob/v2.0.0-rc.4/src/typeahead/typeahead.js#L177\n      if (_refreshDelayPromise) {\n        $timeout.cancel(_refreshDelayPromise);\n      }\n      _refreshDelayPromise = $timeout(function() {\n        if ($scope.$select.search.length >= $scope.$select.minimumInputLength) {\n          var refreshPromise = $scope.$eval(refreshAttr);\n          if (refreshPromise && angular.isFunction(refreshPromise.then) && !ctrl.refreshing) {\n            ctrl.refreshing = true;\n            refreshPromise.finally(function() {\n              ctrl.refreshing = false;\n            });\n          }\n        }\n      }, ctrl.refreshDelay);\n    }\n  };\n\n  ctrl.isActive = function(itemScope) {\n    if ( !ctrl.open ) {\n      return false;\n    }\n    var itemIndex = ctrl.items.indexOf(itemScope[ctrl.itemProperty]);\n    var isActive =  itemIndex == ctrl.activeIndex;\n\n    if ( !isActive || itemIndex < 0 ) {\n      return false;\n    }\n\n    if (isActive && !angular.isUndefined(ctrl.onHighlightCallback)) {\n      itemScope.$eval(ctrl.onHighlightCallback);\n    }\n\n    return isActive;\n  };\n\n  var _isItemSelected = function (item) {\n    return (ctrl.selected && angular.isArray(ctrl.selected) &&\n        ctrl.selected.filter(function (selection) { return angular.equals(selection, item); }).length > 0);\n  };\n\n  var disabledItems = [];\n\n  function _updateItemDisabled(item, isDisabled) {\n    var disabledItemIndex = disabledItems.indexOf(item);\n    if (isDisabled && disabledItemIndex === -1) {\n      disabledItems.push(item);\n    }\n\n    if (!isDisabled && disabledItemIndex > -1) {\n      disabledItems.splice(disabledItemIndex, 1);\n    }\n  }\n\n  function _isItemDisabled(item) {\n    return disabledItems.indexOf(item) > -1;\n  }\n\n  ctrl.isDisabled = function(itemScope) {\n\n    if (!ctrl.open) return;\n\n    var item = itemScope[ctrl.itemProperty];\n    var itemIndex = ctrl.items.indexOf(item);\n    var isDisabled = false;\n\n    if (itemIndex >= 0 && (angular.isDefined(ctrl.disableChoiceExpression) || ctrl.multiple)) {\n\n      if (item.isTag) return false;\n\n      if (ctrl.multiple) {\n        isDisabled = _isItemSelected(item);\n      }\n\n      if (!isDisabled && angular.isDefined(ctrl.disableChoiceExpression)) {\n        isDisabled = !!(itemScope.$eval(ctrl.disableChoiceExpression));\n      }\n\n      _updateItemDisabled(item, isDisabled);\n    }\n\n    return isDisabled;\n  };\n\n\n  // When the user selects an item with ENTER or clicks the dropdown\n  ctrl.select = function(item, skipFocusser, $event) {\n    if (isNil(item) || !_isItemDisabled(item)) {\n\n      if ( ! ctrl.items && ! ctrl.search && ! ctrl.tagging.isActivated) return;\n\n      if (!item || !_isItemDisabled(item)) {\n        // if click is made on existing item, prevent from tagging, ctrl.search does not matter\n        ctrl.clickTriggeredSelect = false;\n        if($event && ($event.type === 'click' || $event.type === 'touchend') && item)\n          ctrl.clickTriggeredSelect = true;\n\n        if(ctrl.tagging.isActivated && ctrl.clickTriggeredSelect === false) {\n          // if taggingLabel is disabled and item is undefined we pull from ctrl.search\n          if ( ctrl.taggingLabel === false ) {\n            if ( ctrl.activeIndex < 0 ) {\n              if (item === undefined) {\n                item = ctrl.tagging.fct !== undefined ? ctrl.tagging.fct(ctrl.search) : ctrl.search;\n              }\n              if (!item || angular.equals( ctrl.items[0], item ) ) {\n                return;\n              }\n            } else {\n              // keyboard nav happened first, user selected from dropdown\n              item = ctrl.items[ctrl.activeIndex];\n            }\n          } else {\n            // tagging always operates at index zero, taggingLabel === false pushes\n            // the ctrl.search value without having it injected\n            if ( ctrl.activeIndex === 0 ) {\n              // ctrl.tagging pushes items to ctrl.items, so we only have empty val\n              // for `item` if it is a detected duplicate\n              if ( item === undefined ) return;\n\n              // create new item on the fly if we don't already have one;\n              // use tagging function if we have one\n              if ( ctrl.tagging.fct !== undefined && typeof item === 'string' ) {\n                item = ctrl.tagging.fct(item);\n                if (!item) return;\n              // if item type is 'string', apply the tagging label\n              } else if ( typeof item === 'string' ) {\n                // trim the trailing space\n                item = item.replace(ctrl.taggingLabel,'').trim();\n              }\n            }\n          }\n          // search ctrl.selected for dupes potentially caused by tagging and return early if found\n          if (_isItemSelected(item)) {\n            ctrl.close(skipFocusser);\n            return;\n          }\n        }\n        _resetSearchInput();\n        $scope.$broadcast('uis:select', item);\n\n        if (ctrl.closeOnSelect) {\n          ctrl.close(skipFocusser);\n        }\n      }\n    }\n  };\n\n  // Closes the dropdown\n  ctrl.close = function(skipFocusser) {\n    if (!ctrl.open) return;\n    if (ctrl.ngModel && ctrl.ngModel.$setTouched) ctrl.ngModel.$setTouched();\n    ctrl.open = false;\n    _resetSearchInput();\n    $scope.$broadcast('uis:close', skipFocusser);\n\n  };\n\n  ctrl.setFocus = function(){\n    if (!ctrl.focus) ctrl.focusInput[0].focus();\n  };\n\n  ctrl.clear = function($event) {\n    ctrl.select(null);\n    $event.stopPropagation();\n    $timeout(function() {\n      ctrl.focusser[0].focus();\n    }, 0, false);\n  };\n\n  // Toggle dropdown\n  ctrl.toggle = function(e) {\n    if (ctrl.open) {\n      ctrl.close();\n    } else {\n      ctrl.activate();\n    }\n    e.preventDefault();\n    e.stopPropagation();\n  };\n\n  // Set default function for locked choices - avoids unnecessary\n  // logic if functionality is not being used\n  ctrl.isLocked = function () {\n    return false;\n  };\n\n  $scope.$watch(function () {\n    return angular.isDefined(ctrl.lockChoiceExpression) && ctrl.lockChoiceExpression !== \"\";\n  }, _initaliseLockedChoices);\n\n  function _initaliseLockedChoices(doInitalise) {\n    if(!doInitalise) return;\n\n    var lockedItems = [];\n\n    function _updateItemLocked(item, isLocked) {\n      var lockedItemIndex = lockedItems.indexOf(item);\n      if (isLocked && lockedItemIndex === -1) {\n        lockedItems.push(item);\n        }\n\n      if (!isLocked && lockedItemIndex > -1) {\n        lockedItems.splice(lockedItemIndex, 1);\n      }\n    }\n\n    function _isItemlocked(item) {\n      return lockedItems.indexOf(item) > -1;\n    }\n\n    ctrl.isLocked = function (itemScope, itemIndex) {\n      var isLocked = false,\n          item = ctrl.selected[itemIndex];\n\n      if(item) {\n        if (itemScope) {\n          isLocked = !!(itemScope.$eval(ctrl.lockChoiceExpression));\n          _updateItemLocked(item, isLocked);\n        } else {\n          isLocked = _isItemlocked(item);\n        }\n      }\n\n      return isLocked;\n    };\n  }\n\n\n  var sizeWatch = null;\n  var updaterScheduled = false;\n  ctrl.sizeSearchInput = function() {\n\n    var input = ctrl.searchInput[0],\n        container = ctrl.$element[0],\n        calculateContainerWidth = function() {\n          // Return the container width only if the search input is visible\n          return container.clientWidth * !!input.offsetParent;\n        },\n        updateIfVisible = function(containerWidth) {\n          if (containerWidth === 0) {\n            return false;\n          }\n          var inputWidth = containerWidth - input.offsetLeft;\n          if (inputWidth < 50) inputWidth = containerWidth;\n          ctrl.searchInput.css('width', inputWidth+'px');\n          return true;\n        };\n\n    ctrl.searchInput.css('width', '10px');\n    $timeout(function() { //Give tags time to render correctly\n      if (sizeWatch === null && !updateIfVisible(calculateContainerWidth())) {\n        sizeWatch = $scope.$watch(function() {\n          if (!updaterScheduled) {\n            updaterScheduled = true;\n            $scope.$$postDigest(function() {\n              updaterScheduled = false;\n              if (updateIfVisible(calculateContainerWidth())) {\n                sizeWatch();\n                sizeWatch = null;\n              }\n            });\n          }\n        }, angular.noop);\n      }\n    });\n  };\n\n  function _handleDropDownSelection(key) {\n    var processed = true;\n    switch (key) {\n      case KEY.DOWN:\n        if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        else if (ctrl.activeIndex < ctrl.items.length - 1) {\n          var idx = ++ctrl.activeIndex;\n          while(_isItemDisabled(ctrl.items[idx]) && idx < ctrl.items.length) {\n            ctrl.activeIndex = ++idx;\n          }\n        }\n        break;\n      case KEY.UP:\n        if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        else if (ctrl.activeIndex > 0) {\n          var idxmin = --ctrl.activeIndex;\n          while(_isItemDisabled(ctrl.items[idxmin]) && idxmin > 0) {\n            ctrl.activeIndex = --idxmin;\n          }\n        }\n        break;\n      case KEY.TAB:\n        if (!ctrl.multiple || ctrl.open) ctrl.select(ctrl.items[ctrl.activeIndex], true);\n        break;\n      case KEY.ENTER:\n        if(ctrl.open && (ctrl.tagging.isActivated || ctrl.activeIndex >= 0)){\n          ctrl.select(ctrl.items[ctrl.activeIndex], ctrl.skipFocusser); // Make sure at least one dropdown item is highlighted before adding if not in tagging mode\n        } else {\n          ctrl.activate(false, true); //In case its the search input in 'multiple' mode\n        }\n        break;\n      case KEY.ESC:\n        ctrl.close();\n        break;\n      default:\n        processed = false;\n    }\n    return processed;\n  }\n\n  // Bind to keyboard shortcuts\n  ctrl.searchInput.on('keydown', function(e) {\n\n    var key = e.which;\n\n    if (~[KEY.ENTER,KEY.ESC].indexOf(key)){\n      e.preventDefault();\n      e.stopPropagation();\n    }\n\n    $scope.$apply(function() {\n\n      var tagged = false;\n\n      if (ctrl.items.length > 0 || ctrl.tagging.isActivated) {\n        if(!_handleDropDownSelection(key) && !ctrl.searchEnabled) {\n          e.preventDefault();\n          e.stopPropagation();\n        }\n        if ( ctrl.taggingTokens.isActivated ) {\n          for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) {\n            if ( ctrl.taggingTokens.tokens[i] === KEY.MAP[e.keyCode] ) {\n              // make sure there is a new value to push via tagging\n              if ( ctrl.search.length > 0 ) {\n                tagged = true;\n              }\n            }\n          }\n          if ( tagged ) {\n            $timeout(function() {\n              ctrl.searchInput.triggerHandler('tagged');\n              var newItem = ctrl.search.replace(KEY.MAP[e.keyCode],'').trim();\n              if ( ctrl.tagging.fct ) {\n                newItem = ctrl.tagging.fct( newItem );\n              }\n              if (newItem) ctrl.select(newItem, true);\n            });\n          }\n        }\n      }\n\n    });\n\n    if(KEY.isVerticalMovement(key) && ctrl.items.length > 0){\n      _ensureHighlightVisible();\n    }\n\n    if (key === KEY.ENTER || key === KEY.ESC) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n\n  });\n\n  ctrl.searchInput.on('paste', function (e) {\n    var data;\n\n    if (window.clipboardData && window.clipboardData.getData) { // IE\n      data = window.clipboardData.getData('Text');\n    } else {\n      data = (e.originalEvent || e).clipboardData.getData('text/plain');\n    }\n\n    // Prepend the current input field text to the paste buffer.\n    data = ctrl.search + data;\n\n    if (data && data.length > 0) {\n      // If tagging try to split by tokens and add items\n      if (ctrl.taggingTokens.isActivated) {\n        var items = [];\n        for (var i = 0; i < ctrl.taggingTokens.tokens.length; i++) {  // split by first token that is contained in data\n          var separator = KEY.toSeparator(ctrl.taggingTokens.tokens[i]) || ctrl.taggingTokens.tokens[i];\n          if (data.indexOf(separator) > -1) {\n            items = data.split(separator);\n            break;  // only split by one token\n          }\n        }\n        if (items.length === 0) {\n          items = [data];\n        }\n        var oldsearch = ctrl.search;\n        angular.forEach(items, function (item) {\n          var newItem = ctrl.tagging.fct ? ctrl.tagging.fct(item) : item;\n          if (newItem) {\n            ctrl.select(newItem, true);\n          }\n        });\n        ctrl.search = oldsearch || EMPTY_SEARCH;\n        e.preventDefault();\n        e.stopPropagation();\n      } else if (ctrl.paste) {\n        ctrl.paste(data);\n        ctrl.search = EMPTY_SEARCH;\n        e.preventDefault();\n        e.stopPropagation();\n      }\n    }\n  });\n\n  ctrl.searchInput.on('tagged', function() {\n    $timeout(function() {\n      _resetSearchInput();\n    });\n  });\n\n  // See https://github.com/ivaynberg/select2/blob/3.4.6/select2.js#L1431\n  function _ensureHighlightVisible() {\n    var container = $element.querySelectorAll('.ui-select-choices-content');\n    var choices = container.querySelectorAll('.ui-select-choices-row');\n    if (choices.length < 1) {\n      throw uiSelectMinErr('choices', \"Expected multiple .ui-select-choices-row but got '{0}'.\", choices.length);\n    }\n\n    if (ctrl.activeIndex < 0) {\n      return;\n    }\n\n    var highlighted = choices[ctrl.activeIndex];\n    var posY = highlighted.offsetTop + highlighted.clientHeight - container[0].scrollTop;\n    var height = container[0].offsetHeight;\n\n    if (posY > height) {\n      container[0].scrollTop += posY - height;\n    } else if (posY < highlighted.clientHeight) {\n      if (ctrl.isGrouped && ctrl.activeIndex === 0)\n        container[0].scrollTop = 0; //To make group header visible when going all the way up\n      else\n        container[0].scrollTop -= highlighted.clientHeight - posY;\n    }\n  }\n\n  var onResize = $$uisDebounce(function() {\n    ctrl.sizeSearchInput();\n  }, 50);\n\n  angular.element($window).bind('resize', onResize);\n\n  $scope.$on('$destroy', function() {\n    ctrl.searchInput.off('keyup keydown tagged blur paste');\n    angular.element($window).off('resize', onResize);\n  });\n\n  $scope.$watch('$select.activeIndex', function(activeIndex) {\n    if (activeIndex)\n      $element.find('input').attr(\n        'aria-activedescendant',\n        'ui-select-choices-row-' + ctrl.generatedId + '-' + activeIndex);\n  });\n\n  $scope.$watch('$select.open', function(open) {\n    if (!open)\n      $element.find('input').removeAttr('aria-activedescendant');\n  });\n}]);\n\nuis.directive('uiSelect',\n  ['$document', 'uiSelectConfig', 'uiSelectMinErr', 'uisOffset', '$compile', '$parse', '$timeout', '$window',\n  function($document, uiSelectConfig, uiSelectMinErr, uisOffset, $compile, $parse, $timeout, $window) {\n\n  return {\n    restrict: 'EA',\n    templateUrl: function(tElement, tAttrs) {\n      var theme = tAttrs.theme || uiSelectConfig.theme;\n      return theme + (angular.isDefined(tAttrs.multiple) ? '/select-multiple.tpl.html' : '/select.tpl.html');\n    },\n    replace: true,\n    transclude: true,\n    require: ['uiSelect', '^ngModel'],\n    scope: true,\n\n    controller: 'uiSelectCtrl',\n    controllerAs: '$select',\n    compile: function(tElement, tAttrs) {\n\n      // Allow setting ngClass on uiSelect\n      var match = /{(.*)}\\s*{(.*)}/.exec(tAttrs.ngClass);\n      if(match) {\n        var combined = '{'+ match[1] +', '+ match[2] +'}';\n        tAttrs.ngClass = combined;\n        tElement.attr('ng-class', combined);\n      }\n\n      //Multiple or Single depending if multiple attribute presence\n      if (angular.isDefined(tAttrs.multiple))\n        tElement.append('<ui-select-multiple/>').removeAttr('multiple');\n      else\n        tElement.append('<ui-select-single/>');\n\n      if (tAttrs.inputId)\n        tElement.querySelectorAll('input.ui-select-search')[0].id = tAttrs.inputId;\n\n      return function(scope, element, attrs, ctrls, transcludeFn) {\n\n        var $select = ctrls[0];\n        var ngModel = ctrls[1];\n\n        $select.generatedId = uiSelectConfig.generateId();\n        $select.baseTitle = attrs.title || 'Select box';\n        $select.focusserTitle = $select.baseTitle + ' focus';\n        $select.focusserId = 'focusser-' + $select.generatedId;\n\n        $select.closeOnSelect = function() {\n          if (angular.isDefined(attrs.closeOnSelect)) {\n            return $parse(attrs.closeOnSelect)();\n          } else {\n            return uiSelectConfig.closeOnSelect;\n          }\n        }();\n\n        scope.$watch('skipFocusser', function() {\n            var skipFocusser = scope.$eval(attrs.skipFocusser);\n            $select.skipFocusser = skipFocusser !== undefined ? skipFocusser : uiSelectConfig.skipFocusser;\n        });\n\n        $select.onSelectCallback = $parse(attrs.onSelect);\n        $select.onRemoveCallback = $parse(attrs.onRemove);\n\n        //Set reference to ngModel from uiSelectCtrl\n        $select.ngModel = ngModel;\n\n        $select.choiceGrouped = function(group){\n          return $select.isGrouped && group && group.name;\n        };\n\n        if(attrs.tabindex){\n          attrs.$observe('tabindex', function(value) {\n            $select.focusInput.attr('tabindex', value);\n            element.removeAttr('tabindex');\n          });\n        }\n\n        scope.$watch(function () { return scope.$eval(attrs.searchEnabled); }, function(newVal) {\n          $select.searchEnabled = newVal !== undefined ? newVal : uiSelectConfig.searchEnabled;\n        });\n\n        scope.$watch('sortable', function() {\n            var sortable = scope.$eval(attrs.sortable);\n            $select.sortable = sortable !== undefined ? sortable : uiSelectConfig.sortable;\n        });\n\n        attrs.$observe('backspaceReset', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var backspaceReset = scope.$eval(attrs.backspaceReset);\n          $select.backspaceReset = backspaceReset !== undefined ? backspaceReset : true;\n        });\n\n        attrs.$observe('limit', function() {\n          //Limit the number of selections allowed\n          $select.limit = (angular.isDefined(attrs.limit)) ? parseInt(attrs.limit, 10) : undefined;\n        });\n\n        scope.$watch('removeSelected', function() {\n            var removeSelected = scope.$eval(attrs.removeSelected);\n            $select.removeSelected = removeSelected !== undefined ? removeSelected : uiSelectConfig.removeSelected;\n        });\n\n        attrs.$observe('disabled', function() {\n          // No need to use $eval() (thanks to ng-disabled) since we already get a boolean instead of a string\n          $select.disabled = attrs.disabled !== undefined ? attrs.disabled : false;\n        });\n\n        attrs.$observe('resetSearchInput', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var resetSearchInput = scope.$eval(attrs.resetSearchInput);\n          $select.resetSearchInput = resetSearchInput !== undefined ? resetSearchInput : true;\n        });\n\n        attrs.$observe('paste', function() {\n          $select.paste = scope.$eval(attrs.paste);\n        });\n\n        attrs.$observe('tagging', function() {\n          if(attrs.tagging !== undefined)\n          {\n            // $eval() is needed otherwise we get a string instead of a boolean\n            var taggingEval = scope.$eval(attrs.tagging);\n            $select.tagging = {isActivated: true, fct: taggingEval !== true ? taggingEval : undefined};\n          }\n          else\n          {\n            $select.tagging = {isActivated: false, fct: undefined};\n          }\n        });\n\n        attrs.$observe('taggingLabel', function() {\n          if(attrs.tagging !== undefined )\n          {\n            // check eval for FALSE, in this case, we disable the labels\n            // associated with tagging\n            if ( attrs.taggingLabel === 'false' ) {\n              $select.taggingLabel = false;\n            }\n            else\n            {\n              $select.taggingLabel = attrs.taggingLabel !== undefined ? attrs.taggingLabel : '(new)';\n            }\n          }\n        });\n\n        attrs.$observe('taggingTokens', function() {\n          if (attrs.tagging !== undefined) {\n            var tokens = attrs.taggingTokens !== undefined ? attrs.taggingTokens.split('|') : [',','ENTER'];\n            $select.taggingTokens = {isActivated: true, tokens: tokens };\n          }\n        });\n\n        attrs.$observe('spinnerEnabled', function() {\n          // $eval() is needed otherwise we get a string instead of a boolean\n          var spinnerEnabled = scope.$eval(attrs.spinnerEnabled);\n          $select.spinnerEnabled = spinnerEnabled !== undefined ? spinnerEnabled : uiSelectConfig.spinnerEnabled;\n        });\n\n        attrs.$observe('spinnerClass', function() {\n          var spinnerClass = attrs.spinnerClass;\n          $select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;\n        });\n\n        scope.$watch(function () { return scope.$eval(attrs.trim); }, function(newVal) {\n          $select.trim = newVal !== undefined ? newVal : uiSelectConfig.trim;\n        });\n\n        //Automatically gets focus when loaded\n        if (angular.isDefined(attrs.autofocus)){\n          $timeout(function(){\n            $select.setFocus();\n          });\n        }\n\n        //Gets focus based on scope event name (e.g. focus-on='SomeEventName')\n        if (angular.isDefined(attrs.focusOn)){\n          scope.$on(attrs.focusOn, function() {\n              $timeout(function(){\n                $select.setFocus();\n              });\n          });\n        }\n\n        function onDocumentClick(e) {\n          if (!$select.open) return; //Skip it if dropdown is close\n\n          var contains = false;\n\n          if (window.jQuery) {\n            // Firefox 3.6 does not support element.contains()\n            // See Node.contains https://developer.mozilla.org/en-US/docs/Web/API/Node.contains\n            contains = window.jQuery.contains(element[0], e.target);\n          } else {\n            contains = element[0].contains(e.target);\n          }\n\n          if (!contains && !$select.clickTriggeredSelect) {\n            var skipFocusser;\n            if (!$select.skipFocusser) {\n              //Will lose focus only with certain targets\n              var focusableControls = ['input','button','textarea','select'];\n              var targetController = angular.element(e.target).controller('uiSelect'); //To check if target is other ui-select\n              skipFocusser = targetController && targetController !== $select; //To check if target is other ui-select\n              if (!skipFocusser) skipFocusser =  ~focusableControls.indexOf(e.target.tagName.toLowerCase()); //Check if target is input, button or textarea\n            } else {\n              skipFocusser = true;\n            }\n            $select.close(skipFocusser);\n            scope.$digest();\n          }\n          $select.clickTriggeredSelect = false;\n        }\n\n        // See Click everywhere but here. Similar approach to http://stackoverflow.com/questions/12931369\n        // but using the capture phase instead of bubble phase of the event propagation.\n        //\n        // Using the capture phase avoids problems that araise when event.stopPropatagion()\n        // is called before the event reaches the `document`.\n        $window.document.addEventListener('click', onDocumentClick, true);\n\n        scope.$on('$destroy', function() {\n          $window.document.removeEventListener('click', onDocumentClick, true);\n        });\n\n        // Move transcluded elements to their correct position in main template\n        transcludeFn(scope, function(clone) {\n          // See Transclude in AngularJS http://blog.omkarpatil.com/2012/11/transclude-in-angularjs.html\n\n          // One day jqLite will be replaced by jQuery and we will be able to write:\n          // var transcludedElement = clone.filter('.my-class')\n          // instead of creating a hackish DOM element:\n          var transcluded = angular.element('<div>').append(clone);\n\n          var transcludedMatch = transcluded.querySelectorAll('.ui-select-match');\n          transcludedMatch.removeAttr('ui-select-match'); //To avoid loop in case directive as attr\n          transcludedMatch.removeAttr('data-ui-select-match'); // Properly handle HTML5 data-attributes\n          if (transcludedMatch.length !== 1) {\n            throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-match but got '{0}'.\", transcludedMatch.length);\n          }\n          element.querySelectorAll('.ui-select-match').replaceWith(transcludedMatch);\n\n          var transcludedChoices = transcluded.querySelectorAll('.ui-select-choices');\n          transcludedChoices.removeAttr('ui-select-choices'); //To avoid loop in case directive as attr\n          transcludedChoices.removeAttr('data-ui-select-choices'); // Properly handle HTML5 data-attributes\n          if (transcludedChoices.length !== 1) {\n            throw uiSelectMinErr('transcluded', \"Expected 1 .ui-select-choices but got '{0}'.\", transcludedChoices.length);\n          }\n          element.querySelectorAll('.ui-select-choices').replaceWith(transcludedChoices);\n\n          var transcludedNoChoice = transcluded.querySelectorAll('.ui-select-no-choice');\n          transcludedNoChoice.removeAttr('ui-select-no-choice'); //To avoid loop in case directive as attr\n          transcludedNoChoice.removeAttr('data-ui-select-no-choice'); // Properly handle HTML5 data-attributes\n          if (transcludedNoChoice.length == 1) {\n            element.querySelectorAll('.ui-select-no-choice').replaceWith(transcludedNoChoice);\n          }\n\n          var transcludedHeader = transcluded.querySelectorAll('.ui-select-header');\n          transcludedHeader.removeAttr('ui-select-header'); // To avoid loop in case directive as attr\n          transcludedHeader.removeAttr('data-ui-select-header'); // Properly handle HTML5 data-attributes\n          if (transcludedHeader.length == 1) {\n            element.querySelectorAll('.ui-select-header').replaceWith(transcludedHeader);\n          } else {\n            element.querySelectorAll('.ui-select-header').remove();\n          }\n\n          var transcludedFooter = transcluded.querySelectorAll('.ui-select-footer');\n          transcludedFooter.removeAttr('ui-select-footer'); // To avoid loop in case directive as attr\n          transcludedFooter.removeAttr('data-ui-select-footer'); // Properly handle HTML5 data-attributes\n          if (transcludedFooter.length == 1) {\n            element.querySelectorAll('.ui-select-footer').replaceWith(transcludedFooter);\n          } else {\n            element.querySelectorAll('.ui-select-footer').remove();\n          }\n        });\n\n        // Support for appending the select field to the body when its open\n        var appendToBody = scope.$eval(attrs.appendToBody);\n        if (appendToBody !== undefined ? appendToBody : uiSelectConfig.appendToBody) {\n          scope.$watch('$select.open', function(isOpen) {\n            if (isOpen) {\n              positionDropdown();\n            } else {\n              resetDropdown();\n            }\n          });\n\n          // Move the dropdown back to its original location when the scope is destroyed. Otherwise\n          // it might stick around when the user routes away or the select field is otherwise removed\n          scope.$on('$destroy', function() {\n            resetDropdown();\n          });\n        }\n\n        // Hold on to a reference to the .ui-select-container element for appendToBody support\n        var placeholder = null,\n            originalWidth = '';\n\n        function positionDropdown() {\n          // Remember the absolute position of the element\n          var offset = uisOffset(element);\n\n          // Clone the element into a placeholder element to take its original place in the DOM\n          placeholder = angular.element('<div class=\"ui-select-placeholder\"></div>');\n          placeholder[0].style.width = offset.width + 'px';\n          placeholder[0].style.height = offset.height + 'px';\n          element.after(placeholder);\n\n          // Remember the original value of the element width inline style, so it can be restored\n          // when the dropdown is closed\n          originalWidth = element[0].style.width;\n\n          // Now move the actual dropdown element to the end of the body\n          $document.find('body').append(element);\n\n          element[0].style.position = 'absolute';\n          element[0].style.left = offset.left + 'px';\n          element[0].style.top = offset.top + 'px';\n          element[0].style.width = offset.width + 'px';\n        }\n\n        function resetDropdown() {\n          if (placeholder === null) {\n            // The dropdown has not actually been display yet, so there's nothing to reset\n            return;\n          }\n\n          // Move the dropdown element back to its original location in the DOM\n          placeholder.replaceWith(element);\n          placeholder = null;\n\n          element[0].style.position = '';\n          element[0].style.left = '';\n          element[0].style.top = '';\n          element[0].style.width = originalWidth;\n\n          // Set focus back on to the moved element\n          $select.setFocus();\n        }\n\n        // Hold on to a reference to the .ui-select-dropdown element for direction support.\n        var dropdown = null,\n            directionUpClassName = 'direction-up';\n\n        // Support changing the direction of the dropdown if there isn't enough space to render it.\n        scope.$watch('$select.open', function() {\n\n          if ($select.dropdownPosition === 'auto' || $select.dropdownPosition === 'up'){\n            scope.calculateDropdownPos();\n          }\n\n        });\n\n        var setDropdownPosUp = function(offset, offsetDropdown){\n\n          offset = offset || uisOffset(element);\n          offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n          dropdown[0].style.position = 'absolute';\n          dropdown[0].style.top = (offsetDropdown.height * -1) + 'px';\n          element.addClass(directionUpClassName);\n\n        };\n\n        var setDropdownPosDown = function(offset, offsetDropdown){\n\n          element.removeClass(directionUpClassName);\n\n          offset = offset || uisOffset(element);\n          offsetDropdown = offsetDropdown || uisOffset(dropdown);\n\n          dropdown[0].style.position = '';\n          dropdown[0].style.top = '';\n\n        };\n\n        var calculateDropdownPosAfterAnimation = function() {\n          // Delay positioning the dropdown until all choices have been added so its height is correct.\n          $timeout(function() {\n            if ($select.dropdownPosition === 'up') {\n              //Go UP\n              setDropdownPosUp();\n            } else {\n              //AUTO\n              element.removeClass(directionUpClassName);\n\n              var offset = uisOffset(element);\n              var offsetDropdown = uisOffset(dropdown);\n\n              //https://code.google.com/p/chromium/issues/detail?id=342307#c4\n              var scrollTop = $document[0].documentElement.scrollTop || $document[0].body.scrollTop; //To make it cross browser (blink, webkit, IE, Firefox).\n\n              // Determine if the direction of the dropdown needs to be changed.\n              if (offset.top + offset.height + offsetDropdown.height > scrollTop + $document[0].documentElement.clientHeight) {\n                //Go UP\n                setDropdownPosUp(offset, offsetDropdown);\n              }else{\n                //Go DOWN\n                setDropdownPosDown(offset, offsetDropdown);\n              }\n            }\n\n            // Display the dropdown once it has been positioned.\n            dropdown[0].style.opacity = 1;\n          });\n        };\n\n        var opened = false;\n\n        scope.calculateDropdownPos = function() {\n          if ($select.open) {\n            dropdown = angular.element(element).querySelectorAll('.ui-select-dropdown');\n\n            if (dropdown.length === 0) {\n              return;\n            }\n\n           // Hide the dropdown so there is no flicker until $timeout is done executing.\n           if ($select.search === '' && !opened) {\n              dropdown[0].style.opacity = 0;\n              opened = true;\n           }\n\n            if (!uisOffset(dropdown).height && $select.$animate && $select.$animate.on && $select.$animate.enabled(dropdown)) {\n              var needsCalculated = true;\n\n              $select.$animate.on('enter', dropdown, function (elem, phase) {\n                if (phase === 'close' && needsCalculated) {\n                  calculateDropdownPosAfterAnimation();\n                  needsCalculated = false;\n                }\n              });\n            } else {\n              calculateDropdownPosAfterAnimation();\n            }\n          } else {\n            if (dropdown === null || dropdown.length === 0) {\n              return;\n            }\n\n            // Reset the position of the dropdown.\n            dropdown[0].style.opacity = 0;\n            dropdown[0].style.position = '';\n            dropdown[0].style.top = '';\n            element.removeClass(directionUpClassName);\n          }\n        };\n      };\n    }\n  };\n}]);\n\nuis.directive('uiSelectFooter', ['uiSelectConfig', function (uiSelectConfig) {\n  return {\n    templateUrl: function (tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-footer');\n\n      // Gets theme attribute from parent (ui-select)\n      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n      return theme + '/footer.tpl.html';\n    },\n    restrict: 'EA',\n    transclude: true,\n    replace: true\n  };\n}]);\n\nuis.directive('uiSelectHeader', ['uiSelectConfig', function (uiSelectConfig) {\n  return {\n    templateUrl: function (tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-header');\n\n      // Gets theme attribute from parent (ui-select)\n      var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n      return theme + '/header.tpl.html';\n    },\n    restrict: 'EA',\n    transclude: true,\n    replace: true\n  };\n}]);\n\nuis.directive('uiSelectHeaderGroupSelectable', ['$timeout', function($timeout) {\n  return {\n    restrict: 'EA',\n    require: ['^uiSelect'],\n    scope: {\n      isEnabled: \"<?uiSelectHeaderGroupSelectable\"\n    },\n    link: function ($scope, $element, attrs, select) {\n      // TODO Why that???\n      var $select = select[0];\n      if (angular.isUndefined($scope.isEnabled)) {\n        $scope.isEnabled = true;\n      }\n\n      function isEnabled() {\n        return angular.isUndefined($scope.isEnabled) || $scope.isEnabled;\n      }\n\n      function getElements() {\n        if ($select.multiple && $select.groups) {\n          return $element.querySelectorAll('.ui-select-choices-group-label');\n        } else {\n          console.error('Use uiSelectHeaderGroupSelectable with no multiple uiSelect or without groupBy');\n          return [];\n        }\n      }\n\n      function enableClick() {\n        if (isEnabled()) {\n          angular.forEach(getElements(), function(e) {\n            var element = angular.element(e);\n\n            // Check the onClick event is not already listen\n            if (!element.hasClass('ui-select-header-group-selectable')) {\n              element.addClass('ui-select-header-group-selectable');\n\n              element.on('click', function () {\n                if (isEnabled()) {\n                  var group = $select.findGroupByName(element.text(), true);\n\n                  angular.forEach(group.items, function(item) {\n                    $timeout(function() {\n                      $select.select(item, false, ' ');\n                    });\n                  });\n                }\n              });\n            }\n          });\n        }\n      }\n\n      function disableClick() {\n        if (!isEnabled()) {\n          angular.forEach(getElements(), function(e) {\n            var element = angular.element(e);\n            element.removeClass('ui-select-header-group-selectable');\n            element.off('click');\n          });\n        }\n      }\n\n      // Watch element to trigger select event\n      $scope.$watch('isEnabled', function() {\n        if (!isEnabled()) {\n          disableClick();\n        } else {\n          enableClick();\n        }\n      });\n\n      $scope.$watch('$select.groups', enableClick);\n      $scope.$watch(function() {\n        return $select.selected && $select.selected.length ? $select.selected.length : -1;\n      }, enableClick);\n    }\n  };\n}]);\n\nuis.directive('uiSelectMatch', ['uiSelectConfig', function(uiSelectConfig) {\n  return {\n    restrict: 'EA',\n    require: '^uiSelect',\n    replace: true,\n    transclude: true,\n    templateUrl: function(tElement) {\n      // Needed so the uiSelect can detect the transcluded content\n      tElement.addClass('ui-select-match');\n\n      var parent = tElement.parent();\n      // Gets theme attribute from parent (ui-select)\n      var theme = getAttribute(parent, 'theme') || uiSelectConfig.theme;\n      var multi = angular.isDefined(getAttribute(parent, 'multiple'));\n\n      return theme + (multi ? '/match-multiple.tpl.html' : '/match.tpl.html');      \n    },\n    link: function(scope, element, attrs, $select) {\n      $select.lockChoiceExpression = attrs.uiLockChoice;\n      attrs.$observe('placeholder', function(placeholder) {\n        $select.placeholder = placeholder !== undefined ? placeholder : uiSelectConfig.placeholder;\n      });\n\n      function setAllowClear(allow) {\n        $select.allowClear = (angular.isDefined(allow)) ? (allow === '') ? true : (allow.toLowerCase() === 'true') : false;\n      }\n\n      attrs.$observe('allowClear', setAllowClear);\n      setAllowClear(attrs.allowClear);\n\n      if($select.multiple){\n        $select.sizeSearchInput();\n      }\n\n    }\n  };\n\n  function getAttribute(elem, attribute) {\n    if (elem[0].hasAttribute(attribute))\n      return elem.attr(attribute);\n\n    if (elem[0].hasAttribute('data-' + attribute))\n      return elem.attr('data-' + attribute);\n\n    if (elem[0].hasAttribute('x-' + attribute))\n      return elem.attr('x-' + attribute);\n  }\n}]);\n\nuis.directive('uiSelectMultiple', ['uiSelectMinErr','$timeout', function(uiSelectMinErr, $timeout) {\n  return {\n    restrict: 'EA',\n    require: ['^uiSelect', '^ngModel'],\n\n    controller: ['$scope','$timeout', function($scope, $timeout){\n\n      var ctrl = this,\n          $select = $scope.$select,\n          ngModel;\n\n      if (angular.isUndefined($select.selected))\n        $select.selected = [];\n\n      //Wait for link fn to inject it\n      $scope.$evalAsync(function(){ ngModel = $scope.ngModel; });\n\n      ctrl.activeMatchIndex = -1;\n\n      ctrl.updateModel = function(){\n        ngModel.$setViewValue(Date.now()); //Set timestamp as a unique string to force changes\n        ctrl.refreshComponent();\n      };\n\n      ctrl.refreshComponent = function(){\n        //Remove already selected items\n        //e.g. When user clicks on a selection, the selected array changes and\n        //the dropdown should remove that item\n        if($select.refreshItems){\n          $select.refreshItems();\n        }\n        if($select.sizeSearchInput){\n          $select.sizeSearchInput();\n        }\n      };\n\n      // Remove item from multiple select\n      ctrl.removeChoice = function(index){\n\n        // if the choice is locked, don't remove it\n        if($select.isLocked(null, index)) return false;\n\n        var removedChoice = $select.selected[index];\n\n        var locals = {};\n        locals[$select.parserResult.itemName] = removedChoice;\n\n        $select.selected.splice(index, 1);\n        ctrl.activeMatchIndex = -1;\n        $select.sizeSearchInput();\n\n        // Give some time for scope propagation.\n        $timeout(function(){\n          $select.onRemoveCallback($scope, {\n            $item: removedChoice,\n            $model: $select.parserResult.modelMapper($scope, locals)\n          });\n        });\n\n        ctrl.updateModel();\n\n        return true;\n      };\n\n\n    }],\n    controllerAs: '$selectMultiple',\n\n    link: function(scope, element, attrs, ctrls) {\n\n      var $select = ctrls[0];\n      var ngModel = scope.ngModel = ctrls[1];\n      var $selectMultiple = scope.$selectMultiple;\n\n      //$select.selected = raw selected objects (ignoring any property binding)\n\n      $select.multiple = true;\n\n      //Input that will handle focus\n      $select.focusInput = $select.searchInput;\n\n      //Properly check for empty if set to multiple\n      ngModel.$isEmpty = function(value) {\n        return !value || value.length === 0;\n      };\n\n      //From view --> model\n      ngModel.$parsers.unshift(function () {\n        var locals = {},\n            result,\n            resultMultiple = [];\n        for (var j = $select.selected.length - 1; j >= 0; j--) {\n          locals = {};\n          locals[$select.parserResult.itemName] = $select.selected[j];\n          result = $select.parserResult.modelMapper(scope, locals);\n          resultMultiple.unshift(result);\n        }\n        return resultMultiple;\n      });\n\n      // From model --> view\n      ngModel.$formatters.unshift(function (inputValue) {\n        var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n            locals = {},\n            result;\n        if (!data) return inputValue;\n        var resultMultiple = [];\n        var checkFnMultiple = function(list, value){\n          if (!list || !list.length) return;\n          for (var p = list.length - 1; p >= 0; p--) {\n            locals[$select.parserResult.itemName] = list[p];\n            result = $select.parserResult.modelMapper(scope, locals);\n            if($select.parserResult.trackByExp){\n                var propsItemNameMatches = /(\\w*)\\./.exec($select.parserResult.trackByExp);\n                var matches = /\\.([^\\s]+)/.exec($select.parserResult.trackByExp);\n                if(propsItemNameMatches && propsItemNameMatches.length > 0 && propsItemNameMatches[1] == $select.parserResult.itemName){\n                  if(matches && matches.length>0 && result[matches[1]] == value[matches[1]]){\n                      resultMultiple.unshift(list[p]);\n                      return true;\n                  }\n                }\n            }\n            if (angular.equals(result,value)){\n              resultMultiple.unshift(list[p]);\n              return true;\n            }\n          }\n          return false;\n        };\n        if (!inputValue) return resultMultiple; //If ngModel was undefined\n        for (var k = inputValue.length - 1; k >= 0; k--) {\n          //Check model array of currently selected items\n          if (!checkFnMultiple($select.selected, inputValue[k])){\n            //Check model array of all items available\n            if (!checkFnMultiple(data, inputValue[k])){\n              //If not found on previous lists, just add it directly to resultMultiple\n              resultMultiple.unshift(inputValue[k]);\n            }\n          }\n        }\n        return resultMultiple;\n      });\n\n      //Watch for external model changes\n      scope.$watchCollection(function(){ return ngModel.$modelValue; }, function(newValue, oldValue) {\n        if (oldValue != newValue){\n          //update the view value with fresh data from items, if there is a valid model value\n          if(angular.isDefined(ngModel.$modelValue)) {\n            ngModel.$modelValue = null; //Force scope model value and ngModel value to be out of sync to re-run formatters\n          }\n          $selectMultiple.refreshComponent();\n        }\n      });\n\n      ngModel.$render = function() {\n        // Make sure that model value is array\n        if(!angular.isArray(ngModel.$viewValue)){\n          // Have tolerance for null or undefined values\n          if (isNil(ngModel.$viewValue)){\n            ngModel.$viewValue = [];\n          } else {\n            throw uiSelectMinErr('multiarr', \"Expected model value to be array but got '{0}'\", ngModel.$viewValue);\n          }\n        }\n        $select.selected = ngModel.$viewValue;\n        $selectMultiple.refreshComponent();\n        scope.$evalAsync(); //To force $digest\n      };\n\n      scope.$on('uis:select', function (event, item) {\n        if($select.selected.length >= $select.limit) {\n          return;\n        }\n        $select.selected.push(item);\n        var locals = {};\n        locals[$select.parserResult.itemName] = item;\n\n        $timeout(function(){\n          $select.onSelectCallback(scope, {\n            $item: item,\n            $model: $select.parserResult.modelMapper(scope, locals)\n          });\n        });\n        $selectMultiple.updateModel();\n      });\n\n      scope.$on('uis:activate', function () {\n        $selectMultiple.activeMatchIndex = -1;\n      });\n\n      scope.$watch('$select.disabled', function(newValue, oldValue) {\n        // As the search input field may now become visible, it may be necessary to recompute its size\n        if (oldValue && !newValue) $select.sizeSearchInput();\n      });\n\n      $select.searchInput.on('keydown', function(e) {\n        var key = e.which;\n        scope.$apply(function() {\n          var processed = false;\n          // var tagged = false; //Checkme\n          if(KEY.isHorizontalMovement(key)){\n            processed = _handleMatchSelection(key);\n          }\n          if (processed  && key != KEY.TAB) {\n            //TODO Check si el tab selecciona aun correctamente\n            //Crear test\n            e.preventDefault();\n            e.stopPropagation();\n          }\n        });\n      });\n      function _getCaretPosition(el) {\n        if(angular.isNumber(el.selectionStart)) return el.selectionStart;\n        // selectionStart is not supported in IE8 and we don't want hacky workarounds so we compromise\n        else return el.value.length;\n      }\n      // Handles selected options in \"multiple\" mode\n      function _handleMatchSelection(key){\n        var caretPosition = _getCaretPosition($select.searchInput[0]),\n            length = $select.selected.length,\n            // none  = -1,\n            first = 0,\n            last  = length-1,\n            curr  = $selectMultiple.activeMatchIndex,\n            next  = $selectMultiple.activeMatchIndex+1,\n            prev  = $selectMultiple.activeMatchIndex-1,\n            newIndex = curr;\n\n        if(caretPosition > 0 || ($select.search.length && key == KEY.RIGHT)) return false;\n\n        $select.close();\n\n        function getNewActiveMatchIndex(){\n          switch(key){\n            case KEY.LEFT:\n              // Select previous/first item\n              if(~$selectMultiple.activeMatchIndex) return prev;\n              // Select last item\n              else return last;\n              break;\n            case KEY.RIGHT:\n              // Open drop-down\n              if(!~$selectMultiple.activeMatchIndex || curr === last){\n                $select.activate();\n                return false;\n              }\n              // Select next/last item\n              else return next;\n              break;\n            case KEY.BACKSPACE:\n              // Remove selected item and select previous/first\n              if(~$selectMultiple.activeMatchIndex){\n                if($selectMultiple.removeChoice(curr)) {\n                  return prev;\n                } else {\n                  return curr;\n                }\n\n              } else {\n                // If nothing yet selected, select last item\n                return last;\n              }\n              break;\n            case KEY.DELETE:\n              // Remove selected item and select next item\n              if(~$selectMultiple.activeMatchIndex){\n                $selectMultiple.removeChoice($selectMultiple.activeMatchIndex);\n                return curr;\n              }\n              else return false;\n          }\n        }\n\n        newIndex = getNewActiveMatchIndex();\n\n        if(!$select.selected.length || newIndex === false) $selectMultiple.activeMatchIndex = -1;\n        else $selectMultiple.activeMatchIndex = Math.min(last,Math.max(first,newIndex));\n\n        return true;\n      }\n\n      $select.searchInput.on('keyup', function(e) {\n\n        if ( ! KEY.isVerticalMovement(e.which) ) {\n          scope.$evalAsync( function () {\n            $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n          });\n        }\n        // Push a \"create new\" item into array if there is a search string\n        if ( $select.tagging.isActivated && $select.search.length > 0 ) {\n\n          // return early with these keys\n          if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || KEY.isVerticalMovement(e.which) ) {\n            return;\n          }\n          // always reset the activeIndex to the first item when tagging\n          $select.activeIndex = $select.taggingLabel === false ? -1 : 0;\n          // taggingLabel === false bypasses all of this\n          if ($select.taggingLabel === false) return;\n\n          var items = angular.copy( $select.items );\n          var stashArr = angular.copy( $select.items );\n          var newItem;\n          var item;\n          var hasTag = false;\n          var dupeIndex = -1;\n          var tagItems;\n          var tagItem;\n\n          // case for object tagging via transform `$select.tagging.fct` function\n          if ( $select.tagging.fct !== undefined) {\n            tagItems = $select.$filter('filter')(items,{'isTag': true});\n            if ( tagItems.length > 0 ) {\n              tagItem = tagItems[0];\n            }\n            // remove the first element, if it has the `isTag` prop we generate a new one with each keyup, shaving the previous\n            if ( items.length > 0 && tagItem ) {\n              hasTag = true;\n              items = items.slice(1,items.length);\n              stashArr = stashArr.slice(1,stashArr.length);\n            }\n            newItem = $select.tagging.fct($select.search);\n            // verify the new tag doesn't match the value of a possible selection choice or an already selected item.\n            if (\n              stashArr.some(function (origItem) {\n                 return angular.equals(origItem, newItem);\n              }) ||\n              $select.selected.some(function (origItem) {\n                return angular.equals(origItem, newItem);\n              })\n            ) {\n              scope.$evalAsync(function () {\n                $select.activeIndex = 0;\n                $select.items = items;\n              });\n              return;\n            }\n            if (newItem) newItem.isTag = true;\n          // handle newItem string and stripping dupes in tagging string context\n          } else {\n            // find any tagging items already in the $select.items array and store them\n            tagItems = $select.$filter('filter')(items,function (item) {\n              return item.match($select.taggingLabel);\n            });\n            if ( tagItems.length > 0 ) {\n              tagItem = tagItems[0];\n            }\n            item = items[0];\n            // remove existing tag item if found (should only ever be one tag item)\n            if ( item !== undefined && items.length > 0 && tagItem ) {\n              hasTag = true;\n              items = items.slice(1,items.length);\n              stashArr = stashArr.slice(1,stashArr.length);\n            }\n            newItem = $select.search+' '+$select.taggingLabel;\n            if ( _findApproxDupe($select.selected, $select.search) > -1 ) {\n              return;\n            }\n            // verify the the tag doesn't match the value of an existing item from\n            // the searched data set or the items already selected\n            if ( _findCaseInsensitiveDupe(stashArr.concat($select.selected)) ) {\n              // if there is a tag from prev iteration, strip it / queue the change\n              // and return early\n              if ( hasTag ) {\n                items = stashArr;\n                scope.$evalAsync( function () {\n                  $select.activeIndex = 0;\n                  $select.items = items;\n                });\n              }\n              return;\n            }\n            if ( _findCaseInsensitiveDupe(stashArr) ) {\n              // if there is a tag from prev iteration, strip it\n              if ( hasTag ) {\n                $select.items = stashArr.slice(1,stashArr.length);\n              }\n              return;\n            }\n          }\n          if ( hasTag ) dupeIndex = _findApproxDupe($select.selected, newItem);\n          // dupe found, shave the first item\n          if ( dupeIndex > -1 ) {\n            items = items.slice(dupeIndex+1,items.length-1);\n          } else {\n            items = [];\n            if (newItem) items.push(newItem);\n            items = items.concat(stashArr);\n          }\n          scope.$evalAsync( function () {\n            $select.activeIndex = 0;\n            $select.items = items;\n\n            if ($select.isGrouped) {\n              // update item references in groups, so that indexOf will work after angular.copy\n              var itemsWithoutTag = newItem ? items.slice(1) : items;\n              $select.setItemsFn(itemsWithoutTag);\n              if (newItem) {\n                // add tag item as a new group\n                $select.items.unshift(newItem);\n                $select.groups.unshift({name: '', items: [newItem], tagging: true});\n              }\n            }\n          });\n        }\n      });\n      function _findCaseInsensitiveDupe(arr) {\n        if ( arr === undefined || $select.search === undefined ) {\n          return false;\n        }\n        var hasDupe = arr.filter( function (origItem) {\n          if ( $select.search.toUpperCase() === undefined || origItem === undefined ) {\n            return false;\n          }\n          return origItem.toUpperCase() === $select.search.toUpperCase();\n        }).length > 0;\n\n        return hasDupe;\n      }\n      function _findApproxDupe(haystack, needle) {\n        var dupeIndex = -1;\n        if(angular.isArray(haystack)) {\n          var tempArr = angular.copy(haystack);\n          for (var i = 0; i <tempArr.length; i++) {\n            // handle the simple string version of tagging\n            if ( $select.tagging.fct === undefined ) {\n              // search the array for the match\n              if ( tempArr[i]+' '+$select.taggingLabel === needle ) {\n              dupeIndex = i;\n              }\n            // handle the object tagging implementation\n            } else {\n              var mockObj = tempArr[i];\n              if (angular.isObject(mockObj)) {\n                mockObj.isTag = true;\n              }\n              if ( angular.equals(mockObj, needle) ) {\n                dupeIndex = i;\n              }\n            }\n          }\n        }\n        return dupeIndex;\n      }\n\n      $select.searchInput.on('blur', function() {\n        $timeout(function() {\n          $selectMultiple.activeMatchIndex = -1;\n        });\n      });\n\n    }\n  };\n}]);\n\nuis.directive('uiSelectNoChoice',\n    ['uiSelectConfig', function (uiSelectConfig) {\n        return {\n            restrict: 'EA',\n            require: '^uiSelect',\n            replace: true,\n            transclude: true,\n            templateUrl: function (tElement) {\n                // Needed so the uiSelect can detect the transcluded content\n                tElement.addClass('ui-select-no-choice');\n      \n                // Gets theme attribute from parent (ui-select)\n                var theme = tElement.parent().attr('theme') || uiSelectConfig.theme;\n                return theme + '/no-choice.tpl.html';\n            }\n        };\n    }]);\n\nuis.directive('uiSelectSingle', ['$timeout','$compile', function($timeout, $compile) {\n  return {\n    restrict: 'EA',\n    require: ['^uiSelect', '^ngModel'],\n    link: function(scope, element, attrs, ctrls) {\n\n      var $select = ctrls[0];\n      var ngModel = ctrls[1];\n\n      //From view --> model\n      ngModel.$parsers.unshift(function (inputValue) {\n        // Keep original value for undefined and null\n        if (isNil(inputValue)) {\n          return inputValue;\n        }\n\n        var locals = {},\n            result;\n        locals[$select.parserResult.itemName] = inputValue;\n        result = $select.parserResult.modelMapper(scope, locals);\n        return result;\n      });\n\n      //From model --> view\n      ngModel.$formatters.unshift(function (inputValue) {\n        // Keep original value for undefined and null\n        if (isNil(inputValue)) {\n          return inputValue;\n        }\n\n        var data = $select.parserResult && $select.parserResult.source (scope, { $select : {search:''}}), //Overwrite $search\n            locals = {},\n            result;\n        if (data){\n          var checkFnSingle = function(d){\n            locals[$select.parserResult.itemName] = d;\n            result = $select.parserResult.modelMapper(scope, locals);\n            return result === inputValue;\n          };\n          //If possible pass same object stored in $select.selected\n          if ($select.selected && checkFnSingle($select.selected)) {\n            return $select.selected;\n          }\n          for (var i = data.length - 1; i >= 0; i--) {\n            if (checkFnSingle(data[i])) return data[i];\n          }\n        }\n        return inputValue;\n      });\n\n      //Update viewValue if model change\n      scope.$watch('$select.selected', function(newValue) {\n        if (ngModel.$viewValue !== newValue) {\n          ngModel.$setViewValue(newValue);\n        }\n      });\n\n      ngModel.$render = function() {\n        $select.selected = ngModel.$viewValue;\n      };\n\n      scope.$on('uis:select', function (event, item) {\n        $select.selected = item;\n        var locals = {};\n        locals[$select.parserResult.itemName] = item;\n\n        $timeout(function() {\n          $select.onSelectCallback(scope, {\n            $item: item,\n            $model: isNil(item) ? item : $select.parserResult.modelMapper(scope, locals)\n          });\n        });\n      });\n\n      scope.$on('uis:close', function (event, skipFocusser) {\n        $timeout(function(){\n          $select.focusser.prop('disabled', false);\n          if (!skipFocusser) $select.focusser[0].focus();\n        },0,false);\n      });\n\n      scope.$on('uis:activate', function () {\n        focusser.prop('disabled', true); //Will reactivate it on .close()\n      });\n\n      //Idea from: https://github.com/ivaynberg/select2/blob/79b5bf6db918d7560bdd959109b7bcfb47edaf43/select2.js#L1954\n      var focusser = angular.element(\"<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />\");\n      $compile(focusser)(scope);\n      $select.focusser = focusser;\n\n      //Input that will handle focus\n      $select.focusInput = focusser;\n\n      element.parent().append(focusser);\n      focusser.bind(\"focus\", function(){\n        scope.$evalAsync(function(){\n          $select.focus = true;\n        });\n      });\n      focusser.bind(\"blur\", function(){\n        scope.$evalAsync(function(){\n          $select.focus = false;\n        });\n      });\n      focusser.bind(\"keydown\", function(e){\n\n        if (e.which === KEY.BACKSPACE && $select.backspaceReset !== false) {\n          e.preventDefault();\n          e.stopPropagation();\n          $select.select(undefined);\n          scope.$apply();\n          return;\n        }\n\n        if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n          return;\n        }\n\n        if (e.which == KEY.DOWN  || e.which == KEY.UP || e.which == KEY.ENTER || e.which == KEY.SPACE){\n          e.preventDefault();\n          e.stopPropagation();\n          $select.activate();\n        }\n\n        scope.$digest();\n      });\n\n      focusser.bind(\"keyup input\", function(e){\n\n        if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC || e.which == KEY.ENTER || e.which === KEY.BACKSPACE) {\n          return;\n        }\n\n        $select.activate(focusser.val()); //User pressed some regular key, so we pass it to the search input\n        focusser.val('');\n        scope.$digest();\n\n      });\n\n\n    }\n  };\n}]);\n\n// Make multiple matches sortable\nuis.directive('uiSelectSort', ['$timeout', 'uiSelectConfig', 'uiSelectMinErr', function($timeout, uiSelectConfig, uiSelectMinErr) {\n  return {\n    require: ['^^uiSelect', '^ngModel'],\n    link: function(scope, element, attrs, ctrls) {\n      if (scope[attrs.uiSelectSort] === null) {\n        throw uiSelectMinErr('sort', 'Expected a list to sort');\n      }\n\n      var $select = ctrls[0];\n      var $ngModel = ctrls[1];\n\n      var options = angular.extend({\n          axis: 'horizontal'\n        },\n        scope.$eval(attrs.uiSelectSortOptions));\n\n      var axis = options.axis;\n      var draggingClassName = 'dragging';\n      var droppingClassName = 'dropping';\n      var droppingBeforeClassName = 'dropping-before';\n      var droppingAfterClassName = 'dropping-after';\n\n      scope.$watch(function(){\n        return $select.sortable;\n      }, function(newValue){\n        if (newValue) {\n          element.attr('draggable', true);\n        } else {\n          element.removeAttr('draggable');\n        }\n      });\n\n      if (element.data('disallowDrop')) {\n        return;\n      }\n\n      element.on('dragstart', function(event) {\n        element.addClass(draggingClassName);\n\n        (event.dataTransfer || event.originalEvent.dataTransfer).setData('text', scope.$index.toString());\n      });\n\n      element.on('dragend', function() {\n        removeClass(draggingClassName);\n      });\n\n      var move = function(from, to) {\n        /*jshint validthis: true */\n        this.splice(to, 0, this.splice(from, 1)[0]);\n      };\n\n      var removeClass = function(className) {\n        angular.forEach($select.$element.querySelectorAll('.' + className), function(el){\n          angular.element(el).removeClass(className);\n        });\n      };\n\n      var dragOverHandler = function(event) {\n        event.preventDefault();\n\n        var offset = axis === 'vertical' ? event.offsetY || event.layerY || (event.originalEvent ? event.originalEvent.offsetY : 0) : event.offsetX || event.layerX || (event.originalEvent ? event.originalEvent.offsetX : 0);\n\n        if (offset < (this[axis === 'vertical' ? 'offsetHeight' : 'offsetWidth'] / 2)) {\n          removeClass(droppingAfterClassName);\n          element.addClass(droppingBeforeClassName);\n\n        } else {\n          removeClass(droppingBeforeClassName);\n          element.addClass(droppingAfterClassName);\n        }\n      };\n\n      var dropTimeout;\n\n      var dropHandler = function(event) {\n        event.preventDefault();\n\n        var droppedItemIndex = parseInt((event.dataTransfer || event.originalEvent.dataTransfer).getData('text'), 10);\n\n        // prevent event firing multiple times in firefox\n        $timeout.cancel(dropTimeout);\n        dropTimeout = $timeout(function() {\n          _dropHandler(droppedItemIndex);\n        }, 20);\n      };\n\n      var _dropHandler = function(droppedItemIndex) {\n        var theList = scope.$eval(attrs.uiSelectSort);\n        var itemToMove = theList[droppedItemIndex];\n        var newIndex = null;\n\n        if (element.hasClass(droppingBeforeClassName)) {\n          if (droppedItemIndex < scope.$index) {\n            newIndex = scope.$index - 1;\n          } else {\n            newIndex = scope.$index;\n          }\n        } else {\n          if (droppedItemIndex < scope.$index) {\n            newIndex = scope.$index;\n          } else {\n            newIndex = scope.$index + 1;\n          }\n        }\n\n        move.apply(theList, [droppedItemIndex, newIndex]);\n\n        $ngModel.$setViewValue(Date.now());\n\n        scope.$apply(function() {\n          scope.$emit('uiSelectSort:change', {\n            array: theList,\n            item: itemToMove,\n            from: droppedItemIndex,\n            to: newIndex\n          });\n        });\n\n        removeClass(droppingClassName);\n        removeClass(droppingBeforeClassName);\n        removeClass(droppingAfterClassName);\n\n        element.off('drop', dropHandler);\n      };\n\n      element.on('dragenter', function() {\n        if (element.hasClass(draggingClassName)) {\n          return;\n        }\n\n        element.addClass(droppingClassName);\n\n        element.on('dragover', dragOverHandler);\n        element.on('drop', dropHandler);\n      });\n\n      element.on('dragleave', function(event) {\n        if (event.target != element) {\n          return;\n        }\n\n        removeClass(droppingClassName);\n        removeClass(droppingBeforeClassName);\n        removeClass(droppingAfterClassName);\n\n        element.off('dragover', dragOverHandler);\n        element.off('drop', dropHandler);\n      });\n    }\n  };\n}]);\n\n/**\n * Debounces functions\n *\n * Taken from UI Bootstrap $$debounce source code\n * See https://github.com/angular-ui/bootstrap/blob/master/src/debounce/debounce.js\n *\n */\nuis.factory('$$uisDebounce', ['$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\nuis.directive('uisOpenClose', ['$parse', '$timeout', function ($parse, $timeout) {\n  return {\n    restrict: 'A',\n    require: 'uiSelect',\n    link: function (scope, element, attrs, $select) {\n      $select.onOpenCloseCallback = $parse(attrs.uisOpenClose);\n\n      scope.$watch('$select.open', function (isOpen, previousState) {\n        if (isOpen !== previousState) {\n          $timeout(function () {\n            $select.onOpenCloseCallback(scope, {\n              isOpen: isOpen\n            });\n          });\n        }\n      });\n    }\n  };\n}]);\n\n/**\n * Parses \"repeat\" attribute.\n *\n * Taken from AngularJS ngRepeat source code\n * See https://github.com/angular/angular.js/blob/v1.2.15/src/ng/directive/ngRepeat.js#L211\n *\n * Original discussion about parsing \"repeat\" attribute instead of fully relying on ng-repeat:\n * https://github.com/angular-ui/ui-select/commit/5dd63ad#commitcomment-5504697\n */\n\nuis.service('uisRepeatParser', ['uiSelectMinErr','$parse', function(uiSelectMinErr, $parse) {\n  var self = this;\n\n  /**\n   * Example:\n   * expression = \"address in addresses | filter: {street: $select.search} track by $index\"\n   * itemName = \"address\",\n   * source = \"addresses | filter: {street: $select.search}\",\n   * trackByExp = \"$index\",\n   */\n  self.parse = function(expression) {\n\n\n    var match;\n    //var isObjectCollection = /\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)/.test(expression);\n    // If an array is used as collection\n\n    // if (isObjectCollection){\n    // 000000000000000000000000000000111111111000000000000000222222222222220033333333333333333333330000444444444444444444000000000000000055555555555000000000000000000000066666666600000000\n    match = expression.match(/^\\s*(?:([\\s\\S]+?)\\s+as\\s+)?(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(\\s*[\\s\\S]+?)?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n    // 1 Alias\n    // 2 Item\n    // 3 Key on (key,value)\n    // 4 Value on (key,value)\n    // 5 Source expression (including filters)\n    // 6 Track by\n\n    if (!match) {\n      throw uiSelectMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n              expression);\n    }\n    \n    var source = match[5], \n        filters = '';\n\n    // When using (key,value) ui-select requires filters to be extracted, since the object\n    // is converted to an array for $select.items \n    // (in which case the filters need to be reapplied)\n    if (match[3]) {\n      // Remove any enclosing parenthesis\n      source = match[5].replace(/(^\\()|(\\)$)/g, '');\n      // match all after | but not after ||\n      var filterMatch = match[5].match(/^\\s*(?:[\\s\\S]+?)(?:[^\\|]|\\|\\|)+([\\s\\S]*)\\s*$/);\n      if(filterMatch && filterMatch[1].trim()) {\n        filters = filterMatch[1];\n        source = source.replace(filters, '');\n      }      \n    }\n\n    return {\n      itemName: match[4] || match[2], // (lhs) Left-hand side,\n      keyName: match[3], //for (key, value) syntax\n      source: $parse(source),\n      filters: filters,\n      trackByExp: match[6],\n      modelMapper: $parse(match[1] || match[4] || match[2]),\n      repeatExpression: function (grouped) {\n        var expression = this.itemName + ' in ' + (grouped ? '$group.items' : '$select.items');\n        if (this.trackByExp) {\n          expression += ' track by ' + this.trackByExp;\n        }\n        return expression;\n      } \n    };\n\n  };\n\n  self.getGroupNgRepeatExpression = function() {\n    return '$group in $select.groups track by $group.name';\n  };\n\n}]);\n\n}());\nangular.module(\"ui.select\").run([\"$templateCache\", function($templateCache) {$templateCache.put(\"bootstrap/choices.tpl.html\",\"<ul class=\\\"ui-select-choices ui-select-choices-content\\\"><li class=\\\"ui-select-choices-group\\\" id=\\\"ui-select-choices-{{ $select.generatedId }}\\\"><div class=\\\"divider\\\" ng-show=\\\"$select.isGrouped && $index > 0\\\"></div><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label dropdown-header\\\" ng-bind=\\\"$group.name\\\"></div><div ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\" role=\\\"option\\\"><span class=\\\"ui-select-choices-row-inner\\\"></span></div></li></ul>\");\n$templateCache.put(\"bootstrap/footer.tpl.html\",\"<div class=\\\"ui-select-footer\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"bootstrap/header.tpl.html\",\"<div class=\\\"ui-select-header\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"bootstrap/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><span ng-repeat=\\\"$item in $select.selected track by $index\\\"><span class=\\\"ui-select-match-item btn btn-default btn-xs\\\" tabindex=\\\"-1\\\" type=\\\"button\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'btn-primary\\':$selectMultiple.activeMatchIndex === $index, \\'select-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"close ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&nbsp;&times;</span> <span uis-transclude-append=\\\"\\\"></span></span></span></span>\");\n$templateCache.put(\"bootstrap/match.tpl.html\",\"<div class=\\\"ui-select-match\\\" ng-hide=\\\"$select.open && $select.searchEnabled\\\" ng-disabled=\\\"$select.disabled\\\" ng-class=\\\"{\\'btn-default-focus\\':$select.focus}\\\"><span tabindex=\\\"-1\\\" class=\\\"btn btn-default form-control ui-select-toggle\\\" aria-label=\\\"{{ $select.baseTitle }} activate\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" style=\\\"outline: 0;\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"ui-select-match-text pull-left\\\" ng-class=\\\"{\\'ui-select-allow-clear\\': $select.allowClear && !$select.isEmpty()}\\\" ng-transclude=\\\"\\\"></span> <i class=\\\"caret pull-right\\\" ng-click=\\\"$select.toggle($event)\\\"></i> <a ng-show=\\\"$select.allowClear && !$select.isEmpty() && ($select.disabled !== true)\\\" aria-label=\\\"{{ $select.baseTitle }} clear\\\" style=\\\"margin-right: 10px\\\" ng-click=\\\"$select.clear($event)\\\" class=\\\"btn btn-xs btn-link pull-right\\\"><i class=\\\"glyphicon glyphicon-remove\\\" aria-hidden=\\\"true\\\"></i></a></span></div>\");\n$templateCache.put(\"bootstrap/no-choice.tpl.html\",\"<ul class=\\\"ui-select-no-choice dropdown-menu\\\" ng-show=\\\"$select.items.length == 0\\\"><li ng-transclude=\\\"\\\"></li></ul>\");\n$templateCache.put(\"bootstrap/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\\\" ng-class=\\\"{open: $select.open}\\\"><div><div class=\\\"ui-select-match\\\"></div><span ng-show=\\\"$select.open && $select.refreshing && $select.spinnerEnabled\\\" class=\\\"ui-select-refreshing {{$select.spinnerClass}}\\\"></span> <input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" class=\\\"ui-select-search input-xs\\\" placeholder=\\\"{{$select.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-click=\\\"$select.activate()\\\" ng-model=\\\"$select.search\\\" role=\\\"combobox\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{$select.baseTitle}}\\\" ng-class=\\\"{\\'spinner\\': $select.refreshing}\\\" data-disallow-drop=\\\"data-disallow-drop\\\"></div><div ng-show=\\\"$select.open && $select.items.length > 0\\\" class=\\\"ui-select-dropdown dropdown-menu\\\"><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-footer\\\"></div></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"bootstrap/select.tpl.html\",\"<div class=\\\"ui-select-container ui-select-bootstrap dropdown\\\" ng-class=\\\"{open: $select.open}\\\"><div class=\\\"ui-select-match\\\"></div><span ng-show=\\\"$select.open && $select.refreshing && $select.spinnerEnabled\\\" class=\\\"ui-select-refreshing {{$select.spinnerClass}}\\\"></span> <input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" aria-expanded=\\\"true\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" class=\\\"form-control ui-select-search\\\" ng-class=\\\"{ \\'ui-select-search-hidden\\' : !$select.searchEnabled }\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-show=\\\"$select.open\\\" ng-trim=\\\"{{ $select.trim }}\\\"><div ng-show=\\\"$select.open && $select.items.length > 0\\\" class=\\\"ui-select-dropdown dropdown-menu\\\"><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-footer\\\"></div></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"select2/choices.tpl.html\",\"<ul tabindex=\\\"-1\\\" class=\\\"ui-select-choices ui-select-choices-content select2-results\\\"><li class=\\\"ui-select-choices-group\\\" ng-class=\\\"{\\'select2-result-with-children\\': $select.choiceGrouped($group) }\\\"><div ng-show=\\\"$select.choiceGrouped($group)\\\" class=\\\"ui-select-choices-group-label select2-result-label\\\" ng-bind=\\\"$group.name\\\"></div><ul id=\\\"ui-select-choices-{{ $select.generatedId }}\\\" ng-class=\\\"{\\'select2-result-sub\\': $select.choiceGrouped($group), \\'select2-result-single\\': !$select.choiceGrouped($group) }\\\"><li role=\\\"option\\\" ng-attr-id=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{\\'select2-highlighted\\': $select.isActive(this), \\'select2-disabled\\': $select.isDisabled(this)}\\\"><div class=\\\"select2-result-label ui-select-choices-row-inner\\\"></div></li></ul></li></ul>\");\n$templateCache.put(\"select2/footer.tpl.html\",\"<div class=\\\"ui-select-footer\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"select2/header.tpl.html\",\"<div class=\\\"ui-select-header\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"select2/match-multiple.tpl.html\",\"<span class=\\\"ui-select-match\\\"><li class=\\\"ui-select-match-item select2-search-choice\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-class=\\\"{\\'select2-search-choice-focus\\':$selectMultiple.activeMatchIndex === $index, \\'select2-locked\\':$select.isLocked(this, $index)}\\\" ui-select-sort=\\\"$select.selected\\\"><span uis-transclude-append=\\\"\\\"></span> <a href=\\\"javascript:;\\\" class=\\\"ui-select-match-close select2-search-choice-close\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\" tabindex=\\\"-1\\\"></a></li></span>\");\n$templateCache.put(\"select2/match.tpl.html\",\"<a class=\\\"select2-choice ui-select-match\\\" ng-class=\\\"{\\'select2-default\\': $select.isEmpty()}\\\" ng-click=\\\"$select.toggle($event)\\\" aria-label=\\\"{{ $select.baseTitle }} select\\\"><span ng-show=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty()\\\" class=\\\"select2-chosen\\\" ng-transclude=\\\"\\\"></span> <abbr ng-if=\\\"$select.allowClear && !$select.isEmpty()\\\" class=\\\"select2-search-choice-close\\\" ng-click=\\\"$select.clear($event)\\\"></abbr> <span class=\\\"select2-arrow ui-select-toggle\\\"><b></b></span></a>\");\n$templateCache.put(\"select2/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"select2/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled}\\\"><ul class=\\\"select2-choices\\\"><span class=\\\"ui-select-match\\\"></span><li class=\\\"select2-search-field\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" aria-activedescendant=\\\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\\\" class=\\\"select2-input ui-select-search\\\" placeholder=\\\"{{$select.getPlaceholder()}}\\\" ng-disabled=\\\"$select.disabled\\\" ng-hide=\\\"$select.disabled\\\" ng-model=\\\"$select.search\\\" ng-click=\\\"$select.activate()\\\" style=\\\"width: 34px;\\\" data-disallow-drop=\\\"data-disallow-drop\\\"></li></ul><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open || $select.items.length === 0}\\\"><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-footer\\\"></div></div></div>\");\n$templateCache.put(\"select2/select.tpl.html\",\"<div class=\\\"ui-select-container select2 select2-container\\\" ng-class=\\\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled, \\'select2-container-active\\': $select.focus, \\'select2-allowclear\\': $select.allowClear && !$select.isEmpty()}\\\"><div class=\\\"ui-select-match\\\"></div><div class=\\\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\\\" ng-class=\\\"{\\'select2-display-none\\': !$select.open}\\\"><div class=\\\"search-container\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled, \\'select2-search\\':$select.searchEnabled}\\\"><input type=\\\"search\\\" autocomplete=\\\"off\\\" autocorrect=\\\"off\\\" autocapitalize=\\\"off\\\" spellcheck=\\\"false\\\" ng-class=\\\"{\\'select2-active\\': $select.refreshing}\\\" ng-trim=\\\"{{ $select.trim }}\\\" role=\\\"combobox\\\" aria-expanded=\\\"true\\\" aria-owns=\\\"ui-select-choices-{{ $select.generatedId }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" class=\\\"ui-select-search select2-input\\\" ng-model=\\\"$select.search\\\"></div><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-no-choice\\\"></div><div class=\\\"ui-select-footer\\\"></div></div></div>\");\n$templateCache.put(\"selectize/choices.tpl.html\",\"<div class=\\\"ui-select-choices\\\"><div class=\\\"ui-select-choices-content selectize-dropdown-content\\\"><div class=\\\"ui-select-choices-group optgroup\\\"><div ng-show=\\\"$select.isGrouped\\\" class=\\\"ui-select-choices-group-label optgroup-header\\\" ng-bind=\\\"$group.name\\\"></div><div role=\\\"option\\\" class=\\\"ui-select-choices-row\\\" ng-class=\\\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\\\"><div class=\\\"option ui-select-choices-row-inner\\\" data-selectable=\\\"\\\"></div></div></div></div></div>\");\n$templateCache.put(\"selectize/footer.tpl.html\",\"<div class=\\\"ui-select-footer\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"selectize/header.tpl.html\",\"<div class=\\\"ui-select-header\\\" ng-transclude=\\\"\\\"></div>\");\n$templateCache.put(\"selectize/match-multiple.tpl.html\",\"<div class=\\\"ui-select-match\\\" data-value=\\\"\\\" ng-repeat=\\\"$item in $select.selected track by $index\\\" ng-click=\\\"$selectMultiple.activeMatchIndex = $index;\\\" ng-class=\\\"{\\'active\\':$selectMultiple.activeMatchIndex === $index}\\\" ui-select-sort=\\\"$select.selected\\\"><span class=\\\"ui-select-match-item\\\" ng-class=\\\"{\\'select-locked\\':$select.isLocked(this, $index)}\\\"><span uis-transclude-append=\\\"\\\"></span> <span class=\\\"remove ui-select-match-close\\\" ng-hide=\\\"$select.disabled\\\" ng-click=\\\"$selectMultiple.removeChoice($index)\\\">&times;</span></span></div>\");\n$templateCache.put(\"selectize/match.tpl.html\",\"<div ng-hide=\\\"$select.searchEnabled && ($select.open || $select.isEmpty())\\\" class=\\\"ui-select-match\\\"><span ng-show=\\\"!$select.searchEnabled && ($select.isEmpty() || $select.open)\\\" class=\\\"ui-select-placeholder text-muted\\\">{{$select.placeholder}}</span> <span ng-hide=\\\"$select.isEmpty() || $select.open\\\" ng-transclude=\\\"\\\"></span></div>\");\n$templateCache.put(\"selectize/no-choice.tpl.html\",\"<div class=\\\"ui-select-no-choice selectize-dropdown\\\" ng-show=\\\"$select.items.length == 0\\\"><div class=\\\"selectize-dropdown-content\\\"><div data-selectable=\\\"\\\" ng-transclude=\\\"\\\"></div></div></div>\");\n$templateCache.put(\"selectize/select-multiple.tpl.html\",\"<div class=\\\"ui-select-container selectize-control multi plugin-remove_button\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" placeholder=\\\"{{$select.getPlaceholder()}}\\\" ng-model=\\\"$select.search\\\" ng-disabled=\\\"$select.disabled\\\" aria-expanded=\\\"{{$select.open}}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\" data-disallow-drop=\\\"data-disallow-drop\\\"></div><div ng-show=\\\"$select.open\\\" class=\\\"ui-select-dropdown selectize-dropdown\\\" ng-class=\\\"{\\'single\\': !$select.multiple, \\'multi\\': $select.multiple}\\\"><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-footer\\\"></div></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");\n$templateCache.put(\"selectize/select.tpl.html\",\"<div class=\\\"ui-select-container selectize-control single\\\" ng-class=\\\"{\\'open\\': $select.open}\\\"><div class=\\\"selectize-input\\\" ng-class=\\\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\\\" ng-click=\\\"$select.open && !$select.searchEnabled ? $select.toggle($event) : $select.activate()\\\"><div class=\\\"ui-select-match\\\"></div><input type=\\\"search\\\" autocomplete=\\\"off\\\" tabindex=\\\"-1\\\" class=\\\"ui-select-search ui-select-toggle\\\" ng-class=\\\"{\\'ui-select-search-hidden\\':!$select.searchEnabled}\\\" ng-click=\\\"$select.toggle($event)\\\" placeholder=\\\"{{$select.placeholder}}\\\" ng-model=\\\"$select.search\\\" ng-hide=\\\"!$select.isEmpty() && !$select.open\\\" ng-disabled=\\\"$select.disabled\\\" ng-trim=\\\"{{ $select.trim }}\\\" aria-label=\\\"{{ $select.baseTitle }}\\\"></div><div ng-show=\\\"$select.open\\\" class=\\\"ui-select-dropdown selectize-dropdown\\\" ng-class=\\\"{\\'single\\': !$select.multiple, \\'multi\\': $select.multiple}\\\"><div class=\\\"ui-select-header\\\"></div><div class=\\\"ui-select-choices\\\"></div><div class=\\\"ui-select-footer\\\"></div></div><div class=\\\"ui-select-no-choice\\\"></div></div>\");}]);",null,null]}
\ No newline at end of file
diff --git a/src/bootstrap/select.tpl.html b/src/bootstrap/select.tpl.html
index 8d11c2077..f5a825929 100644
--- a/src/bootstrap/select.tpl.html
+++ b/src/bootstrap/select.tpl.html
@@ -9,7 +9,8 @@
          ng-class="{ 'ui-select-search-hidden' : !$select.searchEnabled }"
          placeholder="{{$select.placeholder}}"
          ng-model="$select.search"
-         ng-show="$select.open">
+         ng-show="$select.open"
+         ng-trim="{{ $select.trim }}">
   <div ng-show="$select.open && $select.items.length > 0" class="ui-select-dropdown dropdown-menu">
     <div class="ui-select-header"></div>
     <div class="ui-select-choices"></div>
diff --git a/src/common.js b/src/common.js
index 89848e57c..931489ea0 100644
--- a/src/common.js
+++ b/src/common.js
@@ -113,7 +113,8 @@ var uis = angular.module('ui.select', [])
   appendToBody: false,
   spinnerEnabled: false,
   spinnerClass: 'glyphicon glyphicon-refresh ui-select-spin',
-  backspaceReset: true
+  backspaceReset: true,
+  trim: true
 })
 
 // See Rename minErr and make it accessible from outside https://github.com/angular/angular.js/issues/6913
diff --git a/src/select2/select.tpl.html b/src/select2/select.tpl.html
index a4f9bfd12..357e9ffcd 100644
--- a/src/select2/select.tpl.html
+++ b/src/select2/select.tpl.html
@@ -9,6 +9,7 @@
     <div class="search-container" ng-class="{'ui-select-search-hidden':!$select.searchEnabled, 'select2-search':$select.searchEnabled}">
       <input type="search" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"
        ng-class="{'select2-active': $select.refreshing}"
+       ng-trim="{{ $select.trim }}"
        role="combobox"
        aria-expanded="true"
        aria-owns="ui-select-choices-{{ $select.generatedId }}"
diff --git a/src/selectize/select.tpl.html b/src/selectize/select.tpl.html
index 4b33af4d1..f88465f31 100644
--- a/src/selectize/select.tpl.html
+++ b/src/selectize/select.tpl.html
@@ -11,6 +11,7 @@
            ng-model="$select.search"
            ng-hide="!$select.isEmpty() && !$select.open"
            ng-disabled="$select.disabled"
+           ng-trim="{{ $select.trim }}"
            aria-label="{{ $select.baseTitle }}">
   </div>
   <div ng-show="$select.open" class="ui-select-dropdown selectize-dropdown"
diff --git a/src/uiSelectDirective.js b/src/uiSelectDirective.js
index e1e8e0a89..f830b5b13 100644
--- a/src/uiSelectDirective.js
+++ b/src/uiSelectDirective.js
@@ -160,6 +160,10 @@ uis.directive('uiSelect',
           $select.spinnerClass = spinnerClass !== undefined ? attrs.spinnerClass : uiSelectConfig.spinnerClass;
         });
 
+        scope.$watch(function () { return scope.$eval(attrs.trim); }, function(newVal) {
+          $select.trim = newVal !== undefined ? newVal : uiSelectConfig.trim;
+        });
+
         //Automatically gets focus when loaded
         if (angular.isDefined(attrs.autofocus)){
           $timeout(function(){
diff --git a/test/select.spec.js b/test/select.spec.js
index 15cfdb1d2..a9a6cff31 100644
--- a/test/select.spec.js
+++ b/test/select.spec.js
@@ -176,6 +176,7 @@ describe('ui-select tests', function () {
       if (attrs.backspaceReset !== undefined) { attrsHtml += ' backspace-reset="' + attrs.backspaceReset + '"'; }
       if (attrs.uiDisableChoice !== undefined) { choicesAttrsHtml += ' ui-disable-choice="' + attrs.uiDisableChoice + '"'; }
       if (attrs.removeSelected !== undefined) { attrsHtml += ' remove-selected="' + attrs.removeSelected + '"'; }
+      if (attrs.trim !== undefined) { attrsHtml += ' trim="' + attrs.trim + '"'; }
     }
 
     return compileTemplate(
@@ -3494,6 +3495,54 @@ describe('ui-select tests', function () {
     });
   });
 
+  describe('Test trim', function () {
+    it('should have a default value of true', function () {
+      var control = createUiSelect();
+      expect(control.scope().$select.trim).toEqual(true);
+    });
+
+    it('should have set a value of false', function () {
+      var control = createUiSelect({ trim: false });
+      expect(control.scope().$select.trim).toEqual(false);
+    });
+
+    ['selectize', 'bootstrap', 'select2'].forEach(function (theme) {
+      describe(theme + ' theme', function () {
+        it('should define ng-trim to true when undefined', function () {
+          var el = createUiSelect({ theme: theme });
+          expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('true');
+        });
+
+        it('should define ng-trim when true', function () {
+          var el = createUiSelect({ theme: theme, trim: true });
+          expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('true');
+        });
+
+        it('should define ng-trim when false', function () {
+          var el = createUiSelect({ theme: theme, trim: false });
+          expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('false');
+        });
+
+        describe('multiple', function () {
+          it('should define ng-trim to true when undefined', function () {
+            var el = createUiSelect({ multiple: 'multiple', theme: theme });
+            expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('true');
+          });
+
+          it('should define ng-trim when true', function () {
+            var el = createUiSelect({ multiple: 'multiple', theme: theme, trim: true });
+            expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('true');
+          });
+
+          it('should define ng-trim when false', function () {
+            var el = createUiSelect({ multiple: 'multiple', theme: theme, trim: false });
+            expect($(el).find('.ui-select-search').attr('ng-trim')).toEqual('false');
+          });
+        });
+      });
+    });
+  });
+
   describe('With refresh on active', function () {
     it('should refresh when is activated', function () {
       scope.fetchFromServer = function () { };