diff --git a/docs/underscore.html b/docs/underscore.html index 2170598b4..b5855968b 100644 --- a/docs/underscore.html +++ b/docs/underscore.html @@ -29,13 +29,13 @@

underscore.js

Underscore.js 1.8.3
 http://underscorejs.org
-(c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+(c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 Underscore may be freely distributed under the MIT license.
 
-(function() {
+(function() { @@ -71,11 +71,16 @@

Baseline setup

-

Establish the root object, window in the browser, or exports on the server.

+

Establish the root object, window (self) in the browser, global +on the server, or this in some virtual machines. We use self +instead of window for WebWorker support.

-
  var root = this;
+
  var root = typeof self == 'object' && self.self === self && self ||
+            typeof global == 'object' && global.global === global && global ||
+            this ||
+            {};
@@ -105,7 +110,8 @@

Baseline setup

-
  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
@@ -120,11 +126,10 @@

Baseline setup

-
  var
-    push             = ArrayProto.push,
-    slice            = ArrayProto.slice,
-    toString         = ObjProto.toString,
-    hasOwnProperty   = ObjProto.hasOwnProperty;
+
  var push = ArrayProto.push,
+      slice = ArrayProto.slice,
+      toString = ObjProto.toString,
+      hasOwnProperty = ObjProto.hasOwnProperty;
@@ -140,11 +145,9 @@

Baseline setup

-
  var
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind,
-    nativeCreate       = Object.create;
+
  var nativeIsArray = Array.isArray,
+      nativeKeys = Object.keys,
+      nativeCreate = Object.create;
@@ -159,7 +162,7 @@

Baseline setup

-
  var Ctor = function(){};
+
  var Ctor = function(){};
@@ -174,7 +177,7 @@

Baseline setup

-
  var _ = function(obj) {
+            
  var _ = function(obj) {
     if (obj instanceof _) return obj;
     if (!(this instanceof _)) return new _(obj);
     this._wrapped = obj;
@@ -190,13 +193,15 @@ 

Baseline setup

Export the Underscore object for Node.js, with -backwards-compatibility for the old require() API. If we’re in -the browser, add _ as a global object.

+backwards-compatibility for their old module API. If we’re in +the browser, add _ as a global object. +(nodeType is checked to ensure that module +and exports are not HTML elements.)

-
  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
+            
  if (typeof exports != 'undefined' && !exports.nodeType) {
+    if (typeof module != 'undefined' && !module.nodeType && module.exports) {
       exports = module.exports = _;
     }
     exports._ = _;
@@ -234,96 +239,135 @@ 

Baseline setup

-
  var optimizeCb = function(func, context, argCount) {
+            
  var optimizeCb = function(func, context, argCount) {
     if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
+    switch (argCount) {
+      case 1: return function(value) {
         return func.call(context, value);
-      };
-      case 2: return function(value, other) {
-        return func.call(context, value, other);
-      };
-      case 3: return function(value, index, collection) {
+      };
+ + + + +
  • +
    + +
    + +
    +

    The 2-parameter case has been omitted only because no current consumers +made use of it.

    + +
    + +
          case null:
    +      case 3: return function(value, index, collection) {
             return func.call(context, value, index, collection);
           };
    -      case 4: return function(accumulator, value, index, collection) {
    +      case 4: return function(accumulator, value, index, collection) {
             return func.call(context, accumulator, value, index, collection);
           };
         }
    -    return function() {
    +    return function() {
           return func.apply(context, arguments);
         };
    -  };
    + }; + + var builtinIteratee;
  • -
  • +
  • - +
    -

    A mostly-internal function to generate callbacks that can be applied -to each element in a collection, returning the desired result — either -identity, an arbitrary callback, a property matcher, or a property accessor.

    +

    An internal function to generate callbacks that can be applied to each +element in a collection, returning the desired result — either identity, +an arbitrary callback, a property matcher, or a property accessor.

    -
      var cb = function(value, context, argCount) {
    +            
      var cb = function(value, context, argCount) {
    +    if (_.iteratee !== builtinIteratee) return _.iteratee(value, context);
         if (value == null) return _.identity;
         if (_.isFunction(value)) return optimizeCb(value, context, argCount);
    -    if (_.isObject(value)) return _.matcher(value);
    +    if (_.isObject(value) && !_.isArray(value)) return _.matcher(value);
         return _.property(value);
    -  };
    -  _.iteratee = function(value, context) {
    +  };
    + +
  • + + +
  • +
    + +
    + +
    +

    External wrapper for our callback generator. Users may customize +_.iteratee if they want additional predicate/iteratee shorthand styles. +This abstraction hides the internal-only argCount argument.

    + +
    + +
      _.iteratee = builtinIteratee = function(value, context) {
         return cb(value, context, Infinity);
       };
  • -
  • +
  • - +
    -

    An internal function for creating assigner functions.

    +

    Similar to ES6’s rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html) +This accumulates the arguments passed into an array, after a given index.

    -
      var createAssigner = function(keysFunc, undefinedOnly) {
    -    return function(obj) {
    -      var length = arguments.length;
    -      if (length < 2 || obj == null) return obj;
    -      for (var index = 1; index < length; index++) {
    -        var source = arguments[index],
    -            keys = keysFunc(source),
    -            l = keys.length;
    -        for (var i = 0; i < l; i++) {
    -          var key = keys[i];
    -          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
    -        }
    +            
      var restArgs = function(func, startIndex) {
    +    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    +    return function() {
    +      var length = Math.max(arguments.length - startIndex, 0),
    +          rest = Array(length),
    +          index = 0;
    +      for (; index < length; index++) {
    +        rest[index] = arguments[index + startIndex];
           }
    -      return obj;
    +      switch (startIndex) {
    +        case 0: return func.call(this, rest);
    +        case 1: return func.call(this, arguments[0], rest);
    +        case 2: return func.call(this, arguments[0], arguments[1], rest);
    +      }
    +      var args = Array(startIndex + 1);
    +      for (index = 0; index < startIndex; index++) {
    +        args[index] = arguments[index];
    +      }
    +      args[startIndex] = rest;
    +      return func.apply(this, args);
         };
       };
  • -
  • +
  • - +

    An internal function for creating a new object that inherits from another.

    -
      var baseCreate = function(prototype) {
    +            
      var baseCreate = function(prototype) {
         if (!_.isObject(prototype)) return {};
         if (nativeCreate) return nativeCreate(prototype);
         Ctor.prototype = prototype;
    @@ -332,31 +376,40 @@ 

    Baseline setup

    return result; }; - var property = function(key) { - return function(obj) { + var shallowProperty = function(key) { + return function(obj) { return obj == null ? void 0 : obj[key]; }; + }; + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; };
  • -
  • +
  • - +

    Helper for collection methods to determine whether a collection -should be iterated as an array or as an object +should be iterated as an array or as an object. Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094

      var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
    -  var getLength = property('length');
    -  var isArrayLike = function(collection) {
    +  var getLength = shallowProperty('length');
    +  var isArrayLike = function(collection) {
         var length = getLength(collection);
         return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
       };
    @@ -364,11 +417,11 @@

    Baseline setup

  • -
  • +
  • - +

    Collection Functions

    @@ -377,11 +430,11 @@

    Collection Functions

  • -
  • +
  • - +
    @@ -389,11 +442,11 @@

    Collection Functions

  • -
  • +
  • - +

    The cornerstone, an each implementation, aka forEach. Handles raw objects in addition to array-likes. Treats all @@ -401,7 +454,7 @@

    Collection Functions

    -
      _.each = _.forEach = function(obj, iteratee, context) {
    +            
      _.each = _.forEach = function(obj, iteratee, context) {
         iteratee = optimizeCb(iteratee, context);
         var i, length;
         if (isArrayLike(obj)) {
    @@ -420,17 +473,17 @@ 

    Collection Functions

  • -
  • +
  • - +

    Return the results of applying the iteratee to each element.

    -
      _.map = _.collect = function(obj, iteratee, context) {
    +            
      _.map = _.collect = function(obj, iteratee, context) {
         iteratee = cb(iteratee, context);
         var keys = !isArrayLike(obj) && _.keys(obj),
             length = (keys || obj).length,
    @@ -445,75 +498,61 @@ 

    Collection Functions

  • -
  • +
  • - +

    Create a reducing function iterating left or right.

    -
      function createReduce(dir) {
    +
      var createReduce = function(dir) {
  • -
  • +
  • - +
    -

    Optimized iterator function as using arguments.length -in the main function will deoptimize the, see #1991.

    +

    Wrap code that reassigns argument variables in a separate function than +the one that accesses arguments.length to avoid a perf hit. (#1991)

    -
        function iterator(obj, iteratee, memo, keys, index, length) {
    +            
        var reducer = function(obj, iteratee, memo, initial) {
    +      var keys = !isArrayLike(obj) && _.keys(obj),
    +          length = (keys || obj).length,
    +          index = dir > 0 ? 0 : length - 1;
    +      if (!initial) {
    +        memo = obj[keys ? keys[index] : index];
    +        index += dir;
    +      }
           for (; index >= 0 && index < length; index += dir) {
             var currentKey = keys ? keys[index] : index;
             memo = iteratee(memo, obj[currentKey], currentKey, obj);
           }
           return memo;
    -    }
    -
    -    return function(obj, iteratee, memo, context) {
    -      iteratee = optimizeCb(iteratee, context, 4);
    -      var keys = !isArrayLike(obj) && _.keys(obj),
    -          length = (keys || obj).length,
    -          index = dir > 0 ? 0 : length - 1;
    - -
  • - - -
  • -
    - -
    - -
    -

    Determine the initial value if none is provided.

    + }; -
    - -
          if (arguments.length < 3) {
    -        memo = obj[keys ? keys[index] : index];
    -        index += dir;
    -      }
    -      return iterator(obj, iteratee, memo, keys, index, length);
    +    return function(obj, iteratee, memo, context) {
    +      var initial = arguments.length >= 3;
    +      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
         };
    -  }
    + };
  • -
  • +
  • - +

    Reduce builds up a single result from a list of values, aka inject, or foldl.

    @@ -525,59 +564,55 @@

    Collection Functions

  • -
  • +
  • - +

    The right-associative version of reduce, also known as foldr.

    -
      _.reduceRight = _.foldr = createReduce(-1);
    +
      _.reduceRight = _.foldr = createReduce(-1);
  • -
  • +
  • - +

    Return the first value which passes a truth test. Aliased as detect.

    -
      _.find = _.detect = function(obj, predicate, context) {
    -    var key;
    -    if (isArrayLike(obj)) {
    -      key = _.findIndex(obj, predicate, context);
    -    } else {
    -      key = _.findKey(obj, predicate, context);
    -    }
    -    if (key !== void 0 && key !== -1) return obj[key];
    +            
      _.find = _.detect = function(obj, predicate, context) {
    +    var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey;
    +    var key = keyFinder(obj, predicate, context);
    +    if (key !== void 0 && key !== -1) return obj[key];
       };
  • -
  • +
  • - +

    Return all the elements that pass a truth test. Aliased as select.

    -
      _.filter = _.select = function(obj, predicate, context) {
    +            
      _.filter = _.select = function(obj, predicate, context) {
         var results = [];
         predicate = cb(predicate, context);
    -    _.each(obj, function(value, index, list) {
    +    _.each(obj, function(value, index, list) {
           if (predicate(value, index, list)) results.push(value);
         });
         return results;
    @@ -586,35 +621,35 @@ 

    Collection Functions

  • -
  • +
  • - +

    Return all the elements for which a truth test fails.

    -
      _.reject = function(obj, predicate, context) {
    +            
      _.reject = function(obj, predicate, context) {
         return _.filter(obj, _.negate(cb(predicate)), context);
       };
  • -
  • +
  • - +

    Determine whether all of the elements match a truth test. Aliased as all.

    -
      _.every = _.all = function(obj, predicate, context) {
    +            
      _.every = _.all = function(obj, predicate, context) {
         predicate = cb(predicate, context);
         var keys = !isArrayLike(obj) && _.keys(obj),
             length = (keys || obj).length;
    @@ -628,18 +663,18 @@ 

    Collection Functions

  • -
  • +
  • - +

    Determine if at least one element in the object matches a truth test. Aliased as any.

    -
      _.some = _.any = function(obj, predicate, context) {
    +            
      _.some = _.any = function(obj, predicate, context) {
         predicate = cb(predicate, context);
         var keys = !isArrayLike(obj) && _.keys(obj),
             length = (keys || obj).length;
    @@ -653,18 +688,18 @@ 

    Collection Functions

  • -
  • +
  • - +

    Determine if the array or object contains a given item (using ===). Aliased as includes and include.

    -
      _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
    +            
      _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
         if (!isArrayLike(obj)) obj = _.values(obj);
         if (typeof fromIndex != 'number' || guard) fromIndex = 0;
         return _.indexOf(obj, item, fromIndex) >= 0;
    @@ -673,108 +708,120 @@ 

    Collection Functions

  • -
  • +
  • - +

    Invoke a method (with arguments) on every item in a collection.

    -
      _.invoke = function(obj, method) {
    -    var args = slice.call(arguments, 2);
    -    var isFunc = _.isFunction(method);
    -    return _.map(obj, function(value) {
    -      var func = isFunc ? method : value[method];
    -      return func == null ? func : func.apply(value, args);
    +            
      _.invoke = restArgs(function(obj, path, args) {
    +    var contextPath, func;
    +    if (_.isFunction(path)) {
    +      func = path;
    +    } else if (_.isArray(path)) {
    +      contextPath = path.slice(0, -1);
    +      path = path[path.length - 1];
    +    }
    +    return _.map(obj, function(context) {
    +      var method = func;
    +      if (!method) {
    +        if (contextPath && contextPath.length) {
    +          context = deepGet(context, contextPath);
    +        }
    +        if (context == null) return void 0;
    +        method = context[path];
    +      }
    +      return method == null ? method : method.apply(context, args);
         });
    -  };
    + });
  • -
  • +
  • - +

    Convenience version of a common use case of map: fetching a property.

    -
      _.pluck = function(obj, key) {
    +            
      _.pluck = function(obj, key) {
         return _.map(obj, _.property(key));
       };
  • -
  • +
  • - +

    Convenience version of a common use case of filter: selecting only objects containing specific key:value pairs.

    -
      _.where = function(obj, attrs) {
    +            
      _.where = function(obj, attrs) {
         return _.filter(obj, _.matcher(attrs));
       };
  • -
  • +
  • - +

    Convenience version of a common use case of find: getting the first object containing specific key:value pairs.

    -
      _.findWhere = function(obj, attrs) {
    +            
      _.findWhere = function(obj, attrs) {
         return _.find(obj, _.matcher(attrs));
       };
  • -
  • +
  • - +

    Return the maximum element (or element-based computation).

    -
      _.max = function(obj, iteratee, context) {
    +            
      _.max = function(obj, iteratee, context) {
         var result = -Infinity, lastComputed = -Infinity,
             value, computed;
    -    if (iteratee == null && obj != null) {
    +    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) {
           obj = isArrayLike(obj) ? obj : _.values(obj);
           for (var i = 0, length = obj.length; i < length; i++) {
             value = obj[i];
    -        if (value > result) {
    +        if (value != null && value > result) {
               result = value;
             }
           }
         } else {
           iteratee = cb(iteratee, context);
    -      _.each(obj, function(value, index, list) {
    -        computed = iteratee(value, index, list);
    +      _.each(obj, function(v, index, list) {
    +        computed = iteratee(v, index, list);
             if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
    -          result = value;
    +          result = v;
               lastComputed = computed;
             }
           });
    @@ -785,33 +832,33 @@ 

    Collection Functions

  • -
  • +
  • - +

    Return the minimum element (or element-based computation).

    -
      _.min = function(obj, iteratee, context) {
    +            
      _.min = function(obj, iteratee, context) {
         var result = Infinity, lastComputed = Infinity,
             value, computed;
    -    if (iteratee == null && obj != null) {
    +    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) {
           obj = isArrayLike(obj) ? obj : _.values(obj);
           for (var i = 0, length = obj.length; i < length; i++) {
             value = obj[i];
    -        if (value < result) {
    +        if (value != null && value < result) {
               result = value;
             }
           }
         } else {
           iteratee = cb(iteratee, context);
    -      _.each(obj, function(value, index, list) {
    -        computed = iteratee(value, index, list);
    +      _.each(obj, function(v, index, list) {
    +        computed = iteratee(v, index, list);
             if (computed < lastComputed || computed === Infinity && result === Infinity) {
    -          result = value;
    +          result = v;
               lastComputed = computed;
             }
           });
    @@ -822,79 +869,82 @@ 

    Collection Functions

  • -
  • +
  • - +
    -

    Shuffle a collection, using the modern version of the -Fisher-Yates shuffle.

    +

    Shuffle a collection.

    -
      _.shuffle = function(obj) {
    -    var set = isArrayLike(obj) ? obj : _.values(obj);
    -    var length = set.length;
    -    var shuffled = Array(length);
    -    for (var index = 0, rand; index < length; index++) {
    -      rand = _.random(0, index);
    -      if (rand !== index) shuffled[index] = shuffled[rand];
    -      shuffled[rand] = set[index];
    -    }
    -    return shuffled;
    +            
      _.shuffle = function(obj) {
    +    return _.sample(obj, Infinity);
       };
  • -
  • +
  • - +
    -

    Sample n random values from a collection. +

    Sample n random values from a collection using the modern version of the +Fisher-Yates shuffle. If n is not specified, returns a single random element. The internal guard argument allows it to work with map.

    -
      _.sample = function(obj, n, guard) {
    +            
      _.sample = function(obj, n, guard) {
         if (n == null || guard) {
           if (!isArrayLike(obj)) obj = _.values(obj);
           return obj[_.random(obj.length - 1)];
         }
    -    return _.shuffle(obj).slice(0, Math.max(0, n));
    +    var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj);
    +    var length = getLength(sample);
    +    n = Math.max(Math.min(n, length), 0);
    +    var last = length - 1;
    +    for (var index = 0; index < n; index++) {
    +      var rand = _.random(index, last);
    +      var temp = sample[index];
    +      sample[index] = sample[rand];
    +      sample[rand] = temp;
    +    }
    +    return sample.slice(0, n);
       };
  • -
  • +
  • - +

    Sort the object’s values by a criterion produced by an iteratee.

    -
      _.sortBy = function(obj, iteratee, context) {
    +            
      _.sortBy = function(obj, iteratee, context) {
    +    var index = 0;
         iteratee = cb(iteratee, context);
    -    return _.pluck(_.map(obj, function(value, index, list) {
    +    return _.pluck(_.map(obj, function(value, key, list) {
           return {
    -        value: value,
    -        index: index,
    -        criteria: iteratee(value, index, list)
    +        value: value,
    +        index: index++,
    +        criteria: iteratee(value, key, list)
           };
    -    }).sort(function(left, right) {
    +    }).sort(function(left, right) {
           var a = left.criteria;
           var b = right.criteria;
           if (a !== b) {
             if (a > b || a === void 0) return 1;
    -        if (a < b || b === void 0) return -1;
    +        if (a < b || b === void 0) return -1;
           }
           return left.index - right.index;
         }), 'value');
    @@ -903,21 +953,21 @@ 

    Collection Functions

  • -
  • +
  • - +

    An internal function used for aggregate “group by” operations.

    -
      var group = function(behavior) {
    -    return function(obj, iteratee, context) {
    -      var result = {};
    +            
      var group = function(behavior, partition) {
    +    return function(obj, iteratee, context) {
    +      var result = partition ? [[], []] : {};
           iteratee = cb(iteratee, context);
    -      _.each(obj, function(value, index) {
    +      _.each(obj, function(value, index) {
             var key = iteratee(value, index, obj);
             behavior(result, value, key);
           });
    @@ -928,47 +978,47 @@ 

    Collection Functions

  • -
  • +
  • - +

    Groups the object’s values by a criterion. Pass either a string attribute to group by, or a function that returns the criterion.

    -
      _.groupBy = group(function(result, value, key) {
    +            
      _.groupBy = group(function(result, value, key) {
         if (_.has(result, key)) result[key].push(value); else result[key] = [value];
       });
  • -
  • +
  • - +

    Indexes the object’s values by a criterion, similar to groupBy, but for when you know that your index values will be unique.

    -
      _.indexBy = group(function(result, value, key) {
    +            
      _.indexBy = group(function(result, value, key) {
         result[key] = value;
       });
  • -
  • +
  • - +

    Counts instances of an object that group by a certain criterion. Pass either a string attribute to count by, or a function that returns the @@ -976,26 +1026,45 @@

    Collection Functions

    -
      _.countBy = group(function(result, value, key) {
    +            
      _.countBy = group(function(result, value, key) {
         if (_.has(result, key)) result[key]++; else result[key] = 1;
    -  });
    + }); + + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
  • -
  • +
  • - +

    Safely create a real, live array from anything iterable.

    -
      _.toArray = function(obj) {
    +            
      _.toArray = function(obj) {
         if (!obj) return [];
         if (_.isArray(obj)) return slice.call(obj);
    +    if (_.isString(obj)) {
    + +
  • + + +
  • +
    + +
    + +
    +

    Keep surrogate pair characters together

    + +
    + +
          return obj.match(reStrSymbol);
    +    }
         if (isArrayLike(obj)) return _.map(obj, _.identity);
         return _.values(obj);
       };
    @@ -1003,17 +1072,17 @@

    Collection Functions

  • -
  • +
  • - +

    Return the number of elements in an object.

    -
      _.size = function(obj) {
    +            
      _.size = function(obj) {
         if (obj == null) return 0;
         return isArrayLike(obj) ? obj.length : _.keys(obj).length;
       };
    @@ -1021,65 +1090,42 @@

    Collection Functions

  • -
  • +
  • - +

    Split a collection into two arrays: one whose elements all satisfy the given predicate, and one whose elements all do not satisfy the predicate.

    -
      _.partition = function(obj, predicate, context) {
    -    predicate = cb(predicate, context);
    -    var pass = [], fail = [];
    -    _.each(obj, function(value, key, obj) {
    -      (predicate(value, key, obj) ? pass : fail).push(value);
    -    });
    -    return [pass, fail];
    -  };
    +
      _.partition = group(function(result, value, pass) {
    +    result[pass ? 0 : 1].push(value);
    +  }, true);
  • - - -
  • + + +
  • - +
    -

    Trim out all falsy values from an object.

    +

    Array Functions

    -
      _.compact = function(obj) {
    -    return _.filter(obj, _.identity);
    -  };
    -
  • - -
  • -
    - -
    - -
    -

    Array Functions

    - -
    - -
  • - - -
  • +
  • - +
    @@ -1087,11 +1133,11 @@

    Array Functions

  • -
  • +
  • - +

    Get the first element of an array. Passing n will return the first N values in the array. Aliased as head and take. The guard check @@ -1099,8 +1145,8 @@

    Array Functions

    -
      _.first = _.head = _.take = function(array, n, guard) {
    -    if (array == null) return void 0;
    +            
      _.first = _.head = _.take = function(array, n, guard) {
    +    if (array == null || array.length < 1) return void 0;
         if (n == null || guard) return array[0];
         return _.initial(array, array.length - n);
       };
    @@ -1108,11 +1154,11 @@

    Array Functions

  • -
  • +
  • - +

    Returns everything but the last entry of the array. Especially useful on the arguments object. Passing n will return all the values in @@ -1120,26 +1166,26 @@

    Array Functions

    -
      _.initial = function(array, n, guard) {
    +            
      _.initial = function(array, n, guard) {
         return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
       };
  • -
  • +
  • - +

    Get the last element of an array. Passing n will return the last N values in the array.

    -
      _.last = function(array, n, guard) {
    -    if (array == null) return void 0;
    +            
      _.last = function(array, n, guard) {
    +    if (array == null || array.length < 1) return void 0;
         if (n == null || guard) return array[array.length - 1];
         return _.rest(array, Math.max(0, array.length - n));
       };
    @@ -1147,11 +1193,11 @@

    Array Functions

  • -
  • +
  • - +

    Returns everything but the first entry of the array. Aliased as tail and drop. Especially useful on the arguments object. Passing an n will return @@ -1159,47 +1205,66 @@

    Array Functions

    -
      _.rest = _.tail = _.drop = function(array, n, guard) {
    +            
      _.rest = _.tail = _.drop = function(array, n, guard) {
         return slice.call(array, n == null || guard ? 1 : n);
       };
    -
  • + -
  • +
  • - + +
    +

    Trim out all falsy values from an array.

    + +
    + +
      _.compact = function(array) {
    +    return _.filter(array, Boolean);
    +  };
    + +
  • + + +
  • +
    + +
    +

    Internal implementation of a recursive flatten function.

    -
      var flatten = function(input, shallow, strict, startIndex) {
    -    var output = [], idx = 0;
    -    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
    +            
      var flatten = function(input, shallow, strict, output) {
    +    output = output || [];
    +    var idx = output.length;
    +    for (var i = 0, length = getLength(input); i < length; i++) {
           var value = input[i];
           if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
  • -
  • +
  • - +
    -

    flatten current level of array or arguments object

    +

    Flatten current level of array or arguments object.

    -
            if (!shallow) value = flatten(value, shallow, strict);
    -        var j = 0, len = value.length;
    -        output.length += len;
    -        while (j < len) {
    -          output[idx++] = value[j++];
    +            
            if (shallow) {
    +          var j = 0, len = value.length;
    +          while (j < len) output[idx++] = value[j++];
    +        } else {
    +          flatten(value, shallow, strict, output);
    +          idx = output.length;
             }
           } else if (!strict) {
             output[idx++] = value;
    @@ -1211,45 +1276,45 @@ 

    Array Functions

  • -
  • +
  • - +

    Flatten out an array, either recursively (by default), or just one level.

    -
      _.flatten = function(array, shallow) {
    +            
      _.flatten = function(array, shallow) {
         return flatten(array, shallow, false);
       };
  • -
  • +
  • - +

    Return a version of the array that does not contain the specified value(s).

    -
      _.without = function(array) {
    -    return _.difference(array, slice.call(arguments, 1));
    -  };
    +
      _.without = restArgs(function(array, otherArrays) {
    +    return _.difference(array, otherArrays);
    +  });
  • -
  • +
  • - +

    Produce a duplicate-free version of the array. If the array has already been sorted, you have the option of using a faster algorithm. @@ -1257,7 +1322,7 @@

    Array Functions

    -
      _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    +            
      _.uniq = _.unique = function(array, isSorted, iteratee, context) {
         if (!_.isBoolean(isSorted)) {
           context = iteratee;
           iteratee = isSorted;
    @@ -1287,42 +1352,43 @@ 

    Array Functions

  • -
  • +
  • - +

    Produce an array that contains the union: each distinct element from all of the passed-in arrays.

    -
      _.union = function() {
    -    return _.uniq(flatten(arguments, true, true));
    -  };
    +
      _.union = restArgs(function(arrays) {
    +    return _.uniq(flatten(arrays, true, true));
    +  });
  • -
  • +
  • - +

    Produce an array that contains every item shared between all the passed-in arrays.

    -
      _.intersection = function(array) {
    +            
      _.intersection = function(array) {
         var result = [];
         var argsLength = arguments.length;
         for (var i = 0, length = getLength(array); i < length; i++) {
           var item = array[i];
           if (_.contains(result, item)) continue;
    -      for (var j = 1; j < argsLength; j++) {
    +      var j;
    +      for (j = 1; j < argsLength; j++) {
             if (!_.contains(arguments[j], item)) break;
           }
           if (j === argsLength) result.push(item);
    @@ -1333,82 +1399,80 @@ 

    Array Functions

  • -
  • +
  • - +

    Take the difference between one array and a number of other arrays. Only the elements present in just the first array will remain.

    -
      _.difference = function(array) {
    -    var rest = flatten(arguments, true, true, 1);
    -    return _.filter(array, function(value){
    +            
      _.difference = restArgs(function(array, rest) {
    +    rest = flatten(rest, true, true);
    +    return _.filter(array, function(value){
           return !_.contains(rest, value);
         });
    -  };
    + });
  • -
  • +
  • - +
    -

    Zip together multiple lists into a single array — elements that share -an index go together.

    +

    Complement of _.zip. Unzip accepts an array of arrays and groups +each array’s elements on shared indices.

    -
      _.zip = function() {
    -    return _.unzip(arguments);
    +            
      _.unzip = function(array) {
    +    var length = array && _.max(array, getLength).length || 0;
    +    var result = Array(length);
    +
    +    for (var index = 0; index < length; index++) {
    +      result[index] = _.pluck(array, index);
    +    }
    +    return result;
       };
  • -
  • +
  • - +
    -

    Complement of _.zip. Unzip accepts an array of arrays and groups -each array’s elements on shared indices

    +

    Zip together multiple lists into a single array – elements that share +an index go together.

    -
      _.unzip = function(array) {
    -    var length = array && _.max(array, getLength).length || 0;
    -    var result = Array(length);
    -
    -    for (var index = 0; index < length; index++) {
    -      result[index] = _.pluck(array, index);
    -    }
    -    return result;
    -  };
    +
      _.zip = restArgs(_.unzip);
  • -
  • +
  • - +

    Converts lists into objects. Pass either a single array of [key, value] -pairs, or two parallel arrays of the same length — one of keys, and one of -the corresponding values.

    +pairs, or two parallel arrays of the same length – one of keys, and one of +the corresponding values. Passing by pairs is the reverse of _.pairs.

    -
      _.object = function(list, values) {
    +            
      _.object = function(list, values) {
         var result = {};
         for (var i = 0, length = getLength(list); i < length; i++) {
           if (values) {
    @@ -1423,59 +1487,59 @@ 

    Array Functions

  • -
  • +
  • - +
    -

    Generator function to create the findIndex and findLastIndex functions

    +

    Generator function to create the findIndex and findLastIndex functions.

    -
      function createPredicateIndexFinder(dir) {
    -    return function(array, predicate, context) {
    +            
      var createPredicateIndexFinder = function(dir) {
    +    return function(array, predicate, context) {
           predicate = cb(predicate, context);
           var length = getLength(array);
           var index = dir > 0 ? 0 : length - 1;
           for (; index >= 0 && index < length; index += dir) {
             if (predicate(array[index], index, array)) return index;
           }
    -      return -1;
    +      return -1;
         };
    -  }
    + };
  • -
  • +
  • - +
    -

    Returns the first index on an array-like that passes a predicate test

    +

    Returns the first index on an array-like that passes a predicate test.

      _.findIndex = createPredicateIndexFinder(1);
    -  _.findLastIndex = createPredicateIndexFinder(-1);
    + _.findLastIndex = createPredicateIndexFinder(-1);
  • -
  • +
  • - +

    Use a comparator function to figure out the smallest index at which an object should be inserted so as to maintain order. Uses binary search.

    -
      _.sortedIndex = function(array, obj, iteratee, context) {
    +            
      _.sortedIndex = function(array, obj, iteratee, context) {
         iteratee = cb(iteratee, context, 1);
         var value = iteratee(obj);
         var low = 0, high = getLength(array);
    @@ -1489,48 +1553,48 @@ 

    Array Functions

  • -
  • +
  • - +
    -

    Generator function to create the indexOf and lastIndexOf functions

    +

    Generator function to create the indexOf and lastIndexOf functions.

    -
      function createIndexFinder(dir, predicateFind, sortedIndex) {
    -    return function(array, item, idx) {
    +            
      var createIndexFinder = function(dir, predicateFind, sortedIndex) {
    +    return function(array, item, idx) {
           var i = 0, length = getLength(array);
           if (typeof idx == 'number') {
             if (dir > 0) {
    -            i = idx >= 0 ? idx : Math.max(idx + length, i);
    +          i = idx >= 0 ? idx : Math.max(idx + length, i);
             } else {
    -            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
    +          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
             }
           } else if (sortedIndex && idx && length) {
             idx = sortedIndex(array, item);
    -        return array[idx] === item ? idx : -1;
    +        return array[idx] === item ? idx : -1;
           }
           if (item !== item) {
             idx = predicateFind(slice.call(array, i, length), _.isNaN);
    -        return idx >= 0 ? idx + i : -1;
    +        return idx >= 0 ? idx + i : -1;
           }
           for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
             if (array[idx] === item) return idx;
           }
    -      return -1;
    +      return -1;
         };
    -  }
    + };
  • -
  • +
  • - +

    Return the position of the first occurrence of an item in an array, or -1 if the item is not included in the array. @@ -1540,16 +1604,16 @@

    Array Functions

      _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
    -  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
    + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
  • -
  • +
  • - +

    Generate an integer Array containing an arithmetic progression. A port of the native Python range() function. See @@ -1557,12 +1621,14 @@

    Array Functions

    -
      _.range = function(start, stop, step) {
    +            
      _.range = function(start, stop, step) {
         if (stop == null) {
           stop = start || 0;
           start = 0;
         }
    -    step = step || 1;
    +    if (!step) {
    +      step = stop < start ? -1 : 1;
    +    }
     
         var length = Math.max(Math.ceil((stop - start) / step), 0);
         var range = Array(length);
    @@ -1577,11 +1643,36 @@ 

    Array Functions

  • -
  • +
  • - + +
    +

    Split an array into several arrays containing count or less elements +of initial array.

    + +
    + +
      _.chunk = function(array, count) {
    +    if (count == null || count < 1) return [];
    +
    +    var result = [];
    +    var i = 0, length = array.length;
    +    while (i < length) {
    +      result.push(slice.call(array, i, i += count));
    +    }
    +    return result;
    +  };
    + +
  • + + +
  • +
    + +
    +

    Function (ahem) Functions

    @@ -1590,11 +1681,11 @@

    Function (ahem) Functions

  • -
  • +
  • - +
    @@ -1602,18 +1693,18 @@

    Function (ahem) Functions

  • -
  • +
  • - +

    Determines whether to execute a function as a constructor -or a normal function with the provided arguments

    +or a normal function with the provided arguments.

    -
      var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
    +            
      var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
         if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
         var self = baseCreate(sourceFunc.prototype);
         var result = sourceFunc.apply(self, args);
    @@ -1624,11 +1715,11 @@ 

    Function (ahem) Functions

  • -
  • +
  • - +

    Create a function bound to a given object (assigning this, and arguments, optionally). Delegates to ECMAScript 5‘s native Function.bind if @@ -1636,53 +1727,54 @@

    Function (ahem) Functions

    -
      _.bind = function(func, context) {
    -    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
    +            
      _.bind = restArgs(function(func, context, args) {
         if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
    -    var args = slice.call(arguments, 2);
    -    var bound = function() {
    -      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
    -    };
    +    var bound = restArgs(function(callArgs) {
    +      return executeBound(func, bound, context, this, args.concat(callArgs));
    +    });
         return bound;
    -  };
    + });
  • -
  • +
  • - +

    Partially apply a function by creating a version that has had some of its -arguments pre-filled, without changing its dynamic this context. _ acts -as a placeholder, allowing any combination of arguments to be pre-filled.

    +arguments pre-filled, without changing its dynamic this context. acts +as a placeholder by default, allowing any combination of arguments to be +pre-filled. Set `.partial.placeholder` for a custom placeholder argument.

    -
      _.partial = function(func) {
    -    var boundArgs = slice.call(arguments, 1);
    -    var bound = function() {
    +            
      _.partial = restArgs(function(func, boundArgs) {
    +    var placeholder = _.partial.placeholder;
    +    var bound = function() {
           var position = 0, length = boundArgs.length;
           var args = Array(length);
           for (var i = 0; i < length; i++) {
    -        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
    +        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
           }
           while (position < arguments.length) args.push(arguments[position++]);
           return executeBound(func, bound, this, this, args);
         };
         return bound;
    -  };
    + }); + + _.partial.placeholder = _;
  • -
  • +
  • - +

    Bind a number of an object’s methods to that object. Remaining arguments are the method names to be bound. Useful for ensuring that all callbacks @@ -1690,31 +1782,31 @@

    Function (ahem) Functions

    -
      _.bindAll = function(obj) {
    -    var i, length = arguments.length, key;
    -    if (length <= 1) throw new Error('bindAll must be passed function names');
    -    for (i = 1; i < length; i++) {
    -      key = arguments[i];
    +            
      _.bindAll = restArgs(function(obj, keys) {
    +    keys = flatten(keys, false, false);
    +    var index = keys.length;
    +    if (index < 1) throw new Error('bindAll must be passed function names');
    +    while (index--) {
    +      var key = keys[index];
           obj[key] = _.bind(obj[key], obj);
         }
    -    return obj;
    -  };
    + });
  • -
  • +
  • - +

    Memoize an expensive function by storing its results.

    -
      _.memoize = function(func, hasher) {
    -    var memoize = function(key) {
    +            
      _.memoize = function(func, hasher) {
    +    var memoize = function(key) {
           var cache = memoize.cache;
           var address = '' + (hasher ? hasher.apply(this, arguments) : key);
           if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
    @@ -1727,32 +1819,31 @@ 

    Function (ahem) Functions

  • -
  • +
  • - +

    Delays a function for the given number of milliseconds, and then calls it with the arguments supplied.

    -
      _.delay = function(func, wait) {
    -    var args = slice.call(arguments, 2);
    -    return setTimeout(function(){
    +            
      _.delay = restArgs(function(func, wait, args) {
    +    return setTimeout(function() {
           return func.apply(null, args);
         }, wait);
    -  };
    + });
  • -
  • +
  • - +

    Defers a function, scheduling it to run after the current call stack has cleared.

    @@ -1764,11 +1855,11 @@

    Function (ahem) Functions

  • -
  • +
  • - +

    Returns a function, that, when invoked, will only be triggered at most once during a given window of time. Normally, the throttled function will run @@ -1778,18 +1869,19 @@

    Function (ahem) Functions

    -
      _.throttle = function(func, wait, options) {
    -    var context, args, result;
    -    var timeout = null;
    +            
      _.throttle = function(func, wait, options) {
    +    var timeout, context, args, result;
         var previous = 0;
         if (!options) options = {};
    -    var later = function() {
    +
    +    var later = function() {
           previous = options.leading === false ? 0 : _.now();
           timeout = null;
           result = func.apply(context, args);
           if (!timeout) context = args = null;
         };
    -    return function() {
    +
    +    var throttled = function() {
           var now = _.now();
           if (!previous && options.leading === false) previous = now;
           var remaining = wait - (now - previous);
    @@ -1808,16 +1900,24 @@ 

    Function (ahem) Functions

    } return result; }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; };
  • -
  • +
  • - +

    Returns a function, that, as long as it continues to be invoked, will not be triggered. The function will be called after it stops being called for @@ -1826,46 +1926,43 @@

    Function (ahem) Functions

    -
      _.debounce = function(func, wait, immediate) {
    -    var timeout, args, context, timestamp, result;
    -
    -    var later = function() {
    -      var last = _.now() - timestamp;
    +            
      _.debounce = function(func, wait, immediate) {
    +    var timeout, result;
     
    -      if (last < wait && last >= 0) {
    -        timeout = setTimeout(later, wait - last);
    -      } else {
    -        timeout = null;
    -        if (!immediate) {
    -          result = func.apply(context, args);
    -          if (!timeout) context = args = null;
    -        }
    -      }
    +    var later = function(context, args) {
    +      timeout = null;
    +      if (args) result = func.apply(context, args);
         };
     
    -    return function() {
    -      context = this;
    -      args = arguments;
    -      timestamp = _.now();
    -      var callNow = immediate && !timeout;
    -      if (!timeout) timeout = setTimeout(later, wait);
    -      if (callNow) {
    -        result = func.apply(context, args);
    -        context = args = null;
    +    var debounced = restArgs(function(args) {
    +      if (timeout) clearTimeout(timeout);
    +      if (immediate) {
    +        var callNow = !timeout;
    +        timeout = setTimeout(later, wait);
    +        if (callNow) result = func.apply(this, args);
    +      } else {
    +        timeout = _.delay(later, wait, this, args);
           }
     
           return result;
    +    });
    +
    +    debounced.cancel = function() {
    +      clearTimeout(timeout);
    +      timeout = null;
         };
    +
    +    return debounced;
       };
  • -
  • +
  • - +

    Returns the first function passed as an argument to the second, allowing you to adjust arguments, run code before and after, and @@ -1873,25 +1970,25 @@

    Function (ahem) Functions

    -
      _.wrap = function(func, wrapper) {
    +            
      _.wrap = function(func, wrapper) {
         return _.partial(wrapper, func);
       };
  • -
  • +
  • - +

    Returns a negated version of the passed-in predicate.

    -
      _.negate = function(predicate) {
    -    return function() {
    +            
      _.negate = function(predicate) {
    +    return function() {
           return !predicate.apply(this, arguments);
         };
       };
    @@ -1899,21 +1996,21 @@

    Function (ahem) Functions

  • -
  • +
  • - +

    Returns a function that is the composition of a list of functions, each consuming the return value of the function that follows.

    -
      _.compose = function() {
    +            
      _.compose = function() {
         var args = arguments;
         var start = args.length - 1;
    -    return function() {
    +    return function() {
           var i = start;
           var result = args[start].apply(this, arguments);
           while (i--) result = args[i].call(this, result);
    @@ -1924,18 +2021,18 @@ 

    Function (ahem) Functions

  • -
  • +
  • - +

    Returns a function that will only be executed on and after the Nth call.

    -
      _.after = function(times, func) {
    -    return function() {
    +            
      _.after = function(times, func) {
    +    return function() {
           if (--times < 1) {
             return func.apply(this, arguments);
           }
    @@ -1945,19 +2042,19 @@ 

    Function (ahem) Functions

  • -
  • +
  • - +

    Returns a function that will only be executed up to (but not including) the Nth call.

    -
      _.before = function(times, func) {
    +            
      _.before = function(times, func) {
         var memo;
    -    return function() {
    +    return function() {
           if (--times > 0) {
             memo = func.apply(this, arguments);
           }
    @@ -1969,27 +2066,29 @@ 

    Function (ahem) Functions

  • -
  • +
  • - +

    Returns a function that will be executed at most one time, no matter how often you call it. Useful for lazy initialization.

    -
      _.once = _.partial(_.before, 2);
    +
      _.once = _.partial(_.before, 2);
    +
    +  _.restArgs = restArgs;
  • -
  • +
  • - +

    Object Functions

    @@ -1998,11 +2097,11 @@

    Object Functions

  • -
  • +
  • - +
    @@ -2010,33 +2109,33 @@

    Object Functions

  • -
  • +
  • - +

    Keys in IE < 9 that won’t be iterated by for key in ... and thus missed.

    -
      var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
    +            
      var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
       var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
                           'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
     
    -  function collectNonEnumProps(obj, keys) {
    +  var collectNonEnumProps = function(obj, keys) {
         var nonEnumIdx = nonEnumerableProps.length;
    -    var constructor = obj.constructor;
    -    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
    + var constructor = obj.constructor; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto;
  • -
  • +
  • - +

    Constructor is a special case.

    @@ -2051,23 +2150,23 @@

    Object Functions

    keys.push(prop); } } - }
    + };
  • -
  • +
  • - +

    Retrieve the names of an object’s own properties. -Delegates to ECMAScript 5‘s native Object.keys

    +Delegates to ECMAScript 5‘s native Object.keys.

    -
      _.keys = function(obj) {
    +            
      _.keys = function(obj) {
         if (!_.isObject(obj)) return [];
         if (nativeKeys) return nativeKeys(obj);
         var keys = [];
    @@ -2076,11 +2175,11 @@ 

    Object Functions

  • -
  • +
  • - +

    Ahem, IE < 9.

    @@ -2093,17 +2192,17 @@

    Object Functions

  • -
  • +
  • - +

    Retrieve all the property names of an object.

    -
      _.allKeys = function(obj) {
    +            
      _.allKeys = function(obj) {
         if (!_.isObject(obj)) return [];
         var keys = [];
         for (var key in obj) keys.push(key);
    @@ -2111,11 +2210,11 @@

    Object Functions

  • -
  • +
  • - +

    Ahem, IE < 9.

    @@ -2128,17 +2227,17 @@

    Object Functions

  • -
  • +
  • - +

    Retrieve the values of an object’s properties.

    -
      _.values = function(obj) {
    +            
      _.values = function(obj) {
         var keys = _.keys(obj);
         var length = keys.length;
         var values = Array(length);
    @@ -2151,44 +2250,44 @@ 

    Object Functions

  • -
  • +
  • - +
    -

    Returns the results of applying the iteratee to each element of the object -In contrast to _.map it returns an object

    +

    Returns the results of applying the iteratee to each element of the object. +In contrast to _.map it returns an object.

    -
      _.mapObject = function(obj, iteratee, context) {
    +            
      _.mapObject = function(obj, iteratee, context) {
         iteratee = cb(iteratee, context);
    -    var keys =  _.keys(obj),
    -          length = keys.length,
    -          results = {},
    -          currentKey;
    -      for (var index = 0; index < length; index++) {
    -        currentKey = keys[index];
    -        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    -      }
    -      return results;
    +    var keys = _.keys(obj),
    +        length = keys.length,
    +        results = {};
    +    for (var index = 0; index < length; index++) {
    +      var currentKey = keys[index];
    +      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    +    }
    +    return results;
       };
  • -
  • +
  • - +
    -

    Convert an object into a list of [key, value] pairs.

    +

    Convert an object into a list of [key, value] pairs. +The opposite of _.object.

    -
      _.pairs = function(obj) {
    +            
      _.pairs = function(obj) {
         var keys = _.keys(obj);
         var length = keys.length;
         var pairs = Array(length);
    @@ -2201,17 +2300,17 @@ 

    Object Functions

  • -
  • +
  • - +

    Invert the keys and values of an object. The values must be serializable.

    -
      _.invert = function(obj) {
    +            
      _.invert = function(obj) {
         var result = {};
         var keys = _.keys(obj);
         for (var i = 0, length = keys.length; i < length; i++) {
    @@ -2223,18 +2322,18 @@ 

    Object Functions

  • -
  • +
  • - +

    Return a sorted list of the function names available on the object. -Aliased as methods

    +Aliased as methods.

    -
      _.functions = _.methods = function(obj) {
    +            
      _.functions = _.methods = function(obj) {
         var names = [];
         for (var key in obj) {
           if (_.isFunction(obj[key])) names.push(key);
    @@ -2245,11 +2344,42 @@ 

    Object Functions

  • -
  • +
  • - + +
    +

    An internal function for creating assigner functions.

    + +
    + +
      var createAssigner = function(keysFunc, defaults) {
    +    return function(obj) {
    +      var length = arguments.length;
    +      if (defaults) obj = Object(obj);
    +      if (length < 2 || obj == null) return obj;
    +      for (var index = 1; index < length; index++) {
    +        var source = arguments[index],
    +            keys = keysFunc(source),
    +            l = keys.length;
    +        for (var i = 0; i < l; i++) {
    +          var key = keys[i];
    +          if (!defaults || obj[key] === void 0) obj[key] = source[key];
    +        }
    +      }
    +      return obj;
    +    };
    +  };
    + +
  • + + +
  • +
    + +
    +

    Extend a given object with all the properties in passed-in object(s).

    @@ -2260,13 +2390,13 @@

    Object Functions

  • -
  • +
  • - +
    -

    Assigns a given object with all the own properties in the passed-in object(s) +

    Assigns a given object with all the own properties in the passed-in object(s). (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)

    @@ -2276,17 +2406,17 @@

    Object Functions

  • -
  • +
  • - +
    -

    Returns the first key on an object that passes a predicate test

    +

    Returns the first key on an object that passes a predicate test.

    -
      _.findKey = function(obj, predicate, context) {
    +            
      _.findKey = function(obj, predicate, context) {
         predicate = cb(predicate, context);
         var keys = _.keys(obj), key;
         for (var i = 0, length = keys.length; i < length; i++) {
    @@ -2298,25 +2428,64 @@ 

    Object Functions

  • -
  • +
  • - + +
    +

    Returns an array of all keys on an object that pass a predicate test.

    + +
    + +
      _.findKeys = function(obj, predicate, context) {
    +    predicate = cb(predicate, context);
    +    var allKeys = _.keys(obj), res = [];
    +    _.each(allKeys, function(key) {
    +      if (predicate(obj[key], key, obj)) res.push(key);
    +    });
    +    return res;
    +  };
    + +
  • + + +
  • +
    + +
    + +
    +

    Internal pick helper function to determine if obj has key key.

    + +
    + +
      var keyInObj = function(value, key, obj) {
    +    return key in obj;
    +  };
    + +
  • + + +
  • +
    + +
    +

    Return a copy of the object only containing the whitelisted properties.

    -
      _.pick = function(object, oiteratee, context) {
    -    var result = {}, obj = object, iteratee, keys;
    +            
      _.pick = restArgs(function(obj, keys) {
    +    var result = {}, iteratee = keys[0];
         if (obj == null) return result;
    -    if (_.isFunction(oiteratee)) {
    +    if (_.isFunction(iteratee)) {
    +      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
           keys = _.allKeys(obj);
    -      iteratee = optimizeCb(oiteratee, context);
         } else {
    -      keys = flatten(arguments, false, false, 1);
    -      iteratee = function(value, key, obj) { return key in obj; };
    +      iteratee = keyInObj;
    +      keys = flatten(keys, false, false);
           obj = Object(obj);
         }
         for (var i = 0, length = keys.length; i < length; i++) {
    @@ -2325,41 +2494,43 @@ 

    Object Functions

    if (iteratee(value, key, obj)) result[key] = value; } return result; - };
    + });
  • -
  • +
  • - +

    Return a copy of the object without the blacklisted properties.

    -
      _.omit = function(obj, iteratee, context) {
    +            
      _.omit = restArgs(function(obj, keys) {
    +    var iteratee = keys[0], context;
         if (_.isFunction(iteratee)) {
           iteratee = _.negate(iteratee);
    +      if (keys.length > 1) context = keys[1];
         } else {
    -      var keys = _.map(flatten(arguments, false, false, 1), String);
    -      iteratee = function(value, key) {
    +      keys = _.map(flatten(keys, false, false), String);
    +      iteratee = function(value, key) {
             return !_.contains(keys, key);
           };
         }
         return _.pick(obj, iteratee, context);
    -  };
    + });
  • -
  • +
  • - +

    Fill in a given object with default properties.

    @@ -2370,11 +2541,11 @@

    Object Functions

  • -
  • +
  • - +

    Creates an object that inherits from the given prototype object. If additional properties are provided then they will be added to the @@ -2382,7 +2553,7 @@

    Object Functions

    -
      _.create = function(prototype, props) {
    +            
      _.create = function(prototype, props) {
         var result = baseCreate(prototype);
         if (props) _.extendOwn(result, props);
         return result;
    @@ -2391,17 +2562,17 @@ 

    Object Functions

  • -
  • +
  • - +

    Create a (shallow-cloned) duplicate of an object.

    -
      _.clone = function(obj) {
    +            
      _.clone = function(obj) {
         if (!_.isObject(obj)) return obj;
         return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
       };
    @@ -2409,11 +2580,11 @@

    Object Functions

  • -
  • +
  • - +

    Invokes interceptor with the obj, and then returns obj. The primary purpose of this method is to “tap into” a method chain, in @@ -2421,7 +2592,7 @@

    Object Functions

    -
      _.tap = function(obj, interceptor) {
    +            
      _.tap = function(obj, interceptor) {
         interceptor(obj);
         return obj;
       };
    @@ -2429,17 +2600,17 @@

    Object Functions

  • -
  • +
  • - +

    Returns whether an object has a given set of key:value pairs.

    -
      _.isMatch = function(object, attrs) {
    +            
      _.isMatch = function(object, attrs) {
         var keys = _.keys(attrs), length = keys.length;
         if (object == null) return !length;
         var obj = Object(object);
    @@ -2453,26 +2624,27 @@ 

    Object Functions

  • -
  • +
  • - +

    Internal recursive comparison function for isEqual.

    -
      var eq = function(a, b, aStack, bStack) {
    +
      var eq, deepEq;
    +  eq = function(a, b, aStack, bStack) {
  • -
  • +
  • - +

    Identical objects are equal. 0 === -0, but they aren’t identical. See the Harmony egal proposal.

    @@ -2484,26 +2656,74 @@

    Object Functions

  • -
  • +
  • - +
    -

    A strict comparison is necessary because null == undefined.

    +

    null or undefined only equal to itself (strict comparison).

    -
        if (a == null || b == null) return a === b;
    +
        if (a == null || b == null) return false;
  • -
  • +
  • - + +
    +

    NaNs are equivalent, but non-reflexive.

    + +
    + +
        if (a !== a) return b !== b;
    + +
  • + + +
  • +
    + +
    + +
    +

    Exhaust primitive checks

    + +
    + +
        var type = typeof a;
    +    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    +    return deepEq(a, b, aStack, bStack);
    +  };
    + +
  • + + +
  • +
    + +
    + +
    +

    Internal recursive comparison function for isEqual.

    + +
    + +
      deepEq = function(a, b, aStack, bStack) {
    + +
  • + + +
  • +
    + +
    +

    Unwrap any wrapped objects.

    @@ -2515,11 +2735,11 @@

    Object Functions

  • -
  • +
  • - +

    Compare [[Class]] names.

    @@ -2532,11 +2752,11 @@

    Object Functions

  • -
  • +
  • - +

    Strings, numbers, regular expressions, dates, and booleans are compared by value.

    @@ -2547,11 +2767,11 @@

    Object Functions

  • -
  • +
  • - +

    RegExps are coerced to strings for comparison (Note: ‘’ + /a/i === ‘/a/i’)

    @@ -2562,11 +2782,11 @@

    Object Functions

  • -
  • +
  • - +

    Primitives and their corresponding object wrappers are equivalent; thus, "5" is equivalent to new String("5").

    @@ -2579,14 +2799,14 @@

    Object Functions

  • -
  • +
  • - +

    NaNs are equivalent, but non-reflexive. -Object(NaN) is equivalent to NaN

    +Object(NaN) is equivalent to NaN.

    @@ -2595,11 +2815,11 @@

    Object Functions

  • -
  • +
  • - +

    An egal comparison is performed for other numeric values.

    @@ -2612,11 +2832,11 @@

    Object Functions

  • -
  • +
  • - +

    Coerce dates and booleans to numeric primitive values. Dates are compared by their millisecond representations. Note that invalid dates with millisecond representations @@ -2625,6 +2845,8 @@

    Object Functions

            return +a === +b;
    +      case '[object Symbol]':
    +        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
         }
     
         var areArrays = className === '[object Array]';
    @@ -2634,11 +2856,11 @@ 

    Object Functions

  • -
  • +
  • - +

    Objects with different constructors are not equivalent, but Objects or Arrays from different frames are.

    @@ -2656,11 +2878,11 @@

    Object Functions

  • -
  • +
  • - +

    Assume equality for cyclic structures. The algorithm for detecting cyclic structures is adapted from ES 5.1 section 15.12.3, abstract operation JO.

    @@ -2670,11 +2892,11 @@

    Object Functions

  • -
  • +
  • - +

    Initializing stack of traversed objects. It’s done here since we only need them for objects and arrays comparison.

    @@ -2689,11 +2911,11 @@

    Object Functions

  • -
  • +
  • - +

    Linear search. Performance is inversely proportional to the number of unique nested structures.

    @@ -2706,11 +2928,11 @@

    Object Functions

  • -
  • +
  • - +

    Add the first object to the stack of traversed objects.

    @@ -2722,11 +2944,11 @@

    Object Functions

  • -
  • +
  • - +

    Recursively compare objects and arrays.

    @@ -2737,11 +2959,11 @@

    Object Functions

  • -
  • +
  • - +

    Compare array lengths to determine if a deep comparison is necessary.

    @@ -2753,11 +2975,11 @@

    Object Functions

  • -
  • +
  • - +

    Deep compare the contents, ignoring non-numeric properties.

    @@ -2771,11 +2993,11 @@

    Object Functions

  • -
  • +
  • - +

    Deep compare objects.

    @@ -2787,11 +3009,11 @@

    Object Functions

  • -
  • +
  • - +

    Ensure that both objects contain the same number of properties before comparing deep equality.

    @@ -2803,11 +3025,11 @@

    Object Functions

  • -
  • +
  • - +

    Deep compare each member

    @@ -2821,11 +3043,11 @@

    Object Functions

  • -
  • +
  • - +

    Remove the first object from the stack of traversed objects.

    @@ -2839,35 +3061,35 @@

    Object Functions

  • -
  • +
  • - +

    Perform a deep comparison to check if two objects are equal.

    -
      _.isEqual = function(a, b) {
    +            
      _.isEqual = function(a, b) {
         return eq(a, b);
       };
  • -
  • +
  • - +

    Is a given array, string, or object empty? An “empty” object has no enumerable own-properties.

    -
      _.isEmpty = function(obj) {
    +            
      _.isEmpty = function(obj) {
         if (obj == null) return true;
         if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
         return _.keys(obj).length === 0;
    @@ -2876,52 +3098,52 @@ 

    Object Functions

  • -
  • +
  • - +

    Is a given value a DOM element?

    -
      _.isElement = function(obj) {
    +            
      _.isElement = function(obj) {
         return !!(obj && obj.nodeType === 1);
       };
  • -
  • +
  • - +

    Is a given value an array? Delegates to ECMA5’s native Array.isArray

    -
      _.isArray = nativeIsArray || function(obj) {
    +            
      _.isArray = nativeIsArray || function(obj) {
         return toString.call(obj) === '[object Array]';
       };
  • -
  • +
  • - +

    Is a given variable an object?

    -
      _.isObject = function(obj) {
    +            
      _.isObject = function(obj) {
         var type = typeof obj;
         return type === 'function' || type === 'object' && !!obj;
       };
    @@ -2929,18 +3151,18 @@

    Object Functions

  • -
  • +
  • - +
    -

    Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.

    +

    Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet.

    -
      _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
    -    _['is' + name] = function(obj) {
    +            
      _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) {
    +    _['is' + name] = function(obj) {
           return toString.call(obj) === '[object ' + name + ']';
         };
       });
    @@ -2948,11 +3170,11 @@

    Object Functions

  • -
  • +
  • - +

    Define a fallback version of the method in browsers (ahem, IE < 9), where there isn’t any inspectable “Arguments” type.

    @@ -2960,7 +3182,7 @@

    Object Functions

      if (!_.isArguments(arguments)) {
    -    _.isArguments = function(obj) {
    +    _.isArguments = function(obj) {
           return _.has(obj, 'callee');
         };
       }
    @@ -2968,19 +3190,20 @@

    Object Functions

  • -
  • +
  • - +

    Optimize isFunction if appropriate. Work around some typeof bugs in old v8, -IE 11 (#1621), and in Safari 8 (#1929).

    +IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).

    -
      if (typeof /./ != 'function' && typeof Int8Array != 'object') {
    -    _.isFunction = function(obj) {
    +            
      var nodelist = root.document && root.document.childNodes;
    +  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    +    _.isFunction = function(obj) {
           return typeof obj == 'function' || false;
         };
       }
    @@ -2988,114 +3211,125 @@

    Object Functions

  • -
  • +
  • - +

    Is a given object a finite number?

    -
      _.isFinite = function(obj) {
    -    return isFinite(obj) && !isNaN(parseFloat(obj));
    +            
      _.isFinite = function(obj) {
    +    return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj));
       };
  • -
  • +
  • - +
    -

    Is the given value NaN? (NaN is the only number which does not equal itself).

    +

    Is the given value NaN?

    -
      _.isNaN = function(obj) {
    -    return _.isNumber(obj) && obj !== +obj;
    +            
      _.isNaN = function(obj) {
    +    return _.isNumber(obj) && isNaN(obj);
       };
  • -
  • +
  • - +

    Is a given value a boolean?

    -
      _.isBoolean = function(obj) {
    +            
      _.isBoolean = function(obj) {
         return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
       };
  • -
  • +
  • - +

    Is a given value equal to null?

    -
      _.isNull = function(obj) {
    +            
      _.isNull = function(obj) {
         return obj === null;
       };
  • -
  • +
  • - +

    Is a given variable undefined?

    -
      _.isUndefined = function(obj) {
    +            
      _.isUndefined = function(obj) {
         return obj === void 0;
       };
  • -
  • +
  • - +

    Shortcut function for checking if an object has a given property directly on itself (in other words, not on a prototype).

    -
      _.has = function(obj, key) {
    -    return obj != null && hasOwnProperty.call(obj, key);
    +            
      _.has = function(obj, path) {
    +    if (!_.isArray(path)) {
    +      return obj != null && hasOwnProperty.call(obj, path);
    +    }
    +    var length = path.length;
    +    for (var i = 0; i < length; i++) {
    +      var key = path[i];
    +      if (obj == null || !hasOwnProperty.call(obj, key)) {
    +        return false;
    +      }
    +      obj = obj[key];
    +    }
    +    return !!length;
       };
  • -
  • +
  • - +

    Utility Functions

    @@ -3104,11 +3338,11 @@

    Utility Functions

  • -
  • +
  • - +
    @@ -3116,18 +3350,18 @@

    Utility Functions

  • -
  • +
  • - +

    Run Underscore.js in noConflict mode, returning the _ variable to its previous owner. Returns a reference to the Underscore object.

    -
      _.noConflict = function() {
    +            
      _.noConflict = function() {
         root._ = previousUnderscore;
         return this;
       };
    @@ -3135,79 +3369,89 @@

    Utility Functions

  • -
  • +
  • - +

    Keep the identity function around for default iteratees.

    -
      _.identity = function(value) {
    +            
      _.identity = function(value) {
         return value;
       };
  • -
  • +
  • - +

    Predicate-generating functions. Often useful outside of Underscore.

    -
      _.constant = function(value) {
    -    return function() {
    +            
      _.constant = function(value) {
    +    return function() {
           return value;
         };
       };
     
    -  _.noop = function(){};
    +  _.noop = function(){};
     
    -  _.property = property;
    + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + };
  • -
  • +
  • - +

    Generates a function for a given object that returns a given property.

    -
      _.propertyOf = function(obj) {
    -    return obj == null ? function(){} : function(key) {
    -      return obj[key];
    +            
      _.propertyOf = function(obj) {
    +    if (obj == null) {
    +      return function(){};
    +    }
    +    return function(path) {
    +      return !_.isArray(path) ? obj[path] : deepGet(obj, path);
         };
       };
  • -
  • +
  • - +

    Returns a predicate for checking whether an object has a given set of key:value pairs.

    -
      _.matcher = _.matches = function(attrs) {
    +            
      _.matcher = _.matches = function(attrs) {
         attrs = _.extendOwn({}, attrs);
    -    return function(obj) {
    +    return function(obj) {
           return _.isMatch(obj, attrs);
         };
       };
    @@ -3215,17 +3459,17 @@

    Utility Functions

  • -
  • +
  • - +

    Run a function n times.

    -
      _.times = function(n, iteratee, context) {
    +            
      _.times = function(n, iteratee, context) {
         var accum = Array(Math.max(0, n));
         iteratee = optimizeCb(iteratee, context, 1);
         for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    @@ -3235,17 +3479,17 @@ 

    Utility Functions

  • -
  • +
  • - +

    Return a random integer between min and max (inclusive).

    -
      _.random = function(min, max) {
    +            
      _.random = function(min, max) {
         if (max == null) {
           max = min;
           min = 0;
    @@ -3256,28 +3500,28 @@ 

    Utility Functions

  • -
  • +
  • - +

    A (possibly faster) way to get the current timestamp as an integer.

    -
      _.now = Date.now || function() {
    +            
      _.now = Date.now || function() {
         return new Date().getTime();
       };
  • -
  • +
  • - +

    List of HTML entities for escaping.

    @@ -3296,38 +3540,38 @@

    Utility Functions

  • -
  • +
  • - +

    Functions for escaping and unescaping strings to/from HTML interpolation.

    -
      var createEscaper = function(map) {
    -    var escaper = function(match) {
    +            
      var createEscaper = function(map) {
    +    var escaper = function(match) {
           return map[match];
         };
  • -
  • +
  • - +
    -

    Regexes for identifying a key that needs to be escaped

    +

    Regexes for identifying a key that needs to be escaped.

        var source = '(?:' + _.keys(map).join('|') + ')';
         var testRegexp = RegExp(source);
         var replaceRegexp = RegExp(source, 'g');
    -    return function(string) {
    +    return function(string) {
           string = string == null ? '' : '' + string;
           return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
         };
    @@ -3338,33 +3582,43 @@ 

    Utility Functions

  • -
  • +
  • - +
    -

    If the value of the named property is a function then invoke it with the -object as context; otherwise, return it.

    +

    Traverses the children of obj along path. If a child is a function, it +is invoked with its parent as context. Returns the value of the final +child, or fallback if any child is undefined.

    -
      _.result = function(object, property, fallback) {
    -    var value = object == null ? void 0 : object[property];
    -    if (value === void 0) {
    -      value = fallback;
    +            
      _.result = function(obj, path, fallback) {
    +    if (!_.isArray(path)) path = [path];
    +    var length = path.length;
    +    if (!length) {
    +      return _.isFunction(fallback) ? fallback.call(obj) : fallback;
    +    }
    +    for (var i = 0; i < length; i++) {
    +      var prop = obj == null ? void 0 : obj[path[i]];
    +      if (prop === void 0) {
    +        prop = fallback;
    +        i = length; // Ensure we don't continue iterating.
    +      }
    +      obj = _.isFunction(prop) ? prop.call(obj) : prop;
         }
    -    return _.isFunction(value) ? value.call(object) : value;
    +    return obj;
       };
  • -
  • +
  • - +

    Generate a unique integer id (unique within the entire client session). Useful for temporary DOM ids.

    @@ -3372,7 +3626,7 @@

    Utility Functions

      var idCounter = 0;
    -  _.uniqueId = function(prefix) {
    +  _.uniqueId = function(prefix) {
         var id = ++idCounter + '';
         return prefix ? prefix + id : id;
       };
    @@ -3380,11 +3634,11 @@

    Utility Functions

  • -
  • +
  • - +

    By default, Underscore uses ERB-style template delimiters, change the following template settings to use alternative delimiters.

    @@ -3392,19 +3646,19 @@

    Utility Functions

      _.templateSettings = {
    -    evaluate    : /<%([\s\S]+?)%>/g,
    -    interpolate : /<%=([\s\S]+?)%>/g,
    -    escape      : /<%-([\s\S]+?)%>/g
    +    evaluate: /<%([\s\S]+?)%>/g,
    +    interpolate: /<%=([\s\S]+?)%>/g,
    +    escape: /<%-([\s\S]+?)%>/g
       };
  • -
  • +
  • - +

    When customizing templateSettings, if you don’t want to define an interpolation, evaluation or escaping regex, we need one that is @@ -3417,11 +3671,11 @@

    Utility Functions

  • -
  • +
  • - +

    Certain characters need to be escaped so that they can be put into a string literal.

    @@ -3429,28 +3683,28 @@

    Utility Functions

      var escapes = {
    -    "'":      "'",
    -    '\\':     '\\',
    -    '\r':     'r',
    -    '\n':     'n',
    +    "'": "'",
    +    '\\': '\\',
    +    '\r': 'r',
    +    '\n': 'n',
         '\u2028': 'u2028',
         '\u2029': 'u2029'
       };
     
    -  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
    +  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
     
    -  var escapeChar = function(match) {
    +  var escapeChar = function(match) {
         return '\\' + escapes[match];
       };
  • -
  • +
  • - +

    JavaScript micro-templating, similar to John Resig’s implementation. Underscore templating handles arbitrary delimiters, preserves whitespace, @@ -3459,18 +3713,18 @@

    Utility Functions

    -
      _.template = function(text, settings, oldSettings) {
    +            
      _.template = function(text, settings, oldSettings) {
         if (!settings && oldSettings) settings = oldSettings;
         settings = _.defaults({}, settings, _.templateSettings);
  • -
  • +
  • - +

    Combine delimiters into one regular expression via alternation.

    @@ -3485,11 +3739,11 @@

    Utility Functions

  • -
  • +
  • - +

    Compile the template source, escaping string literals appropriately.

    @@ -3497,8 +3751,8 @@

    Utility Functions

        var index = 0;
         var source = "__p+='";
    -    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    -      source += text.slice(index, offset).replace(escaper, escapeChar);
    +    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    +      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
           index = offset + match.length;
     
           if (escape) {
    @@ -3512,11 +3766,11 @@ 

    Utility Functions

  • -
  • +
  • - +

    Adobe VMs need the match returned to produce the correct offset.

    @@ -3529,11 +3783,11 @@

    Utility Functions

  • -
  • +
  • - +

    If a variable is not specified, place data values in local scope.

    @@ -3545,25 +3799,26 @@

    Utility Functions

    "print=function(){__p+=__j.call(arguments,'');};\n" + source + 'return __p;\n'; + var render; try { - var render = new Function(settings.variable || 'obj', '_', source); + render = new Function(settings.variable || 'obj', '_', source); } catch (e) { e.source = source; throw e; } - var template = function(data) { + var template = function(data) { return render.call(this, data, _); };
  • -
  • +
  • - +

    Provide the compiled source as a convenience for precompilation.

    @@ -3578,17 +3833,17 @@

    Utility Functions

  • -
  • +
  • - +

    Add a “chain” function. Start chaining a wrapped Underscore object.

    -
      _.chain = function(obj) {
    +            
      _.chain = function(obj) {
         var instance = _(obj);
         instance._chain = true;
         return instance;
    @@ -3597,11 +3852,11 @@ 

    Utility Functions

  • -
  • +
  • - +

    OOP

    @@ -3610,11 +3865,11 @@

    OOP

  • -
  • +
  • - +

    If Underscore is called as a function, it returns a wrapped object that can be used OO-style. This wrapper holds altered versions of all the @@ -3625,52 +3880,53 @@

    OOP

  • -
  • +
  • - +

    Helper function to continue chaining intermediate results.

    -
      var result = function(instance, obj) {
    +            
      var chainResult = function(instance, obj) {
         return instance._chain ? _(obj).chain() : obj;
       };
  • -
  • +
  • - +

    Add your own custom functions to the Underscore object.

    -
      _.mixin = function(obj) {
    -    _.each(_.functions(obj), function(name) {
    +            
      _.mixin = function(obj) {
    +    _.each(_.functions(obj), function(name) {
           var func = _[name] = obj[name];
    -      _.prototype[name] = function() {
    +      _.prototype[name] = function() {
             var args = [this._wrapped];
             push.apply(args, arguments);
    -        return result(this, func.apply(_, args));
    +        return chainResult(this, func.apply(_, args));
           };
         });
    +    return _;
       };
  • -
  • +
  • - +

    Add all of the Underscore functions to the wrapper object.

    @@ -3681,71 +3937,71 @@

    OOP

  • -
  • +
  • - +

    Add all mutator Array functions to the wrapper.

    -
      _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    +            
      _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
         var method = ArrayProto[name];
    -    _.prototype[name] = function() {
    +    _.prototype[name] = function() {
           var obj = this._wrapped;
           method.apply(obj, arguments);
           if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
    -      return result(this, obj);
    +      return chainResult(this, obj);
         };
       });
  • -
  • +
  • - +

    Add all accessor Array functions to the wrapper.

    -
      _.each(['concat', 'join', 'slice'], function(name) {
    +            
      _.each(['concat', 'join', 'slice'], function(name) {
         var method = ArrayProto[name];
    -    _.prototype[name] = function() {
    -      return result(this, method.apply(this._wrapped, arguments));
    +    _.prototype[name] = function() {
    +      return chainResult(this, method.apply(this._wrapped, arguments));
         };
       });
  • -
  • +
  • - +

    Extracts the result from a wrapped and chained object.

    -
      _.prototype.value = function() {
    +            
      _.prototype.value = function() {
         return this._wrapped;
       };
  • -
  • +
  • - +

    Provide unwrapping proxy for some methods used in engine operations such as arithmetic and JSON stringification.

    @@ -3754,18 +4010,18 @@

    OOP

      _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
     
    -  _.prototype.toString = function() {
    -    return '' + this._wrapped;
    +  _.prototype.toString = function() {
    +    return String(this._wrapped);
       };
  • -
  • +
  • - +

    AMD registration happens at the end for compatibility with AMD loaders that may not enforce next-turn semantics on modules. Even though general @@ -3777,12 +4033,12 @@

    OOP

    -
      if (typeof define === 'function' && define.amd) {
    -    define('underscore', [], function() {
    +            
      if (typeof define == 'function' && define.amd) {
    +    define('underscore', [], function() {
           return _;
         });
       }
    -}.call(this));
    +}());
  • diff --git a/index.html b/index.html index 7ec4563e6..635bc1eec 100644 --- a/index.html +++ b/index.html @@ -295,6 +295,7 @@
  • - create
  • - functions
  • - findKey
  • +
  • - findKeys
  • - extend
  • - extendOwn
  • - pick
  • @@ -1491,6 +1492,22 @@

    Object Functions

    to facilitate shorthand syntaxes.

    +

    + findKeys_.findKeys(object, predicate, [context]) +
    + Similar to _.findKey but find all keys matching predicate in object. + Returns a new array containing all keys where the predicate truth test + passes. + predicate is transformed through iteratee + to facilitate shorthand syntaxes. +

    +
    +_.findKeys({moe: 39.1, larry: 23.3, curly: 35.2}, function(value, key, object) {
    +  return value > 30;
    +});
    +=> ["moe", "curly"]
    +
    +

    extend_.extend(destination, *sources)
    @@ -1970,7 +1987,7 @@

    Utility Functions

    The following Underscore methods transform their predicates through _.iteratee: countBy, every, filter, find, findIndex, findKey, - findLastIndex, groupBy, indexBy, + findKeys, findLastIndex, groupBy, indexBy, map, mapObject, max, min, partition, reject, some, sortBy, sortedIndex, and uniq diff --git a/test/collections.js b/test/collections.js index ce780f873..342f7cb0d 100644 --- a/test/collections.js +++ b/test/collections.js @@ -111,7 +111,7 @@ 'findIndex', 'findLastIndex' ]; var object = [ - 'mapObject', 'findKey', 'pick', 'omit' + 'mapObject', 'findKey', 'findKeys', 'pick', 'omit' ]; _.each(collection.concat(array), function(method) { diff --git a/test/functions.js b/test/functions.js index 522a99e48..e172431c7 100644 --- a/test/functions.js +++ b/test/functions.js @@ -718,6 +718,7 @@ assert.strictEqual(_.find(collection, /b/g), 'bar'); assert.strictEqual(_.findIndex(collection, /b/g), 1); assert.strictEqual(_.findKey(collection, /b/g), '1'); + assert.deepEqual(_.findKeys(collection, /b/g), ['1', '2']); assert.strictEqual(_.findLastIndex(collection, /b/g), 2); assert.deepEqual(_.groupBy(collection, /b/g), {0: ['foo'], 1: ['bar'], 2: ['bbiz']}); assert.deepEqual(_.indexBy(collection, /b/g), {0: 'foo', 1: 'bar', 2: 'bbiz'}); diff --git a/test/objects.js b/test/objects.js index 1abdce21f..975a1d802 100644 --- a/test/objects.js +++ b/test/objects.js @@ -1097,6 +1097,47 @@ assert.strictEqual(_.findKey(array, function(x) { return x === 55; }), 'match', 'matches array-likes keys'); }); + QUnit.test('findKeys', function(assert) { + var objects = { + a: {a: 0, b: 0}, + b: {a: 1, b: 1}, + c: {a: 2, b: 2}, + d: {a: 1, b: 4} + }; + + assert.deepEqual(_.findKeys(objects, function(obj) { + return obj.a === 0; + }), ['a']); + + assert.deepEqual(_.findKeys(objects, function(obj) { + return obj.b * obj.a === 4; + }), ['c', 'd']); + + assert.deepEqual(_.findKeys(objects, 'a'), ['b', 'c', 'd'], 'Uses lookupIterator'); + + assert.deepEqual(_.findKeys(objects, function(obj) { + return obj.b * obj.a === 5; + }), []); + + assert.deepEqual(_.findKeys([1, 2, 3, 4, 5, 6], function(obj) { + return obj === 3; + }), ['2'], 'Keys are strings'); + + assert.deepEqual(_.findKeys(objects, function(a) { + return a.foo === null; + }), []); + + _.findKeys({a: {a: 1}}, function(a, key, obj) { + assert.strictEqual(key, 'a'); + assert.deepEqual(obj, {a: {a: 1}}); + assert.strictEqual(this, objects, 'called with context'); + }, objects); + + var array = [1, 2, 3, 4]; + array.match = 55; + assert.deepEqual(_.findKeys(array, function(x) { return x === 55; }), ['match'], 'matches array-likes keys'); + }); + QUnit.test('mapObject', function(assert) { var obj = {a: 1, b: 2}; diff --git a/underscore-min.js b/underscore-min.js index f01025b7b..a052fb2bf 100644 --- a/underscore-min.js +++ b/underscore-min.js @@ -1,6 +1,6 @@ // Underscore.js 1.8.3 // http://underscorejs.org -// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. -(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); -//# sourceMappingURL=underscore-min.map \ No newline at end of file +!function(){var n="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this||{},r=n._,t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,i=t.push,o=t.slice,a=e.toString,c=e.hasOwnProperty,l=Array.isArray,f=Object.keys,s=Object.create,p=function(){},h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"==typeof exports||exports.nodeType?n._=h:("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=h),exports._=h),h.VERSION="1.8.3";var v,y=function(n,r,t){if(r===void 0)return n;switch(t){case 1:return function(t){return n.call(r,t)};case null:case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,i){return n.call(r,t,e,u,i)}}return function(){return n.apply(r,arguments)}},g=function(n,r,t){return h.iteratee!==v?h.iteratee(n,r):null==n?h.identity:h.isFunction(n)?y(n,r,t):h.isObject(n)&&!h.isArray(n)?h.matcher(n):h.property(n)};h.iteratee=v=function(n,r){return g(n,r,1/0)};var d=function(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;t>u;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var i=Array(r+1);for(u=0;r>u;u++)i[u]=arguments[u];return i[r]=e,n.apply(this,i)}},m=function(n){if(!h.isObject(n))return{};if(s)return s(n);p.prototype=n;var r=new p;return p.prototype=null,r},b=function(n){return function(r){return null==r?void 0:r[n]}},j=function(n,r){for(var t=r.length,e=0;t>e;e++){if(null==n)return void 0;n=n[r[e]]}return t?n:void 0},x=Math.pow(2,53)-1,_=b("length"),A=function(n){var r=_(n);return"number"==typeof r&&r>=0&&x>=r};h.each=h.forEach=function(n,r,t){r=y(r,t);var e,u;if(A(n))for(e=0,u=n.length;u>e;e++)r(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)r(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,r,t){r=g(r,t);for(var e=!A(n)&&h.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=r(n[a],a,n)}return i};var w=function(n){var r=function(r,t,e,u){var i=!A(r)&&h.keys(r),o=(i||r).length,a=n>0?0:o-1;for(u||(e=r[i?i[a]:a],a+=n);a>=0&&o>a;a+=n){var c=i?i[a]:a;e=t(e,r[c],c,r)}return e};return function(n,t,e,u){var i=arguments.length>=3;return r(n,y(t,u,4),e,i)}};h.reduce=h.foldl=h.inject=w(1),h.reduceRight=h.foldr=w(-1),h.find=h.detect=function(n,r,t){var e=A(n)?h.findIndex:h.findKey,u=e(n,r,t);return u!==void 0&&u!==-1?n[u]:void 0},h.filter=h.select=function(n,r,t){var e=[];return r=g(r,t),h.each(n,function(n,t,u){r(n,t,u)&&e.push(n)}),e},h.reject=function(n,r,t){return h.filter(n,h.negate(g(r)),t)},h.every=h.all=function(n,r,t){r=g(r,t);for(var e=!A(n)&&h.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!r(n[o],o,n))return!1}return!0},h.some=h.any=function(n,r,t){r=g(r,t);for(var e=!A(n)&&h.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(r(n[o],o,n))return!0}return!1},h.contains=h.includes=h.include=function(n,r,t,e){return A(n)||(n=h.values(n)),("number"!=typeof t||e)&&(t=0),h.indexOf(n,r,t)>=0},h.invoke=d(function(n,r,t){var e,u;return h.isFunction(r)?u=r:h.isArray(r)&&(e=r.slice(0,-1),r=r[r.length-1]),h.map(n,function(n){var i=u;if(!i){if(e&&e.length&&(n=j(n,e)),null==n)return void 0;i=n[r]}return null==i?i:i.apply(n,t)})}),h.pluck=function(n,r){return h.map(n,h.property(r))},h.where=function(n,r){return h.filter(n,h.matcher(r))},h.findWhere=function(n,r){return h.find(n,h.matcher(r))},h.max=function(n,r,t){var e,u,i=-(1/0),o=-(1/0);if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n){n=A(n)?n:h.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],null!=e&&e>i&&(i=e)}else r=g(r,t),h.each(n,function(n,t,e){u=r(n,t,e),(u>o||u===-(1/0)&&i===-(1/0))&&(i=n,o=u)});return i},h.min=function(n,r,t){var e,u,i=1/0,o=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n){n=A(n)?n:h.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],null!=e&&i>e&&(i=e)}else r=g(r,t),h.each(n,function(n,t,e){u=r(n,t,e),(o>u||u===1/0&&i===1/0)&&(i=n,o=u)});return i},h.shuffle=function(n){return h.sample(n,1/0)},h.sample=function(n,r,t){if(null==r||t)return A(n)||(n=h.values(n)),n[h.random(n.length-1)];var e=A(n)?h.clone(n):h.values(n),u=_(e);r=Math.max(Math.min(r,u),0);for(var i=u-1,o=0;r>o;o++){var a=h.random(o,i),c=e[o];e[o]=e[a],e[a]=c}return e.slice(0,r)},h.sortBy=function(n,r,t){var e=0;return r=g(r,t),h.pluck(h.map(n,function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}}).sort(function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||t===void 0)return 1;if(e>t||e===void 0)return-1}return n.index-r.index}),"value")};var k=function(n,r){return function(t,e,u){var i=r?[[],[]]:{};return e=g(e,u),h.each(t,function(r,u){var o=e(r,u,t);n(i,r,o)}),i}};h.groupBy=k(function(n,r,t){h.has(n,t)?n[t].push(r):n[t]=[r]}),h.indexBy=k(function(n,r,t){n[t]=r}),h.countBy=k(function(n,r,t){h.has(n,t)?n[t]++:n[t]=1});var O=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;h.toArray=function(n){return n?h.isArray(n)?o.call(n):h.isString(n)?n.match(O):A(n)?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:A(n)?n.length:h.keys(n).length},h.partition=k(function(n,r,t){n[t?0:1].push(r)},!0),h.first=h.head=h.take=function(n,r,t){return null==n||n.length<1?void 0:null==r||t?n[0]:h.initial(n,n.length-r)},h.initial=function(n,r,t){return o.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))},h.last=function(n,r,t){return null==n||n.length<1?void 0:null==r||t?n[n.length-1]:h.rest(n,Math.max(0,n.length-r))},h.rest=h.tail=h.drop=function(n,r,t){return o.call(n,null==r||t?1:r)},h.compact=function(n){return h.filter(n,Boolean)};var S=function(n,r,t,e){e=e||[];for(var u=e.length,i=0,o=_(n);o>i;i++){var a=n[i];if(A(a)&&(h.isArray(a)||h.isArguments(a)))if(r)for(var c=0,l=a.length;l>c;)e[u++]=a[c++];else S(a,r,t,e),u=e.length;else t||(e[u++]=a)}return e};h.flatten=function(n,r){return S(n,r,!1)},h.without=d(function(n,r){return h.difference(n,r)}),h.uniq=h.unique=function(n,r,t,e){h.isBoolean(r)||(e=t,t=r,r=!1),null!=t&&(t=g(t,e));for(var u=[],i=[],o=0,a=_(n);a>o;o++){var c=n[o],l=t?t(c,o,n):c;r?(o&&i===l||u.push(c),i=l):t?h.contains(i,l)||(i.push(l),u.push(c)):h.contains(u,c)||u.push(c)}return u},h.union=d(function(n){return h.uniq(S(n,!0,!0))}),h.intersection=function(n){for(var r=[],t=arguments.length,e=0,u=_(n);u>e;e++){var i=n[e];if(!h.contains(r,i)){var o;for(o=1;t>o&&h.contains(arguments[o],i);o++);o===t&&r.push(i)}}return r},h.difference=d(function(n,r){return r=S(r,!0,!0),h.filter(n,function(n){return!h.contains(r,n)})}),h.unzip=function(n){for(var r=n&&h.max(n,_).length||0,t=Array(r),e=0;r>e;e++)t[e]=h.pluck(n,e);return t},h.zip=d(h.unzip),h.object=function(n,r){for(var t={},e=0,u=_(n);u>e;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t};var M=function(n){return function(r,t,e){t=g(t,e);for(var u=_(r),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(t(r[i],i,r))return i;return-1}};h.findIndex=M(1),h.findLastIndex=M(-1),h.sortedIndex=function(n,r,t,e){t=g(t,e,1);for(var u=t(r),i=0,o=_(n);o>i;){var a=Math.floor((i+o)/2);t(n[a])0?a=i>=0?i:Math.max(i+c,a):c=i>=0?Math.min(i+1,c):i+c+1;else if(t&&i&&c)return i=t(e,u),e[i]===u?i:-1;if(u!==u)return i=r(o.call(e,a,c),h.isNaN),i>=0?i+a:-1;for(i=n>0?a:c-1;i>=0&&c>i;i+=n)if(e[i]===u)return i;return-1}};h.indexOf=F(1,h.findIndex,h.sortedIndex),h.lastIndexOf=F(-1,h.findLastIndex),h.range=function(n,r,t){null==r&&(r=n||0,n=0),t||(t=n>r?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),i=0;e>i;i++,n+=t)u[i]=n;return u},h.chunk=function(n,r){if(null==r||1>r)return[];for(var t=[],e=0,u=n.length;u>e;)t.push(o.call(n,e,e+=r));return t};var E=function(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var i=m(n.prototype),o=n.apply(i,u);return h.isObject(o)?o:i};h.bind=d(function(n,r,t){if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");var e=d(function(u){return E(n,e,r,this,t.concat(u))});return e}),h.partial=d(function(n,r){var t=h.partial.placeholder,e=function(){for(var u=0,i=r.length,o=Array(i),a=0;i>a;a++)o[a]=r[a]===t?arguments[u++]:r[a];for(;ut)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=h.bind(n[e],n)}}),h.memoize=function(n,r){var t=function(e){var u=t.cache,i=""+(r?r.apply(this,arguments):e);return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return t.cache={},t},h.delay=d(function(n,r,t){return setTimeout(function(){return n.apply(null,t)},r)}),h.defer=h.partial(h.delay,h,1),h.throttle=function(n,r,t){var e,u,i,o,a=0;t||(t={});var c=function(){a=t.leading===!1?0:h.now(),e=null,o=n.apply(u,i),e||(u=i=null)},l=function(){var l=h.now();a||t.leading!==!1||(a=l);var f=r-(l-a);return u=this,i=arguments,0>=f||f>r?(e&&(clearTimeout(e),e=null),a=l,o=n.apply(u,i),e||(u=i=null)):e||t.trailing===!1||(e=setTimeout(c,f)),o};return l.cancel=function(){clearTimeout(e),a=0,e=u=i=null},l},h.debounce=function(n,r,t){var e,u,i=function(r,t){e=null,t&&(u=n.apply(r,t))},o=d(function(o){if(e&&clearTimeout(e),t){var a=!e;e=setTimeout(i,r),a&&(u=n.apply(this,o))}else e=h.delay(i,r,this,o);return u});return o.cancel=function(){clearTimeout(e),e=null},o},h.wrap=function(n,r){return h.partial(r,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},h.after=function(n,r){return function(){return--n<1?r.apply(this,arguments):void 0}},h.before=function(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),1>=n&&(r=null),t}},h.once=h.partial(h.before,2),h.restArgs=d;var N=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],T=function(n,r){var t=I.length,u=n.constructor,i=h.isFunction(u)&&u.prototype||e,o="constructor";for(h.has(n,o)&&!h.contains(r,o)&&r.push(o);t--;)o=I[t],o in n&&n[o]!==i[o]&&!h.contains(r,o)&&r.push(o)};h.keys=function(n){if(!h.isObject(n))return[];if(f)return f(n);var r=[];for(var t in n)h.has(n,t)&&r.push(t);return N&&T(n,r),r},h.allKeys=function(n){if(!h.isObject(n))return[];var r=[];for(var t in n)r.push(t);return N&&T(n,r),r},h.values=function(n){for(var r=h.keys(n),t=r.length,e=Array(t),u=0;t>u;u++)e[u]=n[r[u]];return e},h.mapObject=function(n,r,t){r=g(r,t);for(var e=h.keys(n),u=e.length,i={},o=0;u>o;o++){var a=e[o];i[a]=r(n[a],a,n)}return i},h.pairs=function(n){for(var r=h.keys(n),t=r.length,e=Array(t),u=0;t>u;u++)e[u]=[r[u],n[r[u]]];return e},h.invert=function(n){for(var r={},t=h.keys(n),e=0,u=t.length;u>e;e++)r[n[t[e]]]=t[e];return r},h.functions=h.methods=function(n){var r=[];for(var t in n)h.isFunction(n[t])&&r.push(t);return r.sort()};var B=function(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),2>e||null==t)return t;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var l=o[c];r&&t[l]!==void 0||(t[l]=i[l])}return t}};h.extend=B(h.allKeys),h.extendOwn=h.assign=B(h.keys),h.findKey=function(n,r,t){r=g(r,t);for(var e,u=h.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],r(n[e],e,n))return e},h.findKeys=function(n,r,t){r=g(r,t);var e=h.keys(n),u=[];return h.each(e,function(t){r(n[t],t,n)&&u.push(t)}),u};var K=function(n,r,t){return r in t};h.pick=d(function(n,r){var t={},e=r[0];if(null==n)return t;h.isFunction(e)?(r.length>1&&(e=y(e,r[1])),r=h.allKeys(n)):(e=K,r=S(r,!1,!1),n=Object(n));for(var u=0,i=r.length;i>u;u++){var o=r[u],a=n[o];e(a,o,n)&&(t[o]=a)}return t}),h.omit=d(function(n,r){var t,e=r[0];return h.isFunction(e)?(e=h.negate(e),r.length>1&&(t=r[1])):(r=h.map(S(r,!1,!1),String),e=function(n,t){return!h.contains(r,t)}),h.pick(n,e,t)}),h.defaults=B(h.allKeys,!0),h.create=function(n,r){var t=m(n);return r&&h.extendOwn(t,r),t},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,r){return r(n),n},h.isMatch=function(n,r){var t=h.keys(r),e=t.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=t[i];if(r[o]!==u[o]||!(o in u))return!1}return!0};var R,q;R=function(n,r,t,e){if(n===r)return 0!==n||1/n===1/r;if(null==n||null==r)return!1;if(n!==n)return r!==r;var u=typeof n;return"function"!==u&&"object"!==u&&"object"!=typeof r?!1:q(n,r,t,e)},q=function(n,r,t,e){n instanceof h&&(n=n._wrapped),r instanceof h&&(r=r._wrapped);var i=a.call(n);if(i!==a.call(r))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+n==""+r;case"[object Number]":return+n!==+n?+r!==+r:0===+n?1/+n===1/r:+n===+r;case"[object Date]":case"[object Boolean]":return+n===+r;case"[object Symbol]":return u.valueOf.call(n)===u.valueOf.call(r)}var o="[object Array]"===i;if(!o){if("object"!=typeof n||"object"!=typeof r)return!1;var c=n.constructor,l=r.constructor;if(c!==l&&!(h.isFunction(c)&&c instanceof c&&h.isFunction(l)&&l instanceof l)&&"constructor"in n&&"constructor"in r)return!1}t=t||[],e=e||[];for(var f=t.length;f--;)if(t[f]===n)return e[f]===r;if(t.push(n),e.push(r),o){if(f=n.length,f!==r.length)return!1;for(;f--;)if(!R(n[f],r[f],t,e))return!1}else{var s,p=h.keys(n);if(f=p.length,h.keys(r).length!==f)return!1;for(;f--;)if(s=p[f],!h.has(r,s)||!R(n[s],r[s],t,e))return!1}return t.pop(),e.pop(),!0},h.isEqual=function(n,r){return R(n,r)},h.isEmpty=function(n){return null==n?!0:A(n)&&(h.isArray(n)||h.isString(n)||h.isArguments(n))?0===n.length:0===h.keys(n).length},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=l||function(n){return"[object Array]"===a.call(n)},h.isObject=function(n){var r=typeof n;return"function"===r||"object"===r&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp","Error","Symbol","Map","WeakMap","Set","WeakSet"],function(n){h["is"+n]=function(r){return a.call(r)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")});var z=n.document&&n.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof z&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return!h.isSymbol(n)&&isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&isNaN(n)},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===a.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,r){if(!h.isArray(r))return null!=n&&c.call(n,r);for(var t=r.length,e=0;t>e;e++){var u=r[e];if(null==n||!c.call(n,u))return!1;n=n[u]}return!!t},h.noConflict=function(){return n._=r,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return h.isArray(n)?function(r){return j(r,n)}:b(n)},h.propertyOf=function(n){return null==n?function(){}:function(r){return h.isArray(r)?j(n,r):n[r]}},h.matcher=h.matches=function(n){return n=h.extendOwn({},n),function(r){return h.isMatch(r,n)}},h.times=function(n,r,t){var e=Array(Math.max(0,n));r=y(r,t,1);for(var u=0;n>u;u++)e[u]=r(u);return e},h.random=function(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var D={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},L=h.invert(D),P=function(n){var r=function(r){return n[r]},t="(?:"+h.keys(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}};h.escape=P(D),h.unescape=P(L),h.result=function(n,r,t){h.isArray(r)||(r=[r]);var e=r.length;if(!e)return h.isFunction(t)?t.call(n):t;for(var u=0;e>u;u++){var i=null==n?void 0:n[r[u]];i===void 0&&(i=t,u=e),n=h.isFunction(i)?i.call(n):i}return n};var W=0;h.uniqueId=function(n){var r=++W+"";return n?n+r:r},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var C=/(.)^/,J={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},U=/\\|'|\r|\n|\u2028|\u2029/g,V=function(n){return"\\"+J[n]};h.template=function(n,r,t){!r&&t&&(r=t),r=h.defaults({},r,h.templateSettings);var e=RegExp([(r.escape||C).source,(r.interpolate||C).source,(r.evaluate||C).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(r,t,e,o,a){return i+=n.slice(u,a).replace(U,V),u=a+r.length,t?i+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),r}),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";var o;try{o=new Function(r.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,h)},l=r.variable||"obj";return c.source="function("+l+"){\n"+i+"}",c},h.chain=function(n){var r=h(n);return r._chain=!0,r};var $=function(n,r){return n._chain?h(r).chain():r};h.mixin=function(n){return h.each(h.functions(n),function(r){var t=h[r]=n[r];h.prototype[r]=function(){var n=[this._wrapped];return i.apply(n,arguments),$(this,t.apply(h,n))}}),h},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var r=t[n];h.prototype[n]=function(){var t=this._wrapped;return r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0],$(this,t)}}),h.each(["concat","join","slice"],function(n){var r=t[n];h.prototype[n]=function(){return $(this,r.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},h.prototype.valueOf=h.prototype.toJSON=h.prototype.value,h.prototype.toString=function(){return String(this._wrapped)},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}(); +//# sourceMappingURL= \ No newline at end of file diff --git a/underscore-min.map b/underscore-min.map index cf356bf9a..ccc9e9e9d 100644 --- a/underscore-min.map +++ b/underscore-min.map @@ -1 +1 @@ -{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":";;;;CAKC,WA4KC,QAASA,GAAaC,GAGpB,QAASC,GAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,GAClD,KAAOD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAAK,CACjD,GAAIQ,GAAaH,EAAOA,EAAKC,GAASA,CACtCF,GAAOD,EAASC,EAAMF,EAAIM,GAAaA,EAAYN,GAErD,MAAOE,GAGT,MAAO,UAASF,EAAKC,EAAUC,EAAMK,GACnCN,EAAWO,EAAWP,EAAUM,EAAS,EACzC,IAAIJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBD,EAAQN,EAAM,EAAI,EAAIO,EAAS,CAMnC,OAJIM,WAAUN,OAAS,IACrBH,EAAOF,EAAIG,EAAOA,EAAKC,GAASA,GAChCA,GAASN,GAEJC,EAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,IA+ZtD,QAASO,GAA2Bd,GAClC,MAAO,UAASe,EAAOC,EAAWP,GAChCO,EAAYC,EAAGD,EAAWP,EAG1B,KAFA,GAAIF,GAASW,EAAUH,GACnBT,EAAQN,EAAM,EAAI,EAAIO,EAAS,EAC5BD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAC5C,GAAIgB,EAAUD,EAAMT,GAAQA,EAAOS,GAAQ,MAAOT,EAEpD,QAAQ,GAsBZ,QAASa,GAAkBnB,EAAKoB,EAAeC,GAC7C,MAAO,UAASN,EAAOO,EAAMC,GAC3B,GAAIC,GAAI,EAAGjB,EAASW,EAAUH,EAC9B,IAAkB,gBAAPQ,GACLvB,EAAM,EACNwB,EAAID,GAAO,EAAIA,EAAME,KAAKC,IAAIH,EAAMhB,EAAQiB,GAE5CjB,EAASgB,GAAO,EAAIE,KAAKE,IAAIJ,EAAM,EAAGhB,GAAUgB,EAAMhB,EAAS,MAE9D,IAAIc,GAAeE,GAAOhB,EAE/B,MADAgB,GAAMF,EAAYN,EAAOO,GAClBP,EAAMQ,KAASD,EAAOC,GAAO,CAEtC,IAAID,IAASA,EAEX,MADAC,GAAMH,EAAcQ,EAAMC,KAAKd,EAAOS,EAAGjB,GAASK,EAAEkB,OAC7CP,GAAO,EAAIA,EAAMC,GAAK,CAE/B,KAAKD,EAAMvB,EAAM,EAAIwB,EAAIjB,EAAS,EAAGgB,GAAO,GAAWhB,EAANgB,EAAcA,GAAOvB,EACpE,GAAIe,EAAMQ,KAASD,EAAM,MAAOC,EAElC,QAAQ,GAqPZ,QAASQ,GAAoB7B,EAAKG,GAChC,GAAI2B,GAAaC,EAAmB1B,OAChC2B,EAAchC,EAAIgC,YAClBC,EAASvB,EAAEwB,WAAWF,IAAgBA,EAAYG,WAAcC,EAGhEC,EAAO,aAGX,KAFI3B,EAAE4B,IAAItC,EAAKqC,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAAOlC,EAAKqC,KAAKH,GAEpDP,KACLO,EAAON,EAAmBD,GACtBO,IAAQrC,IAAOA,EAAIqC,KAAUJ,EAAMI,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAChElC,EAAKqC,KAAKH,GA74BhB,GAAII,GAAOC,KAGPC,EAAqBF,EAAK/B,EAG1BkC,EAAaC,MAAMV,UAAWC,EAAWU,OAAOX,UAAWY,EAAYC,SAASb,UAIlFK,EAAmBI,EAAWJ,KAC9Bd,EAAmBkB,EAAWlB,MAC9BuB,EAAmBb,EAASa,SAC5BC,EAAmBd,EAASc,eAK5BC,EAAqBN,MAAMO,QAC3BC,EAAqBP,OAAO3C,KAC5BmD,EAAqBP,EAAUQ,KAC/BC,EAAqBV,OAAOW,OAG1BC,EAAO,aAGPhD,EAAI,SAASV,GACf,MAAIA,aAAeU,GAAUV,EACvB0C,eAAgBhC,QACtBgC,KAAKiB,SAAW3D,GADiB,GAAIU,GAAEV,GAOlB,oBAAZ4D,UACa,mBAAXC,SAA0BA,OAAOD,UAC1CA,QAAUC,OAAOD,QAAUlD,GAE7BkD,QAAQlD,EAAIA,GAEZ+B,EAAK/B,EAAIA,EAIXA,EAAEoD,QAAU,OAKZ,IAAItD,GAAa,SAASuD,EAAMxD,EAASyD,GACvC,GAAIzD,QAAiB,GAAG,MAAOwD,EAC/B,QAAoB,MAAZC,EAAmB,EAAIA,GAC7B,IAAK,GAAG,MAAO,UAASC,GACtB,MAAOF,GAAKpC,KAAKpB,EAAS0D,GAE5B,KAAK,GAAG,MAAO,UAASA,EAAOC,GAC7B,MAAOH,GAAKpC,KAAKpB,EAAS0D,EAAOC,GAEnC,KAAK,GAAG,MAAO,UAASD,EAAO7D,EAAO+D,GACpC,MAAOJ,GAAKpC,KAAKpB,EAAS0D,EAAO7D,EAAO+D,GAE1C,KAAK,GAAG,MAAO,UAASC,EAAaH,EAAO7D,EAAO+D,GACjD,MAAOJ,GAAKpC,KAAKpB,EAAS6D,EAAaH,EAAO7D,EAAO+D,IAGzD,MAAO,YACL,MAAOJ,GAAKM,MAAM9D,EAASI,aAO3BI,EAAK,SAASkD,EAAO1D,EAASyD,GAChC,MAAa,OAATC,EAAsBvD,EAAE4D,SACxB5D,EAAEwB,WAAW+B,GAAezD,EAAWyD,EAAO1D,EAASyD,GACvDtD,EAAE6D,SAASN,GAAevD,EAAE8D,QAAQP,GACjCvD,EAAE+D,SAASR,GAEpBvD,GAAET,SAAW,SAASgE,EAAO1D,GAC3B,MAAOQ,GAAGkD,EAAO1D,EAASmE,KAI5B,IAAIC,GAAiB,SAASC,EAAUC,GACtC,MAAO,UAAS7E,GACd,GAAIK,GAASM,UAAUN,MACvB,IAAa,EAATA,GAAqB,MAAPL,EAAa,MAAOA,EACtC,KAAK,GAAII,GAAQ,EAAWC,EAARD,EAAgBA,IAIlC,IAAK,GAHD0E,GAASnE,UAAUP,GACnBD,EAAOyE,EAASE,GAChBC,EAAI5E,EAAKE,OACJiB,EAAI,EAAOyD,EAAJzD,EAAOA,IAAK,CAC1B,GAAI0D,GAAM7E,EAAKmB,EACVuD,IAAiB7E,EAAIgF,SAAc,KAAGhF,EAAIgF,GAAOF,EAAOE,IAGjE,MAAOhF,KAKPiF,EAAa,SAAS9C,GACxB,IAAKzB,EAAE6D,SAASpC,GAAY,QAC5B,IAAIqB,EAAc,MAAOA,GAAarB,EACtCuB,GAAKvB,UAAYA,CACjB,IAAI+C,GAAS,GAAIxB,EAEjB,OADAA,GAAKvB,UAAY,KACV+C,GAGLT,EAAW,SAASO,GACtB,MAAO,UAAShF,GACd,MAAc,OAAPA,MAAmB,GAAIA,EAAIgF,KAQlCG,EAAkB5D,KAAK6D,IAAI,EAAG,IAAM,EACpCpE,EAAYyD,EAAS,UACrBhE,EAAc,SAAS0D,GACzB,GAAI9D,GAASW,EAAUmD,EACvB,OAAwB,gBAAV9D,IAAsBA,GAAU,GAAe8E,GAAV9E,EASrDK,GAAE2E,KAAO3E,EAAE4E,QAAU,SAAStF,EAAKC,EAAUM,GAC3CN,EAAWO,EAAWP,EAAUM,EAChC,IAAIe,GAAGjB,CACP,IAAII,EAAYT,GACd,IAAKsB,EAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC3CrB,EAASD,EAAIsB,GAAIA,EAAGtB,OAEjB,CACL,GAAIG,GAAOO,EAAEP,KAAKH,EAClB,KAAKsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAC5CrB,EAASD,EAAIG,EAAKmB,IAAKnB,EAAKmB,GAAItB,GAGpC,MAAOA,IAITU,EAAE6E,IAAM7E,EAAE8E,QAAU,SAASxF,EAAKC,EAAUM,GAC1CN,EAAWc,EAAGd,EAAUM,EAIxB,KAAK,GAHDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBoF,EAAU5C,MAAMxC,GACXD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtCqF,GAAQrF,GAASH,EAASD,EAAIM,GAAaA,EAAYN,GAEzD,MAAOyF,IA+BT/E,EAAEgF,OAAShF,EAAEiF,MAAQjF,EAAEkF,OAAS/F,EAAa,GAG7Ca,EAAEmF,YAAcnF,EAAEoF,MAAQjG,GAAc,GAGxCa,EAAEqF,KAAOrF,EAAEsF,OAAS,SAAShG,EAAKc,EAAWP,GAC3C,GAAIyE,EAMJ,OAJEA,GADEvE,EAAYT,GACRU,EAAEuF,UAAUjG,EAAKc,EAAWP,GAE5BG,EAAEwF,QAAQlG,EAAKc,EAAWP,GAE9ByE,QAAa,IAAKA,KAAS,EAAUhF,EAAIgF,GAA7C,QAKFtE,EAAEyF,OAASzF,EAAE0F,OAAS,SAASpG,EAAKc,EAAWP,GAC7C,GAAIkF,KAKJ,OAJA3E,GAAYC,EAAGD,EAAWP,GAC1BG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC7BvF,EAAUmD,EAAO7D,EAAOiG,IAAOZ,EAAQjD,KAAKyB,KAE3CwB,GAIT/E,EAAE4F,OAAS,SAAStG,EAAKc,EAAWP,GAClC,MAAOG,GAAEyF,OAAOnG,EAAKU,EAAE6F,OAAOxF,EAAGD,IAAaP,IAKhDG,EAAE8F,MAAQ9F,EAAE+F,IAAM,SAASzG,EAAKc,EAAWP,GACzCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,KAAKU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE3D,OAAO,GAKTU,EAAEgG,KAAOhG,EAAEiG,IAAM,SAAS3G,EAAKc,EAAWP,GACxCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,IAAIU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE1D,OAAO,GAKTU,EAAE6B,SAAW7B,EAAEkG,SAAWlG,EAAEmG,QAAU,SAAS7G,EAAKoB,EAAM0F,EAAWC,GAGnE,MAFKtG,GAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,KACd,gBAAb8G,IAAyBC,KAAOD,EAAY,GAChDpG,EAAEuG,QAAQjH,EAAKoB,EAAM0F,IAAc,GAI5CpG,EAAEwG,OAAS,SAASlH,EAAKmH,GACvB,GAAIC,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7B0G,EAAS3G,EAAEwB,WAAWiF,EAC1B,OAAOzG,GAAE6E,IAAIvF,EAAK,SAASiE,GACzB,GAAIF,GAAOsD,EAASF,EAASlD,EAAMkD,EACnC,OAAe,OAARpD,EAAeA,EAAOA,EAAKM,MAAMJ,EAAOmD,MAKnD1G,EAAE4G,MAAQ,SAAStH,EAAKgF,GACtB,MAAOtE,GAAE6E,IAAIvF,EAAKU,EAAE+D,SAASO,KAK/BtE,EAAE6G,MAAQ,SAASvH,EAAKwH,GACtB,MAAO9G,GAAEyF,OAAOnG,EAAKU,EAAE8D,QAAQgD,KAKjC9G,EAAE+G,UAAY,SAASzH,EAAKwH,GAC1B,MAAO9G,GAAEqF,KAAK/F,EAAKU,EAAE8D,QAAQgD,KAI/B9G,EAAEc,IAAM,SAASxB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,GAAUR,IAAUiD,GAAgBjD,GAExC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACR2C,EAAQiB,IACVA,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IAC9BqB,EAAWC,GAAgBD,KAAchD,KAAYQ,KAAYR,OACnEQ,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAITxE,EAAEe,IAAM,SAASzB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,EAASR,IAAUiD,EAAejD,GAEtC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACA4D,EAARjB,IACFiB,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IACnBsB,EAAXD,GAAwChD,MAAbgD,GAAoChD,MAAXQ,KACtDA,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAKTxE,EAAEkH,QAAU,SAAS5H,GAInB,IAAK,GAAe6H,GAHhBC,EAAMrH,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,GACxCK,EAASyH,EAAIzH,OACb0H,EAAWlF,MAAMxC,GACZD,EAAQ,EAAiBC,EAARD,EAAgBA,IACxCyH,EAAOnH,EAAEsH,OAAO,EAAG5H,GACfyH,IAASzH,IAAO2H,EAAS3H,GAAS2H,EAASF,IAC/CE,EAASF,GAAQC,EAAI1H,EAEvB,OAAO2H,IAMTrH,EAAEuH,OAAS,SAASjI,EAAKkI,EAAGnB,GAC1B,MAAS,OAALmB,GAAanB,GACVtG,EAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,IAC/BA,EAAIU,EAAEsH,OAAOhI,EAAIK,OAAS,KAE5BK,EAAEkH,QAAQ5H,GAAK0B,MAAM,EAAGH,KAAKC,IAAI,EAAG0G,KAI7CxH,EAAEyH,OAAS,SAASnI,EAAKC,EAAUM,GAEjC,MADAN,GAAWc,EAAGd,EAAUM,GACjBG,EAAE4G,MAAM5G,EAAE6E,IAAIvF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC/C,OACEpC,MAAOA,EACP7D,MAAOA,EACPgI,SAAUnI,EAASgE,EAAO7D,EAAOiG,MAElCgC,KAAK,SAASC,EAAMC,GACrB,GAAIC,GAAIF,EAAKF,SACTK,EAAIF,EAAMH,QACd,IAAII,IAAMC,EAAG,CACX,GAAID,EAAIC,GAAKD,QAAW,GAAG,MAAO,EAClC,IAAQC,EAAJD,GAASC,QAAW,GAAG,OAAQ,EAErC,MAAOH,GAAKlI,MAAQmI,EAAMnI,QACxB,SAIN,IAAIsI,GAAQ,SAASC,GACnB,MAAO,UAAS3I,EAAKC,EAAUM,GAC7B,GAAI2E,KAMJ,OALAjF,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,GAC1B,GAAI4E,GAAM/E,EAASgE,EAAO7D,EAAOJ,EACjC2I,GAASzD,EAAQjB,EAAOe,KAEnBE,GAMXxE,GAAEkI,QAAUF,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,GAAKxC,KAAKyB,GAAaiB,EAAOF,IAAQf,KAKvEvD,EAAEmI,QAAUH,EAAM,SAASxD,EAAQjB,EAAOe,GACxCE,EAAOF,GAAOf,IAMhBvD,EAAEoI,QAAUJ,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,KAAaE,EAAOF,GAAO,IAI5DtE,EAAEqI,QAAU,SAAS/I,GACnB,MAAKA,GACDU,EAAE0C,QAAQpD,GAAa0B,EAAMC,KAAK3B,GAClCS,EAAYT,GAAaU,EAAE6E,IAAIvF,EAAKU,EAAE4D,UACnC5D,EAAEsG,OAAOhH,OAIlBU,EAAEsI,KAAO,SAAShJ,GAChB,MAAW,OAAPA,EAAoB,EACjBS,EAAYT,GAAOA,EAAIK,OAASK,EAAEP,KAAKH,GAAKK,QAKrDK,EAAEuI,UAAY,SAASjJ,EAAKc,EAAWP,GACrCO,EAAYC,EAAGD,EAAWP,EAC1B,IAAI2I,MAAWC,IAIf,OAHAzI,GAAE2E,KAAKrF,EAAK,SAASiE,EAAOe,EAAKhF,IAC9Bc,EAAUmD,EAAOe,EAAKhF,GAAOkJ,EAAOC,GAAM3G,KAAKyB,MAE1CiF,EAAMC,IAShBzI,EAAE0I,MAAQ1I,EAAE2I,KAAO3I,EAAE4I,KAAO,SAASzI,EAAOqH,EAAGnB,GAC7C,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAM,GAC9BH,EAAE6I,QAAQ1I,EAAOA,EAAMR,OAAS6H,IAMzCxH,EAAE6I,QAAU,SAAS1I,EAAOqH,EAAGnB,GAC7B,MAAOrF,GAAMC,KAAKd,EAAO,EAAGU,KAAKC,IAAI,EAAGX,EAAMR,QAAe,MAAL6H,GAAanB,EAAQ,EAAImB,MAKnFxH,EAAE8I,KAAO,SAAS3I,EAAOqH,EAAGnB,GAC1B,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAMA,EAAMR,OAAS,GAC7CK,EAAE+I,KAAK5I,EAAOU,KAAKC,IAAI,EAAGX,EAAMR,OAAS6H,KAMlDxH,EAAE+I,KAAO/I,EAAEgJ,KAAOhJ,EAAEiJ,KAAO,SAAS9I,EAAOqH,EAAGnB,GAC5C,MAAOrF,GAAMC,KAAKd,EAAY,MAALqH,GAAanB,EAAQ,EAAImB,IAIpDxH,EAAEkJ,QAAU,SAAS/I,GACnB,MAAOH,GAAEyF,OAAOtF,EAAOH,EAAE4D,UAI3B,IAAIuF,GAAU,SAASC,EAAOC,EAASC,EAAQC,GAE7C,IAAK,GADDC,MAAa7I,EAAM,EACdC,EAAI2I,GAAc,EAAG5J,EAASW,EAAU8I,GAAYzJ,EAAJiB,EAAYA,IAAK,CACxE,GAAI2C,GAAQ6F,EAAMxI,EAClB,IAAIb,EAAYwD,KAAWvD,EAAE0C,QAAQa,IAAUvD,EAAEyJ,YAAYlG,IAAS,CAE/D8F,IAAS9F,EAAQ4F,EAAQ5F,EAAO8F,EAASC,GAC9C,IAAII,GAAI,EAAGC,EAAMpG,EAAM5D,MAEvB,KADA6J,EAAO7J,QAAUgK,EACNA,EAAJD,GACLF,EAAO7I,KAAS4C,EAAMmG,SAEdJ,KACVE,EAAO7I,KAAS4C,GAGpB,MAAOiG,GAITxJ,GAAEmJ,QAAU,SAAShJ,EAAOkJ,GAC1B,MAAOF,GAAQhJ,EAAOkJ,GAAS,IAIjCrJ,EAAE4J,QAAU,SAASzJ,GACnB,MAAOH,GAAE6J,WAAW1J,EAAOa,EAAMC,KAAKhB,UAAW,KAMnDD,EAAE8J,KAAO9J,EAAE+J,OAAS,SAAS5J,EAAO6J,EAAUzK,EAAUM,GACjDG,EAAEiK,UAAUD,KACfnK,EAAUN,EACVA,EAAWyK,EACXA,GAAW,GAEG,MAAZzK,IAAkBA,EAAWc,EAAGd,EAAUM,GAG9C,KAAK,GAFD2E,MACA0F,KACKtJ,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAI2C,GAAQpD,EAAMS,GACdoG,EAAWzH,EAAWA,EAASgE,EAAO3C,EAAGT,GAASoD,CAClDyG,IACGpJ,GAAKsJ,IAASlD,GAAUxC,EAAO1C,KAAKyB,GACzC2G,EAAOlD,GACEzH,EACJS,EAAE6B,SAASqI,EAAMlD,KACpBkD,EAAKpI,KAAKkF,GACVxC,EAAO1C,KAAKyB,IAEJvD,EAAE6B,SAAS2C,EAAQjB,IAC7BiB,EAAO1C,KAAKyB,GAGhB,MAAOiB,IAKTxE,EAAEmK,MAAQ,WACR,MAAOnK,GAAE8J,KAAKX,EAAQlJ,WAAW,GAAM,KAKzCD,EAAEoK,aAAe,SAASjK,GAGxB,IAAK,GAFDqE,MACA6F,EAAapK,UAAUN,OAClBiB,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAIF,GAAOP,EAAMS,EACjB,KAAIZ,EAAE6B,SAAS2C,EAAQ9D,GAAvB,CACA,IAAK,GAAIgJ,GAAI,EAAOW,EAAJX,GACT1J,EAAE6B,SAAS5B,UAAUyJ,GAAIhJ,GADAgJ,KAG5BA,IAAMW,GAAY7F,EAAO1C,KAAKpB,IAEpC,MAAO8D,IAKTxE,EAAE6J,WAAa,SAAS1J,GACtB,GAAI4I,GAAOI,EAAQlJ,WAAW,GAAM,EAAM,EAC1C,OAAOD,GAAEyF,OAAOtF,EAAO,SAASoD,GAC9B,OAAQvD,EAAE6B,SAASkH,EAAMxF,MAM7BvD,EAAEsK,IAAM,WACN,MAAOtK,GAAEuK,MAAMtK,YAKjBD,EAAEuK,MAAQ,SAASpK,GAIjB,IAAK,GAHDR,GAASQ,GAASH,EAAEc,IAAIX,EAAOG,GAAWX,QAAU,EACpD6E,EAASrC,MAAMxC,GAEVD,EAAQ,EAAWC,EAARD,EAAgBA,IAClC8E,EAAO9E,GAASM,EAAE4G,MAAMzG,EAAOT,EAEjC,OAAO8E,IAMTxE,EAAEwK,OAAS,SAAS7E,EAAMW,GAExB,IAAK,GADD9B,MACK5D,EAAI,EAAGjB,EAASW,EAAUqF,GAAWhG,EAAJiB,EAAYA,IAChD0F,EACF9B,EAAOmB,EAAK/E,IAAM0F,EAAO1F,GAEzB4D,EAAOmB,EAAK/E,GAAG,IAAM+E,EAAK/E,GAAG,EAGjC,OAAO4D,IAiBTxE,EAAEuF,UAAYrF,EAA2B,GACzCF,EAAEyK,cAAgBvK,GAA4B,GAI9CF,EAAES,YAAc,SAASN,EAAOb,EAAKC,EAAUM,GAC7CN,EAAWc,EAAGd,EAAUM,EAAS,EAGjC,KAFA,GAAI0D,GAAQhE,EAASD,GACjBoL,EAAM,EAAGC,EAAOrK,EAAUH,GACjBwK,EAAND,GAAY,CACjB,GAAIE,GAAM/J,KAAKgK,OAAOH,EAAMC,GAAQ,EAChCpL,GAASY,EAAMyK,IAAQrH,EAAOmH,EAAME,EAAM,EAAQD,EAAOC,EAE/D,MAAOF,IAgCT1K,EAAEuG,QAAUhG,EAAkB,EAAGP,EAAEuF,UAAWvF,EAAES,aAChDT,EAAE8K,YAAcvK,GAAmB,EAAGP,EAAEyK,eAKxCzK,EAAE+K,MAAQ,SAASC,EAAOC,EAAMC,GAClB,MAARD,IACFA,EAAOD,GAAS,EAChBA,EAAQ,GAEVE,EAAOA,GAAQ,CAKf,KAAK,GAHDvL,GAASkB,KAAKC,IAAID,KAAKsK,MAAMF,EAAOD,GAASE,GAAO,GACpDH,EAAQ5I,MAAMxC,GAETgB,EAAM,EAAShB,EAANgB,EAAcA,IAAOqK,GAASE,EAC9CH,EAAMpK,GAAOqK,CAGf,OAAOD,GAQT,IAAIK,GAAe,SAASC,EAAYC,EAAWzL,EAAS0L,EAAgB7E,GAC1E,KAAM6E,YAA0BD,IAAY,MAAOD,GAAW1H,MAAM9D,EAAS6G,EAC7E,IAAI8E,GAAOjH,EAAW8G,EAAW5J,WAC7B+C,EAAS6G,EAAW1H,MAAM6H,EAAM9E,EACpC,OAAI1G,GAAE6D,SAASW,GAAgBA,EACxBgH,EAMTxL,GAAE6C,KAAO,SAASQ,EAAMxD,GACtB,GAAI+C,GAAcS,EAAKR,OAASD,EAAY,MAAOA,GAAWe,MAAMN,EAAMrC,EAAMC,KAAKhB,UAAW,GAChG,KAAKD,EAAEwB,WAAW6B,GAAO,KAAM,IAAIoI,WAAU,oCAC7C,IAAI/E,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7ByL,EAAQ,WACV,MAAON,GAAa/H,EAAMqI,EAAO7L,EAASmC,KAAM0E,EAAKiF,OAAO3K,EAAMC,KAAKhB,aAEzE,OAAOyL,IAMT1L,EAAE4L,QAAU,SAASvI,GACnB,GAAIwI,GAAY7K,EAAMC,KAAKhB,UAAW,GAClCyL,EAAQ,WAGV,IAAK,GAFDI,GAAW,EAAGnM,EAASkM,EAAUlM,OACjC+G,EAAOvE,MAAMxC,GACRiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B8F,EAAK9F,GAAKiL,EAAUjL,KAAOZ,EAAIC,UAAU6L,KAAcD,EAAUjL,EAEnE,MAAOkL,EAAW7L,UAAUN,QAAQ+G,EAAK5E,KAAK7B,UAAU6L,KACxD,OAAOV,GAAa/H,EAAMqI,EAAO1J,KAAMA,KAAM0E,GAE/C,OAAOgF,IAMT1L,EAAE+L,QAAU,SAASzM,GACnB,GAAIsB,GAA8B0D,EAA3B3E,EAASM,UAAUN,MAC1B,IAAc,GAAVA,EAAa,KAAM,IAAIqM,OAAM,wCACjC,KAAKpL,EAAI,EAAOjB,EAAJiB,EAAYA,IACtB0D,EAAMrE,UAAUW,GAChBtB,EAAIgF,GAAOtE,EAAE6C,KAAKvD,EAAIgF,GAAMhF,EAE9B,OAAOA,IAITU,EAAEiM,QAAU,SAAS5I,EAAM6I,GACzB,GAAID,GAAU,SAAS3H,GACrB,GAAI6H,GAAQF,EAAQE,MAChBC,EAAU,IAAMF,EAASA,EAAOvI,MAAM3B,KAAM/B,WAAaqE,EAE7D,OADKtE,GAAE4B,IAAIuK,EAAOC,KAAUD,EAAMC,GAAW/I,EAAKM,MAAM3B,KAAM/B,YACvDkM,EAAMC,GAGf,OADAH,GAAQE,SACDF,GAKTjM,EAAEqM,MAAQ,SAAShJ,EAAMiJ,GACvB,GAAI5F,GAAO1F,EAAMC,KAAKhB,UAAW,EACjC,OAAOsM,YAAW,WAChB,MAAOlJ,GAAKM,MAAM,KAAM+C,IACvB4F,IAKLtM,EAAEwM,MAAQxM,EAAE4L,QAAQ5L,EAAEqM,MAAOrM,EAAG,GAOhCA,EAAEyM,SAAW,SAASpJ,EAAMiJ,EAAMI,GAChC,GAAI7M,GAAS6G,EAAMlC,EACfmI,EAAU,KACVC,EAAW,CACVF,KAASA,KACd,IAAIG,GAAQ,WACVD,EAAWF,EAAQI,WAAY,EAAQ,EAAI9M,EAAE+M,MAC7CJ,EAAU,KACVnI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,MAEjC,OAAO,YACL,GAAIqG,GAAM/M,EAAE+M,KACPH,IAAYF,EAAQI,WAAY,IAAOF,EAAWG,EACvD,IAAIC,GAAYV,GAAQS,EAAMH,EAc9B,OAbA/M,GAAUmC,KACV0E,EAAOzG,UACU,GAAb+M,GAAkBA,EAAYV,GAC5BK,IACFM,aAAaN,GACbA,EAAU,MAEZC,EAAWG,EACXvI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,OACrBiG,GAAWD,EAAQQ,YAAa,IAC1CP,EAAUJ,WAAWM,EAAOG,IAEvBxI,IAQXxE,EAAEmN,SAAW,SAAS9J,EAAMiJ,EAAMc,GAChC,GAAIT,GAASjG,EAAM7G,EAASwN,EAAW7I,EAEnCqI,EAAQ,WACV,GAAI/D,GAAO9I,EAAE+M,MAAQM,CAEVf,GAAPxD,GAAeA,GAAQ,EACzB6D,EAAUJ,WAAWM,EAAOP,EAAOxD,IAEnC6D,EAAU,KACLS,IACH5I,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,QAKrC,OAAO,YACL7G,EAAUmC,KACV0E,EAAOzG,UACPoN,EAAYrN,EAAE+M,KACd,IAAIO,GAAUF,IAAcT,CAO5B,OANKA,KAASA,EAAUJ,WAAWM,EAAOP,IACtCgB,IACF9I,EAASnB,EAAKM,MAAM9D,EAAS6G,GAC7B7G,EAAU6G,EAAO,MAGZlC,IAOXxE,EAAEuN,KAAO,SAASlK,EAAMmK,GACtB,MAAOxN,GAAE4L,QAAQ4B,EAASnK,IAI5BrD,EAAE6F,OAAS,SAASzF,GAClB,MAAO,YACL,OAAQA,EAAUuD,MAAM3B,KAAM/B,aAMlCD,EAAEyN,QAAU,WACV,GAAI/G,GAAOzG,UACP+K,EAAQtE,EAAK/G,OAAS,CAC1B,OAAO,YAGL,IAFA,GAAIiB,GAAIoK,EACJxG,EAASkC,EAAKsE,GAAOrH,MAAM3B,KAAM/B,WAC9BW,KAAK4D,EAASkC,EAAK9F,GAAGK,KAAKe,KAAMwC,EACxC,OAAOA,KAKXxE,EAAE0N,MAAQ,SAASC,EAAOtK,GACxB,MAAO,YACL,QAAMsK,EAAQ,EACLtK,EAAKM,MAAM3B,KAAM/B,WAD1B,SAOJD,EAAE4N,OAAS,SAASD,EAAOtK,GACzB,GAAI7D,EACJ,OAAO,YAKL,QAJMmO,EAAQ,IACZnO,EAAO6D,EAAKM,MAAM3B,KAAM/B,YAEb,GAAT0N,IAAYtK,EAAO,MAChB7D,IAMXQ,EAAE6N,KAAO7N,EAAE4L,QAAQ5L,EAAE4N,OAAQ,EAM7B,IAAIE,KAAevL,SAAU,MAAMwL,qBAAqB,YACpD1M,GAAsB,UAAW,gBAAiB,WAClC,uBAAwB,iBAAkB,iBAqB9DrB,GAAEP,KAAO,SAASH,GAChB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIqD,EAAY,MAAOA,GAAWrD,EAClC,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAASU,EAAE4B,IAAItC,EAAKgF,IAAM7E,EAAKqC,KAAKwC,EAGpD,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEgO,QAAU,SAAS1O,GACnB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAAKG,EAAKqC,KAAKwC,EAG/B,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEsG,OAAS,SAAShH,GAIlB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACd2G,EAASnE,MAAMxC,GACViB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B0F,EAAO1F,GAAKtB,EAAIG,EAAKmB,GAEvB,OAAO0F,IAKTtG,EAAEiO,UAAY,SAAS3O,EAAKC,EAAUM,GACpCN,EAAWc,EAAGd,EAAUM,EAKtB,KAAK,GADDD,GAHFH,EAAQO,EAAEP,KAAKH,GACbK,EAASF,EAAKE,OACdoF,KAEKrF,EAAQ,EAAWC,EAARD,EAAgBA,IAClCE,EAAaH,EAAKC,GAClBqF,EAAQnF,GAAcL,EAASD,EAAIM,GAAaA,EAAYN,EAE9D,OAAOyF,IAIX/E,EAAEkO,MAAQ,SAAS5O,GAIjB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACduO,EAAQ/L,MAAMxC,GACTiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1BsN,EAAMtN,IAAMnB,EAAKmB,GAAItB,EAAIG,EAAKmB,IAEhC,OAAOsN,IAITlO,EAAEmO,OAAS,SAAS7O,GAGlB,IAAK,GAFDkF,MACA/E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAChD4D,EAAOlF,EAAIG,EAAKmB,KAAOnB,EAAKmB,EAE9B,OAAO4D,IAKTxE,EAAEoO,UAAYpO,EAAEqO,QAAU,SAAS/O,GACjC,GAAIgP,KACJ,KAAK,GAAIhK,KAAOhF,GACVU,EAAEwB,WAAWlC,EAAIgF,KAAOgK,EAAMxM,KAAKwC,EAEzC,OAAOgK,GAAM3G,QAIf3H,EAAEuO,OAAStK,EAAejE,EAAEgO,SAI5BhO,EAAEwO,UAAYxO,EAAEyO,OAASxK,EAAejE,EAAEP,MAG1CO,EAAEwF,QAAU,SAASlG,EAAKc,EAAWP,GACnCO,EAAYC,EAAGD,EAAWP,EAE1B,KAAK,GADmByE,GAApB7E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAEhD,GADA0D,EAAM7E,EAAKmB,GACPR,EAAUd,EAAIgF,GAAMA,EAAKhF,GAAM,MAAOgF,IAK9CtE,EAAE0O,KAAO,SAASlE,EAAQmE,EAAW9O,GACnC,GAA+BN,GAAUE,EAArC+E,KAAalF,EAAMkL,CACvB,IAAW,MAAPlL,EAAa,MAAOkF,EACpBxE,GAAEwB,WAAWmN,IACflP,EAAOO,EAAEgO,QAAQ1O,GACjBC,EAAWO,EAAW6O,EAAW9O,KAEjCJ,EAAO0J,EAAQlJ,WAAW,GAAO,EAAO,GACxCV,EAAW,SAASgE,EAAOe,EAAKhF,GAAO,MAAOgF,KAAOhF,IACrDA,EAAM8C,OAAO9C,GAEf,KAAK,GAAIsB,GAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAAK,CACrD,GAAI0D,GAAM7E,EAAKmB,GACX2C,EAAQjE,EAAIgF,EACZ/E,GAASgE,EAAOe,EAAKhF,KAAMkF,EAAOF,GAAOf,GAE/C,MAAOiB,IAITxE,EAAE4O,KAAO,SAAStP,EAAKC,EAAUM,GAC/B,GAAIG,EAAEwB,WAAWjC,GACfA,EAAWS,EAAE6F,OAAOtG,OACf,CACL,GAAIE,GAAOO,EAAE6E,IAAIsE,EAAQlJ,WAAW,GAAO,EAAO,GAAI4O,OACtDtP,GAAW,SAASgE,EAAOe,GACzB,OAAQtE,EAAE6B,SAASpC,EAAM6E,IAG7B,MAAOtE,GAAE0O,KAAKpP,EAAKC,EAAUM,IAI/BG,EAAE8O,SAAW7K,EAAejE,EAAEgO,SAAS,GAKvChO,EAAE+C,OAAS,SAAStB,EAAWsN,GAC7B,GAAIvK,GAASD,EAAW9C,EAExB,OADIsN,IAAO/O,EAAEwO,UAAUhK,EAAQuK,GACxBvK,GAITxE,EAAEgP,MAAQ,SAAS1P,GACjB,MAAKU,GAAE6D,SAASvE,GACTU,EAAE0C,QAAQpD,GAAOA,EAAI0B,QAAUhB,EAAEuO,UAAWjP,GADtBA,GAO/BU,EAAEiP,IAAM,SAAS3P,EAAK4P,GAEpB,MADAA,GAAY5P,GACLA,GAITU,EAAEmP,QAAU,SAAS3E,EAAQ1D,GAC3B,GAAIrH,GAAOO,EAAEP,KAAKqH,GAAQnH,EAASF,EAAKE,MACxC,IAAc,MAAV6K,EAAgB,OAAQ7K,CAE5B,KAAK,GADDL,GAAM8C,OAAOoI,GACR5J,EAAI,EAAOjB,EAAJiB,EAAYA,IAAK,CAC/B,GAAI0D,GAAM7E,EAAKmB,EACf,IAAIkG,EAAMxC,KAAShF,EAAIgF,MAAUA,IAAOhF,IAAM,OAAO,EAEvD,OAAO,EAKT,IAAI8P,GAAK,SAAStH,EAAGC,EAAGsH,EAAQC,GAG9B,GAAIxH,IAAMC,EAAG,MAAa,KAAND,GAAW,EAAIA,IAAM,EAAIC,CAE7C,IAAS,MAALD,GAAkB,MAALC,EAAW,MAAOD,KAAMC,CAErCD,aAAa9H,KAAG8H,EAAIA,EAAE7E,UACtB8E,YAAa/H,KAAG+H,EAAIA,EAAE9E,SAE1B,IAAIsM,GAAYhN,EAAStB,KAAK6G,EAC9B,IAAIyH,IAAchN,EAAStB,KAAK8G,GAAI,OAAO,CAC3C,QAAQwH,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKzH,GAAM,GAAKC,CACzB,KAAK,kBAGH,OAAKD,KAAOA,GAAWC,KAAOA,EAEhB,KAAND,EAAU,GAAKA,IAAM,EAAIC,GAAKD,KAAOC,CAC/C,KAAK,gBACL,IAAK,mBAIH,OAAQD,KAAOC,EAGnB,GAAIyH,GAA0B,mBAAdD,CAChB,KAAKC,EAAW,CACd,GAAgB,gBAAL1H,IAA6B,gBAALC,GAAe,OAAO,CAIzD,IAAI0H,GAAQ3H,EAAExG,YAAaoO,EAAQ3H,EAAEzG,WACrC,IAAImO,IAAUC,KAAW1P,EAAEwB,WAAWiO,IAAUA,YAAiBA,IACxCzP,EAAEwB,WAAWkO,IAAUA,YAAiBA,KACzC,eAAiB5H,IAAK,eAAiBC,GAC7D,OAAO,EAQXsH,EAASA,MACTC,EAASA,KAET,KADA,GAAI3P,GAAS0P,EAAO1P,OACbA,KAGL,GAAI0P,EAAO1P,KAAYmI,EAAG,MAAOwH,GAAO3P,KAAYoI,CAQtD,IAJAsH,EAAOvN,KAAKgG,GACZwH,EAAOxN,KAAKiG,GAGRyH,EAAW,CAGb,GADA7P,EAASmI,EAAEnI,OACPA,IAAWoI,EAAEpI,OAAQ,OAAO,CAEhC,MAAOA,KACL,IAAKyP,EAAGtH,EAAEnI,GAASoI,EAAEpI,GAAS0P,EAAQC,GAAS,OAAO,MAEnD,CAEL,GAAsBhL,GAAlB7E,EAAOO,EAAEP,KAAKqI,EAGlB,IAFAnI,EAASF,EAAKE,OAEVK,EAAEP,KAAKsI,GAAGpI,SAAWA,EAAQ,OAAO,CACxC,MAAOA,KAGL,GADA2E,EAAM7E,EAAKE,IACLK,EAAE4B,IAAImG,EAAGzD,KAAQ8K,EAAGtH,EAAExD,GAAMyD,EAAEzD,GAAM+K,EAAQC,GAAU,OAAO,EAMvE,MAFAD,GAAOM,MACPL,EAAOK,OACA,EAIT3P,GAAE4P,QAAU,SAAS9H,EAAGC,GACtB,MAAOqH,GAAGtH,EAAGC,IAKf/H,EAAE6P,QAAU,SAASvQ,GACnB,MAAW,OAAPA,GAAoB,EACpBS,EAAYT,KAASU,EAAE0C,QAAQpD,IAAQU,EAAE8P,SAASxQ,IAAQU,EAAEyJ,YAAYnK,IAA6B,IAAfA,EAAIK,OAChE,IAAvBK,EAAEP,KAAKH,GAAKK,QAIrBK,EAAE+P,UAAY,SAASzQ,GACrB,SAAUA,GAAwB,IAAjBA,EAAI0Q,WAKvBhQ,EAAE0C,QAAUD,GAAiB,SAASnD,GACpC,MAA8B,mBAAvBiD,EAAStB,KAAK3B,IAIvBU,EAAE6D,SAAW,SAASvE,GACpB,GAAI2Q,SAAc3Q,EAClB,OAAgB,aAAT2Q,GAAgC,WAATA,KAAuB3Q,GAIvDU,EAAE2E,MAAM,YAAa,WAAY,SAAU,SAAU,OAAQ,SAAU,SAAU,SAASuL,GACxFlQ,EAAE,KAAOkQ,GAAQ,SAAS5Q,GACxB,MAAOiD,GAAStB,KAAK3B,KAAS,WAAa4Q,EAAO,OAMjDlQ,EAAEyJ,YAAYxJ,aACjBD,EAAEyJ,YAAc,SAASnK,GACvB,MAAOU,GAAE4B,IAAItC,EAAK,YAMJ,kBAAP,KAAyC,gBAAb6Q,aACrCnQ,EAAEwB,WAAa,SAASlC,GACtB,MAAqB,kBAAPA,KAAqB,IAKvCU,EAAEoQ,SAAW,SAAS9Q,GACpB,MAAO8Q,UAAS9Q,KAAS4B,MAAMmP,WAAW/Q,KAI5CU,EAAEkB,MAAQ,SAAS5B,GACjB,MAAOU,GAAEsQ,SAAShR,IAAQA,KAASA,GAIrCU,EAAEiK,UAAY,SAAS3K,GACrB,MAAOA,MAAQ,GAAQA,KAAQ,GAAgC,qBAAvBiD,EAAStB,KAAK3B,IAIxDU,EAAEuQ,OAAS,SAASjR,GAClB,MAAe,QAARA,GAITU,EAAEwQ,YAAc,SAASlR,GACvB,MAAOA,SAAa,IAKtBU,EAAE4B,IAAM,SAAStC,EAAKgF,GACpB,MAAc,OAAPhF,GAAekD,EAAevB,KAAK3B,EAAKgF,IAQjDtE,EAAEyQ,WAAa,WAEb,MADA1O,GAAK/B,EAAIiC,EACFD,MAIThC,EAAE4D,SAAW,SAASL,GACpB,MAAOA,IAITvD,EAAE0Q,SAAW,SAASnN,GACpB,MAAO,YACL,MAAOA,KAIXvD,EAAE2Q,KAAO,aAET3Q,EAAE+D,SAAWA,EAGb/D,EAAE4Q,WAAa,SAAStR,GACtB,MAAc,OAAPA,EAAc,aAAe,SAASgF,GAC3C,MAAOhF,GAAIgF,KAMftE,EAAE8D,QAAU9D,EAAE6Q,QAAU,SAAS/J,GAE/B,MADAA,GAAQ9G,EAAEwO,aAAc1H,GACjB,SAASxH,GACd,MAAOU,GAAEmP,QAAQ7P,EAAKwH,KAK1B9G,EAAE2N,MAAQ,SAASnG,EAAGjI,EAAUM,GAC9B,GAAIiR,GAAQ3O,MAAMtB,KAAKC,IAAI,EAAG0G,GAC9BjI,GAAWO,EAAWP,EAAUM,EAAS,EACzC,KAAK,GAAIe,GAAI,EAAO4G,EAAJ5G,EAAOA,IAAKkQ,EAAMlQ,GAAKrB,EAASqB,EAChD,OAAOkQ,IAIT9Q,EAAEsH,OAAS,SAASvG,EAAKD,GAKvB,MAJW,OAAPA,IACFA,EAAMC,EACNA,EAAM,GAEDA,EAAMF,KAAKgK,MAAMhK,KAAKyG,UAAYxG,EAAMC,EAAM,KAIvDf,EAAE+M,IAAMgE,KAAKhE,KAAO,WAClB,OAAO,GAAIgE,OAAOC,UAIpB,IAAIC,IACFC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UAEHC,EAAcxR,EAAEmO,OAAO8C,GAGvBQ,EAAgB,SAAS5M,GAC3B,GAAI6M,GAAU,SAASC,GACrB,MAAO9M,GAAI8M,IAGTvN,EAAS,MAAQpE,EAAEP,KAAKoF,GAAK+M,KAAK,KAAO,IACzCC,EAAaC,OAAO1N,GACpB2N,EAAgBD,OAAO1N,EAAQ,IACnC,OAAO,UAAS4N,GAEd,MADAA,GAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7BH,EAAWI,KAAKD,GAAUA,EAAOE,QAAQH,EAAeL,GAAWM,GAG9EhS,GAAEmS,OAASV,EAAcR,GACzBjR,EAAEoS,SAAWX,EAAcD,GAI3BxR,EAAEwE,OAAS,SAASgG,EAAQzG,EAAUsO,GACpC,GAAI9O,GAAkB,MAAViH,MAAsB,GAAIA,EAAOzG,EAI7C,OAHIR,SAAe,KACjBA,EAAQ8O,GAEHrS,EAAEwB,WAAW+B,GAASA,EAAMtC,KAAKuJ,GAAUjH,EAKpD,IAAI+O,GAAY,CAChBtS,GAAEuS,SAAW,SAASC,GACpB,GAAIC,KAAOH,EAAY,EACvB,OAAOE,GAASA,EAASC,EAAKA,GAKhCzS,EAAE0S,kBACAC,SAAc,kBACdC,YAAc,mBACdT,OAAc,mBAMhB,IAAIU,GAAU,OAIVC,GACFxB,IAAU,IACVyB,KAAU,KACVC,KAAU,IACVC,KAAU,IACVC,SAAU,QACVC,SAAU,SAGRzB,EAAU,4BAEV0B,EAAa,SAASzB,GACxB,MAAO,KAAOmB,EAAQnB,GAOxB3R,GAAEqT,SAAW,SAASC,EAAMC,EAAUC,IAC/BD,GAAYC,IAAaD,EAAWC,GACzCD,EAAWvT,EAAE8O,YAAayE,EAAUvT,EAAE0S,iBAGtC,IAAI5O,GAAUgO,SACXyB,EAASpB,QAAUU,GAASzO,QAC5BmP,EAASX,aAAeC,GAASzO,QACjCmP,EAASZ,UAAYE,GAASzO,QAC/BwN,KAAK,KAAO,KAAM,KAGhBlS,EAAQ,EACR0E,EAAS,QACbkP,GAAKpB,QAAQpO,EAAS,SAAS6N,EAAOQ,EAAQS,EAAaD,EAAUc,GAanE,MAZArP,IAAUkP,EAAKtS,MAAMtB,EAAO+T,GAAQvB,QAAQR,EAAS0B,GACrD1T,EAAQ+T,EAAS9B,EAAMhS,OAEnBwS,EACF/N,GAAU,cAAgB+N,EAAS,iCAC1BS,EACTxO,GAAU,cAAgBwO,EAAc,uBAC/BD,IACTvO,GAAU,OAASuO,EAAW,YAIzBhB,IAETvN,GAAU,OAGLmP,EAASG,WAAUtP,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,2CACP,oDACAA,EAAS,eAEX,KACE,GAAIuP,GAAS,GAAIrR,UAASiR,EAASG,UAAY,MAAO,IAAKtP,GAC3D,MAAOwP,GAEP,KADAA,GAAExP,OAASA,EACLwP,EAGR,GAAIP,GAAW,SAASQ,GACtB,MAAOF,GAAO1S,KAAKe,KAAM6R,EAAM7T,IAI7B8T,EAAWP,EAASG,UAAY,KAGpC,OAFAL,GAASjP,OAAS,YAAc0P,EAAW,OAAS1P,EAAS,IAEtDiP,GAITrT,EAAE+T,MAAQ,SAASzU,GACjB,GAAI0U,GAAWhU,EAAEV,EAEjB,OADA0U,GAASC,QAAS,EACXD,EAUT,IAAIxP,GAAS,SAASwP,EAAU1U,GAC9B,MAAO0U,GAASC,OAASjU,EAAEV,GAAKyU,QAAUzU,EAI5CU,GAAEkU,MAAQ,SAAS5U,GACjBU,EAAE2E,KAAK3E,EAAEoO,UAAU9O,GAAM,SAAS4Q,GAChC,GAAI7M,GAAOrD,EAAEkQ,GAAQ5Q,EAAI4Q,EACzBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAIxJ,IAAQ1E,KAAKiB,SAEjB,OADAnB,GAAK6B,MAAM+C,EAAMzG,WACVuE,EAAOxC,KAAMqB,EAAKM,MAAM3D,EAAG0G,QAMxC1G,EAAEkU,MAAMlU,GAGRA,EAAE2E,MAAM,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,WAAY,SAASuL,GAChF,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAI5Q,GAAM0C,KAAKiB,QAGf,OAFAwD,GAAO9C,MAAMrE,EAAKW,WACJ,UAATiQ,GAA6B,WAATA,GAAqC,IAAf5Q,EAAIK,cAAqBL,GAAI,GACrEkF,EAAOxC,KAAM1C,MAKxBU,EAAE2E,MAAM,SAAU,OAAQ,SAAU,SAASuL,GAC3C,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,MAAO1L,GAAOxC,KAAMyE,EAAO9C,MAAM3B,KAAKiB,SAAUhD,eAKpDD,EAAEyB,UAAU8B,MAAQ,WAClB,MAAOvB,MAAKiB,UAKdjD,EAAEyB,UAAU0S,QAAUnU,EAAEyB,UAAU2S,OAASpU,EAAEyB,UAAU8B,MAEvDvD,EAAEyB,UAAUc,SAAW,WACrB,MAAO,GAAKP,KAAKiB,UAUG,kBAAXoR,SAAyBA,OAAOC,KACzCD,OAAO,gBAAkB,WACvB,MAAOrU,OAGXiB,KAAKe"} \ No newline at end of file +{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["root","self","global","this","previousUnderscore","_","ArrayProto","Array","prototype","ObjProto","Object","SymbolProto","Symbol","push","slice","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","keys","nativeCreate","create","Ctor","obj","_wrapped","exports","nodeType","module","VERSION","builtinIteratee","optimizeCb","func","context","argCount","value","call","index","collection","accumulator","apply","arguments","cb","iteratee","identity","isFunction","isObject","matcher","property","Infinity","restArgs","startIndex","length","Math","max","rest","args","baseCreate","result","shallowProperty","key","deepGet","path","i","MAX_ARRAY_INDEX","pow","getLength","isArrayLike","each","forEach","map","collect","results","currentKey","createReduce","dir","reducer","memo","initial","reduce","foldl","inject","reduceRight","foldr","find","detect","predicate","keyFinder","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","contains","includes","include","item","fromIndex","guard","values","indexOf","invoke","contextPath","method","pluck","where","attrs","findWhere","computed","lastComputed","v","min","shuffle","sample","n","random","clone","last","rand","temp","sortBy","criteria","sort","left","right","a","b","group","behavior","partition","groupBy","has","indexBy","countBy","reStrSymbol","toArray","isString","match","size","pass","first","head","take","array","tail","drop","compact","Boolean","flatten","input","shallow","strict","output","idx","isArguments","j","len","without","otherArrays","difference","uniq","unique","isSorted","isBoolean","seen","union","arrays","intersection","argsLength","unzip","zip","object","createPredicateIndexFinder","findLastIndex","sortedIndex","low","high","mid","floor","createIndexFinder","predicateFind","isNaN","lastIndexOf","range","start","stop","step","ceil","chunk","count","executeBound","sourceFunc","boundFunc","callingContext","bind","TypeError","bound","callArgs","concat","partial","boundArgs","placeholder","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","throttled","remaining","clearTimeout","trailing","cancel","debounce","immediate","debounced","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","nonEnumerableProps","collectNonEnumProps","nonEnumIdx","constructor","proto","prop","allKeys","mapObject","pairs","invert","functions","methods","names","createAssigner","keysFunc","defaults","source","l","extend","extendOwn","assign","findKeys","res","keyInObj","pick","omit","String","props","tap","interceptor","isMatch","eq","deepEq","aStack","bStack","type","className","valueOf","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isElement","name","nodelist","document","childNodes","Int8Array","isFinite","isSymbol","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeRegExp","escapeChar","template","text","settings","oldSettings","offset","variable","render","Function","e","data","argument","chain","instance","_chain","chainResult","mixin","toJSON","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/underscore.js b/underscore.js index ca1cdd332..3b490c1c2 100644 --- a/underscore.js +++ b/underscore.js @@ -1100,6 +1100,16 @@ } }; + // Returns an array of all keys on an object that pass a predicate test. + _.findKeys = function(obj, predicate, context) { + predicate = cb(predicate, context); + var allKeys = _.keys(obj), res = []; + _.each(allKeys, function(key) { + if (predicate(obj[key], key, obj)) res.push(key); + }); + return res; + }; + // Internal pick helper function to determine if `obj` has key `key`. var keyInObj = function(value, key, obj) { return key in obj;