// Underscore.js 1.2.3 // (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely distributable under the MIT license. // Portions of Underscore are inspired or borrowed from Prototype, // Oliver Steele's Functional, and John Resig's Micro-Templating. // For all details and documentation: // http://documentcloud.github.com/underscore (function () { function r(a, c, d) { if (a === c) return a !== 0 || 1 / a == 1 / c; if (a == null || c == null) return a === c; if (a._chain) a = a._wrapped; if (c._chain) c = c._wrapped; if (a.isEqual && b.isFunction(a.isEqual)) return a.isEqual(c); if (c.isEqual && b.isFunction(c.isEqual)) return c.isEqual(a); var e = l.call(a); if (e != l.call(c)) return false; switch (e) { case "[object String]": return a == String(c); case "[object Number]": return a != +a ? c != +c : a == 0 ? 1 / a == 1 / c : a == +c; case "[object Date]": case "[object Boolean]": return +a == +c; case "[object RegExp]": return a.source == c.source && a.global == c.global && a.multiline == c.multiline && a.ignoreCase == c.ignoreCase } if (typeof a != "object" || typeof c != "object") return false; for (var f = d.length; f--; ) if (d[f] == a) return true; d.push(a); var f = 0, g = true; if (e == "[object Array]") { if (f = a.length, g = f == c.length) for (; f--; ) if (!(g = f in a == f in c && r(a[f], c[f], d))) break } else { if ("constructor" in a != "constructor" in c || a.constructor != c.constructor) return false; for (var h in a) if (m.call(a, h) && (f++, !(g = m.call(c, h) && r(a[h], c[h], d)))) break; if (g) { for (h in c) if (m.call(c, h) && !f--) break; g = !f } } d.pop(); return g } var s = this, F = s._, o = {}, k = Array.prototype, p = Object.prototype, i = k.slice, G = k.concat, H = k.unshift, l = p.toString, m = p.hasOwnProperty, v = k.forEach, w = k.map, x = k.reduce, y = k.reduceRight, z = k.filter, A = k.every, B = k.some, q = k.indexOf, C = k.lastIndexOf, p = Array.isArray, I = Object.keys, t = Function.prototype.bind, b = function (a) { return new n(a) }; if (typeof exports !== "undefined") { if (typeof module !== "undefined" && module.exports) exports = module.exports = b; exports._ = b } else typeof define === "function" && define.amd ? define("underscore", function () { return b }) : s._ = b; b.VERSION = "1.2.3"; var j = b.each = b.forEach = function (a, c, b) { if (a != null) if (v && a.forEach === v) a.forEach(c, b); else if (a.length === +a.length) for (var e = 0, f = a.length; e < f; e++) { if (e in a && c.call(b, a[e], e, a) === o) break } else for (e in a) if (m.call(a, e) && c.call(b, a[e], e, a) === o) break }; b.map = function (a, c, b) { var e = []; if (a == null) return e; if (w && a.map === w) return a.map(c, b); j(a, function (a, g, h) { e[e.length] = c.call(b, a, g, h) }); return e }; b.reduce = b.foldl = b.inject = function (a, c, d, e) { var f = arguments.length > 2; a == null && (a = []); if (x && a.reduce === x) return e && (c = b.bind(c, e)), f ? a.reduce(c, d) : a.reduce(c); j(a, function (a, b, i) { f ? d = c.call(e, d, a, b, i) : (d = a, f = true) }); if (!f) throw new TypeError("Reduce of empty array with no initial value"); return d }; b.reduceRight = b.foldr = function (a, c, d, e) { var f = arguments.length > 2; a == null && (a = []); if (y && a.reduceRight === y) return e && (c = b.bind(c, e)), f ? a.reduceRight(c, d) : a.reduceRight(c); var g = b.toArray(a).reverse(); e && !f && (c = b.bind(c, e)); return f ? b.reduce(g, c, d, e) : b.reduce(g, c) }; b.find = b.detect = function (a, c, b) { var e; D(a, function (a, g, h) { if (c.call(b, a, g, h)) return e = a, true }); return e }; b.filter = b.select = function (a, c, b) { var e = []; if (a == null) return e; if (z && a.filter === z) return a.filter(c, b); j(a, function (a, g, h) { c.call(b, a, g, h) && (e[e.length] = a) }); return e }; b.reject = function (a, c, b) { var e = []; if (a == null) return e; j(a, function (a, g, h) { c.call(b, a, g, h) || (e[e.length] = a) }); return e }; b.every = b.all = function (a, c, b) { var e = true; if (a == null) return e; if (A && a.every === A) return a.every(c, b); j(a, function (a, g, h) { if (!(e = e && c.call(b, a, g, h))) return o }); return e }; var D = b.some = b.any = function (a, c, d) { c || (c = b.identity); var e = false; if (a == null) return e; if (B && a.some === B) return a.some(c, d); j(a, function (a, b, h) { if (e || (e = c.call(d, a, b, h))) return o }); return !!e }; b.include = b.contains = function (a, c) { var b = false; if (a == null) return b; return q && a.indexOf === q ? a.indexOf(c) != -1 : b = D(a, function (a) { return a === c }) }; b.invoke = function (a, c) { var d = i.call(arguments, 2); return b.map(a, function (a) { return (c.call ? c || a : a[c]).apply(a, d) }) }; b.pluck = function (a, c) { return b.map(a, function (a) { return a[c] }) }; b.max = function (a, c, d) { if (!c && b.isArray(a)) return Math.max.apply(Math, a); if (!c && b.isEmpty(a)) return -Infinity; var e = { computed: -Infinity }; j(a, function (a, b, h) { b = c ? c.call(d, a, b, h) : a; b >= e.computed && (e = { value: a, computed: b }) }); return e.value }; b.min = function (a, c, d) { if (!c && b.isArray(a)) return Math.min.apply(Math, a); if (!c && b.isEmpty(a)) return Infinity; var e = { computed: Infinity }; j(a, function (a, b, h) { b = c ? c.call(d, a, b, h) : a; b < e.computed && (e = { value: a, computed: b }) }); return e.value }; b.shuffle = function (a) { var c = [], b; j(a, function (a, f) { f == 0 ? c[0] = a : (b = Math.floor(Math.random() * (f + 1)), c[f] = c[b], c[b] = a) }); return c }; b.sortBy = function (a, c, d) { return b.pluck(b.map(a, function (a, b, g) { return { value: a, criteria: c.call(d, a, b, g)} }).sort(function (a, c) { var b = a.criteria, d = c.criteria; return b < d ? -1 : b > d ? 1 : 0 }), "value") }; b.groupBy = function (a, c) { var d = {}, e = b.isFunction(c) ? c : function (a) { return a[c] }; j(a, function (a, b) { var c = e(a, b); (d[c] || (d[c] = [])).push(a) }); return d }; b.sortedIndex = function (a, c, d) { d || (d = b.identity); for (var e = 0, f = a.length; e < f; ) { var g = e + f >> 1; d(a[g]) < d(c) ? e = g + 1 : f = g } return e }; b.toArray = function (a) { return !a ? [] : a.toArray ? a.toArray() : b.isArray(a) ? i.call(a) : b.isArguments(a) ? i.call(a) : b.values(a) }; b.size = function (a) { return b.toArray(a).length }; b.first = b.head = function (a, b, d) { return b != null && !d ? i.call(a, 0, b) : a[0] }; b.initial = function (a, b, d) { return i.call(a, 0, a.length - (b == null || d ? 1 : b)) }; b.last = function (a, b, d) { return b != null && !d ? i.call(a, Math.max(a.length - b, 0)) : a[a.length - 1] }; b.rest = b.tail = function (a, b, d) { return i.call(a, b == null || d ? 1 : b) }; b.compact = function (a) { return b.filter(a, function (a) { return !!a }) }; b.flatten = function (a, c) { return b.reduce(a, function (a, e) { if (b.isArray(e)) return a.concat(c ? e : b.flatten(e)); a[a.length] = e; return a }, []) }; b.without = function (a) { return b.difference(a, i.call(arguments, 1)) }; b.uniq = b.unique = function (a, c, d) { var d = d ? b.map(a, d) : a, e = []; b.reduce(d, function (d, g, h) { if (0 == h || (c === true ? b.last(d) != g : !b.include(d, g))) d[d.length] = g, e[e.length] = a[h]; return d }, []); return e }; b.union = function () { return b.uniq(b.flatten(arguments, true)) }; b.intersection = b.intersect = function (a) { var c = i.call(arguments, 1); return b.filter(b.uniq(a), function (a) { return b.every(c, function (c) { return b.indexOf(c, a) >= 0 }) }) }; b.difference = function (a) { var c = b.flatten(i.call(arguments, 1)); return b.filter(a, function (a) { return !b.include(c, a) }) }; b.zip = function () { for (var a = i.call(arguments), c = b.max(b.pluck(a, "length")), d = Array(c), e = 0; e < c; e++) d[e] = b.pluck(a, "" + e); return d }; b.indexOf = function (a, c, d) { if (a == null) return -1; var e; if (d) return d = b.sortedIndex(a, c), a[d] === c ? d : -1; if (q && a.indexOf === q) return a.indexOf(c); for (d = 0, e = a.length; d < e; d++) if (d in a && a[d] === c) return d; return -1 }; b.lastIndexOf = function (a, b) { if (a == null) return -1; if (C && a.lastIndexOf === C) return a.lastIndexOf(b); for (var d = a.length; d--; ) if (d in a && a[d] === b) return d; return -1 }; b.range = function (a, b, d) { arguments.length <= 1 && (b = a || 0, a = 0); for (var d = arguments[2] || 1, e = Math.max(Math.ceil((b - a) / d), 0), f = 0, g = Array(e); f < e; ) g[f++] = a, a += d; return g }; var E = function () { }; b.bind = function (a, c) { var d, e; if (a.bind === t && t) return t.apply(a, i.call(arguments, 1)); if (!b.isFunction(a)) throw new TypeError; e = i.call(arguments, 2); return d = function () { if (!(this instanceof d)) return a.apply(c, e.concat(i.call(arguments))); E.prototype = a.prototype; var b = new E, g = a.apply(b, e.concat(i.call(arguments))); return Object(g) === g ? g : b } }; b.bindAll = function (a) { var c = i.call(arguments, 1); c.length == 0 && (c = b.functions(a)); j(c, function (c) { a[c] = b.bind(a[c], a) }); return a }; b.memoize = function (a, c) { var d = {}; c || (c = b.identity); return function () { var b = c.apply(this, arguments); return m.call(d, b) ? d[b] : d[b] = a.apply(this, arguments) } }; b.delay = function (a, b) { var d = i.call(arguments, 2); return setTimeout(function () { return a.apply(a, d) }, b) }; b.defer = function (a) { return b.delay.apply(b, [a, 1].concat(i.call(arguments, 1))) }; b.throttle = function (a, c) { var d, e, f, g, h, i = b.debounce(function () { h = g = false }, c); return function () { d = this; e = arguments; var b; f || (f = setTimeout(function () { f = null; h && a.apply(d, e); i() }, c)); g ? h = true : a.apply(d, e); i(); g = true } }; b.debounce = function (a, b) { var d; return function () { var e = this, f = arguments; clearTimeout(d); d = setTimeout(function () { d = null; a.apply(e, f) }, b) } }; b.once = function (a) { var b = false, d; return function () { if (b) return d; b = true; return d = a.apply(this, arguments) } }; b.wrap = function (a, b) { return function () { var d = G.apply([a], arguments); return b.apply(this, d) } }; b.compose = function () { var a = arguments; return function () { for (var b = arguments, d = a.length - 1; d >= 0; d--) b = [a[d].apply(this, b)]; return b[0] } }; b.after = function (a, b) { return a <= 0 ? b() : function () { if (--a < 1) return b.apply(this, arguments) } }; b.keys = I || function (a) { if (a !== Object(a)) throw new TypeError("Invalid object"); var b = [], d; for (d in a) m.call(a, d) && (b[b.length] = d); return b }; b.values = function (a) { return b.map(a, b.identity) }; b.functions = b.methods = function (a) { var c = [], d; for (d in a) b.isFunction(a[d]) && c.push(d); return c.sort() }; b.extend = function (a) { j(i.call(arguments, 1), function (b) { for (var d in b) b[d] !== void 0 && (a[d] = b[d]) }); return a }; b.defaults = function (a) { j(i.call(arguments, 1), function (b) { for (var d in b) a[d] == null && (a[d] = b[d]) }); return a }; b.clone = function (a) { return !b.isObject(a) ? a : b.isArray(a) ? a.slice() : b.extend({}, a) }; b.tap = function (a, b) { b(a); return a }; b.isEqual = function (a, b) { return r(a, b, []) }; b.isEmpty = function (a) { if (b.isArray(a) || b.isString(a)) return a.length === 0; for (var c in a) if (m.call(a, c)) return false; return true }; b.isElement = function (a) { return !!(a && a.nodeType == 1) }; b.isArray = p || function (a) { return l.call(a) == "[object Array]" }; b.isObject = function (a) { return a === Object(a) }; b.isArguments = function (a) { return l.call(a) == "[object Arguments]" }; if (!b.isArguments(arguments)) b.isArguments = function (a) { return !(!a || !m.call(a, "callee")) }; b.isFunction = function (a) { return l.call(a) == "[object Function]" }; b.isString = function (a) { return l.call(a) == "[object String]" }; b.isNumber = function (a) { return l.call(a) == "[object Number]" }; b.isNaN = function (a) { return a !== a }; b.isBoolean = function (a) { return a === true || a === false || l.call(a) == "[object Boolean]" }; b.isDate = function (a) { return l.call(a) == "[object Date]" }; b.isRegExp = function (a) { return l.call(a) == "[object RegExp]" }; b.isNull = function (a) { return a === null }; b.isUndefined = function (a) { return a === void 0 }; b.noConflict = function () { s._ = F; return this }; b.identity = function (a) { return a }; b.times = function (a, b, d) { for (var e = 0; e < a; e++) b.call(d, e) }; b.escape = function (a) { return ("" + a).replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/\//g, "/") }; b.mixin = function (a) { j(b.functions(a), function (c) { J(c, b[c] = a[c]) }) }; var K = 0; b.uniqueId = function (a) { var b = K++; return a ? a + b : b }; b.templateSettings = { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g, escape: /<%-([\s\S]+?)%>/g }; b.template = function (a, c) { var d = b.templateSettings, d = "var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('" + a.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(d.escape, function (a, b) { return "',_.escape(" + b.replace(/\\'/g, "'") + "),'" }).replace(d.interpolate, function (a, b) { return "'," + b.replace(/\\'/g, "'") + ",'" }).replace(d.evaluate || null, function (a, b) { return "');" + b.replace(/\\'/g, "'").replace(/[\r\n\t]/g, " ") + ";__p.push('" }).replace(/\r/g, "\\r").replace(/\n/g, "\\n").replace(/\t/g, "\\t") + "');}return __p.join('');", e = new Function("obj", "_", d); return c ? e(c, b) : function (a) { return e.call(this, a, b) } }; var n = function (a) { this._wrapped = a }; b.prototype = n.prototype; var u = function (a, c) { return c ? b(a).chain() : a }, J = function (a, c) { n.prototype[a] = function () { var a = i.call(arguments); H.call(a, this._wrapped); return u(c.apply(b, a), this._chain) } }; b.mixin(b); j("pop,push,reverse,shift,sort,splice,unshift".split(","), function (a) { var b = k[a]; n.prototype[a] = function () { b.apply(this._wrapped, arguments); return u(this._wrapped, this._chain) } }); j(["concat", "join", "slice"], function (a) { var b = k[a]; n.prototype[a] = function () { return u(b.apply(this._wrapped, arguments), this._chain) } }); n.prototype.chain = function () { this._chain = true; return this }; n.prototype.value = function () { return this._wrapped } }).call(this);