vendor/components/indefinido-indemma/build/test.js in ende-0.4.12 vs vendor/components/indefinido-indemma/build/test.js in ende-0.4.13

- old
+ new

@@ -24,14 +24,18 @@ var module = require.modules[resolved]; // perform real require() // by invoking the module's // registered function - if (!module.exports) { - module.exports = {}; - module.client = module.component = true; - module.call(this, module.exports, require.relative(resolved), module); + if (!module._resolving && !module.exports) { + var mod = {}; + mod.exports = {}; + mod.client = mod.component = true; + module._resolving = true; + module.call(this, mod.exports, require.relative(resolved), mod); + delete module._resolving; + module.exports = mod.exports; } return module.exports; } @@ -194,129 +198,21983 @@ }; return localRequire; }; require.register("pluma-assimilate/dist/assimilate.js", Function("exports, require, module", -"/*! assimilate 0.3.0 Copyright (c) 2013 Alan Plum. MIT licensed. */\nvar slice = Array.prototype.slice;\n\nfunction bind(fn, self) {\n var args = slice.call(arguments, 2);\n if (typeof Function.prototype.bind === 'function') {\n return Function.prototype.bind.apply(fn, [self].concat(args));\n }\n return function() {\n return fn.apply(self, args.concat(slice.call(arguments, 0)));\n };\n}\n\nfunction simpleCopy(target, name, source) {\n target[name] = source[name];\n}\n\nfunction properCopy(target, name, source) {\n var descriptor = Object.getOwnPropertyDescriptor(source, name);\n Object.defineProperty(target, name, descriptor);\n}\n\nfunction ownProperties(obj) {\n return Object.getOwnPropertyNames(obj);\n}\n\nfunction allKeys(obj) {\n var keys = [];\n for (var name in obj) {\n keys.push(name);\n }\n return keys;\n}\n\nfunction ownKeys(obj) {\n var keys = [];\n for (var name in obj) {\n if (obj.hasOwnProperty(name)) {\n keys.push(name);\n }\n }\n return keys;\n}\n\nfunction assimilateWithStrategy(target) {\n var strategy = this,\n sources = slice.call(arguments, 1),\n i, source, names, j, name;\n\n if (target === undefined || target === null) {\n target = {};\n }\n\n for (i = 0; i < sources.length; i++) {\n source = sources[i];\n names = strategy.keysFn(source);\n for (j = 0; j < names.length; j++) {\n name = names[j];\n strategy.copyFn(target, name, source);\n }\n }\n\n return target;\n}\n\nvar strategies = {\n DEFAULT: {\n keysFn: ownKeys,\n copyFn: simpleCopy\n },\n PROPER: {\n keysFn: ownProperties,\n copyFn: properCopy\n },\n INHERITED: {\n keysFn: allKeys,\n copyFn: simpleCopy\n },\n DEEP: {\n keysFn: ownKeys,\n copyFn: function recursiveCopy(target, name, source) {\n var val = source[name];\n var old = target[name];\n if (typeof val === 'object' && typeof old === 'object') {\n assimilateWithStrategy.call(strategies.DEEP, old, val);\n } else {\n simpleCopy(target, name, source);\n }\n }\n },\n STRICT: {\n keysFn: ownKeys,\n copyFn: function strictCopy(target, name, source) {\n if (source[name] !== undefined) {\n simpleCopy(target, name, source);\n }\n }\n },\n FALLBACK: {\n keysFn: function fallbackCopy(target, name, source) {\n if (target[name] === undefined) {\n simpleCopy(target, name, source);\n }\n },\n copyFn: simpleCopy\n }\n};\n\nvar assimilate = bind(assimilateWithStrategy, strategies.DEFAULT);\nassimilate.strategies = strategies;\nassimilate.withStrategy = function withStrategy(strategy) {\n if (typeof strategy === 'string') {\n strategy = strategies[strategy.toUpperCase()];\n }\n if (!strategy) {\n throw new Error('Unknwon or invalid strategy:' + strategy);\n }\n if (typeof strategy.copyFn !== 'function') {\n throw new Error('Strategy missing copy function:' + strategy);\n }\n if (typeof strategy.keysFn !== 'function') {\n throw new Error('Strategy missing keys function:' + strategy);\n }\n return bind(assimilateWithStrategy, strategy);\n};\n\nmodule.exports = assimilate;//@ sourceURL=pluma-assimilate/dist/assimilate.js" +"/*! assimilate 0.3.0 Copyright (c) 2013 Alan Plum. MIT licensed. */\n\ +var slice = Array.prototype.slice;\n\ +\n\ +function bind(fn, self) {\n\ + var args = slice.call(arguments, 2);\n\ + if (typeof Function.prototype.bind === 'function') {\n\ + return Function.prototype.bind.apply(fn, [self].concat(args));\n\ + }\n\ + return function() {\n\ + return fn.apply(self, args.concat(slice.call(arguments, 0)));\n\ + };\n\ +}\n\ +\n\ +function simpleCopy(target, name, source) {\n\ + target[name] = source[name];\n\ +}\n\ +\n\ +function properCopy(target, name, source) {\n\ + var descriptor = Object.getOwnPropertyDescriptor(source, name);\n\ + Object.defineProperty(target, name, descriptor);\n\ +}\n\ +\n\ +function ownProperties(obj) {\n\ + return Object.getOwnPropertyNames(obj);\n\ +}\n\ +\n\ +function allKeys(obj) {\n\ + var keys = [];\n\ + for (var name in obj) {\n\ + keys.push(name);\n\ + }\n\ + return keys;\n\ +}\n\ +\n\ +function ownKeys(obj) {\n\ + var keys = [];\n\ + for (var name in obj) {\n\ + if (obj.hasOwnProperty(name)) {\n\ + keys.push(name);\n\ + }\n\ + }\n\ + return keys;\n\ +}\n\ +\n\ +function assimilateWithStrategy(target) {\n\ + var strategy = this,\n\ + sources = slice.call(arguments, 1),\n\ + i, source, names, j, name;\n\ +\n\ + if (target === undefined || target === null) {\n\ + target = {};\n\ + }\n\ +\n\ + for (i = 0; i < sources.length; i++) {\n\ + source = sources[i];\n\ + names = strategy.keysFn(source);\n\ + for (j = 0; j < names.length; j++) {\n\ + name = names[j];\n\ + strategy.copyFn(target, name, source);\n\ + }\n\ + }\n\ +\n\ + return target;\n\ +}\n\ +\n\ +var strategies = {\n\ + DEFAULT: {\n\ + keysFn: ownKeys,\n\ + copyFn: simpleCopy\n\ + },\n\ + PROPER: {\n\ + keysFn: ownProperties,\n\ + copyFn: properCopy\n\ + },\n\ + INHERITED: {\n\ + keysFn: allKeys,\n\ + copyFn: simpleCopy\n\ + },\n\ + DEEP: {\n\ + keysFn: ownKeys,\n\ + copyFn: function recursiveCopy(target, name, source) {\n\ + var val = source[name];\n\ + var old = target[name];\n\ + if (typeof val === 'object' && typeof old === 'object') {\n\ + assimilateWithStrategy.call(strategies.DEEP, old, val);\n\ + } else {\n\ + simpleCopy(target, name, source);\n\ + }\n\ + }\n\ + },\n\ + STRICT: {\n\ + keysFn: ownKeys,\n\ + copyFn: function strictCopy(target, name, source) {\n\ + if (source[name] !== undefined) {\n\ + simpleCopy(target, name, source);\n\ + }\n\ + }\n\ + },\n\ + FALLBACK: {\n\ + keysFn: function fallbackCopy(target, name, source) {\n\ + if (target[name] === undefined) {\n\ + simpleCopy(target, name, source);\n\ + }\n\ + },\n\ + copyFn: simpleCopy\n\ + }\n\ +};\n\ +\n\ +var assimilate = bind(assimilateWithStrategy, strategies.DEFAULT);\n\ +assimilate.strategies = strategies;\n\ +assimilate.withStrategy = function withStrategy(strategy) {\n\ + if (typeof strategy === 'string') {\n\ + strategy = strategies[strategy.toUpperCase()];\n\ + }\n\ + if (!strategy) {\n\ + throw new Error('Unknwon or invalid strategy:' + strategy);\n\ + }\n\ + if (typeof strategy.copyFn !== 'function') {\n\ + throw new Error('Strategy missing copy function:' + strategy);\n\ + }\n\ + if (typeof strategy.keysFn !== 'function') {\n\ + throw new Error('Strategy missing keys function:' + strategy);\n\ + }\n\ + return bind(assimilateWithStrategy, strategy);\n\ +};\n\ +\n\ +module.exports = assimilate;//@ sourceURL=pluma-assimilate/dist/assimilate.js" )); require.register("component-type/index.js", Function("exports, require, module", -"\n/**\n * toString ref.\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Return the type of `val`.\n *\n * @param {Mixed} val\n * @return {String}\n * @api public\n */\n\nmodule.exports = function(val){\n switch (toString.call(val)) {\n case '[object Function]': return 'function';\n case '[object Date]': return 'date';\n case '[object RegExp]': return 'regexp';\n case '[object Arguments]': return 'arguments';\n case '[object Array]': return 'array';\n case '[object String]': return 'string';\n }\n\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n if (val && val.nodeType === 1) return 'element';\n if (val === Object(val)) return 'object';\n\n return typeof val;\n};\n//@ sourceURL=component-type/index.js" +"\n\ +/**\n\ + * toString ref.\n\ + */\n\ +\n\ +var toString = Object.prototype.toString;\n\ +\n\ +/**\n\ + * Return the type of `val`.\n\ + *\n\ + * @param {Mixed} val\n\ + * @return {String}\n\ + * @api public\n\ + */\n\ +\n\ +module.exports = function(val){\n\ + switch (toString.call(val)) {\n\ + case '[object Function]': return 'function';\n\ + case '[object Date]': return 'date';\n\ + case '[object RegExp]': return 'regexp';\n\ + case '[object Arguments]': return 'arguments';\n\ + case '[object Array]': return 'array';\n\ + case '[object String]': return 'string';\n\ + }\n\ +\n\ + if (val === null) return 'null';\n\ + if (val === undefined) return 'undefined';\n\ + if (val && val.nodeType === 1) return 'element';\n\ + if (val === Object(val)) return 'object';\n\ +\n\ + return typeof val;\n\ +};\n\ +//@ sourceURL=component-type/index.js" )); require.register("component-bind/index.js", Function("exports, require, module", -"\n/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n if ('string' == typeof fn) fn = obj[fn];\n if ('function' != typeof fn) throw new Error('bind() requires a function');\n var args = [].slice.call(arguments, 2);\n return function(){\n return fn.apply(obj, args.concat(slice.call(arguments)));\n }\n};\n//@ sourceURL=component-bind/index.js" +"\n\ +/**\n\ + * Slice reference.\n\ + */\n\ +\n\ +var slice = [].slice;\n\ +\n\ +/**\n\ + * Bind `obj` to `fn`.\n\ + *\n\ + * @param {Object} obj\n\ + * @param {Function|String} fn or string\n\ + * @return {Function}\n\ + * @api public\n\ + */\n\ +\n\ +module.exports = function(obj, fn){\n\ + if ('string' == typeof fn) fn = obj[fn];\n\ + if ('function' != typeof fn) throw new Error('bind() requires a function');\n\ + var args = [].slice.call(arguments, 2);\n\ + return function(){\n\ + return fn.apply(obj, args.concat(slice.call(arguments)));\n\ + }\n\ +};\n\ +//@ sourceURL=component-bind/index.js" )); require.register("component-jquery/index.js", Function("exports, require, module", -"/*!\n * jQuery JavaScript Library v1.9.1\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-2-4\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<9\n\t// For `typeof node.method` instead of `node.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\tlocation = window.location,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.9.1\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\targs = args || [];\n\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function() {\n\n\tvar support, all, a,\n\t\tinput, select, fragment,\n\t\topt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Support tests won't run in some limited or non-browser environments\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !all || !a || !all.length ) {\n\t\treturn {};\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\tsupport = {\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\t\tcheckOn: !!input.value,\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Tests for enctype support on a form (#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: document.compatMode === \"CSS1Compat\",\n\n\t\t// Will be defined later\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})();\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, ret,\n\t\tinternalKey = jQuery.expando,\n\t\tgetByName = typeof name === \"string\",\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\telem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\tcache[ id ] = {};\n\n\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tif ( !isNode ) {\n\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t}\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( getByName ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar i, l, thisCache,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( !name.indexOf( \"data-\" ) ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\treturn elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t\t\t}\n\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\thooks.cur = fn;\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\trboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val,\n\t\t\t\tself = jQuery(this);\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, notxml, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && notxml && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && notxml && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\t// In IE9+, Flash objects don't have .getAttribute (#12945)\n\t\t\t// Support: IE9+\n\t\t\tif ( typeof elem.getAttribute !== core_strundefined ) {\n\t\t\t\tret = elem.getAttribute( name );\n\t\t\t}\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( rboolean.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8\n\t\t\t\t\tif ( !getSetAttribute && ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\tvar\n\t\t\t// Use .prop to determine if this attribute is understood as boolean\n\t\t\tprop = jQuery.prop( elem, name ),\n\n\t\t\t// Fetch it accordingly\n\t\t\tattr = typeof prop === \"boolean\" && elem.getAttribute( name ),\n\t\t\tdetail = typeof prop === \"boolean\" ?\n\n\t\t\t\tgetSetInput && getSetAttribute ?\n\t\t\t\t\tattr != null :\n\t\t\t\t\t// oldIE fabricates an empty string for missing boolean attributes\n\t\t\t\t\t// and conflates checked/selected into attroperties\n\t\t\t\t\truseDefault.test( name ) ?\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] :\n\t\t\t\t\t\t!!attr :\n\n\t\t\t\t// fetch an attribute node for properties not recognized as boolean\n\t\t\t\telem.getAttributeNode( name );\n\n\t\treturn detail && detail.value !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\n\n// fix oldIE value attroperty\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn jQuery.nodeName( elem, \"input\" ) ?\n\n\t\t\t\t// Ignore the value *property* by using defaultValue\n\t\t\t\telem.defaultValue :\n\n\t\t\t\tret && ret.specified ? ret.value : undefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( name === \"id\" || name === \"name\" || name === \"coords\" ? ret.value !== \"\" : ret.specified ) ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret == null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\tevent.isTrigger = true;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== document.activeElement && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === document.activeElement && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n(function( window, undefined ) {\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\thasDuplicate,\n\toutermostContext,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsXML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\tsortOrder,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Use a stripped-down slice if we can't use a native one\ntry {\n\tslice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;\n} catch ( e ) {\n\tslice = function( i ) {\n\t\tvar elem,\n\t\t\tresults = [];\n\t\twhile ( (elem = this[i++]) ) {\n\t\t\tresults.push( elem );\n\t\t}\n\t\treturn results;\n\t};\n}\n\n/**\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !documentIsXML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\t\t\t\t\t\tnewSelector\n\t\t\t\t\t), 0 ) );\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsXML = isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.tagNameNoComments = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"<select></select>\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementById returns elements by name\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\t\tdocElem.insertBefore( div, docElem.firstChild );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\t\tsupport.getIdNotName = !doc.getElementById( expando );\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getIdNotName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.tagNameNoComments ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explictly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"<input type='hidden' i=''/>\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\tvar compare;\n\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {\n\t\t\tif ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {\n\t\t\t\tif ( a === doc || contains( preferredDoc, a ) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains( preferredDoc, b ) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\t// Always assume the presence of duplicates if sort doesn't\n\t// pass them to our comparison function (as in Google Chrome).\n\thasDuplicate = false;\n\t[0, 0].sort( sortOrder );\n\tsupport.detectDuplicates = hasDuplicate;\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( !documentIsXML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( documentIsXML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\ti = 1,\n\t\tj = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\tif ( elem === results[ i - 1 ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifider\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsXML ?\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\") :\n\t\t\t\t\t\telem.lang) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && !documentIsXML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = Expr.find[\"ID\"]( token.matches[0].replace( runescape, funescape ), context )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, slice.call( seed, 0 ) );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\tdocumentIsXML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nExpr.filters = setFilters.prototype = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Initialize with the default document\nsetDocument();\n\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i, ret, self,\n\t\t\tlen = this.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\tself = this;\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tret = [];\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, this[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = ( this.selector ? this.selector + \" \" : \"\" ) + selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\trneedsContext.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\" ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, false, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, false, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tvar isFunc = jQuery.isFunction( value );\n\n\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t// this can help fix replacing a parent with child elements\n\t\tif ( !isFunc && typeof value !== \"string\" ) {\n\t\t\tvalue = jQuery( value ).not( this ).detach();\n\t\t}\n\n\t\treturn this.domManip( [ value ], true, function( elem ) {\n\t\t\tvar next = this.nextSibling,\n\t\t\t\tparent = this.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t});\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, table ? self.html() : undefined );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\ti\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\t\t\turl: node.src,\n\t\t\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\t\t\t\"throws\": true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction findOrAppend( elem, tag ) {\n\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\tvar attr = elem.getAttributeNode(\"type\");\n\telem.type = ( attr && attr.specified ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tvar bool = typeof state === \"boolean\";\n\n\t\treturn this.each(function() {\n\t\t\tif ( bool ? state : isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.hover = function( fnOver, fnOut ) {\n\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n};\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 ) {\n\t\t\t\t\tisSuccess = true;\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tisSuccess = true;\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\t\t\t\t\tstatusText = isSuccess.state;\n\t\t\t\t\tsuccess = isSuccess.data;\n\t\t\t\t\terror = isSuccess.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t}\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\tvar conv2, current, conv, tmp,\n\t\tconverters = {},\n\t\ti = 0,\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice(),\n\t\tprev = dataTypes[ 0 ];\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\t// Convert to each sequential dataType, tolerating list modification\n\tfor ( ; (current = dataTypes[++i]); ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\tif ( current !== \"*\" ) {\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\tif ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split(\" \");\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.splice( i--, 0, current );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[\"throws\"] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update prev for next iteration\n\t\t\tprev = current;\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar end, unit,\n\t\t\t\ttween = this.createTween( prop, value ),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tstart = +target || 0,\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( parts ) {\n\t\t\t\tend = +parts[2];\n\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\n\t\t\t\t// We need to compute starting value\n\t\t\t\tif ( unit !== \"px\" && start ) {\n\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\t\t\t\t\t// Fallback to end or a simple constant\n\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t\t// Adjust and apply\n\t\t\t\t\t\tstart = start / scale;\n\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t\t}\n\n\t\t\t\ttween.unit = unit;\n\t\t\t\ttween.start = start;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\t\t\t}\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTweens( animation, props ) {\n\tjQuery.each( props, function( prop, value ) {\n\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\t\tindex = 0,\n\t\t\tlength = collection.length;\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\n\t\t\t\t// we're done with this property\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tcreateTweens( animation, props );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar value, name, index, easing, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/*jshint validthis:true */\n\tvar prop, index, length,\n\t\tvalue, dataShow, toggle,\n\t\ttween, hooks, oldfire,\n\t\tanim = this,\n\t\tstyle = elem.style,\n\t\torig = {},\n\t\thandled = [],\n\t\thidden = elem.nodeType && isHidden( elem );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( index in props ) {\n\t\tvalue = props[ index ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ index ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandled.push( index );\n\t\t}\n\t}\n\n\tlength = handled.length;\n\tif ( length ) {\n\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\t\tif ( \"hidden\" in dataShow ) {\n\t\t\thidden = dataShow.hidden;\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( index = 0 ; index < length ; index++ ) {\n\t\t\tprop = handled[ index ];\n\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Remove in 2.0 - this supports IE8's panic based approach\n// to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\t\t\t\tdoAnimation.finish = function() {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t};\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.cur && hooks.cur.finish ) {\n\t\t\t\thooks.cur.finish.call( this );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.documentElement;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || document.documentElement;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// })();\n\n// Expose for component\nmodule.exports = jQuery;\n\n// Expose jQuery to the global object\n//window.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n})( window );\n//@ sourceURL=component-jquery/index.js" +"/*!\n\ + * jQuery JavaScript Library v1.9.1\n\ + * http://jquery.com/\n\ + *\n\ + * Includes Sizzle.js\n\ + * http://sizzlejs.com/\n\ + *\n\ + * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors\n\ + * Released under the MIT license\n\ + * http://jquery.org/license\n\ + *\n\ + * Date: 2013-2-4\n\ + */\n\ +(function( window, undefined ) {\n\ +\n\ +// Can't do this because several apps including ASP.NET trace\n\ +// the stack via arguments.caller.callee and Firefox dies if\n\ +// you try to trace through \"use strict\" call chains. (#13335)\n\ +// Support: Firefox 18+\n\ +//\"use strict\";\n\ +var\n\ +\t// The deferred used on DOM ready\n\ +\treadyList,\n\ +\n\ +\t// A central reference to the root jQuery(document)\n\ +\trootjQuery,\n\ +\n\ +\t// Support: IE<9\n\ +\t// For `typeof node.method` instead of `node.method !== undefined`\n\ +\tcore_strundefined = typeof undefined,\n\ +\n\ +\t// Use the correct document accordingly with window argument (sandbox)\n\ +\tdocument = window.document,\n\ +\tlocation = window.location,\n\ +\n\ +\t// Map over jQuery in case of overwrite\n\ +\t_jQuery = window.jQuery,\n\ +\n\ +\t// Map over the $ in case of overwrite\n\ +\t_$ = window.$,\n\ +\n\ +\t// [[Class]] -> type pairs\n\ +\tclass2type = {},\n\ +\n\ +\t// List of deleted data cache ids, so we can reuse them\n\ +\tcore_deletedIds = [],\n\ +\n\ +\tcore_version = \"1.9.1\",\n\ +\n\ +\t// Save a reference to some core methods\n\ +\tcore_concat = core_deletedIds.concat,\n\ +\tcore_push = core_deletedIds.push,\n\ +\tcore_slice = core_deletedIds.slice,\n\ +\tcore_indexOf = core_deletedIds.indexOf,\n\ +\tcore_toString = class2type.toString,\n\ +\tcore_hasOwn = class2type.hasOwnProperty,\n\ +\tcore_trim = core_version.trim,\n\ +\n\ +\t// Define a local copy of jQuery\n\ +\tjQuery = function( selector, context ) {\n\ +\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\ +\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\ +\t},\n\ +\n\ +\t// Used for matching numbers\n\ +\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\ +\n\ +\t// Used for splitting on whitespace\n\ +\tcore_rnotwhite = /\\S+/g,\n\ +\n\ +\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\ +\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\ +\n\ +\t// A simple way to check for HTML strings\n\ +\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\ +\t// Strict HTML recognition (#11290: must start with <)\n\ +\trquickExpr = /^(?:(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\ +\n\ +\t// Match a standalone tag\n\ +\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\ +\n\ +\t// JSON RegExp\n\ +\trvalidchars = /^[\\],:{}\\s]*$/,\n\ +\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\ +\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\ +\trvalidtokens = /\"[^\"\\\\\\r\\n\ +]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\ +\n\ +\t// Matches dashed string for camelizing\n\ +\trmsPrefix = /^-ms-/,\n\ +\trdashAlpha = /-([\\da-z])/gi,\n\ +\n\ +\t// Used by jQuery.camelCase as callback to replace()\n\ +\tfcamelCase = function( all, letter ) {\n\ +\t\treturn letter.toUpperCase();\n\ +\t},\n\ +\n\ +\t// The ready event handler\n\ +\tcompleted = function( event ) {\n\ +\n\ +\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\ +\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\ +\t\t\tdetach();\n\ +\t\t\tjQuery.ready();\n\ +\t\t}\n\ +\t},\n\ +\t// Clean-up method for dom ready events\n\ +\tdetach = function() {\n\ +\t\tif ( document.addEventListener ) {\n\ +\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\ +\t\t\twindow.removeEventListener( \"load\", completed, false );\n\ +\n\ +\t\t} else {\n\ +\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\ +\t\t\twindow.detachEvent( \"onload\", completed );\n\ +\t\t}\n\ +\t};\n\ +\n\ +jQuery.fn = jQuery.prototype = {\n\ +\t// The current version of jQuery being used\n\ +\tjquery: core_version,\n\ +\n\ +\tconstructor: jQuery,\n\ +\tinit: function( selector, context, rootjQuery ) {\n\ +\t\tvar match, elem;\n\ +\n\ +\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\ +\t\tif ( !selector ) {\n\ +\t\t\treturn this;\n\ +\t\t}\n\ +\n\ +\t\t// Handle HTML strings\n\ +\t\tif ( typeof selector === \"string\" ) {\n\ +\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\ +\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\ +\t\t\t\tmatch = [ null, selector, null ];\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\tmatch = rquickExpr.exec( selector );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Match html or make sure no context is specified for #id\n\ +\t\t\tif ( match && (match[1] || !context) ) {\n\ +\n\ +\t\t\t\t// HANDLE: $(html) -> $(array)\n\ +\t\t\t\tif ( match[1] ) {\n\ +\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\ +\n\ +\t\t\t\t\t// scripts is true for back-compat\n\ +\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\ +\t\t\t\t\t\tmatch[1],\n\ +\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\ +\t\t\t\t\t\ttrue\n\ +\t\t\t\t\t) );\n\ +\n\ +\t\t\t\t\t// HANDLE: $(html, props)\n\ +\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\ +\t\t\t\t\t\tfor ( match in context ) {\n\ +\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\ +\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\ +\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\ +\n\ +\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\ +\t\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\treturn this;\n\ +\n\ +\t\t\t\t// HANDLE: $(#id)\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\telem = document.getElementById( match[2] );\n\ +\n\ +\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\ +\t\t\t\t\t// nodes that are no longer in the document #6963\n\ +\t\t\t\t\tif ( elem && elem.parentNode ) {\n\ +\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\ +\t\t\t\t\t\t// by name instead of ID\n\ +\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\ +\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\ +\t\t\t\t\t\tthis.length = 1;\n\ +\t\t\t\t\t\tthis[0] = elem;\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\tthis.context = document;\n\ +\t\t\t\t\tthis.selector = selector;\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t// HANDLE: $(expr, $(...))\n\ +\t\t\t} else if ( !context || context.jquery ) {\n\ +\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\ +\n\ +\t\t\t// HANDLE: $(expr, context)\n\ +\t\t\t// (which is just equivalent to: $(context).find(expr)\n\ +\t\t\t} else {\n\ +\t\t\t\treturn this.constructor( context ).find( selector );\n\ +\t\t\t}\n\ +\n\ +\t\t// HANDLE: $(DOMElement)\n\ +\t\t} else if ( selector.nodeType ) {\n\ +\t\t\tthis.context = this[0] = selector;\n\ +\t\t\tthis.length = 1;\n\ +\t\t\treturn this;\n\ +\n\ +\t\t// HANDLE: $(function)\n\ +\t\t// Shortcut for document ready\n\ +\t\t} else if ( jQuery.isFunction( selector ) ) {\n\ +\t\t\treturn rootjQuery.ready( selector );\n\ +\t\t}\n\ +\n\ +\t\tif ( selector.selector !== undefined ) {\n\ +\t\t\tthis.selector = selector.selector;\n\ +\t\t\tthis.context = selector.context;\n\ +\t\t}\n\ +\n\ +\t\treturn jQuery.makeArray( selector, this );\n\ +\t},\n\ +\n\ +\t// Start with an empty selector\n\ +\tselector: \"\",\n\ +\n\ +\t// The default length of a jQuery object is 0\n\ +\tlength: 0,\n\ +\n\ +\t// The number of elements contained in the matched element set\n\ +\tsize: function() {\n\ +\t\treturn this.length;\n\ +\t},\n\ +\n\ +\ttoArray: function() {\n\ +\t\treturn core_slice.call( this );\n\ +\t},\n\ +\n\ +\t// Get the Nth element in the matched element set OR\n\ +\t// Get the whole matched element set as a clean array\n\ +\tget: function( num ) {\n\ +\t\treturn num == null ?\n\ +\n\ +\t\t\t// Return a 'clean' array\n\ +\t\t\tthis.toArray() :\n\ +\n\ +\t\t\t// Return just the object\n\ +\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\ +\t},\n\ +\n\ +\t// Take an array of elements and push it onto the stack\n\ +\t// (returning the new matched element set)\n\ +\tpushStack: function( elems ) {\n\ +\n\ +\t\t// Build a new jQuery matched element set\n\ +\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\ +\n\ +\t\t// Add the old object onto the stack (as a reference)\n\ +\t\tret.prevObject = this;\n\ +\t\tret.context = this.context;\n\ +\n\ +\t\t// Return the newly-formed element set\n\ +\t\treturn ret;\n\ +\t},\n\ +\n\ +\t// Execute a callback for every element in the matched set.\n\ +\t// (You can seed the arguments with an array of args, but this is\n\ +\t// only used internally.)\n\ +\teach: function( callback, args ) {\n\ +\t\treturn jQuery.each( this, callback, args );\n\ +\t},\n\ +\n\ +\tready: function( fn ) {\n\ +\t\t// Add the callback\n\ +\t\tjQuery.ready.promise().done( fn );\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\tslice: function() {\n\ +\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\ +\t},\n\ +\n\ +\tfirst: function() {\n\ +\t\treturn this.eq( 0 );\n\ +\t},\n\ +\n\ +\tlast: function() {\n\ +\t\treturn this.eq( -1 );\n\ +\t},\n\ +\n\ +\teq: function( i ) {\n\ +\t\tvar len = this.length,\n\ +\t\t\tj = +i + ( i < 0 ? len : 0 );\n\ +\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\ +\t},\n\ +\n\ +\tmap: function( callback ) {\n\ +\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\ +\t\t\treturn callback.call( elem, i, elem );\n\ +\t\t}));\n\ +\t},\n\ +\n\ +\tend: function() {\n\ +\t\treturn this.prevObject || this.constructor(null);\n\ +\t},\n\ +\n\ +\t// For internal use only.\n\ +\t// Behaves like an Array's method, not like a jQuery method.\n\ +\tpush: core_push,\n\ +\tsort: [].sort,\n\ +\tsplice: [].splice\n\ +};\n\ +\n\ +// Give the init function the jQuery prototype for later instantiation\n\ +jQuery.fn.init.prototype = jQuery.fn;\n\ +\n\ +jQuery.extend = jQuery.fn.extend = function() {\n\ +\tvar src, copyIsArray, copy, name, options, clone,\n\ +\t\ttarget = arguments[0] || {},\n\ +\t\ti = 1,\n\ +\t\tlength = arguments.length,\n\ +\t\tdeep = false;\n\ +\n\ +\t// Handle a deep copy situation\n\ +\tif ( typeof target === \"boolean\" ) {\n\ +\t\tdeep = target;\n\ +\t\ttarget = arguments[1] || {};\n\ +\t\t// skip the boolean and the target\n\ +\t\ti = 2;\n\ +\t}\n\ +\n\ +\t// Handle case when target is a string or something (possible in deep copy)\n\ +\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\ +\t\ttarget = {};\n\ +\t}\n\ +\n\ +\t// extend jQuery itself if only one argument is passed\n\ +\tif ( length === i ) {\n\ +\t\ttarget = this;\n\ +\t\t--i;\n\ +\t}\n\ +\n\ +\tfor ( ; i < length; i++ ) {\n\ +\t\t// Only deal with non-null/undefined values\n\ +\t\tif ( (options = arguments[ i ]) != null ) {\n\ +\t\t\t// Extend the base object\n\ +\t\t\tfor ( name in options ) {\n\ +\t\t\t\tsrc = target[ name ];\n\ +\t\t\t\tcopy = options[ name ];\n\ +\n\ +\t\t\t\t// Prevent never-ending loop\n\ +\t\t\t\tif ( target === copy ) {\n\ +\t\t\t\t\tcontinue;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Recurse if we're merging plain objects or arrays\n\ +\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\ +\t\t\t\t\tif ( copyIsArray ) {\n\ +\t\t\t\t\t\tcopyIsArray = false;\n\ +\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\ +\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Never move original objects, clone them\n\ +\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\ +\n\ +\t\t\t\t// Don't bring in undefined values\n\ +\t\t\t\t} else if ( copy !== undefined ) {\n\ +\t\t\t\t\ttarget[ name ] = copy;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Return the modified object\n\ +\treturn target;\n\ +};\n\ +\n\ +jQuery.extend({\n\ +\tnoConflict: function( deep ) {\n\ +\t\tif ( window.$ === jQuery ) {\n\ +\t\t\twindow.$ = _$;\n\ +\t\t}\n\ +\n\ +\t\tif ( deep && window.jQuery === jQuery ) {\n\ +\t\t\twindow.jQuery = _jQuery;\n\ +\t\t}\n\ +\n\ +\t\treturn jQuery;\n\ +\t},\n\ +\n\ +\t// Is the DOM ready to be used? Set to true once it occurs.\n\ +\tisReady: false,\n\ +\n\ +\t// A counter to track how many items to wait for before\n\ +\t// the ready event fires. See #6781\n\ +\treadyWait: 1,\n\ +\n\ +\t// Hold (or release) the ready event\n\ +\tholdReady: function( hold ) {\n\ +\t\tif ( hold ) {\n\ +\t\t\tjQuery.readyWait++;\n\ +\t\t} else {\n\ +\t\t\tjQuery.ready( true );\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// Handle when the DOM is ready\n\ +\tready: function( wait ) {\n\ +\n\ +\t\t// Abort if there are pending holds or we're already ready\n\ +\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\ +\t\tif ( !document.body ) {\n\ +\t\t\treturn setTimeout( jQuery.ready );\n\ +\t\t}\n\ +\n\ +\t\t// Remember that the DOM is ready\n\ +\t\tjQuery.isReady = true;\n\ +\n\ +\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\ +\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// If there are functions bound, to execute\n\ +\t\treadyList.resolveWith( document, [ jQuery ] );\n\ +\n\ +\t\t// Trigger any bound ready events\n\ +\t\tif ( jQuery.fn.trigger ) {\n\ +\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// See test/unit/core.js for details concerning isFunction.\n\ +\t// Since version 1.3, DOM methods and functions like alert\n\ +\t// aren't supported. They return false on IE (#2968).\n\ +\tisFunction: function( obj ) {\n\ +\t\treturn jQuery.type(obj) === \"function\";\n\ +\t},\n\ +\n\ +\tisArray: Array.isArray || function( obj ) {\n\ +\t\treturn jQuery.type(obj) === \"array\";\n\ +\t},\n\ +\n\ +\tisWindow: function( obj ) {\n\ +\t\treturn obj != null && obj == obj.window;\n\ +\t},\n\ +\n\ +\tisNumeric: function( obj ) {\n\ +\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\ +\t},\n\ +\n\ +\ttype: function( obj ) {\n\ +\t\tif ( obj == null ) {\n\ +\t\t\treturn String( obj );\n\ +\t\t}\n\ +\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\ +\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\ +\t\t\ttypeof obj;\n\ +\t},\n\ +\n\ +\tisPlainObject: function( obj ) {\n\ +\t\t// Must be an Object.\n\ +\t\t// Because of IE, we also have to check the presence of the constructor property.\n\ +\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\ +\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\n\ +\t\ttry {\n\ +\t\t\t// Not own constructor property must be Object\n\ +\t\t\tif ( obj.constructor &&\n\ +\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\ +\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\t\t} catch ( e ) {\n\ +\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\n\ +\t\t// Own properties are enumerated firstly, so to speed up,\n\ +\t\t// if last one is own, then all properties are own.\n\ +\n\ +\t\tvar key;\n\ +\t\tfor ( key in obj ) {}\n\ +\n\ +\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\ +\t},\n\ +\n\ +\tisEmptyObject: function( obj ) {\n\ +\t\tvar name;\n\ +\t\tfor ( name in obj ) {\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\t\treturn true;\n\ +\t},\n\ +\n\ +\terror: function( msg ) {\n\ +\t\tthrow new Error( msg );\n\ +\t},\n\ +\n\ +\t// data: string of html\n\ +\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\ +\t// keepScripts (optional): If true, will include scripts passed in the html string\n\ +\tparseHTML: function( data, context, keepScripts ) {\n\ +\t\tif ( !data || typeof data !== \"string\" ) {\n\ +\t\t\treturn null;\n\ +\t\t}\n\ +\t\tif ( typeof context === \"boolean\" ) {\n\ +\t\t\tkeepScripts = context;\n\ +\t\t\tcontext = false;\n\ +\t\t}\n\ +\t\tcontext = context || document;\n\ +\n\ +\t\tvar parsed = rsingleTag.exec( data ),\n\ +\t\t\tscripts = !keepScripts && [];\n\ +\n\ +\t\t// Single tag\n\ +\t\tif ( parsed ) {\n\ +\t\t\treturn [ context.createElement( parsed[1] ) ];\n\ +\t\t}\n\ +\n\ +\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\ +\t\tif ( scripts ) {\n\ +\t\t\tjQuery( scripts ).remove();\n\ +\t\t}\n\ +\t\treturn jQuery.merge( [], parsed.childNodes );\n\ +\t},\n\ +\n\ +\tparseJSON: function( data ) {\n\ +\t\t// Attempt to parse using the native JSON parser first\n\ +\t\tif ( window.JSON && window.JSON.parse ) {\n\ +\t\t\treturn window.JSON.parse( data );\n\ +\t\t}\n\ +\n\ +\t\tif ( data === null ) {\n\ +\t\t\treturn data;\n\ +\t\t}\n\ +\n\ +\t\tif ( typeof data === \"string\" ) {\n\ +\n\ +\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\ +\t\t\tdata = jQuery.trim( data );\n\ +\n\ +\t\t\tif ( data ) {\n\ +\t\t\t\t// Make sure the incoming data is actual JSON\n\ +\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\ +\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\ +\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\ +\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\ +\n\ +\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\tjQuery.error( \"Invalid JSON: \" + data );\n\ +\t},\n\ +\n\ +\t// Cross-browser xml parsing\n\ +\tparseXML: function( data ) {\n\ +\t\tvar xml, tmp;\n\ +\t\tif ( !data || typeof data !== \"string\" ) {\n\ +\t\t\treturn null;\n\ +\t\t}\n\ +\t\ttry {\n\ +\t\t\tif ( window.DOMParser ) { // Standard\n\ +\t\t\t\ttmp = new DOMParser();\n\ +\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\ +\t\t\t} else { // IE\n\ +\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\ +\t\t\t\txml.async = \"false\";\n\ +\t\t\t\txml.loadXML( data );\n\ +\t\t\t}\n\ +\t\t} catch( e ) {\n\ +\t\t\txml = undefined;\n\ +\t\t}\n\ +\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\ +\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\ +\t\t}\n\ +\t\treturn xml;\n\ +\t},\n\ +\n\ +\tnoop: function() {},\n\ +\n\ +\t// Evaluates a script in a global context\n\ +\t// Workarounds based on findings by Jim Driscoll\n\ +\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\ +\tglobalEval: function( data ) {\n\ +\t\tif ( data && jQuery.trim( data ) ) {\n\ +\t\t\t// We use execScript on Internet Explorer\n\ +\t\t\t// We use an anonymous function so that context is window\n\ +\t\t\t// rather than jQuery in Firefox\n\ +\t\t\t( window.execScript || function( data ) {\n\ +\t\t\t\twindow[ \"eval\" ].call( window, data );\n\ +\t\t\t} )( data );\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// Convert dashed to camelCase; used by the css and data modules\n\ +\t// Microsoft forgot to hump their vendor prefix (#9572)\n\ +\tcamelCase: function( string ) {\n\ +\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\ +\t},\n\ +\n\ +\tnodeName: function( elem, name ) {\n\ +\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\ +\t},\n\ +\n\ +\t// args is for internal usage only\n\ +\teach: function( obj, callback, args ) {\n\ +\t\tvar value,\n\ +\t\t\ti = 0,\n\ +\t\t\tlength = obj.length,\n\ +\t\t\tisArray = isArraylike( obj );\n\ +\n\ +\t\tif ( args ) {\n\ +\t\t\tif ( isArray ) {\n\ +\t\t\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\ +\n\ +\t\t\t\t\tif ( value === false ) {\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\tfor ( i in obj ) {\n\ +\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\ +\n\ +\t\t\t\t\tif ( value === false ) {\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t// A special, fast, case for the most common use of each\n\ +\t\t} else {\n\ +\t\t\tif ( isArray ) {\n\ +\t\t\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\ +\n\ +\t\t\t\t\tif ( value === false ) {\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\tfor ( i in obj ) {\n\ +\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\ +\n\ +\t\t\t\t\tif ( value === false ) {\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn obj;\n\ +\t},\n\ +\n\ +\t// Use native String.trim function wherever possible\n\ +\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\ +\t\tfunction( text ) {\n\ +\t\t\treturn text == null ?\n\ +\t\t\t\t\"\" :\n\ +\t\t\t\tcore_trim.call( text );\n\ +\t\t} :\n\ +\n\ +\t\t// Otherwise use our own trimming functionality\n\ +\t\tfunction( text ) {\n\ +\t\t\treturn text == null ?\n\ +\t\t\t\t\"\" :\n\ +\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\ +\t\t},\n\ +\n\ +\t// results is for internal usage only\n\ +\tmakeArray: function( arr, results ) {\n\ +\t\tvar ret = results || [];\n\ +\n\ +\t\tif ( arr != null ) {\n\ +\t\t\tif ( isArraylike( Object(arr) ) ) {\n\ +\t\t\t\tjQuery.merge( ret,\n\ +\t\t\t\t\ttypeof arr === \"string\" ?\n\ +\t\t\t\t\t[ arr ] : arr\n\ +\t\t\t\t);\n\ +\t\t\t} else {\n\ +\t\t\t\tcore_push.call( ret, arr );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn ret;\n\ +\t},\n\ +\n\ +\tinArray: function( elem, arr, i ) {\n\ +\t\tvar len;\n\ +\n\ +\t\tif ( arr ) {\n\ +\t\t\tif ( core_indexOf ) {\n\ +\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\ +\t\t\t}\n\ +\n\ +\t\t\tlen = arr.length;\n\ +\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\ +\n\ +\t\t\tfor ( ; i < len; i++ ) {\n\ +\t\t\t\t// Skip accessing in sparse arrays\n\ +\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\ +\t\t\t\t\treturn i;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn -1;\n\ +\t},\n\ +\n\ +\tmerge: function( first, second ) {\n\ +\t\tvar l = second.length,\n\ +\t\t\ti = first.length,\n\ +\t\t\tj = 0;\n\ +\n\ +\t\tif ( typeof l === \"number\" ) {\n\ +\t\t\tfor ( ; j < l; j++ ) {\n\ +\t\t\t\tfirst[ i++ ] = second[ j ];\n\ +\t\t\t}\n\ +\t\t} else {\n\ +\t\t\twhile ( second[j] !== undefined ) {\n\ +\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\tfirst.length = i;\n\ +\n\ +\t\treturn first;\n\ +\t},\n\ +\n\ +\tgrep: function( elems, callback, inv ) {\n\ +\t\tvar retVal,\n\ +\t\t\tret = [],\n\ +\t\t\ti = 0,\n\ +\t\t\tlength = elems.length;\n\ +\t\tinv = !!inv;\n\ +\n\ +\t\t// Go through the array, only saving the items\n\ +\t\t// that pass the validator function\n\ +\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\tretVal = !!callback( elems[ i ], i );\n\ +\t\t\tif ( inv !== retVal ) {\n\ +\t\t\t\tret.push( elems[ i ] );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn ret;\n\ +\t},\n\ +\n\ +\t// arg is for internal usage only\n\ +\tmap: function( elems, callback, arg ) {\n\ +\t\tvar value,\n\ +\t\t\ti = 0,\n\ +\t\t\tlength = elems.length,\n\ +\t\t\tisArray = isArraylike( elems ),\n\ +\t\t\tret = [];\n\ +\n\ +\t\t// Go through the array, translating each of the items to their\n\ +\t\tif ( isArray ) {\n\ +\t\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\ +\n\ +\t\t\t\tif ( value != null ) {\n\ +\t\t\t\t\tret[ ret.length ] = value;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t// Go through every key on the object,\n\ +\t\t} else {\n\ +\t\t\tfor ( i in elems ) {\n\ +\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\ +\n\ +\t\t\t\tif ( value != null ) {\n\ +\t\t\t\t\tret[ ret.length ] = value;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Flatten any nested arrays\n\ +\t\treturn core_concat.apply( [], ret );\n\ +\t},\n\ +\n\ +\t// A global GUID counter for objects\n\ +\tguid: 1,\n\ +\n\ +\t// Bind a function to a context, optionally partially applying any\n\ +\t// arguments.\n\ +\tproxy: function( fn, context ) {\n\ +\t\tvar args, proxy, tmp;\n\ +\n\ +\t\tif ( typeof context === \"string\" ) {\n\ +\t\t\ttmp = fn[ context ];\n\ +\t\t\tcontext = fn;\n\ +\t\t\tfn = tmp;\n\ +\t\t}\n\ +\n\ +\t\t// Quick check to determine if target is callable, in the spec\n\ +\t\t// this throws a TypeError, but we will just return undefined.\n\ +\t\tif ( !jQuery.isFunction( fn ) ) {\n\ +\t\t\treturn undefined;\n\ +\t\t}\n\ +\n\ +\t\t// Simulated bind\n\ +\t\targs = core_slice.call( arguments, 2 );\n\ +\t\tproxy = function() {\n\ +\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\ +\t\t};\n\ +\n\ +\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\ +\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\ +\n\ +\t\treturn proxy;\n\ +\t},\n\ +\n\ +\t// Multifunctional method to get and set values of a collection\n\ +\t// The value/s can optionally be executed if it's a function\n\ +\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\ +\t\tvar i = 0,\n\ +\t\t\tlength = elems.length,\n\ +\t\t\tbulk = key == null;\n\ +\n\ +\t\t// Sets many values\n\ +\t\tif ( jQuery.type( key ) === \"object\" ) {\n\ +\t\t\tchainable = true;\n\ +\t\t\tfor ( i in key ) {\n\ +\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\ +\t\t\t}\n\ +\n\ +\t\t// Sets one value\n\ +\t\t} else if ( value !== undefined ) {\n\ +\t\t\tchainable = true;\n\ +\n\ +\t\t\tif ( !jQuery.isFunction( value ) ) {\n\ +\t\t\t\traw = true;\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( bulk ) {\n\ +\t\t\t\t// Bulk operations run against the entire set\n\ +\t\t\t\tif ( raw ) {\n\ +\t\t\t\t\tfn.call( elems, value );\n\ +\t\t\t\t\tfn = null;\n\ +\n\ +\t\t\t\t// ...except when executing function values\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tbulk = fn;\n\ +\t\t\t\t\tfn = function( elem, key, value ) {\n\ +\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\ +\t\t\t\t\t};\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( fn ) {\n\ +\t\t\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn chainable ?\n\ +\t\t\telems :\n\ +\n\ +\t\t\t// Gets\n\ +\t\t\tbulk ?\n\ +\t\t\t\tfn.call( elems ) :\n\ +\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\ +\t},\n\ +\n\ +\tnow: function() {\n\ +\t\treturn ( new Date() ).getTime();\n\ +\t}\n\ +});\n\ +\n\ +jQuery.ready.promise = function( obj ) {\n\ +\tif ( !readyList ) {\n\ +\n\ +\t\treadyList = jQuery.Deferred();\n\ +\n\ +\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\ +\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\ +\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\ +\t\tif ( document.readyState === \"complete\" ) {\n\ +\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\ +\t\t\tsetTimeout( jQuery.ready );\n\ +\n\ +\t\t// Standards-based browsers support DOMContentLoaded\n\ +\t\t} else if ( document.addEventListener ) {\n\ +\t\t\t// Use the handy event callback\n\ +\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\ +\n\ +\t\t\t// A fallback to window.onload, that will always work\n\ +\t\t\twindow.addEventListener( \"load\", completed, false );\n\ +\n\ +\t\t// If IE event model is used\n\ +\t\t} else {\n\ +\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\ +\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\ +\n\ +\t\t\t// A fallback to window.onload, that will always work\n\ +\t\t\twindow.attachEvent( \"onload\", completed );\n\ +\n\ +\t\t\t// If IE and not a frame\n\ +\t\t\t// continually check to see if the document is ready\n\ +\t\t\tvar top = false;\n\ +\n\ +\t\t\ttry {\n\ +\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\ +\t\t\t} catch(e) {}\n\ +\n\ +\t\t\tif ( top && top.doScroll ) {\n\ +\t\t\t\t(function doScrollCheck() {\n\ +\t\t\t\t\tif ( !jQuery.isReady ) {\n\ +\n\ +\t\t\t\t\t\ttry {\n\ +\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\ +\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\ +\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\ +\t\t\t\t\t\t} catch(e) {\n\ +\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// detach all dom ready events\n\ +\t\t\t\t\t\tdetach();\n\ +\n\ +\t\t\t\t\t\t// and execute any waiting functions\n\ +\t\t\t\t\t\tjQuery.ready();\n\ +\t\t\t\t\t}\n\ +\t\t\t\t})();\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\treturn readyList.promise( obj );\n\ +};\n\ +\n\ +// Populate the class2type map\n\ +jQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\ +\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\ +});\n\ +\n\ +function isArraylike( obj ) {\n\ +\tvar length = obj.length,\n\ +\t\ttype = jQuery.type( obj );\n\ +\n\ +\tif ( jQuery.isWindow( obj ) ) {\n\ +\t\treturn false;\n\ +\t}\n\ +\n\ +\tif ( obj.nodeType === 1 && length ) {\n\ +\t\treturn true;\n\ +\t}\n\ +\n\ +\treturn type === \"array\" || type !== \"function\" &&\n\ +\t\t( length === 0 ||\n\ +\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n\ +}\n\ +\n\ +// All jQuery objects should point back to these\n\ +rootjQuery = jQuery(document);\n\ +// String to Object options format cache\n\ +var optionsCache = {};\n\ +\n\ +// Convert String-formatted options into Object-formatted ones and store in cache\n\ +function createOptions( options ) {\n\ +\tvar object = optionsCache[ options ] = {};\n\ +\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\ +\t\tobject[ flag ] = true;\n\ +\t});\n\ +\treturn object;\n\ +}\n\ +\n\ +/*\n\ + * Create a callback list using the following parameters:\n\ + *\n\ + *\toptions: an optional list of space-separated options that will change how\n\ + *\t\t\tthe callback list behaves or a more traditional option object\n\ + *\n\ + * By default a callback list will act like an event callback list and can be\n\ + * \"fired\" multiple times.\n\ + *\n\ + * Possible options:\n\ + *\n\ + *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n\ + *\n\ + *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n\ + *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n\ + *\t\t\t\t\tvalues (like a Deferred)\n\ + *\n\ + *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n\ + *\n\ + *\tstopOnFalse:\tinterrupt callings when a callback returns false\n\ + *\n\ + */\n\ +jQuery.Callbacks = function( options ) {\n\ +\n\ +\t// Convert options from String-formatted to Object-formatted if needed\n\ +\t// (we check in cache first)\n\ +\toptions = typeof options === \"string\" ?\n\ +\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\ +\t\tjQuery.extend( {}, options );\n\ +\n\ +\tvar // Flag to know if list is currently firing\n\ +\t\tfiring,\n\ +\t\t// Last fire value (for non-forgettable lists)\n\ +\t\tmemory,\n\ +\t\t// Flag to know if list was already fired\n\ +\t\tfired,\n\ +\t\t// End of the loop when firing\n\ +\t\tfiringLength,\n\ +\t\t// Index of currently firing callback (modified by remove if needed)\n\ +\t\tfiringIndex,\n\ +\t\t// First callback to fire (used internally by add and fireWith)\n\ +\t\tfiringStart,\n\ +\t\t// Actual callback list\n\ +\t\tlist = [],\n\ +\t\t// Stack of fire calls for repeatable lists\n\ +\t\tstack = !options.once && [],\n\ +\t\t// Fire callbacks\n\ +\t\tfire = function( data ) {\n\ +\t\t\tmemory = options.memory && data;\n\ +\t\t\tfired = true;\n\ +\t\t\tfiringIndex = firingStart || 0;\n\ +\t\t\tfiringStart = 0;\n\ +\t\t\tfiringLength = list.length;\n\ +\t\t\tfiring = true;\n\ +\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\ +\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\ +\t\t\t\t\tmemory = false; // To prevent further calls using add\n\ +\t\t\t\t\tbreak;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\tfiring = false;\n\ +\t\t\tif ( list ) {\n\ +\t\t\t\tif ( stack ) {\n\ +\t\t\t\t\tif ( stack.length ) {\n\ +\t\t\t\t\t\tfire( stack.shift() );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t} else if ( memory ) {\n\ +\t\t\t\t\tlist = [];\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tself.disable();\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t},\n\ +\t\t// Actual Callbacks object\n\ +\t\tself = {\n\ +\t\t\t// Add a callback or a collection of callbacks to the list\n\ +\t\t\tadd: function() {\n\ +\t\t\t\tif ( list ) {\n\ +\t\t\t\t\t// First, we save the current length\n\ +\t\t\t\t\tvar start = list.length;\n\ +\t\t\t\t\t(function add( args ) {\n\ +\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\ +\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\ +\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\ +\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\ +\t\t\t\t\t\t\t\t\tlist.push( arg );\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\ +\t\t\t\t\t\t\t\t// Inspect recursively\n\ +\t\t\t\t\t\t\t\tadd( arg );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t});\n\ +\t\t\t\t\t})( arguments );\n\ +\t\t\t\t\t// Do we need to add the callbacks to the\n\ +\t\t\t\t\t// current firing batch?\n\ +\t\t\t\t\tif ( firing ) {\n\ +\t\t\t\t\t\tfiringLength = list.length;\n\ +\t\t\t\t\t// With memory, if we're not firing then\n\ +\t\t\t\t\t// we should call right away\n\ +\t\t\t\t\t} else if ( memory ) {\n\ +\t\t\t\t\t\tfiringStart = start;\n\ +\t\t\t\t\t\tfire( memory );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Remove a callback from the list\n\ +\t\t\tremove: function() {\n\ +\t\t\t\tif ( list ) {\n\ +\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\ +\t\t\t\t\t\tvar index;\n\ +\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\ +\t\t\t\t\t\t\tlist.splice( index, 1 );\n\ +\t\t\t\t\t\t\t// Handle firing indexes\n\ +\t\t\t\t\t\t\tif ( firing ) {\n\ +\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\ +\t\t\t\t\t\t\t\t\tfiringLength--;\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\ +\t\t\t\t\t\t\t\t\tfiringIndex--;\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t});\n\ +\t\t\t\t}\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Check if a given callback is in the list.\n\ +\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\ +\t\t\thas: function( fn ) {\n\ +\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\ +\t\t\t},\n\ +\t\t\t// Remove all callbacks from the list\n\ +\t\t\tempty: function() {\n\ +\t\t\t\tlist = [];\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Have the list do nothing anymore\n\ +\t\t\tdisable: function() {\n\ +\t\t\t\tlist = stack = memory = undefined;\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Is it disabled?\n\ +\t\t\tdisabled: function() {\n\ +\t\t\t\treturn !list;\n\ +\t\t\t},\n\ +\t\t\t// Lock the list in its current state\n\ +\t\t\tlock: function() {\n\ +\t\t\t\tstack = undefined;\n\ +\t\t\t\tif ( !memory ) {\n\ +\t\t\t\t\tself.disable();\n\ +\t\t\t\t}\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Is it locked?\n\ +\t\t\tlocked: function() {\n\ +\t\t\t\treturn !stack;\n\ +\t\t\t},\n\ +\t\t\t// Call all callbacks with the given context and arguments\n\ +\t\t\tfireWith: function( context, args ) {\n\ +\t\t\t\targs = args || [];\n\ +\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\ +\t\t\t\tif ( list && ( !fired || stack ) ) {\n\ +\t\t\t\t\tif ( firing ) {\n\ +\t\t\t\t\t\tstack.push( args );\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\tfire( args );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// Call all the callbacks with the given arguments\n\ +\t\t\tfire: function() {\n\ +\t\t\t\tself.fireWith( this, arguments );\n\ +\t\t\t\treturn this;\n\ +\t\t\t},\n\ +\t\t\t// To know if the callbacks have already been called at least once\n\ +\t\t\tfired: function() {\n\ +\t\t\t\treturn !!fired;\n\ +\t\t\t}\n\ +\t\t};\n\ +\n\ +\treturn self;\n\ +};\n\ +jQuery.extend({\n\ +\n\ +\tDeferred: function( func ) {\n\ +\t\tvar tuples = [\n\ +\t\t\t\t// action, add listener, listener list, final state\n\ +\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\ +\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\ +\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\ +\t\t\t],\n\ +\t\t\tstate = \"pending\",\n\ +\t\t\tpromise = {\n\ +\t\t\t\tstate: function() {\n\ +\t\t\t\t\treturn state;\n\ +\t\t\t\t},\n\ +\t\t\t\talways: function() {\n\ +\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t},\n\ +\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\ +\t\t\t\t\tvar fns = arguments;\n\ +\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\ +\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\ +\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\ +\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\ +\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\ +\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\ +\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\ +\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\ +\t\t\t\t\t\t\t\t\treturned.promise()\n\ +\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\ +\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\ +\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\ +\t\t\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t});\n\ +\t\t\t\t\t\t});\n\ +\t\t\t\t\t\tfns = null;\n\ +\t\t\t\t\t}).promise();\n\ +\t\t\t\t},\n\ +\t\t\t\t// Get a promise for this deferred\n\ +\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\ +\t\t\t\tpromise: function( obj ) {\n\ +\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\ +\t\t\t\t}\n\ +\t\t\t},\n\ +\t\t\tdeferred = {};\n\ +\n\ +\t\t// Keep pipe for back-compat\n\ +\t\tpromise.pipe = promise.then;\n\ +\n\ +\t\t// Add list-specific methods\n\ +\t\tjQuery.each( tuples, function( i, tuple ) {\n\ +\t\t\tvar list = tuple[ 2 ],\n\ +\t\t\t\tstateString = tuple[ 3 ];\n\ +\n\ +\t\t\t// promise[ done | fail | progress ] = list.add\n\ +\t\t\tpromise[ tuple[1] ] = list.add;\n\ +\n\ +\t\t\t// Handle state\n\ +\t\t\tif ( stateString ) {\n\ +\t\t\t\tlist.add(function() {\n\ +\t\t\t\t\t// state = [ resolved | rejected ]\n\ +\t\t\t\t\tstate = stateString;\n\ +\n\ +\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\ +\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// deferred[ resolve | reject | notify ]\n\ +\t\t\tdeferred[ tuple[0] ] = function() {\n\ +\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\ +\t\t\t\treturn this;\n\ +\t\t\t};\n\ +\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\ +\t\t});\n\ +\n\ +\t\t// Make the deferred a promise\n\ +\t\tpromise.promise( deferred );\n\ +\n\ +\t\t// Call given func if any\n\ +\t\tif ( func ) {\n\ +\t\t\tfunc.call( deferred, deferred );\n\ +\t\t}\n\ +\n\ +\t\t// All done!\n\ +\t\treturn deferred;\n\ +\t},\n\ +\n\ +\t// Deferred helper\n\ +\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\ +\t\tvar i = 0,\n\ +\t\t\tresolveValues = core_slice.call( arguments ),\n\ +\t\t\tlength = resolveValues.length,\n\ +\n\ +\t\t\t// the count of uncompleted subordinates\n\ +\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\ +\n\ +\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\ +\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\ +\n\ +\t\t\t// Update function for both resolve and progress values\n\ +\t\t\tupdateFunc = function( i, contexts, values ) {\n\ +\t\t\t\treturn function( value ) {\n\ +\t\t\t\t\tcontexts[ i ] = this;\n\ +\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\ +\t\t\t\t\tif( values === progressValues ) {\n\ +\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\ +\t\t\t\t\t} else if ( !( --remaining ) ) {\n\ +\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t};\n\ +\t\t\t},\n\ +\n\ +\t\t\tprogressValues, progressContexts, resolveContexts;\n\ +\n\ +\t\t// add listeners to Deferred subordinates; treat others as resolved\n\ +\t\tif ( length > 1 ) {\n\ +\t\t\tprogressValues = new Array( length );\n\ +\t\t\tprogressContexts = new Array( length );\n\ +\t\t\tresolveContexts = new Array( length );\n\ +\t\t\tfor ( ; i < length; i++ ) {\n\ +\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\ +\t\t\t\t\tresolveValues[ i ].promise()\n\ +\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\ +\t\t\t\t\t\t.fail( deferred.reject )\n\ +\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\t--remaining;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// if we're not waiting on anything, resolve the master\n\ +\t\tif ( !remaining ) {\n\ +\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\ +\t\t}\n\ +\n\ +\t\treturn deferred.promise();\n\ +\t}\n\ +});\n\ +jQuery.support = (function() {\n\ +\n\ +\tvar support, all, a,\n\ +\t\tinput, select, fragment,\n\ +\t\topt, eventName, isSupported, i,\n\ +\t\tdiv = document.createElement(\"div\");\n\ +\n\ +\t// Setup\n\ +\tdiv.setAttribute( \"className\", \"t\" );\n\ +\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\ +\n\ +\t// Support tests won't run in some limited or non-browser environments\n\ +\tall = div.getElementsByTagName(\"*\");\n\ +\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\ +\tif ( !all || !a || !all.length ) {\n\ +\t\treturn {};\n\ +\t}\n\ +\n\ +\t// First batch of tests\n\ +\tselect = document.createElement(\"select\");\n\ +\topt = select.appendChild( document.createElement(\"option\") );\n\ +\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\ +\n\ +\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\ +\tsupport = {\n\ +\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\ +\t\tgetSetAttribute: div.className !== \"t\",\n\ +\n\ +\t\t// IE strips leading whitespace when .innerHTML is used\n\ +\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\ +\n\ +\t\t// Make sure that tbody elements aren't automatically inserted\n\ +\t\t// IE will insert them into empty tables\n\ +\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\ +\n\ +\t\t// Make sure that link elements get serialized correctly by innerHTML\n\ +\t\t// This requires a wrapper element in IE\n\ +\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\ +\n\ +\t\t// Get the style information from getAttribute\n\ +\t\t// (IE uses .cssText instead)\n\ +\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\ +\n\ +\t\t// Make sure that URLs aren't manipulated\n\ +\t\t// (IE normalizes it by default)\n\ +\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\ +\n\ +\t\t// Make sure that element opacity exists\n\ +\t\t// (IE uses filter instead)\n\ +\t\t// Use a regex to work around a WebKit issue. See #5145\n\ +\t\topacity: /^0.5/.test( a.style.opacity ),\n\ +\n\ +\t\t// Verify style float existence\n\ +\t\t// (IE uses styleFloat instead of cssFloat)\n\ +\t\tcssFloat: !!a.style.cssFloat,\n\ +\n\ +\t\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\ +\t\tcheckOn: !!input.value,\n\ +\n\ +\t\t// Make sure that a selected-by-default option has a working selected property.\n\ +\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\ +\t\toptSelected: opt.selected,\n\ +\n\ +\t\t// Tests for enctype support on a form (#6743)\n\ +\t\tenctype: !!document.createElement(\"form\").enctype,\n\ +\n\ +\t\t// Makes sure cloning an html5 element does not cause problems\n\ +\t\t// Where outerHTML is undefined, this still works\n\ +\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\ +\n\ +\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\ +\t\tboxModel: document.compatMode === \"CSS1Compat\",\n\ +\n\ +\t\t// Will be defined later\n\ +\t\tdeleteExpando: true,\n\ +\t\tnoCloneEvent: true,\n\ +\t\tinlineBlockNeedsLayout: false,\n\ +\t\tshrinkWrapBlocks: false,\n\ +\t\treliableMarginRight: true,\n\ +\t\tboxSizingReliable: true,\n\ +\t\tpixelPosition: false\n\ +\t};\n\ +\n\ +\t// Make sure checked status is properly cloned\n\ +\tinput.checked = true;\n\ +\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\ +\n\ +\t// Make sure that the options inside disabled selects aren't marked as disabled\n\ +\t// (WebKit marks them as disabled)\n\ +\tselect.disabled = true;\n\ +\tsupport.optDisabled = !opt.disabled;\n\ +\n\ +\t// Support: IE<9\n\ +\ttry {\n\ +\t\tdelete div.test;\n\ +\t} catch( e ) {\n\ +\t\tsupport.deleteExpando = false;\n\ +\t}\n\ +\n\ +\t// Check if we can trust getAttribute(\"value\")\n\ +\tinput = document.createElement(\"input\");\n\ +\tinput.setAttribute( \"value\", \"\" );\n\ +\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\ +\n\ +\t// Check if an input maintains its value after becoming a radio\n\ +\tinput.value = \"t\";\n\ +\tinput.setAttribute( \"type\", \"radio\" );\n\ +\tsupport.radioValue = input.value === \"t\";\n\ +\n\ +\t// #11217 - WebKit loses check when the name is after the checked attribute\n\ +\tinput.setAttribute( \"checked\", \"t\" );\n\ +\tinput.setAttribute( \"name\", \"t\" );\n\ +\n\ +\tfragment = document.createDocumentFragment();\n\ +\tfragment.appendChild( input );\n\ +\n\ +\t// Check if a disconnected checkbox will retain its checked\n\ +\t// value of true after appended to the DOM (IE6/7)\n\ +\tsupport.appendChecked = input.checked;\n\ +\n\ +\t// WebKit doesn't clone checked state correctly in fragments\n\ +\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\ +\n\ +\t// Support: IE<9\n\ +\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\ +\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\ +\tif ( div.attachEvent ) {\n\ +\t\tdiv.attachEvent( \"onclick\", function() {\n\ +\t\t\tsupport.noCloneEvent = false;\n\ +\t\t});\n\ +\n\ +\t\tdiv.cloneNode( true ).click();\n\ +\t}\n\ +\n\ +\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\ +\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php\n\ +\tfor ( i in { submit: true, change: true, focusin: true }) {\n\ +\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\ +\n\ +\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\ +\t}\n\ +\n\ +\tdiv.style.backgroundClip = \"content-box\";\n\ +\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\ +\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\ +\n\ +\t// Run tests that need a body at doc ready\n\ +\tjQuery(function() {\n\ +\t\tvar container, marginDiv, tds,\n\ +\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\ +\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\ +\n\ +\t\tif ( !body ) {\n\ +\t\t\t// Return for frameset docs that don't have a body\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\tcontainer = document.createElement(\"div\");\n\ +\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\ +\n\ +\t\tbody.appendChild( container ).appendChild( div );\n\ +\n\ +\t\t// Support: IE8\n\ +\t\t// Check if table cells still have offsetWidth/Height when they are set\n\ +\t\t// to display:none and there are still other visible table cells in a\n\ +\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\ +\t\t// determining if an element has been hidden directly using\n\ +\t\t// display:none (it is still safe to use offsets if a parent element is\n\ +\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\ +\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\ +\t\ttds = div.getElementsByTagName(\"td\");\n\ +\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\ +\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\ +\n\ +\t\ttds[ 0 ].style.display = \"\";\n\ +\t\ttds[ 1 ].style.display = \"none\";\n\ +\n\ +\t\t// Support: IE8\n\ +\t\t// Check if empty table cells still have offsetWidth/Height\n\ +\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\ +\n\ +\t\t// Check box-sizing and margin behavior\n\ +\t\tdiv.innerHTML = \"\";\n\ +\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\ +\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\ +\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\ +\n\ +\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\ +\t\tif ( window.getComputedStyle ) {\n\ +\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\ +\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\ +\n\ +\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\ +\t\t\t// gets computed margin-right based on width of container. (#3333)\n\ +\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\ +\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\ +\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\ +\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\ +\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\ +\t\t\tdiv.style.width = \"1px\";\n\ +\n\ +\t\t\tsupport.reliableMarginRight =\n\ +\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\ +\t\t}\n\ +\n\ +\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\ +\t\t\t// Support: IE<8\n\ +\t\t\t// Check if natively block-level elements act like inline-block\n\ +\t\t\t// elements when setting their display to 'inline' and giving\n\ +\t\t\t// them layout\n\ +\t\t\tdiv.innerHTML = \"\";\n\ +\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\ +\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\ +\n\ +\t\t\t// Support: IE6\n\ +\t\t\t// Check if elements with layout shrink-wrap their children\n\ +\t\t\tdiv.style.display = \"block\";\n\ +\t\t\tdiv.innerHTML = \"<div></div>\";\n\ +\t\t\tdiv.firstChild.style.width = \"5px\";\n\ +\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\ +\n\ +\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\ +\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\ +\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\ +\t\t\t\t// Support: IE<8\n\ +\t\t\t\tbody.style.zoom = 1;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\tbody.removeChild( container );\n\ +\n\ +\t\t// Null elements to avoid leaks in IE\n\ +\t\tcontainer = div = tds = marginDiv = null;\n\ +\t});\n\ +\n\ +\t// Null elements to avoid leaks in IE\n\ +\tall = select = fragment = opt = a = input = null;\n\ +\n\ +\treturn support;\n\ +})();\n\ +\n\ +var rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\ +\trmultiDash = /([A-Z])/g;\n\ +\n\ +function internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\ +\tif ( !jQuery.acceptData( elem ) ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tvar thisCache, ret,\n\ +\t\tinternalKey = jQuery.expando,\n\ +\t\tgetByName = typeof name === \"string\",\n\ +\n\ +\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\ +\t\t// can't GC object references properly across the DOM-JS boundary\n\ +\t\tisNode = elem.nodeType,\n\ +\n\ +\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\ +\t\t// attached directly to the object so GC can occur automatically\n\ +\t\tcache = isNode ? jQuery.cache : elem,\n\ +\n\ +\t\t// Only defining an ID for JS objects if its cache already exists allows\n\ +\t\t// the code to shortcut on the same path as a DOM node with no cache\n\ +\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\ +\n\ +\t// Avoid doing any more work than we need to when trying to get data on an\n\ +\t// object that has no data at all\n\ +\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tif ( !id ) {\n\ +\t\t// Only DOM nodes need a new unique ID for each element since their data\n\ +\t\t// ends up in the global cache\n\ +\t\tif ( isNode ) {\n\ +\t\t\telem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;\n\ +\t\t} else {\n\ +\t\t\tid = internalKey;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tif ( !cache[ id ] ) {\n\ +\t\tcache[ id ] = {};\n\ +\n\ +\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\ +\t\t// is serialized using JSON.stringify\n\ +\t\tif ( !isNode ) {\n\ +\t\t\tcache[ id ].toJSON = jQuery.noop;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\ +\t// shallow copied over onto the existing cache\n\ +\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\ +\t\tif ( pvt ) {\n\ +\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\ +\t\t} else {\n\ +\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tthisCache = cache[ id ];\n\ +\n\ +\t// jQuery data() is stored in a separate object inside the object's internal data\n\ +\t// cache in order to avoid key collisions between internal data and user-defined\n\ +\t// data.\n\ +\tif ( !pvt ) {\n\ +\t\tif ( !thisCache.data ) {\n\ +\t\t\tthisCache.data = {};\n\ +\t\t}\n\ +\n\ +\t\tthisCache = thisCache.data;\n\ +\t}\n\ +\n\ +\tif ( data !== undefined ) {\n\ +\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\ +\t}\n\ +\n\ +\t// Check for both converted-to-camel and non-converted data property names\n\ +\t// If a data property was specified\n\ +\tif ( getByName ) {\n\ +\n\ +\t\t// First Try to find as-is property data\n\ +\t\tret = thisCache[ name ];\n\ +\n\ +\t\t// Test for null|undefined property data\n\ +\t\tif ( ret == null ) {\n\ +\n\ +\t\t\t// Try to find the camelCased property\n\ +\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\ +\t\t}\n\ +\t} else {\n\ +\t\tret = thisCache;\n\ +\t}\n\ +\n\ +\treturn ret;\n\ +}\n\ +\n\ +function internalRemoveData( elem, name, pvt ) {\n\ +\tif ( !jQuery.acceptData( elem ) ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tvar i, l, thisCache,\n\ +\t\tisNode = elem.nodeType,\n\ +\n\ +\t\t// See jQuery.data for more information\n\ +\t\tcache = isNode ? jQuery.cache : elem,\n\ +\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\ +\n\ +\t// If there is already no cache entry for this object, there is no\n\ +\t// purpose in continuing\n\ +\tif ( !cache[ id ] ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tif ( name ) {\n\ +\n\ +\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\ +\n\ +\t\tif ( thisCache ) {\n\ +\n\ +\t\t\t// Support array or space separated string names for data keys\n\ +\t\t\tif ( !jQuery.isArray( name ) ) {\n\ +\n\ +\t\t\t\t// try the string as a key before any manipulation\n\ +\t\t\t\tif ( name in thisCache ) {\n\ +\t\t\t\t\tname = [ name ];\n\ +\t\t\t\t} else {\n\ +\n\ +\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\ +\t\t\t\t\tname = jQuery.camelCase( name );\n\ +\t\t\t\t\tif ( name in thisCache ) {\n\ +\t\t\t\t\t\tname = [ name ];\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\tname = name.split(\" \");\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\t// If \"name\" is an array of keys...\n\ +\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\ +\t\t\t\t// keys will be converted to camelCase.\n\ +\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\ +\t\t\t\t// both plain key and camelCase key. #12786\n\ +\t\t\t\t// This will only penalize the array argument path.\n\ +\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\ +\t\t\t}\n\ +\n\ +\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\ +\t\t\t\tdelete thisCache[ name[i] ];\n\ +\t\t\t}\n\ +\n\ +\t\t\t// If there is no data left in the cache, we want to continue\n\ +\t\t\t// and let the cache object itself get destroyed\n\ +\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\ +\t\t\t\treturn;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// See jQuery.data for more information\n\ +\tif ( !pvt ) {\n\ +\t\tdelete cache[ id ].data;\n\ +\n\ +\t\t// Don't destroy the parent cache unless the internal data object\n\ +\t\t// had been the only thing left in it\n\ +\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Destroy the cache\n\ +\tif ( isNode ) {\n\ +\t\tjQuery.cleanData( [ elem ], true );\n\ +\n\ +\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\ +\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\ +\t\tdelete cache[ id ];\n\ +\n\ +\t// When all else fails, null\n\ +\t} else {\n\ +\t\tcache[ id ] = null;\n\ +\t}\n\ +}\n\ +\n\ +jQuery.extend({\n\ +\tcache: {},\n\ +\n\ +\t// Unique for each copy of jQuery on the page\n\ +\t// Non-digits removed to match rinlinejQuery\n\ +\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\ +\n\ +\t// The following elements throw uncatchable exceptions if you\n\ +\t// attempt to add expando properties to them.\n\ +\tnoData: {\n\ +\t\t\"embed\": true,\n\ +\t\t// Ban all objects except for Flash (which handle expandos)\n\ +\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\ +\t\t\"applet\": true\n\ +\t},\n\ +\n\ +\thasData: function( elem ) {\n\ +\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\ +\t\treturn !!elem && !isEmptyDataObject( elem );\n\ +\t},\n\ +\n\ +\tdata: function( elem, name, data ) {\n\ +\t\treturn internalData( elem, name, data );\n\ +\t},\n\ +\n\ +\tremoveData: function( elem, name ) {\n\ +\t\treturn internalRemoveData( elem, name );\n\ +\t},\n\ +\n\ +\t// For internal use only.\n\ +\t_data: function( elem, name, data ) {\n\ +\t\treturn internalData( elem, name, data, true );\n\ +\t},\n\ +\n\ +\t_removeData: function( elem, name ) {\n\ +\t\treturn internalRemoveData( elem, name, true );\n\ +\t},\n\ +\n\ +\t// A method for determining if a DOM node can handle the data expando\n\ +\tacceptData: function( elem ) {\n\ +\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\ +\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\n\ +\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\ +\n\ +\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\ +\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\ +\t}\n\ +});\n\ +\n\ +jQuery.fn.extend({\n\ +\tdata: function( key, value ) {\n\ +\t\tvar attrs, name,\n\ +\t\t\telem = this[0],\n\ +\t\t\ti = 0,\n\ +\t\t\tdata = null;\n\ +\n\ +\t\t// Gets all values\n\ +\t\tif ( key === undefined ) {\n\ +\t\t\tif ( this.length ) {\n\ +\t\t\t\tdata = jQuery.data( elem );\n\ +\n\ +\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\ +\t\t\t\t\tattrs = elem.attributes;\n\ +\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\ +\t\t\t\t\t\tname = attrs[i].name;\n\ +\n\ +\t\t\t\t\t\tif ( !name.indexOf( \"data-\" ) ) {\n\ +\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\ +\n\ +\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn data;\n\ +\t\t}\n\ +\n\ +\t\t// Sets multiple values\n\ +\t\tif ( typeof key === \"object\" ) {\n\ +\t\t\treturn this.each(function() {\n\ +\t\t\t\tjQuery.data( this, key );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\treturn jQuery.access( this, function( value ) {\n\ +\n\ +\t\t\tif ( value === undefined ) {\n\ +\t\t\t\t// Try to fetch any internally stored data first\n\ +\t\t\t\treturn elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\ +\t\t\t}\n\ +\n\ +\t\t\tthis.each(function() {\n\ +\t\t\t\tjQuery.data( this, key, value );\n\ +\t\t\t});\n\ +\t\t}, null, value, arguments.length > 1, null, true );\n\ +\t},\n\ +\n\ +\tremoveData: function( key ) {\n\ +\t\treturn this.each(function() {\n\ +\t\t\tjQuery.removeData( this, key );\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +function dataAttr( elem, key, data ) {\n\ +\t// If nothing was found internally, try to fetch any\n\ +\t// data from the HTML5 data-* attribute\n\ +\tif ( data === undefined && elem.nodeType === 1 ) {\n\ +\n\ +\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\ +\n\ +\t\tdata = elem.getAttribute( name );\n\ +\n\ +\t\tif ( typeof data === \"string\" ) {\n\ +\t\t\ttry {\n\ +\t\t\t\tdata = data === \"true\" ? true :\n\ +\t\t\t\t\tdata === \"false\" ? false :\n\ +\t\t\t\t\tdata === \"null\" ? null :\n\ +\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\ +\t\t\t\t\t+data + \"\" === data ? +data :\n\ +\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\ +\t\t\t\t\t\tdata;\n\ +\t\t\t} catch( e ) {}\n\ +\n\ +\t\t\t// Make sure we set the data so it isn't changed later\n\ +\t\t\tjQuery.data( elem, key, data );\n\ +\n\ +\t\t} else {\n\ +\t\t\tdata = undefined;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn data;\n\ +}\n\ +\n\ +// checks a cache object for emptiness\n\ +function isEmptyDataObject( obj ) {\n\ +\tvar name;\n\ +\tfor ( name in obj ) {\n\ +\n\ +\t\t// if the public data object is empty, the private is still empty\n\ +\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\ +\t\t\tcontinue;\n\ +\t\t}\n\ +\t\tif ( name !== \"toJSON\" ) {\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn true;\n\ +}\n\ +jQuery.extend({\n\ +\tqueue: function( elem, type, data ) {\n\ +\t\tvar queue;\n\ +\n\ +\t\tif ( elem ) {\n\ +\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\ +\t\t\tqueue = jQuery._data( elem, type );\n\ +\n\ +\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\ +\t\t\tif ( data ) {\n\ +\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\ +\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tqueue.push( data );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\treturn queue || [];\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tdequeue: function( elem, type ) {\n\ +\t\ttype = type || \"fx\";\n\ +\n\ +\t\tvar queue = jQuery.queue( elem, type ),\n\ +\t\t\tstartLength = queue.length,\n\ +\t\t\tfn = queue.shift(),\n\ +\t\t\thooks = jQuery._queueHooks( elem, type ),\n\ +\t\t\tnext = function() {\n\ +\t\t\t\tjQuery.dequeue( elem, type );\n\ +\t\t\t};\n\ +\n\ +\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\ +\t\tif ( fn === \"inprogress\" ) {\n\ +\t\t\tfn = queue.shift();\n\ +\t\t\tstartLength--;\n\ +\t\t}\n\ +\n\ +\t\thooks.cur = fn;\n\ +\t\tif ( fn ) {\n\ +\n\ +\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\ +\t\t\t// automatically dequeued\n\ +\t\t\tif ( type === \"fx\" ) {\n\ +\t\t\t\tqueue.unshift( \"inprogress\" );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// clear up the last queue stop function\n\ +\t\t\tdelete hooks.stop;\n\ +\t\t\tfn.call( elem, next, hooks );\n\ +\t\t}\n\ +\n\ +\t\tif ( !startLength && hooks ) {\n\ +\t\t\thooks.empty.fire();\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\ +\t_queueHooks: function( elem, type ) {\n\ +\t\tvar key = type + \"queueHooks\";\n\ +\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\ +\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\ +\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\ +\t\t\t\tjQuery._removeData( elem, key );\n\ +\t\t\t})\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +jQuery.fn.extend({\n\ +\tqueue: function( type, data ) {\n\ +\t\tvar setter = 2;\n\ +\n\ +\t\tif ( typeof type !== \"string\" ) {\n\ +\t\t\tdata = type;\n\ +\t\t\ttype = \"fx\";\n\ +\t\t\tsetter--;\n\ +\t\t}\n\ +\n\ +\t\tif ( arguments.length < setter ) {\n\ +\t\t\treturn jQuery.queue( this[0], type );\n\ +\t\t}\n\ +\n\ +\t\treturn data === undefined ?\n\ +\t\t\tthis :\n\ +\t\t\tthis.each(function() {\n\ +\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\ +\n\ +\t\t\t\t// ensure a hooks for this queue\n\ +\t\t\t\tjQuery._queueHooks( this, type );\n\ +\n\ +\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\ +\t\t\t\t\tjQuery.dequeue( this, type );\n\ +\t\t\t\t}\n\ +\t\t\t});\n\ +\t},\n\ +\tdequeue: function( type ) {\n\ +\t\treturn this.each(function() {\n\ +\t\t\tjQuery.dequeue( this, type );\n\ +\t\t});\n\ +\t},\n\ +\t// Based off of the plugin by Clint Helfers, with permission.\n\ +\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\ +\tdelay: function( time, type ) {\n\ +\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ +\t\ttype = type || \"fx\";\n\ +\n\ +\t\treturn this.queue( type, function( next, hooks ) {\n\ +\t\t\tvar timeout = setTimeout( next, time );\n\ +\t\t\thooks.stop = function() {\n\ +\t\t\t\tclearTimeout( timeout );\n\ +\t\t\t};\n\ +\t\t});\n\ +\t},\n\ +\tclearQueue: function( type ) {\n\ +\t\treturn this.queue( type || \"fx\", [] );\n\ +\t},\n\ +\t// Get a promise resolved when queues of a certain type\n\ +\t// are emptied (fx is the type by default)\n\ +\tpromise: function( type, obj ) {\n\ +\t\tvar tmp,\n\ +\t\t\tcount = 1,\n\ +\t\t\tdefer = jQuery.Deferred(),\n\ +\t\t\telements = this,\n\ +\t\t\ti = this.length,\n\ +\t\t\tresolve = function() {\n\ +\t\t\t\tif ( !( --count ) ) {\n\ +\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\n\ +\t\tif ( typeof type !== \"string\" ) {\n\ +\t\t\tobj = type;\n\ +\t\t\ttype = undefined;\n\ +\t\t}\n\ +\t\ttype = type || \"fx\";\n\ +\n\ +\t\twhile( i-- ) {\n\ +\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\ +\t\t\tif ( tmp && tmp.empty ) {\n\ +\t\t\t\tcount++;\n\ +\t\t\t\ttmp.empty.add( resolve );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\tresolve();\n\ +\t\treturn defer.promise( obj );\n\ +\t}\n\ +});\n\ +var nodeHook, boolHook,\n\ +\trclass = /[\\t\\r\\n\ +]/g,\n\ +\trreturn = /\\r/g,\n\ +\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\ +\trclickable = /^(?:a|area)$/i,\n\ +\trboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,\n\ +\truseDefault = /^(?:checked|selected)$/i,\n\ +\tgetSetAttribute = jQuery.support.getSetAttribute,\n\ +\tgetSetInput = jQuery.support.input;\n\ +\n\ +jQuery.fn.extend({\n\ +\tattr: function( name, value ) {\n\ +\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\ +\t},\n\ +\n\ +\tremoveAttr: function( name ) {\n\ +\t\treturn this.each(function() {\n\ +\t\t\tjQuery.removeAttr( this, name );\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tprop: function( name, value ) {\n\ +\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\ +\t},\n\ +\n\ +\tremoveProp: function( name ) {\n\ +\t\tname = jQuery.propFix[ name ] || name;\n\ +\t\treturn this.each(function() {\n\ +\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\ +\t\t\ttry {\n\ +\t\t\t\tthis[ name ] = undefined;\n\ +\t\t\t\tdelete this[ name ];\n\ +\t\t\t} catch( e ) {}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\taddClass: function( value ) {\n\ +\t\tvar classes, elem, cur, clazz, j,\n\ +\t\t\ti = 0,\n\ +\t\t\tlen = this.length,\n\ +\t\t\tproceed = typeof value === \"string\" && value;\n\ +\n\ +\t\tif ( jQuery.isFunction( value ) ) {\n\ +\t\t\treturn this.each(function( j ) {\n\ +\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\tif ( proceed ) {\n\ +\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\ +\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\ +\n\ +\t\t\tfor ( ; i < len; i++ ) {\n\ +\t\t\t\telem = this[ i ];\n\ +\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\ +\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\ +\t\t\t\t\t\" \"\n\ +\t\t\t\t);\n\ +\n\ +\t\t\t\tif ( cur ) {\n\ +\t\t\t\t\tj = 0;\n\ +\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\ +\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\ +\t\t\t\t\t\t\tcur += clazz + \" \";\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\telem.className = jQuery.trim( cur );\n\ +\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\tremoveClass: function( value ) {\n\ +\t\tvar classes, elem, cur, clazz, j,\n\ +\t\t\ti = 0,\n\ +\t\t\tlen = this.length,\n\ +\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\ +\n\ +\t\tif ( jQuery.isFunction( value ) ) {\n\ +\t\t\treturn this.each(function( j ) {\n\ +\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\ +\t\t\t});\n\ +\t\t}\n\ +\t\tif ( proceed ) {\n\ +\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\ +\n\ +\t\t\tfor ( ; i < len; i++ ) {\n\ +\t\t\t\telem = this[ i ];\n\ +\t\t\t\t// This expression is here for better compressibility (see addClass)\n\ +\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\ +\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\ +\t\t\t\t\t\"\"\n\ +\t\t\t\t);\n\ +\n\ +\t\t\t\tif ( cur ) {\n\ +\t\t\t\t\tj = 0;\n\ +\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\ +\t\t\t\t\t\t// Remove *all* instances\n\ +\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\ +\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\ttoggleClass: function( value, stateVal ) {\n\ +\t\tvar type = typeof value,\n\ +\t\t\tisBool = typeof stateVal === \"boolean\";\n\ +\n\ +\t\tif ( jQuery.isFunction( value ) ) {\n\ +\t\t\treturn this.each(function( i ) {\n\ +\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\treturn this.each(function() {\n\ +\t\t\tif ( type === \"string\" ) {\n\ +\t\t\t\t// toggle individual class names\n\ +\t\t\t\tvar className,\n\ +\t\t\t\t\ti = 0,\n\ +\t\t\t\t\tself = jQuery( this ),\n\ +\t\t\t\t\tstate = stateVal,\n\ +\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\ +\n\ +\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\ +\t\t\t\t\t// check each className given, space separated list\n\ +\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\ +\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t// Toggle whole class name\n\ +\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\ +\t\t\t\tif ( this.className ) {\n\ +\t\t\t\t\t// store className if set\n\ +\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\ +\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\ +\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\ +\t\t\t\t// falling back to the empty string if nothing was stored.\n\ +\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\thasClass: function( selector ) {\n\ +\t\tvar className = \" \" + selector + \" \",\n\ +\t\t\ti = 0,\n\ +\t\t\tl = this.length;\n\ +\t\tfor ( ; i < l; i++ ) {\n\ +\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\ +\t\t\t\treturn true;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn false;\n\ +\t},\n\ +\n\ +\tval: function( value ) {\n\ +\t\tvar ret, hooks, isFunction,\n\ +\t\t\telem = this[0];\n\ +\n\ +\t\tif ( !arguments.length ) {\n\ +\t\t\tif ( elem ) {\n\ +\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\ +\n\ +\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\ +\t\t\t\t\treturn ret;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tret = elem.value;\n\ +\n\ +\t\t\t\treturn typeof ret === \"string\" ?\n\ +\t\t\t\t\t// handle most common string cases\n\ +\t\t\t\t\tret.replace(rreturn, \"\") :\n\ +\t\t\t\t\t// handle cases where value is null/undef or number\n\ +\t\t\t\t\tret == null ? \"\" : ret;\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\tisFunction = jQuery.isFunction( value );\n\ +\n\ +\t\treturn this.each(function( i ) {\n\ +\t\t\tvar val,\n\ +\t\t\t\tself = jQuery(this);\n\ +\n\ +\t\t\tif ( this.nodeType !== 1 ) {\n\ +\t\t\t\treturn;\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( isFunction ) {\n\ +\t\t\t\tval = value.call( this, i, self.val() );\n\ +\t\t\t} else {\n\ +\t\t\t\tval = value;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\ +\t\t\tif ( val == null ) {\n\ +\t\t\t\tval = \"\";\n\ +\t\t\t} else if ( typeof val === \"number\" ) {\n\ +\t\t\t\tval += \"\";\n\ +\t\t\t} else if ( jQuery.isArray( val ) ) {\n\ +\t\t\t\tval = jQuery.map(val, function ( value ) {\n\ +\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\ +\t\t\t\t});\n\ +\t\t\t}\n\ +\n\ +\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\ +\n\ +\t\t\t// If set returns undefined, fall back to normal setting\n\ +\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\ +\t\t\t\tthis.value = val;\n\ +\t\t\t}\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +jQuery.extend({\n\ +\tvalHooks: {\n\ +\t\toption: {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\ +\t\t\t\t// uses .value. See #6932\n\ +\t\t\t\tvar val = elem.attributes.value;\n\ +\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\ +\t\t\t}\n\ +\t\t},\n\ +\t\tselect: {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\tvar value, option,\n\ +\t\t\t\t\toptions = elem.options,\n\ +\t\t\t\t\tindex = elem.selectedIndex,\n\ +\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\ +\t\t\t\t\tvalues = one ? null : [],\n\ +\t\t\t\t\tmax = one ? index + 1 : options.length,\n\ +\t\t\t\t\ti = index < 0 ?\n\ +\t\t\t\t\t\tmax :\n\ +\t\t\t\t\t\tone ? index : 0;\n\ +\n\ +\t\t\t\t// Loop through all the selected options\n\ +\t\t\t\tfor ( ; i < max; i++ ) {\n\ +\t\t\t\t\toption = options[ i ];\n\ +\n\ +\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\ +\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\ +\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\ +\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\ +\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\ +\n\ +\t\t\t\t\t\t// Get the specific value for the option\n\ +\t\t\t\t\t\tvalue = jQuery( option ).val();\n\ +\n\ +\t\t\t\t\t\t// We don't need an array for one selects\n\ +\t\t\t\t\t\tif ( one ) {\n\ +\t\t\t\t\t\t\treturn value;\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Multi-Selects return an array\n\ +\t\t\t\t\t\tvalues.push( value );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\treturn values;\n\ +\t\t\t},\n\ +\n\ +\t\t\tset: function( elem, value ) {\n\ +\t\t\t\tvar values = jQuery.makeArray( value );\n\ +\n\ +\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\ +\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\ +\t\t\t\t});\n\ +\n\ +\t\t\t\tif ( !values.length ) {\n\ +\t\t\t\t\telem.selectedIndex = -1;\n\ +\t\t\t\t}\n\ +\t\t\t\treturn values;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tattr: function( elem, name, value ) {\n\ +\t\tvar hooks, notxml, ret,\n\ +\t\t\tnType = elem.nodeType;\n\ +\n\ +\t\t// don't get/set attributes on text, comment and attribute nodes\n\ +\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Fallback to prop when attributes are not supported\n\ +\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\ +\t\t\treturn jQuery.prop( elem, name, value );\n\ +\t\t}\n\ +\n\ +\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\ +\n\ +\t\t// All attributes are lowercase\n\ +\t\t// Grab necessary hook if one is defined\n\ +\t\tif ( notxml ) {\n\ +\t\t\tname = name.toLowerCase();\n\ +\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\ +\t\t}\n\ +\n\ +\t\tif ( value !== undefined ) {\n\ +\n\ +\t\t\tif ( value === null ) {\n\ +\t\t\t\tjQuery.removeAttr( elem, name );\n\ +\n\ +\t\t\t} else if ( hooks && notxml && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\ +\t\t\t\treturn ret;\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\telem.setAttribute( name, value + \"\" );\n\ +\t\t\t\treturn value;\n\ +\t\t\t}\n\ +\n\ +\t\t} else if ( hooks && notxml && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\ +\t\t\treturn ret;\n\ +\n\ +\t\t} else {\n\ +\n\ +\t\t\t// In IE9+, Flash objects don't have .getAttribute (#12945)\n\ +\t\t\t// Support: IE9+\n\ +\t\t\tif ( typeof elem.getAttribute !== core_strundefined ) {\n\ +\t\t\t\tret = elem.getAttribute( name );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Non-existent attributes return null, we normalize to undefined\n\ +\t\t\treturn ret == null ?\n\ +\t\t\t\tundefined :\n\ +\t\t\t\tret;\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tremoveAttr: function( elem, value ) {\n\ +\t\tvar name, propName,\n\ +\t\t\ti = 0,\n\ +\t\t\tattrNames = value && value.match( core_rnotwhite );\n\ +\n\ +\t\tif ( attrNames && elem.nodeType === 1 ) {\n\ +\t\t\twhile ( (name = attrNames[i++]) ) {\n\ +\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\ +\n\ +\t\t\t\t// Boolean attributes get special treatment (#10870)\n\ +\t\t\t\tif ( rboolean.test( name ) ) {\n\ +\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\ +\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8\n\ +\t\t\t\t\tif ( !getSetAttribute && ruseDefault.test( name ) ) {\n\ +\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\ +\t\t\t\t\t\t\telem[ propName ] = false;\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\telem[ propName ] = false;\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tattrHooks: {\n\ +\t\ttype: {\n\ +\t\t\tset: function( elem, value ) {\n\ +\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\ +\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\ +\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\ +\t\t\t\t\tvar val = elem.value;\n\ +\t\t\t\t\telem.setAttribute( \"type\", value );\n\ +\t\t\t\t\tif ( val ) {\n\ +\t\t\t\t\t\telem.value = val;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\treturn value;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tpropFix: {\n\ +\t\ttabindex: \"tabIndex\",\n\ +\t\treadonly: \"readOnly\",\n\ +\t\t\"for\": \"htmlFor\",\n\ +\t\t\"class\": \"className\",\n\ +\t\tmaxlength: \"maxLength\",\n\ +\t\tcellspacing: \"cellSpacing\",\n\ +\t\tcellpadding: \"cellPadding\",\n\ +\t\trowspan: \"rowSpan\",\n\ +\t\tcolspan: \"colSpan\",\n\ +\t\tusemap: \"useMap\",\n\ +\t\tframeborder: \"frameBorder\",\n\ +\t\tcontenteditable: \"contentEditable\"\n\ +\t},\n\ +\n\ +\tprop: function( elem, name, value ) {\n\ +\t\tvar ret, hooks, notxml,\n\ +\t\t\tnType = elem.nodeType;\n\ +\n\ +\t\t// don't get/set properties on text, comment and attribute nodes\n\ +\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\ +\n\ +\t\tif ( notxml ) {\n\ +\t\t\t// Fix name and attach hooks\n\ +\t\t\tname = jQuery.propFix[ name ] || name;\n\ +\t\t\thooks = jQuery.propHooks[ name ];\n\ +\t\t}\n\ +\n\ +\t\tif ( value !== undefined ) {\n\ +\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\ +\t\t\t\treturn ret;\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\treturn ( elem[ name ] = value );\n\ +\t\t\t}\n\ +\n\ +\t\t} else {\n\ +\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\ +\t\t\t\treturn ret;\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\treturn elem[ name ];\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tpropHooks: {\n\ +\t\ttabIndex: {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\ +\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\ +\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\ +\n\ +\t\t\t\treturn attributeNode && attributeNode.specified ?\n\ +\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\ +\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\ +\t\t\t\t\t\t0 :\n\ +\t\t\t\t\t\tundefined;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +});\n\ +\n\ +// Hook for boolean attributes\n\ +boolHook = {\n\ +\tget: function( elem, name ) {\n\ +\t\tvar\n\ +\t\t\t// Use .prop to determine if this attribute is understood as boolean\n\ +\t\t\tprop = jQuery.prop( elem, name ),\n\ +\n\ +\t\t\t// Fetch it accordingly\n\ +\t\t\tattr = typeof prop === \"boolean\" && elem.getAttribute( name ),\n\ +\t\t\tdetail = typeof prop === \"boolean\" ?\n\ +\n\ +\t\t\t\tgetSetInput && getSetAttribute ?\n\ +\t\t\t\t\tattr != null :\n\ +\t\t\t\t\t// oldIE fabricates an empty string for missing boolean attributes\n\ +\t\t\t\t\t// and conflates checked/selected into attroperties\n\ +\t\t\t\t\truseDefault.test( name ) ?\n\ +\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] :\n\ +\t\t\t\t\t\t!!attr :\n\ +\n\ +\t\t\t\t// fetch an attribute node for properties not recognized as boolean\n\ +\t\t\t\telem.getAttributeNode( name );\n\ +\n\ +\t\treturn detail && detail.value !== false ?\n\ +\t\t\tname.toLowerCase() :\n\ +\t\t\tundefined;\n\ +\t},\n\ +\tset: function( elem, value, name ) {\n\ +\t\tif ( value === false ) {\n\ +\t\t\t// Remove boolean attributes when set to false\n\ +\t\t\tjQuery.removeAttr( elem, name );\n\ +\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\ +\t\t\t// IE<8 needs the *property* name\n\ +\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\ +\n\ +\t\t// Use defaultChecked and defaultSelected for oldIE\n\ +\t\t} else {\n\ +\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\ +\t\t}\n\ +\n\ +\t\treturn name;\n\ +\t}\n\ +};\n\ +\n\ +// fix oldIE value attroperty\n\ +if ( !getSetInput || !getSetAttribute ) {\n\ +\tjQuery.attrHooks.value = {\n\ +\t\tget: function( elem, name ) {\n\ +\t\t\tvar ret = elem.getAttributeNode( name );\n\ +\t\t\treturn jQuery.nodeName( elem, \"input\" ) ?\n\ +\n\ +\t\t\t\t// Ignore the value *property* by using defaultValue\n\ +\t\t\t\telem.defaultValue :\n\ +\n\ +\t\t\t\tret && ret.specified ? ret.value : undefined;\n\ +\t\t},\n\ +\t\tset: function( elem, value, name ) {\n\ +\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\ +\t\t\t\t// Does not return so that setAttribute is also used\n\ +\t\t\t\telem.defaultValue = value;\n\ +\t\t\t} else {\n\ +\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\ +\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// IE6/7 do not support getting/setting some attributes with get/setAttribute\n\ +if ( !getSetAttribute ) {\n\ +\n\ +\t// Use this for any attribute in IE6/7\n\ +\t// This fixes almost every IE6/7 issue\n\ +\tnodeHook = jQuery.valHooks.button = {\n\ +\t\tget: function( elem, name ) {\n\ +\t\t\tvar ret = elem.getAttributeNode( name );\n\ +\t\t\treturn ret && ( name === \"id\" || name === \"name\" || name === \"coords\" ? ret.value !== \"\" : ret.specified ) ?\n\ +\t\t\t\tret.value :\n\ +\t\t\t\tundefined;\n\ +\t\t},\n\ +\t\tset: function( elem, value, name ) {\n\ +\t\t\t// Set the existing or create a new attribute node\n\ +\t\t\tvar ret = elem.getAttributeNode( name );\n\ +\t\t\tif ( !ret ) {\n\ +\t\t\t\telem.setAttributeNode(\n\ +\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\ +\t\t\t\t);\n\ +\t\t\t}\n\ +\n\ +\t\t\tret.value = value += \"\";\n\ +\n\ +\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\ +\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\ +\t\t\t\tvalue :\n\ +\t\t\t\tundefined;\n\ +\t\t}\n\ +\t};\n\ +\n\ +\t// Set contenteditable to false on removals(#10429)\n\ +\t// Setting to empty string throws an error as an invalid value\n\ +\tjQuery.attrHooks.contenteditable = {\n\ +\t\tget: nodeHook.get,\n\ +\t\tset: function( elem, value, name ) {\n\ +\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\ +\t\t}\n\ +\t};\n\ +\n\ +\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\ +\t// This is for removals\n\ +\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\ +\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\ +\t\t\tset: function( elem, value ) {\n\ +\t\t\t\tif ( value === \"\" ) {\n\ +\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\ +\t\t\t\t\treturn value;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t});\n\ +\t});\n\ +}\n\ +\n\ +\n\ +// Some attributes require a special call on IE\n\ +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\n\ +if ( !jQuery.support.hrefNormalized ) {\n\ +\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\ +\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\ +\t\t\t\treturn ret == null ? undefined : ret;\n\ +\t\t\t}\n\ +\t\t});\n\ +\t});\n\ +\n\ +\t// href/src property should get the full normalized URL (#10299/#12915)\n\ +\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\ +\t\tjQuery.propHooks[ name ] = {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\treturn elem.getAttribute( name, 4 );\n\ +\t\t\t}\n\ +\t\t};\n\ +\t});\n\ +}\n\ +\n\ +if ( !jQuery.support.style ) {\n\ +\tjQuery.attrHooks.style = {\n\ +\t\tget: function( elem ) {\n\ +\t\t\t// Return undefined in the case of empty string\n\ +\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\ +\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\ +\t\t\treturn elem.style.cssText || undefined;\n\ +\t\t},\n\ +\t\tset: function( elem, value ) {\n\ +\t\t\treturn ( elem.style.cssText = value + \"\" );\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// Safari mis-reports the default selected property of an option\n\ +// Accessing the parent's selectedIndex property fixes it\n\ +if ( !jQuery.support.optSelected ) {\n\ +\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\ +\t\tget: function( elem ) {\n\ +\t\t\tvar parent = elem.parentNode;\n\ +\n\ +\t\t\tif ( parent ) {\n\ +\t\t\t\tparent.selectedIndex;\n\ +\n\ +\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\ +\t\t\t\tif ( parent.parentNode ) {\n\ +\t\t\t\t\tparent.parentNode.selectedIndex;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\treturn null;\n\ +\t\t}\n\ +\t});\n\ +}\n\ +\n\ +// IE6/7 call enctype encoding\n\ +if ( !jQuery.support.enctype ) {\n\ +\tjQuery.propFix.enctype = \"encoding\";\n\ +}\n\ +\n\ +// Radios and checkboxes getter/setter\n\ +if ( !jQuery.support.checkOn ) {\n\ +\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\ +\t\tjQuery.valHooks[ this ] = {\n\ +\t\t\tget: function( elem ) {\n\ +\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\ +\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\ +\t\t\t}\n\ +\t\t};\n\ +\t});\n\ +}\n\ +jQuery.each([ \"radio\", \"checkbox\" ], function() {\n\ +\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\ +\t\tset: function( elem, value ) {\n\ +\t\t\tif ( jQuery.isArray( value ) ) {\n\ +\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t});\n\ +});\n\ +var rformElems = /^(?:input|select|textarea)$/i,\n\ +\trkeyEvent = /^key/,\n\ +\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\ +\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\ +\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\ +\n\ +function returnTrue() {\n\ +\treturn true;\n\ +}\n\ +\n\ +function returnFalse() {\n\ +\treturn false;\n\ +}\n\ +\n\ +/*\n\ + * Helper functions for managing events -- not part of the public interface.\n\ + * Props to Dean Edwards' addEvent library for many of the ideas.\n\ + */\n\ +jQuery.event = {\n\ +\n\ +\tglobal: {},\n\ +\n\ +\tadd: function( elem, types, handler, data, selector ) {\n\ +\t\tvar tmp, events, t, handleObjIn,\n\ +\t\t\tspecial, eventHandle, handleObj,\n\ +\t\t\thandlers, type, namespaces, origType,\n\ +\t\t\telemData = jQuery._data( elem );\n\ +\n\ +\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\ +\t\tif ( !elemData ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Caller can pass in an object of custom data in lieu of the handler\n\ +\t\tif ( handler.handler ) {\n\ +\t\t\thandleObjIn = handler;\n\ +\t\t\thandler = handleObjIn.handler;\n\ +\t\t\tselector = handleObjIn.selector;\n\ +\t\t}\n\ +\n\ +\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\ +\t\tif ( !handler.guid ) {\n\ +\t\t\thandler.guid = jQuery.guid++;\n\ +\t\t}\n\ +\n\ +\t\t// Init the element's event structure and main handler, if this is the first\n\ +\t\tif ( !(events = elemData.events) ) {\n\ +\t\t\tevents = elemData.events = {};\n\ +\t\t}\n\ +\t\tif ( !(eventHandle = elemData.handle) ) {\n\ +\t\t\teventHandle = elemData.handle = function( e ) {\n\ +\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\ +\t\t\t\t// when an event is called after a page has unloaded\n\ +\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\ +\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\ +\t\t\t\t\tundefined;\n\ +\t\t\t};\n\ +\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\ +\t\t\teventHandle.elem = elem;\n\ +\t\t}\n\ +\n\ +\t\t// Handle multiple events separated by a space\n\ +\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\ +\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\ +\t\tt = types.length;\n\ +\t\twhile ( t-- ) {\n\ +\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\ +\t\t\ttype = origType = tmp[1];\n\ +\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\ +\n\ +\t\t\t// If event changes its type, use the special event handlers for the changed type\n\ +\t\t\tspecial = jQuery.event.special[ type ] || {};\n\ +\n\ +\t\t\t// If selector defined, determine special event api type, otherwise given type\n\ +\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\ +\n\ +\t\t\t// Update special based on newly reset type\n\ +\t\t\tspecial = jQuery.event.special[ type ] || {};\n\ +\n\ +\t\t\t// handleObj is passed to all event handlers\n\ +\t\t\thandleObj = jQuery.extend({\n\ +\t\t\t\ttype: type,\n\ +\t\t\t\torigType: origType,\n\ +\t\t\t\tdata: data,\n\ +\t\t\t\thandler: handler,\n\ +\t\t\t\tguid: handler.guid,\n\ +\t\t\t\tselector: selector,\n\ +\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\ +\t\t\t\tnamespace: namespaces.join(\".\")\n\ +\t\t\t}, handleObjIn );\n\ +\n\ +\t\t\t// Init the event handler queue if we're the first\n\ +\t\t\tif ( !(handlers = events[ type ]) ) {\n\ +\t\t\t\thandlers = events[ type ] = [];\n\ +\t\t\t\thandlers.delegateCount = 0;\n\ +\n\ +\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\ +\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\ +\t\t\t\t\t// Bind the global event handler to the element\n\ +\t\t\t\t\tif ( elem.addEventListener ) {\n\ +\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\ +\n\ +\t\t\t\t\t} else if ( elem.attachEvent ) {\n\ +\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( special.add ) {\n\ +\t\t\t\tspecial.add.call( elem, handleObj );\n\ +\n\ +\t\t\t\tif ( !handleObj.handler.guid ) {\n\ +\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add to the element's handler list, delegates in front\n\ +\t\t\tif ( selector ) {\n\ +\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\ +\t\t\t} else {\n\ +\t\t\t\thandlers.push( handleObj );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Keep track of which events have ever been used, for event optimization\n\ +\t\t\tjQuery.event.global[ type ] = true;\n\ +\t\t}\n\ +\n\ +\t\t// Nullify elem to prevent memory leaks in IE\n\ +\t\telem = null;\n\ +\t},\n\ +\n\ +\t// Detach an event or set of events from an element\n\ +\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\ +\t\tvar j, handleObj, tmp,\n\ +\t\t\torigCount, t, events,\n\ +\t\t\tspecial, handlers, type,\n\ +\t\t\tnamespaces, origType,\n\ +\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\ +\n\ +\t\tif ( !elemData || !(events = elemData.events) ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Once for each type.namespace in types; type may be omitted\n\ +\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\ +\t\tt = types.length;\n\ +\t\twhile ( t-- ) {\n\ +\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\ +\t\t\ttype = origType = tmp[1];\n\ +\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\ +\n\ +\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\ +\t\t\tif ( !type ) {\n\ +\t\t\t\tfor ( type in events ) {\n\ +\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\ +\t\t\t\t}\n\ +\t\t\t\tcontinue;\n\ +\t\t\t}\n\ +\n\ +\t\t\tspecial = jQuery.event.special[ type ] || {};\n\ +\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\ +\t\t\thandlers = events[ type ] || [];\n\ +\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\ +\n\ +\t\t\t// Remove matching events\n\ +\t\t\torigCount = j = handlers.length;\n\ +\t\t\twhile ( j-- ) {\n\ +\t\t\t\thandleObj = handlers[ j ];\n\ +\n\ +\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\ +\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\ +\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\ +\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\ +\t\t\t\t\thandlers.splice( j, 1 );\n\ +\n\ +\t\t\t\t\tif ( handleObj.selector ) {\n\ +\t\t\t\t\t\thandlers.delegateCount--;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tif ( special.remove ) {\n\ +\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\ +\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\ +\t\t\tif ( origCount && !handlers.length ) {\n\ +\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\ +\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tdelete events[ type ];\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Remove the expando if it's no longer used\n\ +\t\tif ( jQuery.isEmptyObject( events ) ) {\n\ +\t\t\tdelete elemData.handle;\n\ +\n\ +\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\ +\t\t\t// so use it instead of delete\n\ +\t\t\tjQuery._removeData( elem, \"events\" );\n\ +\t\t}\n\ +\t},\n\ +\n\ +\ttrigger: function( event, data, elem, onlyHandlers ) {\n\ +\t\tvar handle, ontype, cur,\n\ +\t\t\tbubbleType, special, tmp, i,\n\ +\t\t\teventPath = [ elem || document ],\n\ +\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\ +\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\ +\n\ +\t\tcur = tmp = elem = elem || document;\n\ +\n\ +\t\t// Don't do events on text and comment nodes\n\ +\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\ +\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\tif ( type.indexOf(\".\") >= 0 ) {\n\ +\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\ +\t\t\tnamespaces = type.split(\".\");\n\ +\t\t\ttype = namespaces.shift();\n\ +\t\t\tnamespaces.sort();\n\ +\t\t}\n\ +\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\ +\n\ +\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\ +\t\tevent = event[ jQuery.expando ] ?\n\ +\t\t\tevent :\n\ +\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\ +\n\ +\t\tevent.isTrigger = true;\n\ +\t\tevent.namespace = namespaces.join(\".\");\n\ +\t\tevent.namespace_re = event.namespace ?\n\ +\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\ +\t\t\tnull;\n\ +\n\ +\t\t// Clean up the event in case it is being reused\n\ +\t\tevent.result = undefined;\n\ +\t\tif ( !event.target ) {\n\ +\t\t\tevent.target = elem;\n\ +\t\t}\n\ +\n\ +\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\ +\t\tdata = data == null ?\n\ +\t\t\t[ event ] :\n\ +\t\t\tjQuery.makeArray( data, [ event ] );\n\ +\n\ +\t\t// Allow special events to draw outside the lines\n\ +\t\tspecial = jQuery.event.special[ type ] || {};\n\ +\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\ +\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\ +\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\ +\n\ +\t\t\tbubbleType = special.delegateType || type;\n\ +\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\ +\t\t\t\tcur = cur.parentNode;\n\ +\t\t\t}\n\ +\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\ +\t\t\t\teventPath.push( cur );\n\ +\t\t\t\ttmp = cur;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\ +\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\ +\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Fire handlers on the event path\n\ +\t\ti = 0;\n\ +\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\ +\n\ +\t\t\tevent.type = i > 1 ?\n\ +\t\t\t\tbubbleType :\n\ +\t\t\t\tspecial.bindType || type;\n\ +\n\ +\t\t\t// jQuery handler\n\ +\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\ +\t\t\tif ( handle ) {\n\ +\t\t\t\thandle.apply( cur, data );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Native handler\n\ +\t\t\thandle = ontype && cur[ ontype ];\n\ +\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\ +\t\t\t\tevent.preventDefault();\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\tevent.type = type;\n\ +\n\ +\t\t// If nobody prevented the default action, do it now\n\ +\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\ +\n\ +\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\ +\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\ +\n\ +\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\ +\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\ +\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\ +\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\ +\n\ +\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\ +\t\t\t\t\ttmp = elem[ ontype ];\n\ +\n\ +\t\t\t\t\tif ( tmp ) {\n\ +\t\t\t\t\t\telem[ ontype ] = null;\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\ +\t\t\t\t\tjQuery.event.triggered = type;\n\ +\t\t\t\t\ttry {\n\ +\t\t\t\t\t\telem[ type ]();\n\ +\t\t\t\t\t} catch ( e ) {\n\ +\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\ +\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tjQuery.event.triggered = undefined;\n\ +\n\ +\t\t\t\t\tif ( tmp ) {\n\ +\t\t\t\t\t\telem[ ontype ] = tmp;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn event.result;\n\ +\t},\n\ +\n\ +\tdispatch: function( event ) {\n\ +\n\ +\t\t// Make a writable jQuery.Event from the native event object\n\ +\t\tevent = jQuery.event.fix( event );\n\ +\n\ +\t\tvar i, ret, handleObj, matched, j,\n\ +\t\t\thandlerQueue = [],\n\ +\t\t\targs = core_slice.call( arguments ),\n\ +\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\ +\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\ +\n\ +\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\ +\t\targs[0] = event;\n\ +\t\tevent.delegateTarget = this;\n\ +\n\ +\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\ +\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Determine handlers\n\ +\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\ +\n\ +\t\t// Run delegates first; they may want to stop propagation beneath us\n\ +\t\ti = 0;\n\ +\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\ +\t\t\tevent.currentTarget = matched.elem;\n\ +\n\ +\t\t\tj = 0;\n\ +\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\ +\n\ +\t\t\t\t// Triggered event must either 1) have no namespace, or\n\ +\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\ +\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\ +\n\ +\t\t\t\t\tevent.handleObj = handleObj;\n\ +\t\t\t\t\tevent.data = handleObj.data;\n\ +\n\ +\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\ +\t\t\t\t\t\t\t.apply( matched.elem, args );\n\ +\n\ +\t\t\t\t\tif ( ret !== undefined ) {\n\ +\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\ +\t\t\t\t\t\t\tevent.preventDefault();\n\ +\t\t\t\t\t\t\tevent.stopPropagation();\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Call the postDispatch hook for the mapped type\n\ +\t\tif ( special.postDispatch ) {\n\ +\t\t\tspecial.postDispatch.call( this, event );\n\ +\t\t}\n\ +\n\ +\t\treturn event.result;\n\ +\t},\n\ +\n\ +\thandlers: function( event, handlers ) {\n\ +\t\tvar sel, handleObj, matches, i,\n\ +\t\t\thandlerQueue = [],\n\ +\t\t\tdelegateCount = handlers.delegateCount,\n\ +\t\t\tcur = event.target;\n\ +\n\ +\t\t// Find delegate handlers\n\ +\t\t// Black-hole SVG <use> instance trees (#13180)\n\ +\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\ +\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\ +\n\ +\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\ +\n\ +\t\t\t\t// Don't check non-elements (#13208)\n\ +\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\ +\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\ +\t\t\t\t\tmatches = [];\n\ +\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\ +\t\t\t\t\t\thandleObj = handlers[ i ];\n\ +\n\ +\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\ +\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\ +\n\ +\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\ +\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\ +\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\ +\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t\tif ( matches[ sel ] ) {\n\ +\t\t\t\t\t\t\tmatches.push( handleObj );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tif ( matches.length ) {\n\ +\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Add the remaining (directly-bound) handlers\n\ +\t\tif ( delegateCount < handlers.length ) {\n\ +\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\ +\t\t}\n\ +\n\ +\t\treturn handlerQueue;\n\ +\t},\n\ +\n\ +\tfix: function( event ) {\n\ +\t\tif ( event[ jQuery.expando ] ) {\n\ +\t\t\treturn event;\n\ +\t\t}\n\ +\n\ +\t\t// Create a writable copy of the event object and normalize some properties\n\ +\t\tvar i, prop, copy,\n\ +\t\t\ttype = event.type,\n\ +\t\t\toriginalEvent = event,\n\ +\t\t\tfixHook = this.fixHooks[ type ];\n\ +\n\ +\t\tif ( !fixHook ) {\n\ +\t\t\tthis.fixHooks[ type ] = fixHook =\n\ +\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\ +\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\ +\t\t\t\t{};\n\ +\t\t}\n\ +\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\ +\n\ +\t\tevent = new jQuery.Event( originalEvent );\n\ +\n\ +\t\ti = copy.length;\n\ +\t\twhile ( i-- ) {\n\ +\t\t\tprop = copy[ i ];\n\ +\t\t\tevent[ prop ] = originalEvent[ prop ];\n\ +\t\t}\n\ +\n\ +\t\t// Support: IE<9\n\ +\t\t// Fix target property (#1925)\n\ +\t\tif ( !event.target ) {\n\ +\t\t\tevent.target = originalEvent.srcElement || document;\n\ +\t\t}\n\ +\n\ +\t\t// Support: Chrome 23+, Safari?\n\ +\t\t// Target should not be a text node (#504, #13143)\n\ +\t\tif ( event.target.nodeType === 3 ) {\n\ +\t\t\tevent.target = event.target.parentNode;\n\ +\t\t}\n\ +\n\ +\t\t// Support: IE<9\n\ +\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\ +\t\tevent.metaKey = !!event.metaKey;\n\ +\n\ +\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\ +\t},\n\ +\n\ +\t// Includes some event props shared by KeyEvent and MouseEvent\n\ +\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\ +\n\ +\tfixHooks: {},\n\ +\n\ +\tkeyHooks: {\n\ +\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\ +\t\tfilter: function( event, original ) {\n\ +\n\ +\t\t\t// Add which for key events\n\ +\t\t\tif ( event.which == null ) {\n\ +\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn event;\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tmouseHooks: {\n\ +\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\ +\t\tfilter: function( event, original ) {\n\ +\t\t\tvar body, eventDoc, doc,\n\ +\t\t\t\tbutton = original.button,\n\ +\t\t\t\tfromElement = original.fromElement;\n\ +\n\ +\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\ +\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\ +\t\t\t\teventDoc = event.target.ownerDocument || document;\n\ +\t\t\t\tdoc = eventDoc.documentElement;\n\ +\t\t\t\tbody = eventDoc.body;\n\ +\n\ +\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\ +\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add relatedTarget, if necessary\n\ +\t\t\tif ( !event.relatedTarget && fromElement ) {\n\ +\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\ +\t\t\t// Note: button is not normalized, so don't use it\n\ +\t\t\tif ( !event.which && button !== undefined ) {\n\ +\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn event;\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tspecial: {\n\ +\t\tload: {\n\ +\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\ +\t\t\tnoBubble: true\n\ +\t\t},\n\ +\t\tclick: {\n\ +\t\t\t// For checkbox, fire native event so checked state will be right\n\ +\t\t\ttrigger: function() {\n\ +\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\ +\t\t\t\t\tthis.click();\n\ +\t\t\t\t\treturn false;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t},\n\ +\t\tfocus: {\n\ +\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\ +\t\t\ttrigger: function() {\n\ +\t\t\t\tif ( this !== document.activeElement && this.focus ) {\n\ +\t\t\t\t\ttry {\n\ +\t\t\t\t\t\tthis.focus();\n\ +\t\t\t\t\t\treturn false;\n\ +\t\t\t\t\t} catch ( e ) {\n\ +\t\t\t\t\t\t// Support: IE<9\n\ +\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\ +\t\t\t\t\t\t// let .trigger() run the handlers\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t},\n\ +\t\t\tdelegateType: \"focusin\"\n\ +\t\t},\n\ +\t\tblur: {\n\ +\t\t\ttrigger: function() {\n\ +\t\t\t\tif ( this === document.activeElement && this.blur ) {\n\ +\t\t\t\t\tthis.blur();\n\ +\t\t\t\t\treturn false;\n\ +\t\t\t\t}\n\ +\t\t\t},\n\ +\t\t\tdelegateType: \"focusout\"\n\ +\t\t},\n\ +\n\ +\t\tbeforeunload: {\n\ +\t\t\tpostDispatch: function( event ) {\n\ +\n\ +\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\ +\t\t\t\tif ( event.result !== undefined ) {\n\ +\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tsimulate: function( type, elem, event, bubble ) {\n\ +\t\t// Piggyback on a donor event to simulate a different one.\n\ +\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\ +\t\t// simulated event prevents default then we do the same on the donor.\n\ +\t\tvar e = jQuery.extend(\n\ +\t\t\tnew jQuery.Event(),\n\ +\t\t\tevent,\n\ +\t\t\t{ type: type,\n\ +\t\t\t\tisSimulated: true,\n\ +\t\t\t\toriginalEvent: {}\n\ +\t\t\t}\n\ +\t\t);\n\ +\t\tif ( bubble ) {\n\ +\t\t\tjQuery.event.trigger( e, null, elem );\n\ +\t\t} else {\n\ +\t\t\tjQuery.event.dispatch.call( elem, e );\n\ +\t\t}\n\ +\t\tif ( e.isDefaultPrevented() ) {\n\ +\t\t\tevent.preventDefault();\n\ +\t\t}\n\ +\t}\n\ +};\n\ +\n\ +jQuery.removeEvent = document.removeEventListener ?\n\ +\tfunction( elem, type, handle ) {\n\ +\t\tif ( elem.removeEventListener ) {\n\ +\t\t\telem.removeEventListener( type, handle, false );\n\ +\t\t}\n\ +\t} :\n\ +\tfunction( elem, type, handle ) {\n\ +\t\tvar name = \"on\" + type;\n\ +\n\ +\t\tif ( elem.detachEvent ) {\n\ +\n\ +\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\ +\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\ +\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\ +\t\t\t\telem[ name ] = null;\n\ +\t\t\t}\n\ +\n\ +\t\t\telem.detachEvent( name, handle );\n\ +\t\t}\n\ +\t};\n\ +\n\ +jQuery.Event = function( src, props ) {\n\ +\t// Allow instantiation without the 'new' keyword\n\ +\tif ( !(this instanceof jQuery.Event) ) {\n\ +\t\treturn new jQuery.Event( src, props );\n\ +\t}\n\ +\n\ +\t// Event object\n\ +\tif ( src && src.type ) {\n\ +\t\tthis.originalEvent = src;\n\ +\t\tthis.type = src.type;\n\ +\n\ +\t\t// Events bubbling up the document may have been marked as prevented\n\ +\t\t// by a handler lower down the tree; reflect the correct value.\n\ +\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\ +\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\ +\n\ +\t// Event type\n\ +\t} else {\n\ +\t\tthis.type = src;\n\ +\t}\n\ +\n\ +\t// Put explicitly provided properties onto the event object\n\ +\tif ( props ) {\n\ +\t\tjQuery.extend( this, props );\n\ +\t}\n\ +\n\ +\t// Create a timestamp if incoming event doesn't have one\n\ +\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\ +\n\ +\t// Mark it as fixed\n\ +\tthis[ jQuery.expando ] = true;\n\ +};\n\ +\n\ +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n\ +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n\ +jQuery.Event.prototype = {\n\ +\tisDefaultPrevented: returnFalse,\n\ +\tisPropagationStopped: returnFalse,\n\ +\tisImmediatePropagationStopped: returnFalse,\n\ +\n\ +\tpreventDefault: function() {\n\ +\t\tvar e = this.originalEvent;\n\ +\n\ +\t\tthis.isDefaultPrevented = returnTrue;\n\ +\t\tif ( !e ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// If preventDefault exists, run it on the original event\n\ +\t\tif ( e.preventDefault ) {\n\ +\t\t\te.preventDefault();\n\ +\n\ +\t\t// Support: IE\n\ +\t\t// Otherwise set the returnValue property of the original event to false\n\ +\t\t} else {\n\ +\t\t\te.returnValue = false;\n\ +\t\t}\n\ +\t},\n\ +\tstopPropagation: function() {\n\ +\t\tvar e = this.originalEvent;\n\ +\n\ +\t\tthis.isPropagationStopped = returnTrue;\n\ +\t\tif ( !e ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\t\t// If stopPropagation exists, run it on the original event\n\ +\t\tif ( e.stopPropagation ) {\n\ +\t\t\te.stopPropagation();\n\ +\t\t}\n\ +\n\ +\t\t// Support: IE\n\ +\t\t// Set the cancelBubble property of the original event to true\n\ +\t\te.cancelBubble = true;\n\ +\t},\n\ +\tstopImmediatePropagation: function() {\n\ +\t\tthis.isImmediatePropagationStopped = returnTrue;\n\ +\t\tthis.stopPropagation();\n\ +\t}\n\ +};\n\ +\n\ +// Create mouseenter/leave events using mouseover/out and event-time checks\n\ +jQuery.each({\n\ +\tmouseenter: \"mouseover\",\n\ +\tmouseleave: \"mouseout\"\n\ +}, function( orig, fix ) {\n\ +\tjQuery.event.special[ orig ] = {\n\ +\t\tdelegateType: fix,\n\ +\t\tbindType: fix,\n\ +\n\ +\t\thandle: function( event ) {\n\ +\t\t\tvar ret,\n\ +\t\t\t\ttarget = this,\n\ +\t\t\t\trelated = event.relatedTarget,\n\ +\t\t\t\thandleObj = event.handleObj;\n\ +\n\ +\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\ +\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\ +\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\ +\t\t\t\tevent.type = handleObj.origType;\n\ +\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\ +\t\t\t\tevent.type = fix;\n\ +\t\t\t}\n\ +\t\t\treturn ret;\n\ +\t\t}\n\ +\t};\n\ +});\n\ +\n\ +// IE submit delegation\n\ +if ( !jQuery.support.submitBubbles ) {\n\ +\n\ +\tjQuery.event.special.submit = {\n\ +\t\tsetup: function() {\n\ +\t\t\t// Only need this for delegated form submit events\n\ +\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\ +\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\ +\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\ +\t\t\t\tvar elem = e.target,\n\ +\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\ +\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\ +\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\ +\t\t\t\t\t\tevent._submit_bubble = true;\n\ +\t\t\t\t\t});\n\ +\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\ +\t\t\t\t}\n\ +\t\t\t});\n\ +\t\t\t// return undefined since we don't need an event listener\n\ +\t\t},\n\ +\n\ +\t\tpostDispatch: function( event ) {\n\ +\t\t\t// If form was submitted by the user, bubble the event up the tree\n\ +\t\t\tif ( event._submit_bubble ) {\n\ +\t\t\t\tdelete event._submit_bubble;\n\ +\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\ +\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t},\n\ +\n\ +\t\tteardown: function() {\n\ +\t\t\t// Only need this for delegated form submit events\n\ +\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\ +\t\t\tjQuery.event.remove( this, \"._submit\" );\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// IE change delegation and checkbox/radio fix\n\ +if ( !jQuery.support.changeBubbles ) {\n\ +\n\ +\tjQuery.event.special.change = {\n\ +\n\ +\t\tsetup: function() {\n\ +\n\ +\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\ +\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\ +\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\ +\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\ +\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\ +\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\ +\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\ +\t\t\t\t\t\t\tthis._just_changed = true;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t});\n\ +\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\ +\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\ +\t\t\t\t\t\t\tthis._just_changed = false;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\ +\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\ +\t\t\t\t\t});\n\ +\t\t\t\t}\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\ +\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\ +\t\t\t\tvar elem = e.target;\n\ +\n\ +\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\ +\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\ +\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\ +\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t});\n\ +\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\ +\t\t\t\t}\n\ +\t\t\t});\n\ +\t\t},\n\ +\n\ +\t\thandle: function( event ) {\n\ +\t\t\tvar elem = event.target;\n\ +\n\ +\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\ +\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\ +\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\ +\t\t\t}\n\ +\t\t},\n\ +\n\ +\t\tteardown: function() {\n\ +\t\t\tjQuery.event.remove( this, \"._change\" );\n\ +\n\ +\t\t\treturn !rformElems.test( this.nodeName );\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// Create \"bubbling\" focus and blur events\n\ +if ( !jQuery.support.focusinBubbles ) {\n\ +\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\ +\n\ +\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\ +\t\tvar attaches = 0,\n\ +\t\t\thandler = function( event ) {\n\ +\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\ +\t\t\t};\n\ +\n\ +\t\tjQuery.event.special[ fix ] = {\n\ +\t\t\tsetup: function() {\n\ +\t\t\t\tif ( attaches++ === 0 ) {\n\ +\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\ +\t\t\t\t}\n\ +\t\t\t},\n\ +\t\t\tteardown: function() {\n\ +\t\t\t\tif ( --attaches === 0 ) {\n\ +\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t};\n\ +\t});\n\ +}\n\ +\n\ +jQuery.fn.extend({\n\ +\n\ +\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\ +\t\tvar type, origFn;\n\ +\n\ +\t\t// Types can be a map of types/handlers\n\ +\t\tif ( typeof types === \"object\" ) {\n\ +\t\t\t// ( types-Object, selector, data )\n\ +\t\t\tif ( typeof selector !== \"string\" ) {\n\ +\t\t\t\t// ( types-Object, data )\n\ +\t\t\t\tdata = data || selector;\n\ +\t\t\t\tselector = undefined;\n\ +\t\t\t}\n\ +\t\t\tfor ( type in types ) {\n\ +\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\ +\t\t\t}\n\ +\t\t\treturn this;\n\ +\t\t}\n\ +\n\ +\t\tif ( data == null && fn == null ) {\n\ +\t\t\t// ( types, fn )\n\ +\t\t\tfn = selector;\n\ +\t\t\tdata = selector = undefined;\n\ +\t\t} else if ( fn == null ) {\n\ +\t\t\tif ( typeof selector === \"string\" ) {\n\ +\t\t\t\t// ( types, selector, fn )\n\ +\t\t\t\tfn = data;\n\ +\t\t\t\tdata = undefined;\n\ +\t\t\t} else {\n\ +\t\t\t\t// ( types, data, fn )\n\ +\t\t\t\tfn = data;\n\ +\t\t\t\tdata = selector;\n\ +\t\t\t\tselector = undefined;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\tif ( fn === false ) {\n\ +\t\t\tfn = returnFalse;\n\ +\t\t} else if ( !fn ) {\n\ +\t\t\treturn this;\n\ +\t\t}\n\ +\n\ +\t\tif ( one === 1 ) {\n\ +\t\t\torigFn = fn;\n\ +\t\t\tfn = function( event ) {\n\ +\t\t\t\t// Can use an empty set, since event contains the info\n\ +\t\t\t\tjQuery().off( event );\n\ +\t\t\t\treturn origFn.apply( this, arguments );\n\ +\t\t\t};\n\ +\t\t\t// Use same guid so caller can remove using origFn\n\ +\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\ +\t\t}\n\ +\t\treturn this.each( function() {\n\ +\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\ +\t\t});\n\ +\t},\n\ +\tone: function( types, selector, data, fn ) {\n\ +\t\treturn this.on( types, selector, data, fn, 1 );\n\ +\t},\n\ +\toff: function( types, selector, fn ) {\n\ +\t\tvar handleObj, type;\n\ +\t\tif ( types && types.preventDefault && types.handleObj ) {\n\ +\t\t\t// ( event ) dispatched jQuery.Event\n\ +\t\t\thandleObj = types.handleObj;\n\ +\t\t\tjQuery( types.delegateTarget ).off(\n\ +\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\ +\t\t\t\thandleObj.selector,\n\ +\t\t\t\thandleObj.handler\n\ +\t\t\t);\n\ +\t\t\treturn this;\n\ +\t\t}\n\ +\t\tif ( typeof types === \"object\" ) {\n\ +\t\t\t// ( types-object [, selector] )\n\ +\t\t\tfor ( type in types ) {\n\ +\t\t\t\tthis.off( type, selector, types[ type ] );\n\ +\t\t\t}\n\ +\t\t\treturn this;\n\ +\t\t}\n\ +\t\tif ( selector === false || typeof selector === \"function\" ) {\n\ +\t\t\t// ( types [, fn] )\n\ +\t\t\tfn = selector;\n\ +\t\t\tselector = undefined;\n\ +\t\t}\n\ +\t\tif ( fn === false ) {\n\ +\t\t\tfn = returnFalse;\n\ +\t\t}\n\ +\t\treturn this.each(function() {\n\ +\t\t\tjQuery.event.remove( this, types, fn, selector );\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tbind: function( types, data, fn ) {\n\ +\t\treturn this.on( types, null, data, fn );\n\ +\t},\n\ +\tunbind: function( types, fn ) {\n\ +\t\treturn this.off( types, null, fn );\n\ +\t},\n\ +\n\ +\tdelegate: function( selector, types, data, fn ) {\n\ +\t\treturn this.on( types, selector, data, fn );\n\ +\t},\n\ +\tundelegate: function( selector, types, fn ) {\n\ +\t\t// ( namespace ) or ( selector, types [, fn] )\n\ +\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\ +\t},\n\ +\n\ +\ttrigger: function( type, data ) {\n\ +\t\treturn this.each(function() {\n\ +\t\t\tjQuery.event.trigger( type, data, this );\n\ +\t\t});\n\ +\t},\n\ +\ttriggerHandler: function( type, data ) {\n\ +\t\tvar elem = this[0];\n\ +\t\tif ( elem ) {\n\ +\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\ +\t\t}\n\ +\t}\n\ +});\n\ +/*!\n\ + * Sizzle CSS Selector Engine\n\ + * Copyright 2012 jQuery Foundation and other contributors\n\ + * Released under the MIT license\n\ + * http://sizzlejs.com/\n\ + */\n\ +(function( window, undefined ) {\n\ +\n\ +var i,\n\ +\tcachedruns,\n\ +\tExpr,\n\ +\tgetText,\n\ +\tisXML,\n\ +\tcompile,\n\ +\thasDuplicate,\n\ +\toutermostContext,\n\ +\n\ +\t// Local document vars\n\ +\tsetDocument,\n\ +\tdocument,\n\ +\tdocElem,\n\ +\tdocumentIsXML,\n\ +\trbuggyQSA,\n\ +\trbuggyMatches,\n\ +\tmatches,\n\ +\tcontains,\n\ +\tsortOrder,\n\ +\n\ +\t// Instance-specific data\n\ +\texpando = \"sizzle\" + -(new Date()),\n\ +\tpreferredDoc = window.document,\n\ +\tsupport = {},\n\ +\tdirruns = 0,\n\ +\tdone = 0,\n\ +\tclassCache = createCache(),\n\ +\ttokenCache = createCache(),\n\ +\tcompilerCache = createCache(),\n\ +\n\ +\t// General-purpose constants\n\ +\tstrundefined = typeof undefined,\n\ +\tMAX_NEGATIVE = 1 << 31,\n\ +\n\ +\t// Array methods\n\ +\tarr = [],\n\ +\tpop = arr.pop,\n\ +\tpush = arr.push,\n\ +\tslice = arr.slice,\n\ +\t// Use a stripped-down indexOf if we can't use a native one\n\ +\tindexOf = arr.indexOf || function( elem ) {\n\ +\t\tvar i = 0,\n\ +\t\t\tlen = this.length;\n\ +\t\tfor ( ; i < len; i++ ) {\n\ +\t\t\tif ( this[i] === elem ) {\n\ +\t\t\t\treturn i;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\treturn -1;\n\ +\t},\n\ +\n\ +\n\ +\t// Regular expressions\n\ +\n\ +\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\ +\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\ +\\\\f]\",\n\ +\t// http://www.w3.org/TR/css3-syntax/#characters\n\ +\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\ +\n\ +\t// Loosely modeled on CSS identifier characters\n\ +\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\ +\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\ +\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\ +\n\ +\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\ +\toperators = \"([*^$|!~]?=)\",\n\ +\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\ +\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\ +\n\ +\t// Prefer arguments quoted,\n\ +\t// then not containing pseudos/brackets,\n\ +\t// then attribute selectors/non-parenthetical expressions,\n\ +\t// then anything else\n\ +\t// These preferences are here to reduce the number of selectors\n\ +\t// needing tokenize in the PSEUDO preFilter\n\ +\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\ +\n\ +\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\ +\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\ +\n\ +\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\ +\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\ +\\\\f>+~])\" + whitespace + \"*\" ),\n\ +\trpseudo = new RegExp( pseudos ),\n\ +\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\ +\n\ +\tmatchExpr = {\n\ +\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\ +\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\ +\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\ +\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\ +\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\ +\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\ +\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\ +\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\ +\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\ +\t\t// For use in libraries implementing .is()\n\ +\t\t// We use this for POS matching in `select`\n\ +\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\ +\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\ +\t},\n\ +\n\ +\trsibling = /[\\x20\\t\\r\\n\ +\\f]*[+~]/,\n\ +\n\ +\trnative = /^[^{]+\\{\\s*\\[native code/,\n\ +\n\ +\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\ +\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\ +\n\ +\trinputs = /^(?:input|select|textarea|button)$/i,\n\ +\trheader = /^h\\d$/i,\n\ +\n\ +\trescape = /'|\\\\/g,\n\ +\trattributeQuotes = /\\=[\\x20\\t\\r\\n\ +\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\ +\\f]*\\]/g,\n\ +\n\ +\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\ +\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\ +\\f]?|.)/g,\n\ +\tfunescape = function( _, escaped ) {\n\ +\t\tvar high = \"0x\" + escaped - 0x10000;\n\ +\t\t// NaN means non-codepoint\n\ +\t\treturn high !== high ?\n\ +\t\t\tescaped :\n\ +\t\t\t// BMP codepoint\n\ +\t\t\thigh < 0 ?\n\ +\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\ +\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\ +\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\ +\t};\n\ +\n\ +// Use a stripped-down slice if we can't use a native one\n\ +try {\n\ +\tslice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;\n\ +} catch ( e ) {\n\ +\tslice = function( i ) {\n\ +\t\tvar elem,\n\ +\t\t\tresults = [];\n\ +\t\twhile ( (elem = this[i++]) ) {\n\ +\t\t\tresults.push( elem );\n\ +\t\t}\n\ +\t\treturn results;\n\ +\t};\n\ +}\n\ +\n\ +/**\n\ + * For feature detection\n\ + * @param {Function} fn The function to test for native support\n\ + */\n\ +function isNative( fn ) {\n\ +\treturn rnative.test( fn + \"\" );\n\ +}\n\ +\n\ +/**\n\ + * Create key-value caches of limited size\n\ + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n\ + *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n\ + *\tdeleting the oldest entry\n\ + */\n\ +function createCache() {\n\ +\tvar cache,\n\ +\t\tkeys = [];\n\ +\n\ +\treturn (cache = function( key, value ) {\n\ +\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\ +\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\ +\t\t\t// Only keep the most recent entries\n\ +\t\t\tdelete cache[ keys.shift() ];\n\ +\t\t}\n\ +\t\treturn (cache[ key ] = value);\n\ +\t});\n\ +}\n\ +\n\ +/**\n\ + * Mark a function for special use by Sizzle\n\ + * @param {Function} fn The function to mark\n\ + */\n\ +function markFunction( fn ) {\n\ +\tfn[ expando ] = true;\n\ +\treturn fn;\n\ +}\n\ +\n\ +/**\n\ + * Support testing using an element\n\ + * @param {Function} fn Passed the created div and expects a boolean result\n\ + */\n\ +function assert( fn ) {\n\ +\tvar div = document.createElement(\"div\");\n\ +\n\ +\ttry {\n\ +\t\treturn fn( div );\n\ +\t} catch (e) {\n\ +\t\treturn false;\n\ +\t} finally {\n\ +\t\t// release memory in IE\n\ +\t\tdiv = null;\n\ +\t}\n\ +}\n\ +\n\ +function Sizzle( selector, context, results, seed ) {\n\ +\tvar match, elem, m, nodeType,\n\ +\t\t// QSA vars\n\ +\t\ti, groups, old, nid, newContext, newSelector;\n\ +\n\ +\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\ +\t\tsetDocument( context );\n\ +\t}\n\ +\n\ +\tcontext = context || document;\n\ +\tresults = results || [];\n\ +\n\ +\tif ( !selector || typeof selector !== \"string\" ) {\n\ +\t\treturn results;\n\ +\t}\n\ +\n\ +\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\ +\t\treturn [];\n\ +\t}\n\ +\n\ +\tif ( !documentIsXML && !seed ) {\n\ +\n\ +\t\t// Shortcuts\n\ +\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\ +\t\t\t// Speed-up: Sizzle(\"#ID\")\n\ +\t\t\tif ( (m = match[1]) ) {\n\ +\t\t\t\tif ( nodeType === 9 ) {\n\ +\t\t\t\t\telem = context.getElementById( m );\n\ +\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\ +\t\t\t\t\t// nodes that are no longer in the document #6963\n\ +\t\t\t\t\tif ( elem && elem.parentNode ) {\n\ +\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\ +\t\t\t\t\t\t// by name instead of ID\n\ +\t\t\t\t\t\tif ( elem.id === m ) {\n\ +\t\t\t\t\t\t\tresults.push( elem );\n\ +\t\t\t\t\t\t\treturn results;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\treturn results;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\t// Context is not a document\n\ +\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\ +\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\ +\t\t\t\t\t\tresults.push( elem );\n\ +\t\t\t\t\t\treturn results;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t// Speed-up: Sizzle(\"TAG\")\n\ +\t\t\t} else if ( match[2] ) {\n\ +\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\ +\t\t\t\treturn results;\n\ +\n\ +\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\ +\t\t\t} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {\n\ +\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\ +\t\t\t\treturn results;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// QSA path\n\ +\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\ +\t\t\told = true;\n\ +\t\t\tnid = expando;\n\ +\t\t\tnewContext = context;\n\ +\t\t\tnewSelector = nodeType === 9 && selector;\n\ +\n\ +\t\t\t// qSA works strangely on Element-rooted queries\n\ +\t\t\t// We can work around this by specifying an extra ID on the root\n\ +\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\ +\t\t\t// IE 8 doesn't work on object elements\n\ +\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\ +\t\t\t\tgroups = tokenize( selector );\n\ +\n\ +\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\ +\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\ +\t\t\t\t}\n\ +\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\ +\n\ +\t\t\t\ti = groups.length;\n\ +\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\ +\t\t\t\t}\n\ +\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\ +\t\t\t\tnewSelector = groups.join(\",\");\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( newSelector ) {\n\ +\t\t\t\ttry {\n\ +\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\ +\t\t\t\t\t\tnewSelector\n\ +\t\t\t\t\t), 0 ) );\n\ +\t\t\t\t\treturn results;\n\ +\t\t\t\t} catch(qsaError) {\n\ +\t\t\t\t} finally {\n\ +\t\t\t\t\tif ( !old ) {\n\ +\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// All others\n\ +\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n\ +}\n\ +\n\ +/**\n\ + * Detect xml\n\ + * @param {Element|Object} elem An element or a document\n\ + */\n\ +isXML = Sizzle.isXML = function( elem ) {\n\ +\t// documentElement is verified for cases where it doesn't yet exist\n\ +\t// (such as loading iframes in IE - #4833)\n\ +\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\ +\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n\ +};\n\ +\n\ +/**\n\ + * Sets document-related variables once based on the current document\n\ + * @param {Element|Object} [doc] An element or document object to use to set the document\n\ + * @returns {Object} Returns the current document\n\ + */\n\ +setDocument = Sizzle.setDocument = function( node ) {\n\ +\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\ +\n\ +\t// If no document and documentElement is available, return\n\ +\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\ +\t\treturn document;\n\ +\t}\n\ +\n\ +\t// Set our document\n\ +\tdocument = doc;\n\ +\tdocElem = doc.documentElement;\n\ +\n\ +\t// Support tests\n\ +\tdocumentIsXML = isXML( doc );\n\ +\n\ +\t// Check if getElementsByTagName(\"*\") returns only elements\n\ +\tsupport.tagNameNoComments = assert(function( div ) {\n\ +\t\tdiv.appendChild( doc.createComment(\"\") );\n\ +\t\treturn !div.getElementsByTagName(\"*\").length;\n\ +\t});\n\ +\n\ +\t// Check if attributes should be retrieved by attribute nodes\n\ +\tsupport.attributes = assert(function( div ) {\n\ +\t\tdiv.innerHTML = \"<select></select>\";\n\ +\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\ +\t\t// IE8 returns a string for some attributes even when not present\n\ +\t\treturn type !== \"boolean\" && type !== \"string\";\n\ +\t});\n\ +\n\ +\t// Check if getElementsByClassName can be trusted\n\ +\tsupport.getByClassName = assert(function( div ) {\n\ +\t\t// Opera can't find a second classname (in 9.6)\n\ +\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\ +\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\ +\t\t\treturn false;\n\ +\t\t}\n\ +\n\ +\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\ +\t\tdiv.lastChild.className = \"e\";\n\ +\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\ +\t});\n\ +\n\ +\t// Check if getElementById returns elements by name\n\ +\t// Check if getElementsByName privileges form controls or returns elements by ID\n\ +\tsupport.getByName = assert(function( div ) {\n\ +\t\t// Inject content\n\ +\t\tdiv.id = expando + 0;\n\ +\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\ +\t\tdocElem.insertBefore( div, docElem.firstChild );\n\ +\n\ +\t\t// Test\n\ +\t\tvar pass = doc.getElementsByName &&\n\ +\t\t\t// buggy browsers will return fewer than the correct 2\n\ +\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\ +\t\t\t// buggy browsers will return more than the correct 0\n\ +\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\ +\t\tsupport.getIdNotName = !doc.getElementById( expando );\n\ +\n\ +\t\t// Cleanup\n\ +\t\tdocElem.removeChild( div );\n\ +\n\ +\t\treturn pass;\n\ +\t});\n\ +\n\ +\t// IE6/7 return modified attributes\n\ +\tExpr.attrHandle = assert(function( div ) {\n\ +\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\ +\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\ +\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\ +\t}) ?\n\ +\t\t{} :\n\ +\t\t{\n\ +\t\t\t\"href\": function( elem ) {\n\ +\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\ +\t\t\t},\n\ +\t\t\t\"type\": function( elem ) {\n\ +\t\t\t\treturn elem.getAttribute(\"type\");\n\ +\t\t\t}\n\ +\t\t};\n\ +\n\ +\t// ID find and filter\n\ +\tif ( support.getIdNotName ) {\n\ +\t\tExpr.find[\"ID\"] = function( id, context ) {\n\ +\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\ +\t\t\t\tvar m = context.getElementById( id );\n\ +\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\ +\t\t\t\t// nodes that are no longer in the document #6963\n\ +\t\t\t\treturn m && m.parentNode ? [m] : [];\n\ +\t\t\t}\n\ +\t\t};\n\ +\t\tExpr.filter[\"ID\"] = function( id ) {\n\ +\t\t\tvar attrId = id.replace( runescape, funescape );\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\ +\t\t\t};\n\ +\t\t};\n\ +\t} else {\n\ +\t\tExpr.find[\"ID\"] = function( id, context ) {\n\ +\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\ +\t\t\t\tvar m = context.getElementById( id );\n\ +\n\ +\t\t\t\treturn m ?\n\ +\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\ +\t\t\t\t\t\t[m] :\n\ +\t\t\t\t\t\tundefined :\n\ +\t\t\t\t\t[];\n\ +\t\t\t}\n\ +\t\t};\n\ +\t\tExpr.filter[\"ID\"] = function( id ) {\n\ +\t\t\tvar attrId = id.replace( runescape, funescape );\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\ +\t\t\t\treturn node && node.value === attrId;\n\ +\t\t\t};\n\ +\t\t};\n\ +\t}\n\ +\n\ +\t// Tag\n\ +\tExpr.find[\"TAG\"] = support.tagNameNoComments ?\n\ +\t\tfunction( tag, context ) {\n\ +\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\ +\t\t\t\treturn context.getElementsByTagName( tag );\n\ +\t\t\t}\n\ +\t\t} :\n\ +\t\tfunction( tag, context ) {\n\ +\t\t\tvar elem,\n\ +\t\t\t\ttmp = [],\n\ +\t\t\t\ti = 0,\n\ +\t\t\t\tresults = context.getElementsByTagName( tag );\n\ +\n\ +\t\t\t// Filter out possible comments\n\ +\t\t\tif ( tag === \"*\" ) {\n\ +\t\t\t\twhile ( (elem = results[i++]) ) {\n\ +\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\ +\t\t\t\t\t\ttmp.push( elem );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\treturn tmp;\n\ +\t\t\t}\n\ +\t\t\treturn results;\n\ +\t\t};\n\ +\n\ +\t// Name\n\ +\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\ +\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\ +\t\t\treturn context.getElementsByName( name );\n\ +\t\t}\n\ +\t};\n\ +\n\ +\t// Class\n\ +\tExpr.find[\"CLASS\"] = support.getByClassName && function( className, context ) {\n\ +\t\tif ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {\n\ +\t\t\treturn context.getElementsByClassName( className );\n\ +\t\t}\n\ +\t};\n\ +\n\ +\t// QSA and matchesSelector support\n\ +\n\ +\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\ +\trbuggyMatches = [];\n\ +\n\ +\t// qSa(:focus) reports false when true (Chrome 21),\n\ +\t// no need to also add to buggyMatches since matches checks buggyQSA\n\ +\t// A support test would require too much code (would include document ready)\n\ +\trbuggyQSA = [ \":focus\" ];\n\ +\n\ +\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\ +\t\t// Build QSA regex\n\ +\t\t// Regex strategy adopted from Diego Perini\n\ +\t\tassert(function( div ) {\n\ +\t\t\t// Select is set to empty string on purpose\n\ +\t\t\t// This is to test IE's treatment of not explictly\n\ +\t\t\t// setting a boolean content attribute,\n\ +\t\t\t// since its presence should be enough\n\ +\t\t\t// http://bugs.jquery.com/ticket/12359\n\ +\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\ +\n\ +\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\ +\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\ +\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Webkit/Opera - :checked should return selected option elements\n\ +\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\ +\t\t\t// IE8 throws error here and will not see later tests\n\ +\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\ +\t\t\t\trbuggyQSA.push(\":checked\");\n\ +\t\t\t}\n\ +\t\t});\n\ +\n\ +\t\tassert(function( div ) {\n\ +\n\ +\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\ +\t\t\t// Should not select anything\n\ +\t\t\tdiv.innerHTML = \"<input type='hidden' i=''/>\";\n\ +\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\ +\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\ +\t\t\t// IE8 throws error here and will not see later tests\n\ +\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\ +\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\ +\t\t\tdiv.querySelectorAll(\"*,:x\");\n\ +\t\t\trbuggyQSA.push(\",.*:\");\n\ +\t\t});\n\ +\t}\n\ +\n\ +\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\ +\t\tdocElem.mozMatchesSelector ||\n\ +\t\tdocElem.webkitMatchesSelector ||\n\ +\t\tdocElem.oMatchesSelector ||\n\ +\t\tdocElem.msMatchesSelector) )) ) {\n\ +\n\ +\t\tassert(function( div ) {\n\ +\t\t\t// Check to see if it's possible to do matchesSelector\n\ +\t\t\t// on a disconnected node (IE 9)\n\ +\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\ +\n\ +\t\t\t// This should fail with an exception\n\ +\t\t\t// Gecko does not error, returns false instead\n\ +\t\t\tmatches.call( div, \"[s!='']:x\" );\n\ +\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\ +\t\t});\n\ +\t}\n\ +\n\ +\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\ +\trbuggyMatches = new RegExp( rbuggyMatches.join(\"|\") );\n\ +\n\ +\t// Element contains another\n\ +\t// Purposefully does not implement inclusive descendent\n\ +\t// As in, an element does not contain itself\n\ +\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\ +\t\tfunction( a, b ) {\n\ +\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\ +\t\t\t\tbup = b && b.parentNode;\n\ +\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\ +\t\t\t\tadown.contains ?\n\ +\t\t\t\t\tadown.contains( bup ) :\n\ +\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\ +\t\t\t));\n\ +\t\t} :\n\ +\t\tfunction( a, b ) {\n\ +\t\t\tif ( b ) {\n\ +\t\t\t\twhile ( (b = b.parentNode) ) {\n\ +\t\t\t\t\tif ( b === a ) {\n\ +\t\t\t\t\t\treturn true;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\treturn false;\n\ +\t\t};\n\ +\n\ +\t// Document order sorting\n\ +\tsortOrder = docElem.compareDocumentPosition ?\n\ +\tfunction( a, b ) {\n\ +\t\tvar compare;\n\ +\n\ +\t\tif ( a === b ) {\n\ +\t\t\thasDuplicate = true;\n\ +\t\t\treturn 0;\n\ +\t\t}\n\ +\n\ +\t\tif ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {\n\ +\t\t\tif ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {\n\ +\t\t\t\tif ( a === doc || contains( preferredDoc, a ) ) {\n\ +\t\t\t\t\treturn -1;\n\ +\t\t\t\t}\n\ +\t\t\t\tif ( b === doc || contains( preferredDoc, b ) ) {\n\ +\t\t\t\t\treturn 1;\n\ +\t\t\t\t}\n\ +\t\t\t\treturn 0;\n\ +\t\t\t}\n\ +\t\t\treturn compare & 4 ? -1 : 1;\n\ +\t\t}\n\ +\n\ +\t\treturn a.compareDocumentPosition ? -1 : 1;\n\ +\t} :\n\ +\tfunction( a, b ) {\n\ +\t\tvar cur,\n\ +\t\t\ti = 0,\n\ +\t\t\taup = a.parentNode,\n\ +\t\t\tbup = b.parentNode,\n\ +\t\t\tap = [ a ],\n\ +\t\t\tbp = [ b ];\n\ +\n\ +\t\t// Exit early if the nodes are identical\n\ +\t\tif ( a === b ) {\n\ +\t\t\thasDuplicate = true;\n\ +\t\t\treturn 0;\n\ +\n\ +\t\t// Parentless nodes are either documents or disconnected\n\ +\t\t} else if ( !aup || !bup ) {\n\ +\t\t\treturn a === doc ? -1 :\n\ +\t\t\t\tb === doc ? 1 :\n\ +\t\t\t\taup ? -1 :\n\ +\t\t\t\tbup ? 1 :\n\ +\t\t\t\t0;\n\ +\n\ +\t\t// If the nodes are siblings, we can do a quick check\n\ +\t\t} else if ( aup === bup ) {\n\ +\t\t\treturn siblingCheck( a, b );\n\ +\t\t}\n\ +\n\ +\t\t// Otherwise we need full lists of their ancestors for comparison\n\ +\t\tcur = a;\n\ +\t\twhile ( (cur = cur.parentNode) ) {\n\ +\t\t\tap.unshift( cur );\n\ +\t\t}\n\ +\t\tcur = b;\n\ +\t\twhile ( (cur = cur.parentNode) ) {\n\ +\t\t\tbp.unshift( cur );\n\ +\t\t}\n\ +\n\ +\t\t// Walk down the tree looking for a discrepancy\n\ +\t\twhile ( ap[i] === bp[i] ) {\n\ +\t\t\ti++;\n\ +\t\t}\n\ +\n\ +\t\treturn i ?\n\ +\t\t\t// Do a sibling check if the nodes have a common ancestor\n\ +\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\ +\n\ +\t\t\t// Otherwise nodes in our document sort first\n\ +\t\t\tap[i] === preferredDoc ? -1 :\n\ +\t\t\tbp[i] === preferredDoc ? 1 :\n\ +\t\t\t0;\n\ +\t};\n\ +\n\ +\t// Always assume the presence of duplicates if sort doesn't\n\ +\t// pass them to our comparison function (as in Google Chrome).\n\ +\thasDuplicate = false;\n\ +\t[0, 0].sort( sortOrder );\n\ +\tsupport.detectDuplicates = hasDuplicate;\n\ +\n\ +\treturn document;\n\ +};\n\ +\n\ +Sizzle.matches = function( expr, elements ) {\n\ +\treturn Sizzle( expr, null, null, elements );\n\ +};\n\ +\n\ +Sizzle.matchesSelector = function( elem, expr ) {\n\ +\t// Set document vars if needed\n\ +\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\ +\t\tsetDocument( elem );\n\ +\t}\n\ +\n\ +\t// Make sure that attribute selectors are quoted\n\ +\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\ +\n\ +\t// rbuggyQSA always contains :focus, so no need for an existence check\n\ +\tif ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\ +\t\ttry {\n\ +\t\t\tvar ret = matches.call( elem, expr );\n\ +\n\ +\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\ +\t\t\tif ( ret || support.disconnectedMatch ||\n\ +\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\ +\t\t\t\t\t// fragment in IE 9\n\ +\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\ +\t\t\t\treturn ret;\n\ +\t\t\t}\n\ +\t\t} catch(e) {}\n\ +\t}\n\ +\n\ +\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n\ +};\n\ +\n\ +Sizzle.contains = function( context, elem ) {\n\ +\t// Set document vars if needed\n\ +\tif ( ( context.ownerDocument || context ) !== document ) {\n\ +\t\tsetDocument( context );\n\ +\t}\n\ +\treturn contains( context, elem );\n\ +};\n\ +\n\ +Sizzle.attr = function( elem, name ) {\n\ +\tvar val;\n\ +\n\ +\t// Set document vars if needed\n\ +\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\ +\t\tsetDocument( elem );\n\ +\t}\n\ +\n\ +\tif ( !documentIsXML ) {\n\ +\t\tname = name.toLowerCase();\n\ +\t}\n\ +\tif ( (val = Expr.attrHandle[ name ]) ) {\n\ +\t\treturn val( elem );\n\ +\t}\n\ +\tif ( documentIsXML || support.attributes ) {\n\ +\t\treturn elem.getAttribute( name );\n\ +\t}\n\ +\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\ +\t\tname :\n\ +\t\tval && val.specified ? val.value : null;\n\ +};\n\ +\n\ +Sizzle.error = function( msg ) {\n\ +\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n\ +};\n\ +\n\ +// Document sorting and removing duplicates\n\ +Sizzle.uniqueSort = function( results ) {\n\ +\tvar elem,\n\ +\t\tduplicates = [],\n\ +\t\ti = 1,\n\ +\t\tj = 0;\n\ +\n\ +\t// Unless we *know* we can detect duplicates, assume their presence\n\ +\thasDuplicate = !support.detectDuplicates;\n\ +\tresults.sort( sortOrder );\n\ +\n\ +\tif ( hasDuplicate ) {\n\ +\t\tfor ( ; (elem = results[i]); i++ ) {\n\ +\t\t\tif ( elem === results[ i - 1 ] ) {\n\ +\t\t\t\tj = duplicates.push( i );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\twhile ( j-- ) {\n\ +\t\t\tresults.splice( duplicates[ j ], 1 );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn results;\n\ +};\n\ +\n\ +function siblingCheck( a, b ) {\n\ +\tvar cur = b && a,\n\ +\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\ +\n\ +\t// Use IE sourceIndex if available on both nodes\n\ +\tif ( diff ) {\n\ +\t\treturn diff;\n\ +\t}\n\ +\n\ +\t// Check if b follows a\n\ +\tif ( cur ) {\n\ +\t\twhile ( (cur = cur.nextSibling) ) {\n\ +\t\t\tif ( cur === b ) {\n\ +\t\t\t\treturn -1;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn a ? 1 : -1;\n\ +}\n\ +\n\ +// Returns a function to use in pseudos for input types\n\ +function createInputPseudo( type ) {\n\ +\treturn function( elem ) {\n\ +\t\tvar name = elem.nodeName.toLowerCase();\n\ +\t\treturn name === \"input\" && elem.type === type;\n\ +\t};\n\ +}\n\ +\n\ +// Returns a function to use in pseudos for buttons\n\ +function createButtonPseudo( type ) {\n\ +\treturn function( elem ) {\n\ +\t\tvar name = elem.nodeName.toLowerCase();\n\ +\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\ +\t};\n\ +}\n\ +\n\ +// Returns a function to use in pseudos for positionals\n\ +function createPositionalPseudo( fn ) {\n\ +\treturn markFunction(function( argument ) {\n\ +\t\targument = +argument;\n\ +\t\treturn markFunction(function( seed, matches ) {\n\ +\t\t\tvar j,\n\ +\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\ +\t\t\t\ti = matchIndexes.length;\n\ +\n\ +\t\t\t// Match elements found at the specified indexes\n\ +\t\t\twhile ( i-- ) {\n\ +\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\ +\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t});\n\ +\t});\n\ +}\n\ +\n\ +/**\n\ + * Utility function for retrieving the text value of an array of DOM nodes\n\ + * @param {Array|Element} elem\n\ + */\n\ +getText = Sizzle.getText = function( elem ) {\n\ +\tvar node,\n\ +\t\tret = \"\",\n\ +\t\ti = 0,\n\ +\t\tnodeType = elem.nodeType;\n\ +\n\ +\tif ( !nodeType ) {\n\ +\t\t// If no nodeType, this is expected to be an array\n\ +\t\tfor ( ; (node = elem[i]); i++ ) {\n\ +\t\t\t// Do not traverse comment nodes\n\ +\t\t\tret += getText( node );\n\ +\t\t}\n\ +\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\ +\t\t// Use textContent for elements\n\ +\t\t// innerText usage removed for consistency of new lines (see #11153)\n\ +\t\tif ( typeof elem.textContent === \"string\" ) {\n\ +\t\t\treturn elem.textContent;\n\ +\t\t} else {\n\ +\t\t\t// Traverse its children\n\ +\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\ +\t\t\t\tret += getText( elem );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\ +\t\treturn elem.nodeValue;\n\ +\t}\n\ +\t// Do not include comment or processing instruction nodes\n\ +\n\ +\treturn ret;\n\ +};\n\ +\n\ +Expr = Sizzle.selectors = {\n\ +\n\ +\t// Can be adjusted by the user\n\ +\tcacheLength: 50,\n\ +\n\ +\tcreatePseudo: markFunction,\n\ +\n\ +\tmatch: matchExpr,\n\ +\n\ +\tfind: {},\n\ +\n\ +\trelative: {\n\ +\t\t\">\": { dir: \"parentNode\", first: true },\n\ +\t\t\" \": { dir: \"parentNode\" },\n\ +\t\t\"+\": { dir: \"previousSibling\", first: true },\n\ +\t\t\"~\": { dir: \"previousSibling\" }\n\ +\t},\n\ +\n\ +\tpreFilter: {\n\ +\t\t\"ATTR\": function( match ) {\n\ +\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\ +\n\ +\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\ +\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\ +\n\ +\t\t\tif ( match[2] === \"~=\" ) {\n\ +\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn match.slice( 0, 4 );\n\ +\t\t},\n\ +\n\ +\t\t\"CHILD\": function( match ) {\n\ +\t\t\t/* matches from matchExpr[\"CHILD\"]\n\ +\t\t\t\t1 type (only|nth|...)\n\ +\t\t\t\t2 what (child|of-type)\n\ +\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\ +\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\ +\t\t\t\t5 sign of xn-component\n\ +\t\t\t\t6 x of xn-component\n\ +\t\t\t\t7 sign of y-component\n\ +\t\t\t\t8 y of y-component\n\ +\t\t\t*/\n\ +\t\t\tmatch[1] = match[1].toLowerCase();\n\ +\n\ +\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\ +\t\t\t\t// nth-* requires argument\n\ +\t\t\t\tif ( !match[3] ) {\n\ +\t\t\t\t\tSizzle.error( match[0] );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\ +\t\t\t\t// remember that false/true cast respectively to 0/1\n\ +\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\ +\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\ +\n\ +\t\t\t// other types prohibit arguments\n\ +\t\t\t} else if ( match[3] ) {\n\ +\t\t\t\tSizzle.error( match[0] );\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn match;\n\ +\t\t},\n\ +\n\ +\t\t\"PSEUDO\": function( match ) {\n\ +\t\t\tvar excess,\n\ +\t\t\t\tunquoted = !match[5] && match[2];\n\ +\n\ +\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\ +\t\t\t\treturn null;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Accept quoted arguments as-is\n\ +\t\t\tif ( match[4] ) {\n\ +\t\t\t\tmatch[2] = match[4];\n\ +\n\ +\t\t\t// Strip excess characters from unquoted arguments\n\ +\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\ +\t\t\t\t// Get excess from tokenize (recursively)\n\ +\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\ +\t\t\t\t// advance to the next closing parenthesis\n\ +\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\ +\n\ +\t\t\t\t// excess is a negative index\n\ +\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\ +\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\ +\t\t\treturn match.slice( 0, 3 );\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tfilter: {\n\ +\n\ +\t\t\"TAG\": function( nodeName ) {\n\ +\t\t\tif ( nodeName === \"*\" ) {\n\ +\t\t\t\treturn function() { return true; };\n\ +\t\t\t}\n\ +\n\ +\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\ +\t\t\t};\n\ +\t\t},\n\ +\n\ +\t\t\"CLASS\": function( className ) {\n\ +\t\t\tvar pattern = classCache[ className + \" \" ];\n\ +\n\ +\t\t\treturn pattern ||\n\ +\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\ +\t\t\t\tclassCache( className, function( elem ) {\n\ +\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\ +\t\t\t\t});\n\ +\t\t},\n\ +\n\ +\t\t\"ATTR\": function( name, operator, check ) {\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\tvar result = Sizzle.attr( elem, name );\n\ +\n\ +\t\t\t\tif ( result == null ) {\n\ +\t\t\t\t\treturn operator === \"!=\";\n\ +\t\t\t\t}\n\ +\t\t\t\tif ( !operator ) {\n\ +\t\t\t\t\treturn true;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tresult += \"\";\n\ +\n\ +\t\t\t\treturn operator === \"=\" ? result === check :\n\ +\t\t\t\t\toperator === \"!=\" ? result !== check :\n\ +\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\ +\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\ +\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\ +\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\ +\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\ +\t\t\t\t\tfalse;\n\ +\t\t\t};\n\ +\t\t},\n\ +\n\ +\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\ +\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\ +\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\ +\t\t\t\tofType = what === \"of-type\";\n\ +\n\ +\t\t\treturn first === 1 && last === 0 ?\n\ +\n\ +\t\t\t\t// Shortcut for :nth-*(n)\n\ +\t\t\t\tfunction( elem ) {\n\ +\t\t\t\t\treturn !!elem.parentNode;\n\ +\t\t\t\t} :\n\ +\n\ +\t\t\t\tfunction( elem, context, xml ) {\n\ +\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\ +\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\ +\t\t\t\t\t\tparent = elem.parentNode,\n\ +\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\ +\t\t\t\t\t\tuseCache = !xml && !ofType;\n\ +\n\ +\t\t\t\t\tif ( parent ) {\n\ +\n\ +\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\ +\t\t\t\t\t\tif ( simple ) {\n\ +\t\t\t\t\t\t\twhile ( dir ) {\n\ +\t\t\t\t\t\t\t\tnode = elem;\n\ +\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\ +\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\ +\t\t\t\t\t\t\t\t\t\treturn false;\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\ +\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\treturn true;\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\ +\n\ +\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\ +\t\t\t\t\t\tif ( forward && useCache ) {\n\ +\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\ +\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\ +\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\ +\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\ +\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\ +\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\ +\n\ +\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\ +\n\ +\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\ +\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\ +\n\ +\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\ +\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\ +\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\ +\t\t\t\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Use previously-cached element index if available\n\ +\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\ +\t\t\t\t\t\t\tdiff = cache[1];\n\ +\n\ +\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\ +\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\ +\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\ +\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\ +\n\ +\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\ +\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\ +\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\ +\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\ +\t\t\t\t\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\ +\t\t\t\t\t\tdiff -= last;\n\ +\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t};\n\ +\t\t},\n\ +\n\ +\t\t\"PSEUDO\": function( pseudo, argument ) {\n\ +\t\t\t// pseudo-class names are case-insensitive\n\ +\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\ +\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\ +\t\t\t// Remember that setFilters inherits from pseudos\n\ +\t\t\tvar args,\n\ +\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\ +\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\ +\n\ +\t\t\t// The user may use createPseudo to indicate that\n\ +\t\t\t// arguments are needed to create the filter function\n\ +\t\t\t// just as Sizzle does\n\ +\t\t\tif ( fn[ expando ] ) {\n\ +\t\t\t\treturn fn( argument );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// But maintain support for old signatures\n\ +\t\t\tif ( fn.length > 1 ) {\n\ +\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\ +\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\ +\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\ +\t\t\t\t\t\tvar idx,\n\ +\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\ +\t\t\t\t\t\t\ti = matched.length;\n\ +\t\t\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\ +\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}) :\n\ +\t\t\t\t\tfunction( elem ) {\n\ +\t\t\t\t\t\treturn fn( elem, 0, args );\n\ +\t\t\t\t\t};\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn fn;\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tpseudos: {\n\ +\t\t// Potentially complex pseudos\n\ +\t\t\"not\": markFunction(function( selector ) {\n\ +\t\t\t// Trim the selector passed to compile\n\ +\t\t\t// to avoid treating leading and trailing\n\ +\t\t\t// spaces as combinators\n\ +\t\t\tvar input = [],\n\ +\t\t\t\tresults = [],\n\ +\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\ +\n\ +\t\t\treturn matcher[ expando ] ?\n\ +\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\ +\t\t\t\t\tvar elem,\n\ +\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\ +\t\t\t\t\t\ti = seed.length;\n\ +\n\ +\t\t\t\t\t// Match elements unmatched by `matcher`\n\ +\t\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\ +\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}) :\n\ +\t\t\t\tfunction( elem, context, xml ) {\n\ +\t\t\t\t\tinput[0] = elem;\n\ +\t\t\t\t\tmatcher( input, null, xml, results );\n\ +\t\t\t\t\treturn !results.pop();\n\ +\t\t\t\t};\n\ +\t\t}),\n\ +\n\ +\t\t\"has\": markFunction(function( selector ) {\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\ +\t\t\t};\n\ +\t\t}),\n\ +\n\ +\t\t\"contains\": markFunction(function( text ) {\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\ +\t\t\t};\n\ +\t\t}),\n\ +\n\ +\t\t// \"Whether an element is represented by a :lang() selector\n\ +\t\t// is based solely on the element's language value\n\ +\t\t// being equal to the identifier C,\n\ +\t\t// or beginning with the identifier C immediately followed by \"-\".\n\ +\t\t// The matching of C against the element's language value is performed case-insensitively.\n\ +\t\t// The identifier C does not have to be a valid language name.\"\n\ +\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\ +\t\t\"lang\": markFunction( function( lang ) {\n\ +\t\t\t// lang value must be a valid identifider\n\ +\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\ +\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\ +\t\t\t}\n\ +\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\ +\t\t\treturn function( elem ) {\n\ +\t\t\t\tvar elemLang;\n\ +\t\t\t\tdo {\n\ +\t\t\t\t\tif ( (elemLang = documentIsXML ?\n\ +\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\") :\n\ +\t\t\t\t\t\telem.lang) ) {\n\ +\n\ +\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\ +\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\ +\t\t\t\treturn false;\n\ +\t\t\t};\n\ +\t\t}),\n\ +\n\ +\t\t// Miscellaneous\n\ +\t\t\"target\": function( elem ) {\n\ +\t\t\tvar hash = window.location && window.location.hash;\n\ +\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\ +\t\t},\n\ +\n\ +\t\t\"root\": function( elem ) {\n\ +\t\t\treturn elem === docElem;\n\ +\t\t},\n\ +\n\ +\t\t\"focus\": function( elem ) {\n\ +\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\ +\t\t},\n\ +\n\ +\t\t// Boolean properties\n\ +\t\t\"enabled\": function( elem ) {\n\ +\t\t\treturn elem.disabled === false;\n\ +\t\t},\n\ +\n\ +\t\t\"disabled\": function( elem ) {\n\ +\t\t\treturn elem.disabled === true;\n\ +\t\t},\n\ +\n\ +\t\t\"checked\": function( elem ) {\n\ +\t\t\t// In CSS3, :checked should return both checked and selected elements\n\ +\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\ +\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\ +\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\ +\t\t},\n\ +\n\ +\t\t\"selected\": function( elem ) {\n\ +\t\t\t// Accessing this property makes selected-by-default\n\ +\t\t\t// options in Safari work properly\n\ +\t\t\tif ( elem.parentNode ) {\n\ +\t\t\t\telem.parentNode.selectedIndex;\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn elem.selected === true;\n\ +\t\t},\n\ +\n\ +\t\t// Contents\n\ +\t\t\"empty\": function( elem ) {\n\ +\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\ +\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\ +\t\t\t// not comment, processing instructions, or others\n\ +\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\ +\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\ +\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\ +\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\ +\t\t\t\t\treturn false;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\treturn true;\n\ +\t\t},\n\ +\n\ +\t\t\"parent\": function( elem ) {\n\ +\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\ +\t\t},\n\ +\n\ +\t\t// Element/input types\n\ +\t\t\"header\": function( elem ) {\n\ +\t\t\treturn rheader.test( elem.nodeName );\n\ +\t\t},\n\ +\n\ +\t\t\"input\": function( elem ) {\n\ +\t\t\treturn rinputs.test( elem.nodeName );\n\ +\t\t},\n\ +\n\ +\t\t\"button\": function( elem ) {\n\ +\t\t\tvar name = elem.nodeName.toLowerCase();\n\ +\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\ +\t\t},\n\ +\n\ +\t\t\"text\": function( elem ) {\n\ +\t\t\tvar attr;\n\ +\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\ +\t\t\t// use getAttribute instead to test this case\n\ +\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\ +\t\t\t\telem.type === \"text\" &&\n\ +\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\ +\t\t},\n\ +\n\ +\t\t// Position-in-collection\n\ +\t\t\"first\": createPositionalPseudo(function() {\n\ +\t\t\treturn [ 0 ];\n\ +\t\t}),\n\ +\n\ +\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\ +\t\t\treturn [ length - 1 ];\n\ +\t\t}),\n\ +\n\ +\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\ +\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\ +\t\t}),\n\ +\n\ +\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\ +\t\t\tvar i = 0;\n\ +\t\t\tfor ( ; i < length; i += 2 ) {\n\ +\t\t\t\tmatchIndexes.push( i );\n\ +\t\t\t}\n\ +\t\t\treturn matchIndexes;\n\ +\t\t}),\n\ +\n\ +\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\ +\t\t\tvar i = 1;\n\ +\t\t\tfor ( ; i < length; i += 2 ) {\n\ +\t\t\t\tmatchIndexes.push( i );\n\ +\t\t\t}\n\ +\t\t\treturn matchIndexes;\n\ +\t\t}),\n\ +\n\ +\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\ +\t\t\tvar i = argument < 0 ? argument + length : argument;\n\ +\t\t\tfor ( ; --i >= 0; ) {\n\ +\t\t\t\tmatchIndexes.push( i );\n\ +\t\t\t}\n\ +\t\t\treturn matchIndexes;\n\ +\t\t}),\n\ +\n\ +\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\ +\t\t\tvar i = argument < 0 ? argument + length : argument;\n\ +\t\t\tfor ( ; ++i < length; ) {\n\ +\t\t\t\tmatchIndexes.push( i );\n\ +\t\t\t}\n\ +\t\t\treturn matchIndexes;\n\ +\t\t})\n\ +\t}\n\ +};\n\ +\n\ +// Add button/input type pseudos\n\ +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\ +\tExpr.pseudos[ i ] = createInputPseudo( i );\n\ +}\n\ +for ( i in { submit: true, reset: true } ) {\n\ +\tExpr.pseudos[ i ] = createButtonPseudo( i );\n\ +}\n\ +\n\ +function tokenize( selector, parseOnly ) {\n\ +\tvar matched, match, tokens, type,\n\ +\t\tsoFar, groups, preFilters,\n\ +\t\tcached = tokenCache[ selector + \" \" ];\n\ +\n\ +\tif ( cached ) {\n\ +\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\ +\t}\n\ +\n\ +\tsoFar = selector;\n\ +\tgroups = [];\n\ +\tpreFilters = Expr.preFilter;\n\ +\n\ +\twhile ( soFar ) {\n\ +\n\ +\t\t// Comma and first run\n\ +\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\ +\t\t\tif ( match ) {\n\ +\t\t\t\t// Don't consume trailing commas as valid\n\ +\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\ +\t\t\t}\n\ +\t\t\tgroups.push( tokens = [] );\n\ +\t\t}\n\ +\n\ +\t\tmatched = false;\n\ +\n\ +\t\t// Combinators\n\ +\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\ +\t\t\tmatched = match.shift();\n\ +\t\t\ttokens.push( {\n\ +\t\t\t\tvalue: matched,\n\ +\t\t\t\t// Cast descendant combinators to space\n\ +\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\ +\t\t\t} );\n\ +\t\t\tsoFar = soFar.slice( matched.length );\n\ +\t\t}\n\ +\n\ +\t\t// Filters\n\ +\t\tfor ( type in Expr.filter ) {\n\ +\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\ +\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\ +\t\t\t\tmatched = match.shift();\n\ +\t\t\t\ttokens.push( {\n\ +\t\t\t\t\tvalue: matched,\n\ +\t\t\t\t\ttype: type,\n\ +\t\t\t\t\tmatches: match\n\ +\t\t\t\t} );\n\ +\t\t\t\tsoFar = soFar.slice( matched.length );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\tif ( !matched ) {\n\ +\t\t\tbreak;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Return the length of the invalid excess\n\ +\t// if we're just parsing\n\ +\t// Otherwise, throw an error or return tokens\n\ +\treturn parseOnly ?\n\ +\t\tsoFar.length :\n\ +\t\tsoFar ?\n\ +\t\t\tSizzle.error( selector ) :\n\ +\t\t\t// Cache the tokens\n\ +\t\t\ttokenCache( selector, groups ).slice( 0 );\n\ +}\n\ +\n\ +function toSelector( tokens ) {\n\ +\tvar i = 0,\n\ +\t\tlen = tokens.length,\n\ +\t\tselector = \"\";\n\ +\tfor ( ; i < len; i++ ) {\n\ +\t\tselector += tokens[i].value;\n\ +\t}\n\ +\treturn selector;\n\ +}\n\ +\n\ +function addCombinator( matcher, combinator, base ) {\n\ +\tvar dir = combinator.dir,\n\ +\t\tcheckNonElements = base && dir === \"parentNode\",\n\ +\t\tdoneName = done++;\n\ +\n\ +\treturn combinator.first ?\n\ +\t\t// Check against closest ancestor/preceding element\n\ +\t\tfunction( elem, context, xml ) {\n\ +\t\t\twhile ( (elem = elem[ dir ]) ) {\n\ +\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\ +\t\t\t\t\treturn matcher( elem, context, xml );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t} :\n\ +\n\ +\t\t// Check against all ancestor/preceding elements\n\ +\t\tfunction( elem, context, xml ) {\n\ +\t\t\tvar data, cache, outerCache,\n\ +\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\ +\n\ +\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\ +\t\t\tif ( xml ) {\n\ +\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\ +\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\ +\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\ +\t\t\t\t\t\t\treturn true;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\ +\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\ +\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\ +\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\ +\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\ +\t\t\t\t\t\t\t\treturn data === true;\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\ +\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\ +\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\ +\t\t\t\t\t\t\t\treturn true;\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t};\n\ +}\n\ +\n\ +function elementMatcher( matchers ) {\n\ +\treturn matchers.length > 1 ?\n\ +\t\tfunction( elem, context, xml ) {\n\ +\t\t\tvar i = matchers.length;\n\ +\t\t\twhile ( i-- ) {\n\ +\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\ +\t\t\t\t\treturn false;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t\treturn true;\n\ +\t\t} :\n\ +\t\tmatchers[0];\n\ +}\n\ +\n\ +function condense( unmatched, map, filter, context, xml ) {\n\ +\tvar elem,\n\ +\t\tnewUnmatched = [],\n\ +\t\ti = 0,\n\ +\t\tlen = unmatched.length,\n\ +\t\tmapped = map != null;\n\ +\n\ +\tfor ( ; i < len; i++ ) {\n\ +\t\tif ( (elem = unmatched[i]) ) {\n\ +\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\ +\t\t\t\tnewUnmatched.push( elem );\n\ +\t\t\t\tif ( mapped ) {\n\ +\t\t\t\t\tmap.push( i );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn newUnmatched;\n\ +}\n\ +\n\ +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\ +\tif ( postFilter && !postFilter[ expando ] ) {\n\ +\t\tpostFilter = setMatcher( postFilter );\n\ +\t}\n\ +\tif ( postFinder && !postFinder[ expando ] ) {\n\ +\t\tpostFinder = setMatcher( postFinder, postSelector );\n\ +\t}\n\ +\treturn markFunction(function( seed, results, context, xml ) {\n\ +\t\tvar temp, i, elem,\n\ +\t\t\tpreMap = [],\n\ +\t\t\tpostMap = [],\n\ +\t\t\tpreexisting = results.length,\n\ +\n\ +\t\t\t// Get initial elements from seed or context\n\ +\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\ +\n\ +\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\ +\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\ +\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\ +\t\t\t\telems,\n\ +\n\ +\t\t\tmatcherOut = matcher ?\n\ +\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\ +\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\ +\n\ +\t\t\t\t\t// ...intermediate processing is necessary\n\ +\t\t\t\t\t[] :\n\ +\n\ +\t\t\t\t\t// ...otherwise use results directly\n\ +\t\t\t\t\tresults :\n\ +\t\t\t\tmatcherIn;\n\ +\n\ +\t\t// Find primary matches\n\ +\t\tif ( matcher ) {\n\ +\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\ +\t\t}\n\ +\n\ +\t\t// Apply postFilter\n\ +\t\tif ( postFilter ) {\n\ +\t\t\ttemp = condense( matcherOut, postMap );\n\ +\t\t\tpostFilter( temp, [], context, xml );\n\ +\n\ +\t\t\t// Un-match failing elements by moving them back to matcherIn\n\ +\t\t\ti = temp.length;\n\ +\t\t\twhile ( i-- ) {\n\ +\t\t\t\tif ( (elem = temp[i]) ) {\n\ +\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\tif ( seed ) {\n\ +\t\t\tif ( postFinder || preFilter ) {\n\ +\t\t\t\tif ( postFinder ) {\n\ +\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\ +\t\t\t\t\ttemp = [];\n\ +\t\t\t\t\ti = matcherOut.length;\n\ +\t\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\ +\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\ +\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\ +\t\t\t\ti = matcherOut.length;\n\ +\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\ +\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\ +\n\ +\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t// Add elements to results, through postFinder if defined\n\ +\t\t} else {\n\ +\t\t\tmatcherOut = condense(\n\ +\t\t\t\tmatcherOut === results ?\n\ +\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\ +\t\t\t\t\tmatcherOut\n\ +\t\t\t);\n\ +\t\t\tif ( postFinder ) {\n\ +\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\ +\t\t\t} else {\n\ +\t\t\t\tpush.apply( results, matcherOut );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t});\n\ +}\n\ +\n\ +function matcherFromTokens( tokens ) {\n\ +\tvar checkContext, matcher, j,\n\ +\t\tlen = tokens.length,\n\ +\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\ +\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\ +\t\ti = leadingRelative ? 1 : 0,\n\ +\n\ +\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\ +\t\tmatchContext = addCombinator( function( elem ) {\n\ +\t\t\treturn elem === checkContext;\n\ +\t\t}, implicitRelative, true ),\n\ +\t\tmatchAnyContext = addCombinator( function( elem ) {\n\ +\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\ +\t\t}, implicitRelative, true ),\n\ +\t\tmatchers = [ function( elem, context, xml ) {\n\ +\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\ +\t\t\t\t(checkContext = context).nodeType ?\n\ +\t\t\t\t\tmatchContext( elem, context, xml ) :\n\ +\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\ +\t\t} ];\n\ +\n\ +\tfor ( ; i < len; i++ ) {\n\ +\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\ +\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\ +\t\t} else {\n\ +\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\ +\n\ +\t\t\t// Return special upon seeing a positional matcher\n\ +\t\t\tif ( matcher[ expando ] ) {\n\ +\t\t\t\t// Find the next relative operator (if any) for proper handling\n\ +\t\t\t\tj = ++i;\n\ +\t\t\t\tfor ( ; j < len; j++ ) {\n\ +\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t\treturn setMatcher(\n\ +\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\ +\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\ +\t\t\t\t\tmatcher,\n\ +\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\ +\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\ +\t\t\t\t\tj < len && toSelector( tokens )\n\ +\t\t\t\t);\n\ +\t\t\t}\n\ +\t\t\tmatchers.push( matcher );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn elementMatcher( matchers );\n\ +}\n\ +\n\ +function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\ +\t// A counter to specify which element is currently being matched\n\ +\tvar matcherCachedRuns = 0,\n\ +\t\tbySet = setMatchers.length > 0,\n\ +\t\tbyElement = elementMatchers.length > 0,\n\ +\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\ +\t\t\tvar elem, j, matcher,\n\ +\t\t\t\tsetMatched = [],\n\ +\t\t\t\tmatchedCount = 0,\n\ +\t\t\t\ti = \"0\",\n\ +\t\t\t\tunmatched = seed && [],\n\ +\t\t\t\toutermost = expandContext != null,\n\ +\t\t\t\tcontextBackup = outermostContext,\n\ +\t\t\t\t// We must always have either seed elements or context\n\ +\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\ +\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\ +\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\ +\n\ +\t\t\tif ( outermost ) {\n\ +\t\t\t\toutermostContext = context !== document && context;\n\ +\t\t\t\tcachedruns = matcherCachedRuns;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add elements passing elementMatchers directly to results\n\ +\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\ +\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\ +\t\t\t\tif ( byElement && elem ) {\n\ +\t\t\t\t\tj = 0;\n\ +\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\ +\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\ +\t\t\t\t\t\t\tresults.push( elem );\n\ +\t\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tif ( outermost ) {\n\ +\t\t\t\t\t\tdirruns = dirrunsUnique;\n\ +\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Track unmatched elements for set filters\n\ +\t\t\t\tif ( bySet ) {\n\ +\t\t\t\t\t// They will have gone through all possible matchers\n\ +\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\ +\t\t\t\t\t\tmatchedCount--;\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Lengthen the array for every element, matched or not\n\ +\t\t\t\t\tif ( seed ) {\n\ +\t\t\t\t\t\tunmatched.push( elem );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Apply set filters to unmatched elements\n\ +\t\t\tmatchedCount += i;\n\ +\t\t\tif ( bySet && i !== matchedCount ) {\n\ +\t\t\t\tj = 0;\n\ +\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\ +\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tif ( seed ) {\n\ +\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\ +\t\t\t\t\tif ( matchedCount > 0 ) {\n\ +\t\t\t\t\t\twhile ( i-- ) {\n\ +\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\ +\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\ +\t\t\t\t\tsetMatched = condense( setMatched );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Add matches to results\n\ +\t\t\t\tpush.apply( results, setMatched );\n\ +\n\ +\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\ +\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\ +\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\ +\n\ +\t\t\t\t\tSizzle.uniqueSort( results );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Override manipulation of globals by nested matchers\n\ +\t\t\tif ( outermost ) {\n\ +\t\t\t\tdirruns = dirrunsUnique;\n\ +\t\t\t\toutermostContext = contextBackup;\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn unmatched;\n\ +\t\t};\n\ +\n\ +\treturn bySet ?\n\ +\t\tmarkFunction( superMatcher ) :\n\ +\t\tsuperMatcher;\n\ +}\n\ +\n\ +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\ +\tvar i,\n\ +\t\tsetMatchers = [],\n\ +\t\telementMatchers = [],\n\ +\t\tcached = compilerCache[ selector + \" \" ];\n\ +\n\ +\tif ( !cached ) {\n\ +\t\t// Generate a function of recursive functions that can be used to check each element\n\ +\t\tif ( !group ) {\n\ +\t\t\tgroup = tokenize( selector );\n\ +\t\t}\n\ +\t\ti = group.length;\n\ +\t\twhile ( i-- ) {\n\ +\t\t\tcached = matcherFromTokens( group[i] );\n\ +\t\t\tif ( cached[ expando ] ) {\n\ +\t\t\t\tsetMatchers.push( cached );\n\ +\t\t\t} else {\n\ +\t\t\t\telementMatchers.push( cached );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Cache the compiled function\n\ +\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\ +\t}\n\ +\treturn cached;\n\ +};\n\ +\n\ +function multipleContexts( selector, contexts, results ) {\n\ +\tvar i = 0,\n\ +\t\tlen = contexts.length;\n\ +\tfor ( ; i < len; i++ ) {\n\ +\t\tSizzle( selector, contexts[i], results );\n\ +\t}\n\ +\treturn results;\n\ +}\n\ +\n\ +function select( selector, context, results, seed ) {\n\ +\tvar i, tokens, token, type, find,\n\ +\t\tmatch = tokenize( selector );\n\ +\n\ +\tif ( !seed ) {\n\ +\t\t// Try to minimize operations if there is only one group\n\ +\t\tif ( match.length === 1 ) {\n\ +\n\ +\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\ +\t\t\ttokens = match[0] = match[0].slice( 0 );\n\ +\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\ +\t\t\t\t\tcontext.nodeType === 9 && !documentIsXML &&\n\ +\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\ +\n\ +\t\t\t\tcontext = Expr.find[\"ID\"]( token.matches[0].replace( runescape, funescape ), context )[0];\n\ +\t\t\t\tif ( !context ) {\n\ +\t\t\t\t\treturn results;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Fetch a seed set for right-to-left matching\n\ +\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\ +\t\t\twhile ( i-- ) {\n\ +\t\t\t\ttoken = tokens[i];\n\ +\n\ +\t\t\t\t// Abort if we hit a combinator\n\ +\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\ +\t\t\t\t\tbreak;\n\ +\t\t\t\t}\n\ +\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\ +\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\ +\t\t\t\t\tif ( (seed = find(\n\ +\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\ +\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\ +\t\t\t\t\t)) ) {\n\ +\n\ +\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\ +\t\t\t\t\t\ttokens.splice( i, 1 );\n\ +\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\ +\t\t\t\t\t\tif ( !selector ) {\n\ +\t\t\t\t\t\t\tpush.apply( results, slice.call( seed, 0 ) );\n\ +\t\t\t\t\t\t\treturn results;\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Compile and execute a filtering function\n\ +\t// Provide `match` to avoid retokenization if we modified the selector above\n\ +\tcompile( selector, match )(\n\ +\t\tseed,\n\ +\t\tcontext,\n\ +\t\tdocumentIsXML,\n\ +\t\tresults,\n\ +\t\trsibling.test( selector )\n\ +\t);\n\ +\treturn results;\n\ +}\n\ +\n\ +// Deprecated\n\ +Expr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\ +\n\ +// Easy API for creating new setFilters\n\ +function setFilters() {}\n\ +Expr.filters = setFilters.prototype = Expr.pseudos;\n\ +Expr.setFilters = new setFilters();\n\ +\n\ +// Initialize with the default document\n\ +setDocument();\n\ +\n\ +// Override sizzle attribute retrieval\n\ +Sizzle.attr = jQuery.attr;\n\ +jQuery.find = Sizzle;\n\ +jQuery.expr = Sizzle.selectors;\n\ +jQuery.expr[\":\"] = jQuery.expr.pseudos;\n\ +jQuery.unique = Sizzle.uniqueSort;\n\ +jQuery.text = Sizzle.getText;\n\ +jQuery.isXMLDoc = Sizzle.isXML;\n\ +jQuery.contains = Sizzle.contains;\n\ +\n\ +\n\ +})( window );\n\ +var runtil = /Until$/,\n\ +\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\ +\tisSimple = /^.[^:#\\[\\.,]*$/,\n\ +\trneedsContext = jQuery.expr.match.needsContext,\n\ +\t// methods guaranteed to produce a unique set when starting from a unique set\n\ +\tguaranteedUnique = {\n\ +\t\tchildren: true,\n\ +\t\tcontents: true,\n\ +\t\tnext: true,\n\ +\t\tprev: true\n\ +\t};\n\ +\n\ +jQuery.fn.extend({\n\ +\tfind: function( selector ) {\n\ +\t\tvar i, ret, self,\n\ +\t\t\tlen = this.length;\n\ +\n\ +\t\tif ( typeof selector !== \"string\" ) {\n\ +\t\t\tself = this;\n\ +\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\ +\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\ +\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\ +\t\t\t\t\t\treturn true;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}) );\n\ +\t\t}\n\ +\n\ +\t\tret = [];\n\ +\t\tfor ( i = 0; i < len; i++ ) {\n\ +\t\t\tjQuery.find( selector, this[ i ], ret );\n\ +\t\t}\n\ +\n\ +\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\ +\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\ +\t\tret.selector = ( this.selector ? this.selector + \" \" : \"\" ) + selector;\n\ +\t\treturn ret;\n\ +\t},\n\ +\n\ +\thas: function( target ) {\n\ +\t\tvar i,\n\ +\t\t\ttargets = jQuery( target, this ),\n\ +\t\t\tlen = targets.length;\n\ +\n\ +\t\treturn this.filter(function() {\n\ +\t\t\tfor ( i = 0; i < len; i++ ) {\n\ +\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\ +\t\t\t\t\treturn true;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tnot: function( selector ) {\n\ +\t\treturn this.pushStack( winnow(this, selector, false) );\n\ +\t},\n\ +\n\ +\tfilter: function( selector ) {\n\ +\t\treturn this.pushStack( winnow(this, selector, true) );\n\ +\t},\n\ +\n\ +\tis: function( selector ) {\n\ +\t\treturn !!selector && (\n\ +\t\t\ttypeof selector === \"string\" ?\n\ +\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\ +\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\ +\t\t\t\trneedsContext.test( selector ) ?\n\ +\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\ +\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\ +\t\t\t\tthis.filter( selector ).length > 0 );\n\ +\t},\n\ +\n\ +\tclosest: function( selectors, context ) {\n\ +\t\tvar cur,\n\ +\t\t\ti = 0,\n\ +\t\t\tl = this.length,\n\ +\t\t\tret = [],\n\ +\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\ +\t\t\t\tjQuery( selectors, context || this.context ) :\n\ +\t\t\t\t0;\n\ +\n\ +\t\tfor ( ; i < l; i++ ) {\n\ +\t\t\tcur = this[i];\n\ +\n\ +\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\ +\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\ +\t\t\t\t\tret.push( cur );\n\ +\t\t\t\t\tbreak;\n\ +\t\t\t\t}\n\ +\t\t\t\tcur = cur.parentNode;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\ +\t},\n\ +\n\ +\t// Determine the position of an element within\n\ +\t// the matched set of elements\n\ +\tindex: function( elem ) {\n\ +\n\ +\t\t// No argument, return index in parent\n\ +\t\tif ( !elem ) {\n\ +\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\ +\t\t}\n\ +\n\ +\t\t// index in selector\n\ +\t\tif ( typeof elem === \"string\" ) {\n\ +\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\ +\t\t}\n\ +\n\ +\t\t// Locate the position of the desired element\n\ +\t\treturn jQuery.inArray(\n\ +\t\t\t// If it receives a jQuery object, the first element is used\n\ +\t\t\telem.jquery ? elem[0] : elem, this );\n\ +\t},\n\ +\n\ +\tadd: function( selector, context ) {\n\ +\t\tvar set = typeof selector === \"string\" ?\n\ +\t\t\t\tjQuery( selector, context ) :\n\ +\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\ +\t\t\tall = jQuery.merge( this.get(), set );\n\ +\n\ +\t\treturn this.pushStack( jQuery.unique(all) );\n\ +\t},\n\ +\n\ +\taddBack: function( selector ) {\n\ +\t\treturn this.add( selector == null ?\n\ +\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\ +\t\t);\n\ +\t}\n\ +});\n\ +\n\ +jQuery.fn.andSelf = jQuery.fn.addBack;\n\ +\n\ +function sibling( cur, dir ) {\n\ +\tdo {\n\ +\t\tcur = cur[ dir ];\n\ +\t} while ( cur && cur.nodeType !== 1 );\n\ +\n\ +\treturn cur;\n\ +}\n\ +\n\ +jQuery.each({\n\ +\tparent: function( elem ) {\n\ +\t\tvar parent = elem.parentNode;\n\ +\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\ +\t},\n\ +\tparents: function( elem ) {\n\ +\t\treturn jQuery.dir( elem, \"parentNode\" );\n\ +\t},\n\ +\tparentsUntil: function( elem, i, until ) {\n\ +\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\ +\t},\n\ +\tnext: function( elem ) {\n\ +\t\treturn sibling( elem, \"nextSibling\" );\n\ +\t},\n\ +\tprev: function( elem ) {\n\ +\t\treturn sibling( elem, \"previousSibling\" );\n\ +\t},\n\ +\tnextAll: function( elem ) {\n\ +\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\ +\t},\n\ +\tprevAll: function( elem ) {\n\ +\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\ +\t},\n\ +\tnextUntil: function( elem, i, until ) {\n\ +\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\ +\t},\n\ +\tprevUntil: function( elem, i, until ) {\n\ +\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\ +\t},\n\ +\tsiblings: function( elem ) {\n\ +\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\ +\t},\n\ +\tchildren: function( elem ) {\n\ +\t\treturn jQuery.sibling( elem.firstChild );\n\ +\t},\n\ +\tcontents: function( elem ) {\n\ +\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\ +\t\t\telem.contentDocument || elem.contentWindow.document :\n\ +\t\t\tjQuery.merge( [], elem.childNodes );\n\ +\t}\n\ +}, function( name, fn ) {\n\ +\tjQuery.fn[ name ] = function( until, selector ) {\n\ +\t\tvar ret = jQuery.map( this, fn, until );\n\ +\n\ +\t\tif ( !runtil.test( name ) ) {\n\ +\t\t\tselector = until;\n\ +\t\t}\n\ +\n\ +\t\tif ( selector && typeof selector === \"string\" ) {\n\ +\t\t\tret = jQuery.filter( selector, ret );\n\ +\t\t}\n\ +\n\ +\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\ +\n\ +\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\ +\t\t\tret = ret.reverse();\n\ +\t\t}\n\ +\n\ +\t\treturn this.pushStack( ret );\n\ +\t};\n\ +});\n\ +\n\ +jQuery.extend({\n\ +\tfilter: function( expr, elems, not ) {\n\ +\t\tif ( not ) {\n\ +\t\t\texpr = \":not(\" + expr + \")\";\n\ +\t\t}\n\ +\n\ +\t\treturn elems.length === 1 ?\n\ +\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\ +\t\t\tjQuery.find.matches(expr, elems);\n\ +\t},\n\ +\n\ +\tdir: function( elem, dir, until ) {\n\ +\t\tvar matched = [],\n\ +\t\t\tcur = elem[ dir ];\n\ +\n\ +\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\ +\t\t\tif ( cur.nodeType === 1 ) {\n\ +\t\t\t\tmatched.push( cur );\n\ +\t\t\t}\n\ +\t\t\tcur = cur[dir];\n\ +\t\t}\n\ +\t\treturn matched;\n\ +\t},\n\ +\n\ +\tsibling: function( n, elem ) {\n\ +\t\tvar r = [];\n\ +\n\ +\t\tfor ( ; n; n = n.nextSibling ) {\n\ +\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\ +\t\t\t\tr.push( n );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn r;\n\ +\t}\n\ +});\n\ +\n\ +// Implement the identical functionality for filter and not\n\ +function winnow( elements, qualifier, keep ) {\n\ +\n\ +\t// Can't pass null or undefined to indexOf in Firefox 4\n\ +\t// Set to 0 to skip string check\n\ +\tqualifier = qualifier || 0;\n\ +\n\ +\tif ( jQuery.isFunction( qualifier ) ) {\n\ +\t\treturn jQuery.grep(elements, function( elem, i ) {\n\ +\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\ +\t\t\treturn retVal === keep;\n\ +\t\t});\n\ +\n\ +\t} else if ( qualifier.nodeType ) {\n\ +\t\treturn jQuery.grep(elements, function( elem ) {\n\ +\t\t\treturn ( elem === qualifier ) === keep;\n\ +\t\t});\n\ +\n\ +\t} else if ( typeof qualifier === \"string\" ) {\n\ +\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\ +\t\t\treturn elem.nodeType === 1;\n\ +\t\t});\n\ +\n\ +\t\tif ( isSimple.test( qualifier ) ) {\n\ +\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\ +\t\t} else {\n\ +\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn jQuery.grep(elements, function( elem ) {\n\ +\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\ +\t});\n\ +}\n\ +function createSafeFragment( document ) {\n\ +\tvar list = nodeNames.split( \"|\" ),\n\ +\t\tsafeFrag = document.createDocumentFragment();\n\ +\n\ +\tif ( safeFrag.createElement ) {\n\ +\t\twhile ( list.length ) {\n\ +\t\t\tsafeFrag.createElement(\n\ +\t\t\t\tlist.pop()\n\ +\t\t\t);\n\ +\t\t}\n\ +\t}\n\ +\treturn safeFrag;\n\ +}\n\ +\n\ +var nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\ +\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\ +\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\ +\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\ +\trleadingWhitespace = /^\\s+/,\n\ +\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\ +\trtagName = /<([\\w:]+)/,\n\ +\trtbody = /<tbody/i,\n\ +\trhtml = /<|&#?\\w+;/,\n\ +\trnoInnerhtml = /<(?:script|style|link)/i,\n\ +\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\ +\t// checked=\"checked\" or checked\n\ +\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\ +\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\ +\trscriptTypeMasked = /^true\\/(.*)/,\n\ +\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\ +\n\ +\t// We have to close these tags to support XHTML (#13200)\n\ +\twrapMap = {\n\ +\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\ +\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\ +\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\ +\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\ +\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\ +\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ +\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\ +\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\ +\n\ +\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\ +\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\ +\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\" ]\n\ +\t},\n\ +\tsafeFragment = createSafeFragment( document ),\n\ +\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\ +\n\ +wrapMap.optgroup = wrapMap.option;\n\ +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\ +wrapMap.th = wrapMap.td;\n\ +\n\ +jQuery.fn.extend({\n\ +\ttext: function( value ) {\n\ +\t\treturn jQuery.access( this, function( value ) {\n\ +\t\t\treturn value === undefined ?\n\ +\t\t\t\tjQuery.text( this ) :\n\ +\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\ +\t\t}, null, value, arguments.length );\n\ +\t},\n\ +\n\ +\twrapAll: function( html ) {\n\ +\t\tif ( jQuery.isFunction( html ) ) {\n\ +\t\t\treturn this.each(function(i) {\n\ +\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\tif ( this[0] ) {\n\ +\t\t\t// The elements to wrap the target around\n\ +\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\ +\n\ +\t\t\tif ( this[0].parentNode ) {\n\ +\t\t\t\twrap.insertBefore( this[0] );\n\ +\t\t\t}\n\ +\n\ +\t\t\twrap.map(function() {\n\ +\t\t\t\tvar elem = this;\n\ +\n\ +\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\ +\t\t\t\t\telem = elem.firstChild;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\treturn elem;\n\ +\t\t\t}).append( this );\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\twrapInner: function( html ) {\n\ +\t\tif ( jQuery.isFunction( html ) ) {\n\ +\t\t\treturn this.each(function(i) {\n\ +\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\treturn this.each(function() {\n\ +\t\t\tvar self = jQuery( this ),\n\ +\t\t\t\tcontents = self.contents();\n\ +\n\ +\t\t\tif ( contents.length ) {\n\ +\t\t\t\tcontents.wrapAll( html );\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\tself.append( html );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\twrap: function( html ) {\n\ +\t\tvar isFunction = jQuery.isFunction( html );\n\ +\n\ +\t\treturn this.each(function(i) {\n\ +\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tunwrap: function() {\n\ +\t\treturn this.parent().each(function() {\n\ +\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\ +\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\ +\t\t\t}\n\ +\t\t}).end();\n\ +\t},\n\ +\n\ +\tappend: function() {\n\ +\t\treturn this.domManip(arguments, true, function( elem ) {\n\ +\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\ +\t\t\t\tthis.appendChild( elem );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tprepend: function() {\n\ +\t\treturn this.domManip(arguments, true, function( elem ) {\n\ +\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\ +\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tbefore: function() {\n\ +\t\treturn this.domManip( arguments, false, function( elem ) {\n\ +\t\t\tif ( this.parentNode ) {\n\ +\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tafter: function() {\n\ +\t\treturn this.domManip( arguments, false, function( elem ) {\n\ +\t\t\tif ( this.parentNode ) {\n\ +\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\t// keepData is for internal use only--do not document\n\ +\tremove: function( selector, keepData ) {\n\ +\t\tvar elem,\n\ +\t\t\ti = 0;\n\ +\n\ +\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\ +\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {\n\ +\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\ +\t\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tif ( elem.parentNode ) {\n\ +\t\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\ +\t\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\telem.parentNode.removeChild( elem );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\tempty: function() {\n\ +\t\tvar elem,\n\ +\t\t\ti = 0;\n\ +\n\ +\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\ +\t\t\t// Remove element nodes and prevent memory leaks\n\ +\t\t\tif ( elem.nodeType === 1 ) {\n\ +\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Remove any remaining nodes\n\ +\t\t\twhile ( elem.firstChild ) {\n\ +\t\t\t\telem.removeChild( elem.firstChild );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\ +\t\t\t// Support: IE<9\n\ +\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\ +\t\t\t\telem.options.length = 0;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t},\n\ +\n\ +\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\ +\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\ +\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\ +\n\ +\t\treturn this.map( function () {\n\ +\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\ +\t\t});\n\ +\t},\n\ +\n\ +\thtml: function( value ) {\n\ +\t\treturn jQuery.access( this, function( value ) {\n\ +\t\t\tvar elem = this[0] || {},\n\ +\t\t\t\ti = 0,\n\ +\t\t\t\tl = this.length;\n\ +\n\ +\t\t\tif ( value === undefined ) {\n\ +\t\t\t\treturn elem.nodeType === 1 ?\n\ +\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\ +\t\t\t\t\tundefined;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// See if we can take a shortcut and just use innerHTML\n\ +\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\ +\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&\n\ +\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\ +\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\ +\n\ +\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\ +\n\ +\t\t\t\ttry {\n\ +\t\t\t\t\tfor (; i < l; i++ ) {\n\ +\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\ +\t\t\t\t\t\telem = this[i] || {};\n\ +\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\ +\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\ +\t\t\t\t\t\t\telem.innerHTML = value;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\telem = 0;\n\ +\n\ +\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\ +\t\t\t\t} catch(e) {}\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( elem ) {\n\ +\t\t\t\tthis.empty().append( value );\n\ +\t\t\t}\n\ +\t\t}, null, value, arguments.length );\n\ +\t},\n\ +\n\ +\treplaceWith: function( value ) {\n\ +\t\tvar isFunc = jQuery.isFunction( value );\n\ +\n\ +\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\ +\t\t// this can help fix replacing a parent with child elements\n\ +\t\tif ( !isFunc && typeof value !== \"string\" ) {\n\ +\t\t\tvalue = jQuery( value ).not( this ).detach();\n\ +\t\t}\n\ +\n\ +\t\treturn this.domManip( [ value ], true, function( elem ) {\n\ +\t\t\tvar next = this.nextSibling,\n\ +\t\t\t\tparent = this.parentNode;\n\ +\n\ +\t\t\tif ( parent ) {\n\ +\t\t\t\tjQuery( this ).remove();\n\ +\t\t\t\tparent.insertBefore( elem, next );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\n\ +\tdetach: function( selector ) {\n\ +\t\treturn this.remove( selector, true );\n\ +\t},\n\ +\n\ +\tdomManip: function( args, table, callback ) {\n\ +\n\ +\t\t// Flatten any nested arrays\n\ +\t\targs = core_concat.apply( [], args );\n\ +\n\ +\t\tvar first, node, hasScripts,\n\ +\t\t\tscripts, doc, fragment,\n\ +\t\t\ti = 0,\n\ +\t\t\tl = this.length,\n\ +\t\t\tset = this,\n\ +\t\t\tiNoClone = l - 1,\n\ +\t\t\tvalue = args[0],\n\ +\t\t\tisFunction = jQuery.isFunction( value );\n\ +\n\ +\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\ +\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\ +\t\t\treturn this.each(function( index ) {\n\ +\t\t\t\tvar self = set.eq( index );\n\ +\t\t\t\tif ( isFunction ) {\n\ +\t\t\t\t\targs[0] = value.call( this, index, table ? self.html() : undefined );\n\ +\t\t\t\t}\n\ +\t\t\t\tself.domManip( args, table, callback );\n\ +\t\t\t});\n\ +\t\t}\n\ +\n\ +\t\tif ( l ) {\n\ +\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\ +\t\t\tfirst = fragment.firstChild;\n\ +\n\ +\t\t\tif ( fragment.childNodes.length === 1 ) {\n\ +\t\t\t\tfragment = first;\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( first ) {\n\ +\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\ +\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\ +\t\t\t\thasScripts = scripts.length;\n\ +\n\ +\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\ +\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\ +\t\t\t\tfor ( ; i < l; i++ ) {\n\ +\t\t\t\t\tnode = fragment;\n\ +\n\ +\t\t\t\t\tif ( i !== iNoClone ) {\n\ +\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\ +\n\ +\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\ +\t\t\t\t\t\tif ( hasScripts ) {\n\ +\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\tcallback.call(\n\ +\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\ +\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\ +\t\t\t\t\t\t\tthis[i],\n\ +\t\t\t\t\t\tnode,\n\ +\t\t\t\t\t\ti\n\ +\t\t\t\t\t);\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tif ( hasScripts ) {\n\ +\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\ +\n\ +\t\t\t\t\t// Reenable scripts\n\ +\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\ +\n\ +\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\ +\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\ +\t\t\t\t\t\tnode = scripts[ i ];\n\ +\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\ +\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\ +\n\ +\t\t\t\t\t\t\tif ( node.src ) {\n\ +\t\t\t\t\t\t\t\t// Hope ajax is available...\n\ +\t\t\t\t\t\t\t\tjQuery.ajax({\n\ +\t\t\t\t\t\t\t\t\turl: node.src,\n\ +\t\t\t\t\t\t\t\t\ttype: \"GET\",\n\ +\t\t\t\t\t\t\t\t\tdataType: \"script\",\n\ +\t\t\t\t\t\t\t\t\tasync: false,\n\ +\t\t\t\t\t\t\t\t\tglobal: false,\n\ +\t\t\t\t\t\t\t\t\t\"throws\": true\n\ +\t\t\t\t\t\t\t\t});\n\ +\t\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Fix #11809: Avoid leaking memory\n\ +\t\t\t\tfragment = first = null;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn this;\n\ +\t}\n\ +});\n\ +\n\ +function findOrAppend( elem, tag ) {\n\ +\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n\ +}\n\ +\n\ +// Replace/restore the type attribute of script elements for safe DOM manipulation\n\ +function disableScript( elem ) {\n\ +\tvar attr = elem.getAttributeNode(\"type\");\n\ +\telem.type = ( attr && attr.specified ) + \"/\" + elem.type;\n\ +\treturn elem;\n\ +}\n\ +function restoreScript( elem ) {\n\ +\tvar match = rscriptTypeMasked.exec( elem.type );\n\ +\tif ( match ) {\n\ +\t\telem.type = match[1];\n\ +\t} else {\n\ +\t\telem.removeAttribute(\"type\");\n\ +\t}\n\ +\treturn elem;\n\ +}\n\ +\n\ +// Mark scripts as having already been evaluated\n\ +function setGlobalEval( elems, refElements ) {\n\ +\tvar elem,\n\ +\t\ti = 0;\n\ +\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\ +\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\ +\t}\n\ +}\n\ +\n\ +function cloneCopyEvent( src, dest ) {\n\ +\n\ +\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tvar type, i, l,\n\ +\t\toldData = jQuery._data( src ),\n\ +\t\tcurData = jQuery._data( dest, oldData ),\n\ +\t\tevents = oldData.events;\n\ +\n\ +\tif ( events ) {\n\ +\t\tdelete curData.handle;\n\ +\t\tcurData.events = {};\n\ +\n\ +\t\tfor ( type in events ) {\n\ +\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\ +\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// make the cloned public data object a copy from the original\n\ +\tif ( curData.data ) {\n\ +\t\tcurData.data = jQuery.extend( {}, curData.data );\n\ +\t}\n\ +}\n\ +\n\ +function fixCloneNodeIssues( src, dest ) {\n\ +\tvar nodeName, e, data;\n\ +\n\ +\t// We do not need to do anything for non-Elements\n\ +\tif ( dest.nodeType !== 1 ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tnodeName = dest.nodeName.toLowerCase();\n\ +\n\ +\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\ +\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\ +\t\tdata = jQuery._data( dest );\n\ +\n\ +\t\tfor ( e in data.events ) {\n\ +\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\ +\t\t}\n\ +\n\ +\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\ +\t\tdest.removeAttribute( jQuery.expando );\n\ +\t}\n\ +\n\ +\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\ +\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\ +\t\tdisableScript( dest ).text = src.text;\n\ +\t\trestoreScript( dest );\n\ +\n\ +\t// IE6-10 improperly clones children of object elements using classid.\n\ +\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\ +\t} else if ( nodeName === \"object\" ) {\n\ +\t\tif ( dest.parentNode ) {\n\ +\t\t\tdest.outerHTML = src.outerHTML;\n\ +\t\t}\n\ +\n\ +\t\t// This path appears unavoidable for IE9. When cloning an object\n\ +\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\ +\t\t// If the src has innerHTML and the destination does not,\n\ +\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\ +\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\ +\t\t\tdest.innerHTML = src.innerHTML;\n\ +\t\t}\n\ +\n\ +\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\ +\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\ +\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\ +\t\t// a checked appearance if the defaultChecked value isn't also set\n\ +\n\ +\t\tdest.defaultChecked = dest.checked = src.checked;\n\ +\n\ +\t\t// IE6-7 get confused and end up setting the value of a cloned\n\ +\t\t// checkbox/radio button to an empty string instead of \"on\"\n\ +\t\tif ( dest.value !== src.value ) {\n\ +\t\t\tdest.value = src.value;\n\ +\t\t}\n\ +\n\ +\t// IE6-8 fails to return the selected option to the default selected\n\ +\t// state when cloning options\n\ +\t} else if ( nodeName === \"option\" ) {\n\ +\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\ +\n\ +\t// IE6-8 fails to set the defaultValue to the correct value when\n\ +\t// cloning other types of input fields\n\ +\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\ +\t\tdest.defaultValue = src.defaultValue;\n\ +\t}\n\ +}\n\ +\n\ +jQuery.each({\n\ +\tappendTo: \"append\",\n\ +\tprependTo: \"prepend\",\n\ +\tinsertBefore: \"before\",\n\ +\tinsertAfter: \"after\",\n\ +\treplaceAll: \"replaceWith\"\n\ +}, function( name, original ) {\n\ +\tjQuery.fn[ name ] = function( selector ) {\n\ +\t\tvar elems,\n\ +\t\t\ti = 0,\n\ +\t\t\tret = [],\n\ +\t\t\tinsert = jQuery( selector ),\n\ +\t\t\tlast = insert.length - 1;\n\ +\n\ +\t\tfor ( ; i <= last; i++ ) {\n\ +\t\t\telems = i === last ? this : this.clone(true);\n\ +\t\t\tjQuery( insert[i] )[ original ]( elems );\n\ +\n\ +\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\ +\t\t\tcore_push.apply( ret, elems.get() );\n\ +\t\t}\n\ +\n\ +\t\treturn this.pushStack( ret );\n\ +\t};\n\ +});\n\ +\n\ +function getAll( context, tag ) {\n\ +\tvar elems, elem,\n\ +\t\ti = 0,\n\ +\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\ +\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\ +\t\t\tundefined;\n\ +\n\ +\tif ( !found ) {\n\ +\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\ +\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\ +\t\t\t\tfound.push( elem );\n\ +\t\t\t} else {\n\ +\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\ +\t\tjQuery.merge( [ context ], found ) :\n\ +\t\tfound;\n\ +}\n\ +\n\ +// Used in buildFragment, fixes the defaultChecked property\n\ +function fixDefaultChecked( elem ) {\n\ +\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\ +\t\telem.defaultChecked = elem.checked;\n\ +\t}\n\ +}\n\ +\n\ +jQuery.extend({\n\ +\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\ +\t\tvar destElements, node, clone, i, srcElements,\n\ +\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\ +\n\ +\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\ +\t\t\tclone = elem.cloneNode( true );\n\ +\n\ +\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\ +\t\t} else {\n\ +\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\ +\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\ +\t\t}\n\ +\n\ +\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\ +\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\ +\n\ +\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\ +\t\t\tdestElements = getAll( clone );\n\ +\t\t\tsrcElements = getAll( elem );\n\ +\n\ +\t\t\t// Fix all IE cloning issues\n\ +\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\ +\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\ +\t\t\t\tif ( destElements[i] ) {\n\ +\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Copy the events from the original to the clone\n\ +\t\tif ( dataAndEvents ) {\n\ +\t\t\tif ( deepDataAndEvents ) {\n\ +\t\t\t\tsrcElements = srcElements || getAll( elem );\n\ +\t\t\t\tdestElements = destElements || getAll( clone );\n\ +\n\ +\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\ +\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\tcloneCopyEvent( elem, clone );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Preserve script evaluation history\n\ +\t\tdestElements = getAll( clone, \"script\" );\n\ +\t\tif ( destElements.length > 0 ) {\n\ +\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\ +\t\t}\n\ +\n\ +\t\tdestElements = srcElements = node = null;\n\ +\n\ +\t\t// Return the cloned set\n\ +\t\treturn clone;\n\ +\t},\n\ +\n\ +\tbuildFragment: function( elems, context, scripts, selection ) {\n\ +\t\tvar j, elem, contains,\n\ +\t\t\ttmp, tag, tbody, wrap,\n\ +\t\t\tl = elems.length,\n\ +\n\ +\t\t\t// Ensure a safe fragment\n\ +\t\t\tsafe = createSafeFragment( context ),\n\ +\n\ +\t\t\tnodes = [],\n\ +\t\t\ti = 0;\n\ +\n\ +\t\tfor ( ; i < l; i++ ) {\n\ +\t\t\telem = elems[ i ];\n\ +\n\ +\t\t\tif ( elem || elem === 0 ) {\n\ +\n\ +\t\t\t\t// Add nodes directly\n\ +\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\ +\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\ +\n\ +\t\t\t\t// Convert non-html into a text node\n\ +\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\ +\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\ +\n\ +\t\t\t\t// Convert html into DOM nodes\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\ +\n\ +\t\t\t\t\t// Deserialize a standard representation\n\ +\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\ +\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\ +\n\ +\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\ +\n\ +\t\t\t\t\t// Descend through wrappers to the right content\n\ +\t\t\t\t\tj = wrap[0];\n\ +\t\t\t\t\twhile ( j-- ) {\n\ +\t\t\t\t\t\ttmp = tmp.lastChild;\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Manually add leading whitespace removed by IE\n\ +\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\ +\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\ +\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\ +\n\ +\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\ +\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\ +\t\t\t\t\t\t\ttmp.firstChild :\n\ +\n\ +\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\ +\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\ +\t\t\t\t\t\t\t\ttmp :\n\ +\t\t\t\t\t\t\t\t0;\n\ +\n\ +\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\ +\t\t\t\t\t\twhile ( j-- ) {\n\ +\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\ +\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\ +\n\ +\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\ +\t\t\t\t\ttmp.textContent = \"\";\n\ +\n\ +\t\t\t\t\t// Fix #12392 for oldIE\n\ +\t\t\t\t\twhile ( tmp.firstChild ) {\n\ +\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Remember the top-level container for proper cleanup\n\ +\t\t\t\t\ttmp = safe.lastChild;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Fix #11356: Clear elements from fragment\n\ +\t\tif ( tmp ) {\n\ +\t\t\tsafe.removeChild( tmp );\n\ +\t\t}\n\ +\n\ +\t\t// Reset defaultChecked for any radios and checkboxes\n\ +\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\ +\t\tif ( !jQuery.support.appendChecked ) {\n\ +\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\ +\t\t}\n\ +\n\ +\t\ti = 0;\n\ +\t\twhile ( (elem = nodes[ i++ ]) ) {\n\ +\n\ +\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\ +\t\t\t// that element, do not do anything\n\ +\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\ +\t\t\t\tcontinue;\n\ +\t\t\t}\n\ +\n\ +\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\ +\n\ +\t\t\t// Append to fragment\n\ +\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\ +\n\ +\t\t\t// Preserve script evaluation history\n\ +\t\t\tif ( contains ) {\n\ +\t\t\t\tsetGlobalEval( tmp );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Capture executables\n\ +\t\t\tif ( scripts ) {\n\ +\t\t\t\tj = 0;\n\ +\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\ +\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\ +\t\t\t\t\t\tscripts.push( elem );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\ttmp = null;\n\ +\n\ +\t\treturn safe;\n\ +\t},\n\ +\n\ +\tcleanData: function( elems, /* internal */ acceptData ) {\n\ +\t\tvar elem, type, id, data,\n\ +\t\t\ti = 0,\n\ +\t\t\tinternalKey = jQuery.expando,\n\ +\t\t\tcache = jQuery.cache,\n\ +\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\ +\t\t\tspecial = jQuery.event.special;\n\ +\n\ +\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\ +\n\ +\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\ +\n\ +\t\t\t\tid = elem[ internalKey ];\n\ +\t\t\t\tdata = id && cache[ id ];\n\ +\n\ +\t\t\t\tif ( data ) {\n\ +\t\t\t\t\tif ( data.events ) {\n\ +\t\t\t\t\t\tfor ( type in data.events ) {\n\ +\t\t\t\t\t\t\tif ( special[ type ] ) {\n\ +\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\ +\n\ +\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\ +\t\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\ +\t\t\t\t\tif ( cache[ id ] ) {\n\ +\n\ +\t\t\t\t\t\tdelete cache[ id ];\n\ +\n\ +\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\ +\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\ +\t\t\t\t\t\t// we must handle all of these cases\n\ +\t\t\t\t\t\tif ( deleteExpando ) {\n\ +\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\ +\n\ +\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\ +\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\ +\n\ +\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\telem[ internalKey ] = null;\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\tcore_deletedIds.push( id );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +});\n\ +var iframe, getStyles, curCSS,\n\ +\tralpha = /alpha\\([^)]*\\)/i,\n\ +\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\ +\trposition = /^(top|right|bottom|left)$/,\n\ +\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\ +\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\ +\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\ +\trmargin = /^margin/,\n\ +\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\ +\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\ +\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\ +\telemdisplay = { BODY: \"block\" },\n\ +\n\ +\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\ +\tcssNormalTransform = {\n\ +\t\tletterSpacing: 0,\n\ +\t\tfontWeight: 400\n\ +\t},\n\ +\n\ +\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\ +\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\ +\n\ +// return a css property mapped to a potentially vendor prefixed property\n\ +function vendorPropName( style, name ) {\n\ +\n\ +\t// shortcut for names that are not vendor prefixed\n\ +\tif ( name in style ) {\n\ +\t\treturn name;\n\ +\t}\n\ +\n\ +\t// check for vendor prefixed names\n\ +\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\ +\t\torigName = name,\n\ +\t\ti = cssPrefixes.length;\n\ +\n\ +\twhile ( i-- ) {\n\ +\t\tname = cssPrefixes[ i ] + capName;\n\ +\t\tif ( name in style ) {\n\ +\t\t\treturn name;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn origName;\n\ +}\n\ +\n\ +function isHidden( elem, el ) {\n\ +\t// isHidden might be called from jQuery#filter function;\n\ +\t// in that case, element will be second argument\n\ +\telem = el || elem;\n\ +\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\ +}\n\ +\n\ +function showHide( elements, show ) {\n\ +\tvar display, elem, hidden,\n\ +\t\tvalues = [],\n\ +\t\tindex = 0,\n\ +\t\tlength = elements.length;\n\ +\n\ +\tfor ( ; index < length; index++ ) {\n\ +\t\telem = elements[ index ];\n\ +\t\tif ( !elem.style ) {\n\ +\t\t\tcontinue;\n\ +\t\t}\n\ +\n\ +\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\ +\t\tdisplay = elem.style.display;\n\ +\t\tif ( show ) {\n\ +\t\t\t// Reset the inline display of this element to learn if it is\n\ +\t\t\t// being hidden by cascaded rules or not\n\ +\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\ +\t\t\t\telem.style.display = \"\";\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Set elements which have been overridden with display: none\n\ +\t\t\t// in a stylesheet to whatever the default browser style is\n\ +\t\t\t// for such an element\n\ +\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\ +\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\ +\t\t\t}\n\ +\t\t} else {\n\ +\n\ +\t\t\tif ( !values[ index ] ) {\n\ +\t\t\t\thidden = isHidden( elem );\n\ +\n\ +\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\ +\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Set the display of most of the elements in a second loop\n\ +\t// to avoid the constant reflow\n\ +\tfor ( index = 0; index < length; index++ ) {\n\ +\t\telem = elements[ index ];\n\ +\t\tif ( !elem.style ) {\n\ +\t\t\tcontinue;\n\ +\t\t}\n\ +\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\ +\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn elements;\n\ +}\n\ +\n\ +jQuery.fn.extend({\n\ +\tcss: function( name, value ) {\n\ +\t\treturn jQuery.access( this, function( elem, name, value ) {\n\ +\t\t\tvar len, styles,\n\ +\t\t\t\tmap = {},\n\ +\t\t\t\ti = 0;\n\ +\n\ +\t\t\tif ( jQuery.isArray( name ) ) {\n\ +\t\t\t\tstyles = getStyles( elem );\n\ +\t\t\t\tlen = name.length;\n\ +\n\ +\t\t\t\tfor ( ; i < len; i++ ) {\n\ +\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\treturn map;\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn value !== undefined ?\n\ +\t\t\t\tjQuery.style( elem, name, value ) :\n\ +\t\t\t\tjQuery.css( elem, name );\n\ +\t\t}, name, value, arguments.length > 1 );\n\ +\t},\n\ +\tshow: function() {\n\ +\t\treturn showHide( this, true );\n\ +\t},\n\ +\thide: function() {\n\ +\t\treturn showHide( this );\n\ +\t},\n\ +\ttoggle: function( state ) {\n\ +\t\tvar bool = typeof state === \"boolean\";\n\ +\n\ +\t\treturn this.each(function() {\n\ +\t\t\tif ( bool ? state : isHidden( this ) ) {\n\ +\t\t\t\tjQuery( this ).show();\n\ +\t\t\t} else {\n\ +\t\t\t\tjQuery( this ).hide();\n\ +\t\t\t}\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +jQuery.extend({\n\ +\t// Add in style property hooks for overriding the default\n\ +\t// behavior of getting and setting a style property\n\ +\tcssHooks: {\n\ +\t\topacity: {\n\ +\t\t\tget: function( elem, computed ) {\n\ +\t\t\t\tif ( computed ) {\n\ +\t\t\t\t\t// We should always get a number back from opacity\n\ +\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\ +\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// Exclude the following css properties to add px\n\ +\tcssNumber: {\n\ +\t\t\"columnCount\": true,\n\ +\t\t\"fillOpacity\": true,\n\ +\t\t\"fontWeight\": true,\n\ +\t\t\"lineHeight\": true,\n\ +\t\t\"opacity\": true,\n\ +\t\t\"orphans\": true,\n\ +\t\t\"widows\": true,\n\ +\t\t\"zIndex\": true,\n\ +\t\t\"zoom\": true\n\ +\t},\n\ +\n\ +\t// Add in properties whose names you wish to fix before\n\ +\t// setting or getting the value\n\ +\tcssProps: {\n\ +\t\t// normalize float css property\n\ +\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\ +\t},\n\ +\n\ +\t// Get and set the style property on a DOM Node\n\ +\tstyle: function( elem, name, value, extra ) {\n\ +\t\t// Don't set styles on text and comment nodes\n\ +\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\t// Make sure that we're working with the right name\n\ +\t\tvar ret, type, hooks,\n\ +\t\t\torigName = jQuery.camelCase( name ),\n\ +\t\t\tstyle = elem.style;\n\ +\n\ +\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\ +\n\ +\t\t// gets hook for the prefixed version\n\ +\t\t// followed by the unprefixed version\n\ +\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\ +\n\ +\t\t// Check if we're setting a value\n\ +\t\tif ( value !== undefined ) {\n\ +\t\t\ttype = typeof value;\n\ +\n\ +\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\ +\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\ +\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\ +\t\t\t\t// Fixes bug #9237\n\ +\t\t\t\ttype = \"number\";\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\ +\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\ +\t\t\t\treturn;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\ +\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\ +\t\t\t\tvalue += \"px\";\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\ +\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\ +\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\ +\t\t\t\tstyle[ name ] = \"inherit\";\n\ +\t\t\t}\n\ +\n\ +\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\ +\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\ +\n\ +\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\ +\t\t\t\t// Fixes bug #5509\n\ +\t\t\t\ttry {\n\ +\t\t\t\t\tstyle[ name ] = value;\n\ +\t\t\t\t} catch(e) {}\n\ +\t\t\t}\n\ +\n\ +\t\t} else {\n\ +\t\t\t// If a hook was provided get the non-computed value from there\n\ +\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\ +\t\t\t\treturn ret;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Otherwise just get the value from the style object\n\ +\t\t\treturn style[ name ];\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tcss: function( elem, name, extra, styles ) {\n\ +\t\tvar num, val, hooks,\n\ +\t\t\torigName = jQuery.camelCase( name );\n\ +\n\ +\t\t// Make sure that we're working with the right name\n\ +\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\ +\n\ +\t\t// gets hook for the prefixed version\n\ +\t\t// followed by the unprefixed version\n\ +\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\ +\n\ +\t\t// If a hook was provided get the computed value from there\n\ +\t\tif ( hooks && \"get\" in hooks ) {\n\ +\t\t\tval = hooks.get( elem, true, extra );\n\ +\t\t}\n\ +\n\ +\t\t// Otherwise, if a way to get the computed value exists, use that\n\ +\t\tif ( val === undefined ) {\n\ +\t\t\tval = curCSS( elem, name, styles );\n\ +\t\t}\n\ +\n\ +\t\t//convert \"normal\" to computed value\n\ +\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\ +\t\t\tval = cssNormalTransform[ name ];\n\ +\t\t}\n\ +\n\ +\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\ +\t\tif ( extra === \"\" || extra ) {\n\ +\t\t\tnum = parseFloat( val );\n\ +\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\ +\t\t}\n\ +\t\treturn val;\n\ +\t},\n\ +\n\ +\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\ +\tswap: function( elem, options, callback, args ) {\n\ +\t\tvar ret, name,\n\ +\t\t\told = {};\n\ +\n\ +\t\t// Remember the old values, and insert the new ones\n\ +\t\tfor ( name in options ) {\n\ +\t\t\told[ name ] = elem.style[ name ];\n\ +\t\t\telem.style[ name ] = options[ name ];\n\ +\t\t}\n\ +\n\ +\t\tret = callback.apply( elem, args || [] );\n\ +\n\ +\t\t// Revert the old values\n\ +\t\tfor ( name in options ) {\n\ +\t\t\telem.style[ name ] = old[ name ];\n\ +\t\t}\n\ +\n\ +\t\treturn ret;\n\ +\t}\n\ +});\n\ +\n\ +// NOTE: we've included the \"window\" in window.getComputedStyle\n\ +// because jsdom on node.js will break without it.\n\ +if ( window.getComputedStyle ) {\n\ +\tgetStyles = function( elem ) {\n\ +\t\treturn window.getComputedStyle( elem, null );\n\ +\t};\n\ +\n\ +\tcurCSS = function( elem, name, _computed ) {\n\ +\t\tvar width, minWidth, maxWidth,\n\ +\t\t\tcomputed = _computed || getStyles( elem ),\n\ +\n\ +\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\ +\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\ +\t\t\tstyle = elem.style;\n\ +\n\ +\t\tif ( computed ) {\n\ +\n\ +\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\ +\t\t\t\tret = jQuery.style( elem, name );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\ +\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\ +\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\ +\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\ +\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\ +\n\ +\t\t\t\t// Remember the original values\n\ +\t\t\t\twidth = style.width;\n\ +\t\t\t\tminWidth = style.minWidth;\n\ +\t\t\t\tmaxWidth = style.maxWidth;\n\ +\n\ +\t\t\t\t// Put in the new values to get a computed value out\n\ +\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\ +\t\t\t\tret = computed.width;\n\ +\n\ +\t\t\t\t// Revert the changed values\n\ +\t\t\t\tstyle.width = width;\n\ +\t\t\t\tstyle.minWidth = minWidth;\n\ +\t\t\t\tstyle.maxWidth = maxWidth;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn ret;\n\ +\t};\n\ +} else if ( document.documentElement.currentStyle ) {\n\ +\tgetStyles = function( elem ) {\n\ +\t\treturn elem.currentStyle;\n\ +\t};\n\ +\n\ +\tcurCSS = function( elem, name, _computed ) {\n\ +\t\tvar left, rs, rsLeft,\n\ +\t\t\tcomputed = _computed || getStyles( elem ),\n\ +\t\t\tret = computed ? computed[ name ] : undefined,\n\ +\t\t\tstyle = elem.style;\n\ +\n\ +\t\t// Avoid setting ret to empty string here\n\ +\t\t// so we don't default to auto\n\ +\t\tif ( ret == null && style && style[ name ] ) {\n\ +\t\t\tret = style[ name ];\n\ +\t\t}\n\ +\n\ +\t\t// From the awesome hack by Dean Edwards\n\ +\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\ +\n\ +\t\t// If we're not dealing with a regular pixel number\n\ +\t\t// but a number that has a weird ending, we need to convert it to pixels\n\ +\t\t// but not position css attributes, as those are proportional to the parent element instead\n\ +\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\ +\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\ +\n\ +\t\t\t// Remember the original values\n\ +\t\t\tleft = style.left;\n\ +\t\t\trs = elem.runtimeStyle;\n\ +\t\t\trsLeft = rs && rs.left;\n\ +\n\ +\t\t\t// Put in the new values to get a computed value out\n\ +\t\t\tif ( rsLeft ) {\n\ +\t\t\t\trs.left = elem.currentStyle.left;\n\ +\t\t\t}\n\ +\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\ +\t\t\tret = style.pixelLeft + \"px\";\n\ +\n\ +\t\t\t// Revert the changed values\n\ +\t\t\tstyle.left = left;\n\ +\t\t\tif ( rsLeft ) {\n\ +\t\t\t\trs.left = rsLeft;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn ret === \"\" ? \"auto\" : ret;\n\ +\t};\n\ +}\n\ +\n\ +function setPositiveNumber( elem, value, subtract ) {\n\ +\tvar matches = rnumsplit.exec( value );\n\ +\treturn matches ?\n\ +\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\ +\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\ +\t\tvalue;\n\ +}\n\ +\n\ +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\ +\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\ +\t\t// If we already have the right measurement, avoid augmentation\n\ +\t\t4 :\n\ +\t\t// Otherwise initialize for horizontal or vertical properties\n\ +\t\tname === \"width\" ? 1 : 0,\n\ +\n\ +\t\tval = 0;\n\ +\n\ +\tfor ( ; i < 4; i += 2 ) {\n\ +\t\t// both box models exclude margin, so add it if we want it\n\ +\t\tif ( extra === \"margin\" ) {\n\ +\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\ +\t\t}\n\ +\n\ +\t\tif ( isBorderBox ) {\n\ +\t\t\t// border-box includes padding, so remove it if we want content\n\ +\t\t\tif ( extra === \"content\" ) {\n\ +\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// at this point, extra isn't border nor margin, so remove border\n\ +\t\t\tif ( extra !== \"margin\" ) {\n\ +\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\ +\t\t\t}\n\ +\t\t} else {\n\ +\t\t\t// at this point, extra isn't content, so add padding\n\ +\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\ +\n\ +\t\t\t// at this point, extra isn't content nor padding, so add border\n\ +\t\t\tif ( extra !== \"padding\" ) {\n\ +\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn val;\n\ +}\n\ +\n\ +function getWidthOrHeight( elem, name, extra ) {\n\ +\n\ +\t// Start with offset property, which is equivalent to the border-box value\n\ +\tvar valueIsBorderBox = true,\n\ +\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\ +\t\tstyles = getStyles( elem ),\n\ +\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\ +\n\ +\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\ +\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\ +\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\ +\tif ( val <= 0 || val == null ) {\n\ +\t\t// Fall back to computed then uncomputed css if necessary\n\ +\t\tval = curCSS( elem, name, styles );\n\ +\t\tif ( val < 0 || val == null ) {\n\ +\t\t\tval = elem.style[ name ];\n\ +\t\t}\n\ +\n\ +\t\t// Computed unit is not pixels. Stop here and return.\n\ +\t\tif ( rnumnonpx.test(val) ) {\n\ +\t\t\treturn val;\n\ +\t\t}\n\ +\n\ +\t\t// we need the check for style in case a browser which returns unreliable values\n\ +\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\ +\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\ +\n\ +\t\t// Normalize \"\", auto, and prepare for extra\n\ +\t\tval = parseFloat( val ) || 0;\n\ +\t}\n\ +\n\ +\t// use the active box-sizing model to add/subtract irrelevant styles\n\ +\treturn ( val +\n\ +\t\taugmentWidthOrHeight(\n\ +\t\t\telem,\n\ +\t\t\tname,\n\ +\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\ +\t\t\tvalueIsBorderBox,\n\ +\t\t\tstyles\n\ +\t\t)\n\ +\t) + \"px\";\n\ +}\n\ +\n\ +// Try to determine the default display value of an element\n\ +function css_defaultDisplay( nodeName ) {\n\ +\tvar doc = document,\n\ +\t\tdisplay = elemdisplay[ nodeName ];\n\ +\n\ +\tif ( !display ) {\n\ +\t\tdisplay = actualDisplay( nodeName, doc );\n\ +\n\ +\t\t// If the simple way fails, read from inside an iframe\n\ +\t\tif ( display === \"none\" || !display ) {\n\ +\t\t\t// Use the already-created iframe if possible\n\ +\t\t\tiframe = ( iframe ||\n\ +\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\ +\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\ +\t\t\t).appendTo( doc.documentElement );\n\ +\n\ +\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\ +\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\ +\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\ +\t\t\tdoc.close();\n\ +\n\ +\t\t\tdisplay = actualDisplay( nodeName, doc );\n\ +\t\t\tiframe.detach();\n\ +\t\t}\n\ +\n\ +\t\t// Store the correct default display\n\ +\t\telemdisplay[ nodeName ] = display;\n\ +\t}\n\ +\n\ +\treturn display;\n\ +}\n\ +\n\ +// Called ONLY from within css_defaultDisplay\n\ +function actualDisplay( name, doc ) {\n\ +\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\ +\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\ +\telem.remove();\n\ +\treturn display;\n\ +}\n\ +\n\ +jQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\ +\tjQuery.cssHooks[ name ] = {\n\ +\t\tget: function( elem, computed, extra ) {\n\ +\t\t\tif ( computed ) {\n\ +\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\ +\t\t\t\t// however, it must have a current display style that would benefit from this\n\ +\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\ +\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\ +\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\ +\t\t\t\t\t}) :\n\ +\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\ +\t\t\t}\n\ +\t\t},\n\ +\n\ +\t\tset: function( elem, value, extra ) {\n\ +\t\t\tvar styles = extra && getStyles( elem );\n\ +\t\t\treturn setPositiveNumber( elem, value, extra ?\n\ +\t\t\t\taugmentWidthOrHeight(\n\ +\t\t\t\t\telem,\n\ +\t\t\t\t\tname,\n\ +\t\t\t\t\textra,\n\ +\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\ +\t\t\t\t\tstyles\n\ +\t\t\t\t) : 0\n\ +\t\t\t);\n\ +\t\t}\n\ +\t};\n\ +});\n\ +\n\ +if ( !jQuery.support.opacity ) {\n\ +\tjQuery.cssHooks.opacity = {\n\ +\t\tget: function( elem, computed ) {\n\ +\t\t\t// IE uses filters for opacity\n\ +\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\ +\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\ +\t\t\t\tcomputed ? \"1\" : \"\";\n\ +\t\t},\n\ +\n\ +\t\tset: function( elem, value ) {\n\ +\t\t\tvar style = elem.style,\n\ +\t\t\t\tcurrentStyle = elem.currentStyle,\n\ +\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\ +\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\ +\n\ +\t\t\t// IE has trouble with opacity if it does not have layout\n\ +\t\t\t// Force it by setting the zoom level\n\ +\t\t\tstyle.zoom = 1;\n\ +\n\ +\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\ +\t\t\t// if value === \"\", then remove inline opacity #12685\n\ +\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\ +\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\ +\t\t\t\t\tstyle.removeAttribute ) {\n\ +\n\ +\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\ +\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\ +\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\ +\t\t\t\tstyle.removeAttribute( \"filter\" );\n\ +\n\ +\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\ +\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\ +\t\t\t\t\treturn;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// otherwise, set new filter values\n\ +\t\t\tstyle.filter = ralpha.test( filter ) ?\n\ +\t\t\t\tfilter.replace( ralpha, opacity ) :\n\ +\t\t\t\tfilter + \" \" + opacity;\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// These hooks cannot be added until DOM ready because the support test\n\ +// for it is not run until after DOM ready\n\ +jQuery(function() {\n\ +\tif ( !jQuery.support.reliableMarginRight ) {\n\ +\t\tjQuery.cssHooks.marginRight = {\n\ +\t\t\tget: function( elem, computed ) {\n\ +\t\t\t\tif ( computed ) {\n\ +\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\ +\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\ +\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\ +\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t};\n\ +\t}\n\ +\n\ +\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\ +\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\ +\t// rather than make the css module depend on the offset module, we just check for it here\n\ +\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\ +\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\ +\t\t\tjQuery.cssHooks[ prop ] = {\n\ +\t\t\t\tget: function( elem, computed ) {\n\ +\t\t\t\t\tif ( computed ) {\n\ +\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\ +\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\ +\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\ +\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\ +\t\t\t\t\t\t\tcomputed;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\t\t});\n\ +\t}\n\ +\n\ +});\n\ +\n\ +if ( jQuery.expr && jQuery.expr.filters ) {\n\ +\tjQuery.expr.filters.hidden = function( elem ) {\n\ +\t\t// Support: Opera <= 12.12\n\ +\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\ +\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\ +\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\ +\t};\n\ +\n\ +\tjQuery.expr.filters.visible = function( elem ) {\n\ +\t\treturn !jQuery.expr.filters.hidden( elem );\n\ +\t};\n\ +}\n\ +\n\ +// These hooks are used by animate to expand properties\n\ +jQuery.each({\n\ +\tmargin: \"\",\n\ +\tpadding: \"\",\n\ +\tborder: \"Width\"\n\ +}, function( prefix, suffix ) {\n\ +\tjQuery.cssHooks[ prefix + suffix ] = {\n\ +\t\texpand: function( value ) {\n\ +\t\t\tvar i = 0,\n\ +\t\t\t\texpanded = {},\n\ +\n\ +\t\t\t\t// assumes a single number if not a string\n\ +\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\ +\n\ +\t\t\tfor ( ; i < 4; i++ ) {\n\ +\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\ +\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\ +\t\t\t}\n\ +\n\ +\t\t\treturn expanded;\n\ +\t\t}\n\ +\t};\n\ +\n\ +\tif ( !rmargin.test( prefix ) ) {\n\ +\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\ +\t}\n\ +});\n\ +var r20 = /%20/g,\n\ +\trbracket = /\\[\\]$/,\n\ +\trCRLF = /\\r?\\n\ +/g,\n\ +\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\ +\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\ +\n\ +jQuery.fn.extend({\n\ +\tserialize: function() {\n\ +\t\treturn jQuery.param( this.serializeArray() );\n\ +\t},\n\ +\tserializeArray: function() {\n\ +\t\treturn this.map(function(){\n\ +\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\ +\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\ +\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\ +\t\t})\n\ +\t\t.filter(function(){\n\ +\t\t\tvar type = this.type;\n\ +\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\ +\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\ +\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\ +\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\ +\t\t})\n\ +\t\t.map(function( i, elem ){\n\ +\t\t\tvar val = jQuery( this ).val();\n\ +\n\ +\t\t\treturn val == null ?\n\ +\t\t\t\tnull :\n\ +\t\t\t\tjQuery.isArray( val ) ?\n\ +\t\t\t\t\tjQuery.map( val, function( val ){\n\ +\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\ +\" ) };\n\ +\t\t\t\t\t}) :\n\ +\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\ +\" ) };\n\ +\t\t}).get();\n\ +\t}\n\ +});\n\ +\n\ +//Serialize an array of form elements or a set of\n\ +//key/values into a query string\n\ +jQuery.param = function( a, traditional ) {\n\ +\tvar prefix,\n\ +\t\ts = [],\n\ +\t\tadd = function( key, value ) {\n\ +\t\t\t// If value is a function, invoke it and return its value\n\ +\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\ +\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\ +\t\t};\n\ +\n\ +\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\ +\tif ( traditional === undefined ) {\n\ +\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\ +\t}\n\ +\n\ +\t// If an array was passed in, assume that it is an array of form elements.\n\ +\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\ +\t\t// Serialize the form elements\n\ +\t\tjQuery.each( a, function() {\n\ +\t\t\tadd( this.name, this.value );\n\ +\t\t});\n\ +\n\ +\t} else {\n\ +\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\ +\t\t// did it), otherwise encode params recursively.\n\ +\t\tfor ( prefix in a ) {\n\ +\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Return the resulting serialization\n\ +\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\ +};\n\ +\n\ +function buildParams( prefix, obj, traditional, add ) {\n\ +\tvar name;\n\ +\n\ +\tif ( jQuery.isArray( obj ) ) {\n\ +\t\t// Serialize array item.\n\ +\t\tjQuery.each( obj, function( i, v ) {\n\ +\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\ +\t\t\t\t// Treat each array item as a scalar.\n\ +\t\t\t\tadd( prefix, v );\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\ +\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\ +\t\t\t}\n\ +\t\t});\n\ +\n\ +\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\ +\t\t// Serialize object item.\n\ +\t\tfor ( name in obj ) {\n\ +\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\ +\t\t}\n\ +\n\ +\t} else {\n\ +\t\t// Serialize scalar item.\n\ +\t\tadd( prefix, obj );\n\ +\t}\n\ +}\n\ +jQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\ +\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\ +\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\ +\n\ +\t// Handle event binding\n\ +\tjQuery.fn[ name ] = function( data, fn ) {\n\ +\t\treturn arguments.length > 0 ?\n\ +\t\t\tthis.on( name, null, data, fn ) :\n\ +\t\t\tthis.trigger( name );\n\ +\t};\n\ +});\n\ +\n\ +jQuery.fn.hover = function( fnOver, fnOut ) {\n\ +\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\ +};\n\ +var\n\ +\t// Document location\n\ +\tajaxLocParts,\n\ +\tajaxLocation,\n\ +\tajax_nonce = jQuery.now(),\n\ +\n\ +\tajax_rquery = /\\?/,\n\ +\trhash = /#.*$/,\n\ +\trts = /([?&])_=[^&]*/,\n\ +\trheaders = /^(.*?):[ \\t]*([^\\r\\n\ +]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\ +\t// #7653, #8125, #8152: local protocol detection\n\ +\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\ +\trnoContent = /^(?:GET|HEAD)$/,\n\ +\trprotocol = /^\\/\\//,\n\ +\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\ +\n\ +\t// Keep a copy of the old load method\n\ +\t_load = jQuery.fn.load,\n\ +\n\ +\t/* Prefilters\n\ +\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\ +\t * 2) These are called:\n\ +\t * - BEFORE asking for a transport\n\ +\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\ +\t * 3) key is the dataType\n\ +\t * 4) the catchall symbol \"*\" can be used\n\ +\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\ +\t */\n\ +\tprefilters = {},\n\ +\n\ +\t/* Transports bindings\n\ +\t * 1) key is the dataType\n\ +\t * 2) the catchall symbol \"*\" can be used\n\ +\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\ +\t */\n\ +\ttransports = {},\n\ +\n\ +\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\ +\tallTypes = \"*/\".concat(\"*\");\n\ +\n\ +// #8138, IE may throw an exception when accessing\n\ +// a field from window.location if document.domain has been set\n\ +try {\n\ +\tajaxLocation = location.href;\n\ +} catch( e ) {\n\ +\t// Use the href attribute of an A element\n\ +\t// since IE will modify it given document.location\n\ +\tajaxLocation = document.createElement( \"a\" );\n\ +\tajaxLocation.href = \"\";\n\ +\tajaxLocation = ajaxLocation.href;\n\ +}\n\ +\n\ +// Segment location into parts\n\ +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\ +\n\ +// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\n\ +function addToPrefiltersOrTransports( structure ) {\n\ +\n\ +\t// dataTypeExpression is optional and defaults to \"*\"\n\ +\treturn function( dataTypeExpression, func ) {\n\ +\n\ +\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\ +\t\t\tfunc = dataTypeExpression;\n\ +\t\t\tdataTypeExpression = \"*\";\n\ +\t\t}\n\ +\n\ +\t\tvar dataType,\n\ +\t\t\ti = 0,\n\ +\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\ +\n\ +\t\tif ( jQuery.isFunction( func ) ) {\n\ +\t\t\t// For each dataType in the dataTypeExpression\n\ +\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\ +\t\t\t\t// Prepend if requested\n\ +\t\t\t\tif ( dataType[0] === \"+\" ) {\n\ +\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\ +\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\ +\n\ +\t\t\t\t// Otherwise append\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t};\n\ +}\n\ +\n\ +// Base inspection function for prefilters and transports\n\ +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\ +\n\ +\tvar inspected = {},\n\ +\t\tseekingTransport = ( structure === transports );\n\ +\n\ +\tfunction inspect( dataType ) {\n\ +\t\tvar selected;\n\ +\t\tinspected[ dataType ] = true;\n\ +\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\ +\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\ +\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\ +\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\ +\t\t\t\tinspect( dataTypeOrTransport );\n\ +\t\t\t\treturn false;\n\ +\t\t\t} else if ( seekingTransport ) {\n\ +\t\t\t\treturn !( selected = dataTypeOrTransport );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t\treturn selected;\n\ +\t}\n\ +\n\ +\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n\ +}\n\ +\n\ +// A special extend for ajax options\n\ +// that takes \"flat\" options (not to be deep extended)\n\ +// Fixes #9887\n\ +function ajaxExtend( target, src ) {\n\ +\tvar deep, key,\n\ +\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\ +\n\ +\tfor ( key in src ) {\n\ +\t\tif ( src[ key ] !== undefined ) {\n\ +\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\ +\t\t}\n\ +\t}\n\ +\tif ( deep ) {\n\ +\t\tjQuery.extend( true, target, deep );\n\ +\t}\n\ +\n\ +\treturn target;\n\ +}\n\ +\n\ +jQuery.fn.load = function( url, params, callback ) {\n\ +\tif ( typeof url !== \"string\" && _load ) {\n\ +\t\treturn _load.apply( this, arguments );\n\ +\t}\n\ +\n\ +\tvar selector, response, type,\n\ +\t\tself = this,\n\ +\t\toff = url.indexOf(\" \");\n\ +\n\ +\tif ( off >= 0 ) {\n\ +\t\tselector = url.slice( off, url.length );\n\ +\t\turl = url.slice( 0, off );\n\ +\t}\n\ +\n\ +\t// If it's a function\n\ +\tif ( jQuery.isFunction( params ) ) {\n\ +\n\ +\t\t// We assume that it's the callback\n\ +\t\tcallback = params;\n\ +\t\tparams = undefined;\n\ +\n\ +\t// Otherwise, build a param string\n\ +\t} else if ( params && typeof params === \"object\" ) {\n\ +\t\ttype = \"POST\";\n\ +\t}\n\ +\n\ +\t// If we have elements to modify, make the request\n\ +\tif ( self.length > 0 ) {\n\ +\t\tjQuery.ajax({\n\ +\t\t\turl: url,\n\ +\n\ +\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\ +\t\t\ttype: type,\n\ +\t\t\tdataType: \"html\",\n\ +\t\t\tdata: params\n\ +\t\t}).done(function( responseText ) {\n\ +\n\ +\t\t\t// Save response for use in complete callback\n\ +\t\t\tresponse = arguments;\n\ +\n\ +\t\t\tself.html( selector ?\n\ +\n\ +\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\ +\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\ +\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\ +\n\ +\t\t\t\t// Otherwise use the full result\n\ +\t\t\t\tresponseText );\n\ +\n\ +\t\t}).complete( callback && function( jqXHR, status ) {\n\ +\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\ +\t\t});\n\ +\t}\n\ +\n\ +\treturn this;\n\ +};\n\ +\n\ +// Attach a bunch of functions for handling common AJAX events\n\ +jQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\ +\tjQuery.fn[ type ] = function( fn ){\n\ +\t\treturn this.on( type, fn );\n\ +\t};\n\ +});\n\ +\n\ +jQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\ +\tjQuery[ method ] = function( url, data, callback, type ) {\n\ +\t\t// shift arguments if data argument was omitted\n\ +\t\tif ( jQuery.isFunction( data ) ) {\n\ +\t\t\ttype = type || callback;\n\ +\t\t\tcallback = data;\n\ +\t\t\tdata = undefined;\n\ +\t\t}\n\ +\n\ +\t\treturn jQuery.ajax({\n\ +\t\t\turl: url,\n\ +\t\t\ttype: method,\n\ +\t\t\tdataType: type,\n\ +\t\t\tdata: data,\n\ +\t\t\tsuccess: callback\n\ +\t\t});\n\ +\t};\n\ +});\n\ +\n\ +jQuery.extend({\n\ +\n\ +\t// Counter for holding the number of active queries\n\ +\tactive: 0,\n\ +\n\ +\t// Last-Modified header cache for next request\n\ +\tlastModified: {},\n\ +\tetag: {},\n\ +\n\ +\tajaxSettings: {\n\ +\t\turl: ajaxLocation,\n\ +\t\ttype: \"GET\",\n\ +\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\ +\t\tglobal: true,\n\ +\t\tprocessData: true,\n\ +\t\tasync: true,\n\ +\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\ +\t\t/*\n\ +\t\ttimeout: 0,\n\ +\t\tdata: null,\n\ +\t\tdataType: null,\n\ +\t\tusername: null,\n\ +\t\tpassword: null,\n\ +\t\tcache: null,\n\ +\t\tthrows: false,\n\ +\t\ttraditional: false,\n\ +\t\theaders: {},\n\ +\t\t*/\n\ +\n\ +\t\taccepts: {\n\ +\t\t\t\"*\": allTypes,\n\ +\t\t\ttext: \"text/plain\",\n\ +\t\t\thtml: \"text/html\",\n\ +\t\t\txml: \"application/xml, text/xml\",\n\ +\t\t\tjson: \"application/json, text/javascript\"\n\ +\t\t},\n\ +\n\ +\t\tcontents: {\n\ +\t\t\txml: /xml/,\n\ +\t\t\thtml: /html/,\n\ +\t\t\tjson: /json/\n\ +\t\t},\n\ +\n\ +\t\tresponseFields: {\n\ +\t\t\txml: \"responseXML\",\n\ +\t\t\ttext: \"responseText\"\n\ +\t\t},\n\ +\n\ +\t\t// Data converters\n\ +\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\ +\t\tconverters: {\n\ +\n\ +\t\t\t// Convert anything to text\n\ +\t\t\t\"* text\": window.String,\n\ +\n\ +\t\t\t// Text to html (true = no transformation)\n\ +\t\t\t\"text html\": true,\n\ +\n\ +\t\t\t// Evaluate text as a json expression\n\ +\t\t\t\"text json\": jQuery.parseJSON,\n\ +\n\ +\t\t\t// Parse text as xml\n\ +\t\t\t\"text xml\": jQuery.parseXML\n\ +\t\t},\n\ +\n\ +\t\t// For options that shouldn't be deep extended:\n\ +\t\t// you can add your own custom options here if\n\ +\t\t// and when you create one that shouldn't be\n\ +\t\t// deep extended (see ajaxExtend)\n\ +\t\tflatOptions: {\n\ +\t\t\turl: true,\n\ +\t\t\tcontext: true\n\ +\t\t}\n\ +\t},\n\ +\n\ +\t// Creates a full fledged settings object into target\n\ +\t// with both ajaxSettings and settings fields.\n\ +\t// If target is omitted, writes into ajaxSettings.\n\ +\tajaxSetup: function( target, settings ) {\n\ +\t\treturn settings ?\n\ +\n\ +\t\t\t// Building a settings object\n\ +\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\ +\n\ +\t\t\t// Extending ajaxSettings\n\ +\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\ +\t},\n\ +\n\ +\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\ +\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\ +\n\ +\t// Main method\n\ +\tajax: function( url, options ) {\n\ +\n\ +\t\t// If url is an object, simulate pre-1.5 signature\n\ +\t\tif ( typeof url === \"object\" ) {\n\ +\t\t\toptions = url;\n\ +\t\t\turl = undefined;\n\ +\t\t}\n\ +\n\ +\t\t// Force options to be an object\n\ +\t\toptions = options || {};\n\ +\n\ +\t\tvar // Cross-domain detection vars\n\ +\t\t\tparts,\n\ +\t\t\t// Loop variable\n\ +\t\t\ti,\n\ +\t\t\t// URL without anti-cache param\n\ +\t\t\tcacheURL,\n\ +\t\t\t// Response headers as string\n\ +\t\t\tresponseHeadersString,\n\ +\t\t\t// timeout handle\n\ +\t\t\ttimeoutTimer,\n\ +\n\ +\t\t\t// To know if global events are to be dispatched\n\ +\t\t\tfireGlobals,\n\ +\n\ +\t\t\ttransport,\n\ +\t\t\t// Response headers\n\ +\t\t\tresponseHeaders,\n\ +\t\t\t// Create the final options object\n\ +\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\ +\t\t\t// Callbacks context\n\ +\t\t\tcallbackContext = s.context || s,\n\ +\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\ +\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\ +\t\t\t\tjQuery( callbackContext ) :\n\ +\t\t\t\tjQuery.event,\n\ +\t\t\t// Deferreds\n\ +\t\t\tdeferred = jQuery.Deferred(),\n\ +\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\ +\t\t\t// Status-dependent callbacks\n\ +\t\t\tstatusCode = s.statusCode || {},\n\ +\t\t\t// Headers (they are sent all at once)\n\ +\t\t\trequestHeaders = {},\n\ +\t\t\trequestHeadersNames = {},\n\ +\t\t\t// The jqXHR state\n\ +\t\t\tstate = 0,\n\ +\t\t\t// Default abort message\n\ +\t\t\tstrAbort = \"canceled\",\n\ +\t\t\t// Fake xhr\n\ +\t\t\tjqXHR = {\n\ +\t\t\t\treadyState: 0,\n\ +\n\ +\t\t\t\t// Builds headers hashtable if needed\n\ +\t\t\t\tgetResponseHeader: function( key ) {\n\ +\t\t\t\t\tvar match;\n\ +\t\t\t\t\tif ( state === 2 ) {\n\ +\t\t\t\t\t\tif ( !responseHeaders ) {\n\ +\t\t\t\t\t\t\tresponseHeaders = {};\n\ +\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\ +\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\treturn match == null ? null : match;\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\t// Raw string\n\ +\t\t\t\tgetAllResponseHeaders: function() {\n\ +\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\t// Caches the header\n\ +\t\t\t\tsetRequestHeader: function( name, value ) {\n\ +\t\t\t\t\tvar lname = name.toLowerCase();\n\ +\t\t\t\t\tif ( !state ) {\n\ +\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\ +\t\t\t\t\t\trequestHeaders[ name ] = value;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\t// Overrides response content-type header\n\ +\t\t\t\toverrideMimeType: function( type ) {\n\ +\t\t\t\t\tif ( !state ) {\n\ +\t\t\t\t\t\ts.mimeType = type;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\t// Status-dependent callbacks\n\ +\t\t\t\tstatusCode: function( map ) {\n\ +\t\t\t\t\tvar code;\n\ +\t\t\t\t\tif ( map ) {\n\ +\t\t\t\t\t\tif ( state < 2 ) {\n\ +\t\t\t\t\t\t\tfor ( code in map ) {\n\ +\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\ +\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\ +\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\t// Cancel the request\n\ +\t\t\t\tabort: function( statusText ) {\n\ +\t\t\t\t\tvar finalText = statusText || strAbort;\n\ +\t\t\t\t\tif ( transport ) {\n\ +\t\t\t\t\t\ttransport.abort( finalText );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tdone( 0, finalText );\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\n\ +\t\t// Attach deferreds\n\ +\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\ +\t\tjqXHR.success = jqXHR.done;\n\ +\t\tjqXHR.error = jqXHR.fail;\n\ +\n\ +\t\t// Remove hash character (#7531: and string promotion)\n\ +\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\ +\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\ +\t\t// We also use the url parameter if available\n\ +\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\ +\n\ +\t\t// Alias method option to type as per ticket #12004\n\ +\t\ts.type = options.method || options.type || s.method || s.type;\n\ +\n\ +\t\t// Extract dataTypes list\n\ +\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\ +\n\ +\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\ +\t\tif ( s.crossDomain == null ) {\n\ +\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\ +\t\t\ts.crossDomain = !!( parts &&\n\ +\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\ +\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\ +\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\ +\t\t\t);\n\ +\t\t}\n\ +\n\ +\t\t// Convert data if not already a string\n\ +\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\ +\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\ +\t\t}\n\ +\n\ +\t\t// Apply prefilters\n\ +\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\ +\n\ +\t\t// If request was aborted inside a prefilter, stop there\n\ +\t\tif ( state === 2 ) {\n\ +\t\t\treturn jqXHR;\n\ +\t\t}\n\ +\n\ +\t\t// We can fire global events as of now if asked to\n\ +\t\tfireGlobals = s.global;\n\ +\n\ +\t\t// Watch for a new set of requests\n\ +\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\ +\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\ +\t\t}\n\ +\n\ +\t\t// Uppercase the type\n\ +\t\ts.type = s.type.toUpperCase();\n\ +\n\ +\t\t// Determine if request has content\n\ +\t\ts.hasContent = !rnoContent.test( s.type );\n\ +\n\ +\t\t// Save the URL in case we're toying with the If-Modified-Since\n\ +\t\t// and/or If-None-Match header later on\n\ +\t\tcacheURL = s.url;\n\ +\n\ +\t\t// More options handling for requests with no content\n\ +\t\tif ( !s.hasContent ) {\n\ +\n\ +\t\t\t// If data is available, append data to url\n\ +\t\t\tif ( s.data ) {\n\ +\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\ +\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\ +\t\t\t\tdelete s.data;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add anti-cache in url if needed\n\ +\t\t\tif ( s.cache === false ) {\n\ +\t\t\t\ts.url = rts.test( cacheURL ) ?\n\ +\n\ +\t\t\t\t\t// If there is already a '_' parameter, set its value\n\ +\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\ +\n\ +\t\t\t\t\t// Otherwise add one to the end\n\ +\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\ +\t\tif ( s.ifModified ) {\n\ +\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\ +\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\ +\t\t\t}\n\ +\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\ +\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Set the correct header, if data is being sent\n\ +\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\ +\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\ +\t\t}\n\ +\n\ +\t\t// Set the Accepts header for the server, depending on the dataType\n\ +\t\tjqXHR.setRequestHeader(\n\ +\t\t\t\"Accept\",\n\ +\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\ +\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\ +\t\t\t\ts.accepts[ \"*\" ]\n\ +\t\t);\n\ +\n\ +\t\t// Check for headers option\n\ +\t\tfor ( i in s.headers ) {\n\ +\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\ +\t\t}\n\ +\n\ +\t\t// Allow custom headers/mimetypes and early abort\n\ +\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\ +\t\t\t// Abort if not done already and return\n\ +\t\t\treturn jqXHR.abort();\n\ +\t\t}\n\ +\n\ +\t\t// aborting is no longer a cancellation\n\ +\t\tstrAbort = \"abort\";\n\ +\n\ +\t\t// Install callbacks on deferreds\n\ +\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\ +\t\t\tjqXHR[ i ]( s[ i ] );\n\ +\t\t}\n\ +\n\ +\t\t// Get transport\n\ +\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\ +\n\ +\t\t// If no transport, we auto-abort\n\ +\t\tif ( !transport ) {\n\ +\t\t\tdone( -1, \"No Transport\" );\n\ +\t\t} else {\n\ +\t\t\tjqXHR.readyState = 1;\n\ +\n\ +\t\t\t// Send global event\n\ +\t\t\tif ( fireGlobals ) {\n\ +\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\ +\t\t\t}\n\ +\t\t\t// Timeout\n\ +\t\t\tif ( s.async && s.timeout > 0 ) {\n\ +\t\t\t\ttimeoutTimer = setTimeout(function() {\n\ +\t\t\t\t\tjqXHR.abort(\"timeout\");\n\ +\t\t\t\t}, s.timeout );\n\ +\t\t\t}\n\ +\n\ +\t\t\ttry {\n\ +\t\t\t\tstate = 1;\n\ +\t\t\t\ttransport.send( requestHeaders, done );\n\ +\t\t\t} catch ( e ) {\n\ +\t\t\t\t// Propagate exception as error if not done\n\ +\t\t\t\tif ( state < 2 ) {\n\ +\t\t\t\t\tdone( -1, e );\n\ +\t\t\t\t// Simply rethrow otherwise\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tthrow e;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\t// Callback for when everything is done\n\ +\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\ +\t\t\tvar isSuccess, success, error, response, modified,\n\ +\t\t\t\tstatusText = nativeStatusText;\n\ +\n\ +\t\t\t// Called once\n\ +\t\t\tif ( state === 2 ) {\n\ +\t\t\t\treturn;\n\ +\t\t\t}\n\ +\n\ +\t\t\t// State is \"done\" now\n\ +\t\t\tstate = 2;\n\ +\n\ +\t\t\t// Clear timeout if it exists\n\ +\t\t\tif ( timeoutTimer ) {\n\ +\t\t\t\tclearTimeout( timeoutTimer );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Dereference transport for early garbage collection\n\ +\t\t\t// (no matter how long the jqXHR object will be used)\n\ +\t\t\ttransport = undefined;\n\ +\n\ +\t\t\t// Cache response headers\n\ +\t\t\tresponseHeadersString = headers || \"\";\n\ +\n\ +\t\t\t// Set readyState\n\ +\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\ +\n\ +\t\t\t// Get response data\n\ +\t\t\tif ( responses ) {\n\ +\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// If successful, handle type chaining\n\ +\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\ +\n\ +\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\ +\t\t\t\tif ( s.ifModified ) {\n\ +\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\ +\t\t\t\t\tif ( modified ) {\n\ +\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\ +\t\t\t\t\tif ( modified ) {\n\ +\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// if no content\n\ +\t\t\t\tif ( status === 204 ) {\n\ +\t\t\t\t\tisSuccess = true;\n\ +\t\t\t\t\tstatusText = \"nocontent\";\n\ +\n\ +\t\t\t\t// if not modified\n\ +\t\t\t\t} else if ( status === 304 ) {\n\ +\t\t\t\t\tisSuccess = true;\n\ +\t\t\t\t\tstatusText = \"notmodified\";\n\ +\n\ +\t\t\t\t// If we have data, let's convert it\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\ +\t\t\t\t\tstatusText = isSuccess.state;\n\ +\t\t\t\t\tsuccess = isSuccess.data;\n\ +\t\t\t\t\terror = isSuccess.error;\n\ +\t\t\t\t\tisSuccess = !error;\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\t// We extract error from statusText\n\ +\t\t\t\t// then normalize statusText and status for non-aborts\n\ +\t\t\t\terror = statusText;\n\ +\t\t\t\tif ( status || !statusText ) {\n\ +\t\t\t\t\tstatusText = \"error\";\n\ +\t\t\t\t\tif ( status < 0 ) {\n\ +\t\t\t\t\t\tstatus = 0;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Set data for the fake xhr object\n\ +\t\t\tjqXHR.status = status;\n\ +\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\ +\n\ +\t\t\t// Success/Error\n\ +\t\t\tif ( isSuccess ) {\n\ +\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\ +\t\t\t} else {\n\ +\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Status-dependent callbacks\n\ +\t\t\tjqXHR.statusCode( statusCode );\n\ +\t\t\tstatusCode = undefined;\n\ +\n\ +\t\t\tif ( fireGlobals ) {\n\ +\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\ +\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Complete\n\ +\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\ +\n\ +\t\t\tif ( fireGlobals ) {\n\ +\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\ +\t\t\t\t// Handle the global AJAX counter\n\ +\t\t\t\tif ( !( --jQuery.active ) ) {\n\ +\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\n\ +\t\treturn jqXHR;\n\ +\t},\n\ +\n\ +\tgetScript: function( url, callback ) {\n\ +\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\ +\t},\n\ +\n\ +\tgetJSON: function( url, data, callback ) {\n\ +\t\treturn jQuery.get( url, data, callback, \"json\" );\n\ +\t}\n\ +});\n\ +\n\ +/* Handles responses to an ajax request:\n\ + * - sets all responseXXX fields accordingly\n\ + * - finds the right dataType (mediates between content-type and expected dataType)\n\ + * - returns the corresponding response\n\ + */\n\ +function ajaxHandleResponses( s, jqXHR, responses ) {\n\ +\tvar firstDataType, ct, finalDataType, type,\n\ +\t\tcontents = s.contents,\n\ +\t\tdataTypes = s.dataTypes,\n\ +\t\tresponseFields = s.responseFields;\n\ +\n\ +\t// Fill responseXXX fields\n\ +\tfor ( type in responseFields ) {\n\ +\t\tif ( type in responses ) {\n\ +\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Remove auto dataType and get content-type in the process\n\ +\twhile( dataTypes[ 0 ] === \"*\" ) {\n\ +\t\tdataTypes.shift();\n\ +\t\tif ( ct === undefined ) {\n\ +\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Check if we're dealing with a known content-type\n\ +\tif ( ct ) {\n\ +\t\tfor ( type in contents ) {\n\ +\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\ +\t\t\t\tdataTypes.unshift( type );\n\ +\t\t\t\tbreak;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Check to see if we have a response for the expected dataType\n\ +\tif ( dataTypes[ 0 ] in responses ) {\n\ +\t\tfinalDataType = dataTypes[ 0 ];\n\ +\t} else {\n\ +\t\t// Try convertible dataTypes\n\ +\t\tfor ( type in responses ) {\n\ +\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\ +\t\t\t\tfinalDataType = type;\n\ +\t\t\t\tbreak;\n\ +\t\t\t}\n\ +\t\t\tif ( !firstDataType ) {\n\ +\t\t\t\tfirstDataType = type;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t\t// Or just use first one\n\ +\t\tfinalDataType = finalDataType || firstDataType;\n\ +\t}\n\ +\n\ +\t// If we found a dataType\n\ +\t// We add the dataType to the list if needed\n\ +\t// and return the corresponding response\n\ +\tif ( finalDataType ) {\n\ +\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\ +\t\t\tdataTypes.unshift( finalDataType );\n\ +\t\t}\n\ +\t\treturn responses[ finalDataType ];\n\ +\t}\n\ +}\n\ +\n\ +// Chain conversions given the request and the original response\n\ +function ajaxConvert( s, response ) {\n\ +\tvar conv2, current, conv, tmp,\n\ +\t\tconverters = {},\n\ +\t\ti = 0,\n\ +\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\ +\t\tdataTypes = s.dataTypes.slice(),\n\ +\t\tprev = dataTypes[ 0 ];\n\ +\n\ +\t// Apply the dataFilter if provided\n\ +\tif ( s.dataFilter ) {\n\ +\t\tresponse = s.dataFilter( response, s.dataType );\n\ +\t}\n\ +\n\ +\t// Create converters map with lowercased keys\n\ +\tif ( dataTypes[ 1 ] ) {\n\ +\t\tfor ( conv in s.converters ) {\n\ +\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\ +\t\t}\n\ +\t}\n\ +\n\ +\t// Convert to each sequential dataType, tolerating list modification\n\ +\tfor ( ; (current = dataTypes[++i]); ) {\n\ +\n\ +\t\t// There's only work to do if current dataType is non-auto\n\ +\t\tif ( current !== \"*\" ) {\n\ +\n\ +\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\ +\t\t\tif ( prev !== \"*\" && prev !== current ) {\n\ +\n\ +\t\t\t\t// Seek a direct converter\n\ +\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\ +\n\ +\t\t\t\t// If none found, seek a pair\n\ +\t\t\t\tif ( !conv ) {\n\ +\t\t\t\t\tfor ( conv2 in converters ) {\n\ +\n\ +\t\t\t\t\t\t// If conv2 outputs current\n\ +\t\t\t\t\t\ttmp = conv2.split(\" \");\n\ +\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\ +\n\ +\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\ +\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\ +\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\ +\t\t\t\t\t\t\tif ( conv ) {\n\ +\t\t\t\t\t\t\t\t// Condense equivalence converters\n\ +\t\t\t\t\t\t\t\tif ( conv === true ) {\n\ +\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\ +\n\ +\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\ +\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\ +\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\ +\t\t\t\t\t\t\t\t\tdataTypes.splice( i--, 0, current );\n\ +\t\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t\t\tbreak;\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Apply converter (if not an equivalence)\n\ +\t\t\t\tif ( conv !== true ) {\n\ +\n\ +\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\ +\t\t\t\t\tif ( conv && s[\"throws\"] ) {\n\ +\t\t\t\t\t\tresponse = conv( response );\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\ttry {\n\ +\t\t\t\t\t\t\tresponse = conv( response );\n\ +\t\t\t\t\t\t} catch ( e ) {\n\ +\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Update prev for next iteration\n\ +\t\t\tprev = current;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\treturn { state: \"success\", data: response };\n\ +}\n\ +// Install script dataType\n\ +jQuery.ajaxSetup({\n\ +\taccepts: {\n\ +\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\ +\t},\n\ +\tcontents: {\n\ +\t\tscript: /(?:java|ecma)script/\n\ +\t},\n\ +\tconverters: {\n\ +\t\t\"text script\": function( text ) {\n\ +\t\t\tjQuery.globalEval( text );\n\ +\t\t\treturn text;\n\ +\t\t}\n\ +\t}\n\ +});\n\ +\n\ +// Handle cache's special case and global\n\ +jQuery.ajaxPrefilter( \"script\", function( s ) {\n\ +\tif ( s.cache === undefined ) {\n\ +\t\ts.cache = false;\n\ +\t}\n\ +\tif ( s.crossDomain ) {\n\ +\t\ts.type = \"GET\";\n\ +\t\ts.global = false;\n\ +\t}\n\ +});\n\ +\n\ +// Bind script tag hack transport\n\ +jQuery.ajaxTransport( \"script\", function(s) {\n\ +\n\ +\t// This transport only deals with cross domain requests\n\ +\tif ( s.crossDomain ) {\n\ +\n\ +\t\tvar script,\n\ +\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\ +\n\ +\t\treturn {\n\ +\n\ +\t\t\tsend: function( _, callback ) {\n\ +\n\ +\t\t\t\tscript = document.createElement(\"script\");\n\ +\n\ +\t\t\t\tscript.async = true;\n\ +\n\ +\t\t\t\tif ( s.scriptCharset ) {\n\ +\t\t\t\t\tscript.charset = s.scriptCharset;\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\tscript.src = s.url;\n\ +\n\ +\t\t\t\t// Attach handlers for all browsers\n\ +\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\ +\n\ +\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\ +\n\ +\t\t\t\t\t\t// Handle memory leak in IE\n\ +\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\ +\n\ +\t\t\t\t\t\t// Remove the script\n\ +\t\t\t\t\t\tif ( script.parentNode ) {\n\ +\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Dereference the script\n\ +\t\t\t\t\t\tscript = null;\n\ +\n\ +\t\t\t\t\t\t// Callback if not abort\n\ +\t\t\t\t\t\tif ( !isAbort ) {\n\ +\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\t\t\t\t};\n\ +\n\ +\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\ +\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\ +\t\t\t\thead.insertBefore( script, head.firstChild );\n\ +\t\t\t},\n\ +\n\ +\t\t\tabort: function() {\n\ +\t\t\t\tif ( script ) {\n\ +\t\t\t\t\tscript.onload( undefined, true );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t};\n\ +\t}\n\ +});\n\ +var oldCallbacks = [],\n\ +\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\ +\n\ +// Default jsonp settings\n\ +jQuery.ajaxSetup({\n\ +\tjsonp: \"callback\",\n\ +\tjsonpCallback: function() {\n\ +\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\ +\t\tthis[ callback ] = true;\n\ +\t\treturn callback;\n\ +\t}\n\ +});\n\ +\n\ +// Detect, normalize options and install callbacks for jsonp requests\n\ +jQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\ +\n\ +\tvar callbackName, overwritten, responseContainer,\n\ +\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\ +\t\t\t\"url\" :\n\ +\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\ +\t\t);\n\ +\n\ +\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\ +\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\ +\n\ +\t\t// Get callback name, remembering preexisting value associated with it\n\ +\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\ +\t\t\ts.jsonpCallback() :\n\ +\t\t\ts.jsonpCallback;\n\ +\n\ +\t\t// Insert callback into url or form data\n\ +\t\tif ( jsonProp ) {\n\ +\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\ +\t\t} else if ( s.jsonp !== false ) {\n\ +\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\ +\t\t}\n\ +\n\ +\t\t// Use data converter to retrieve json after script execution\n\ +\t\ts.converters[\"script json\"] = function() {\n\ +\t\t\tif ( !responseContainer ) {\n\ +\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\ +\t\t\t}\n\ +\t\t\treturn responseContainer[ 0 ];\n\ +\t\t};\n\ +\n\ +\t\t// force json dataType\n\ +\t\ts.dataTypes[ 0 ] = \"json\";\n\ +\n\ +\t\t// Install callback\n\ +\t\toverwritten = window[ callbackName ];\n\ +\t\twindow[ callbackName ] = function() {\n\ +\t\t\tresponseContainer = arguments;\n\ +\t\t};\n\ +\n\ +\t\t// Clean-up function (fires after converters)\n\ +\t\tjqXHR.always(function() {\n\ +\t\t\t// Restore preexisting value\n\ +\t\t\twindow[ callbackName ] = overwritten;\n\ +\n\ +\t\t\t// Save back as free\n\ +\t\t\tif ( s[ callbackName ] ) {\n\ +\t\t\t\t// make sure that re-using the options doesn't screw things around\n\ +\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\ +\n\ +\t\t\t\t// save the callback name for future use\n\ +\t\t\t\toldCallbacks.push( callbackName );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Call if it was a function and we have a response\n\ +\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\ +\t\t\t\toverwritten( responseContainer[ 0 ] );\n\ +\t\t\t}\n\ +\n\ +\t\t\tresponseContainer = overwritten = undefined;\n\ +\t\t});\n\ +\n\ +\t\t// Delegate to script\n\ +\t\treturn \"script\";\n\ +\t}\n\ +});\n\ +var xhrCallbacks, xhrSupported,\n\ +\txhrId = 0,\n\ +\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\ +\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\ +\t\t// Abort all pending requests\n\ +\t\tvar key;\n\ +\t\tfor ( key in xhrCallbacks ) {\n\ +\t\t\txhrCallbacks[ key ]( undefined, true );\n\ +\t\t}\n\ +\t};\n\ +\n\ +// Functions to create xhrs\n\ +function createStandardXHR() {\n\ +\ttry {\n\ +\t\treturn new window.XMLHttpRequest();\n\ +\t} catch( e ) {}\n\ +}\n\ +\n\ +function createActiveXHR() {\n\ +\ttry {\n\ +\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\ +\t} catch( e ) {}\n\ +}\n\ +\n\ +// Create the request object\n\ +// (This is still attached to ajaxSettings for backward compatibility)\n\ +jQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\ +\t/* Microsoft failed to properly\n\ +\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\ +\t * so we use the ActiveXObject when it is available\n\ +\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\ +\t * we need a fallback.\n\ +\t */\n\ +\tfunction() {\n\ +\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\ +\t} :\n\ +\t// For all other browsers, use the standard XMLHttpRequest object\n\ +\tcreateStandardXHR;\n\ +\n\ +// Determine support properties\n\ +xhrSupported = jQuery.ajaxSettings.xhr();\n\ +jQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\n\ +xhrSupported = jQuery.support.ajax = !!xhrSupported;\n\ +\n\ +// Create transport if the browser can provide an xhr\n\ +if ( xhrSupported ) {\n\ +\n\ +\tjQuery.ajaxTransport(function( s ) {\n\ +\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\ +\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\ +\n\ +\t\t\tvar callback;\n\ +\n\ +\t\t\treturn {\n\ +\t\t\t\tsend: function( headers, complete ) {\n\ +\n\ +\t\t\t\t\t// Get a new xhr\n\ +\t\t\t\t\tvar handle, i,\n\ +\t\t\t\t\t\txhr = s.xhr();\n\ +\n\ +\t\t\t\t\t// Open the socket\n\ +\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\ +\t\t\t\t\tif ( s.username ) {\n\ +\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Apply custom fields if provided\n\ +\t\t\t\t\tif ( s.xhrFields ) {\n\ +\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\ +\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Override mime type if needed\n\ +\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\ +\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// X-Requested-With header\n\ +\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\ +\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\ +\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\ +\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\ +\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\ +\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\ +\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\ +\t\t\t\t\ttry {\n\ +\t\t\t\t\t\tfor ( i in headers ) {\n\ +\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t} catch( err ) {}\n\ +\n\ +\t\t\t\t\t// Do send the request\n\ +\t\t\t\t\t// This may raise an exception which is actually\n\ +\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\ +\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\ +\n\ +\t\t\t\t\t// Listener\n\ +\t\t\t\t\tcallback = function( _, isAbort ) {\n\ +\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\ +\n\ +\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\ +\t\t\t\t\t\t// of an xhr when a network error occurred\n\ +\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\ +\t\t\t\t\t\ttry {\n\ +\n\ +\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\ +\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\ +\n\ +\t\t\t\t\t\t\t\t// Only called once\n\ +\t\t\t\t\t\t\t\tcallback = undefined;\n\ +\n\ +\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\ +\t\t\t\t\t\t\t\tif ( handle ) {\n\ +\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\ +\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\ +\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t\t\t// If it's an abort\n\ +\t\t\t\t\t\t\t\tif ( isAbort ) {\n\ +\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\ +\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\ +\t\t\t\t\t\t\t\t\t\txhr.abort();\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t} else {\n\ +\t\t\t\t\t\t\t\t\tresponses = {};\n\ +\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\ +\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\ +\n\ +\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\ +\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\ +\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\ +\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\ +\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\ +\t\t\t\t\t\t\t\t\ttry {\n\ +\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\ +\t\t\t\t\t\t\t\t\t} catch( e ) {\n\ +\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\ +\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\ +\n\ +\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\ +\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\ +\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\ +\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\ +\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\ +\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\ +\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\ +\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\ +\t\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\ +\t\t\t\t\t\t\tif ( !isAbort ) {\n\ +\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t}\n\ +\n\ +\t\t\t\t\t\t// Call complete if needed\n\ +\t\t\t\t\t\tif ( responses ) {\n\ +\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t};\n\ +\n\ +\t\t\t\t\tif ( !s.async ) {\n\ +\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\ +\t\t\t\t\t\tcallback();\n\ +\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\ +\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\ +\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\ +\t\t\t\t\t\tsetTimeout( callback );\n\ +\t\t\t\t\t} else {\n\ +\t\t\t\t\t\thandle = ++xhrId;\n\ +\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\ +\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\ +\t\t\t\t\t\t\t// and attach the unload handler\n\ +\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\ +\t\t\t\t\t\t\t\txhrCallbacks = {};\n\ +\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\ +\t\t\t\t\t\t\t}\n\ +\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\ +\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\ +\t\t\t\t\t\t}\n\ +\t\t\t\t\t\txhr.onreadystatechange = callback;\n\ +\t\t\t\t\t}\n\ +\t\t\t\t},\n\ +\n\ +\t\t\t\tabort: function() {\n\ +\t\t\t\t\tif ( callback ) {\n\ +\t\t\t\t\t\tcallback( undefined, true );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\t\t}\n\ +\t});\n\ +}\n\ +var fxNow, timerId,\n\ +\trfxtypes = /^(?:toggle|show|hide)$/,\n\ +\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\ +\trrun = /queueHooks$/,\n\ +\tanimationPrefilters = [ defaultPrefilter ],\n\ +\ttweeners = {\n\ +\t\t\"*\": [function( prop, value ) {\n\ +\t\t\tvar end, unit,\n\ +\t\t\t\ttween = this.createTween( prop, value ),\n\ +\t\t\t\tparts = rfxnum.exec( value ),\n\ +\t\t\t\ttarget = tween.cur(),\n\ +\t\t\t\tstart = +target || 0,\n\ +\t\t\t\tscale = 1,\n\ +\t\t\t\tmaxIterations = 20;\n\ +\n\ +\t\t\tif ( parts ) {\n\ +\t\t\t\tend = +parts[2];\n\ +\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\ +\n\ +\t\t\t\t// We need to compute starting value\n\ +\t\t\t\tif ( unit !== \"px\" && start ) {\n\ +\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\ +\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\ +\t\t\t\t\t// Fallback to end or a simple constant\n\ +\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\ +\n\ +\t\t\t\t\tdo {\n\ +\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\ +\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\ +\t\t\t\t\t\tscale = scale || \".5\";\n\ +\n\ +\t\t\t\t\t\t// Adjust and apply\n\ +\t\t\t\t\t\tstart = start / scale;\n\ +\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\ +\n\ +\t\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\ +\t\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\ +\t\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\ttween.unit = unit;\n\ +\t\t\t\ttween.start = start;\n\ +\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\ +\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\ +\t\t\t}\n\ +\t\t\treturn tween;\n\ +\t\t}]\n\ +\t};\n\ +\n\ +// Animations created synchronously will run synchronously\n\ +function createFxNow() {\n\ +\tsetTimeout(function() {\n\ +\t\tfxNow = undefined;\n\ +\t});\n\ +\treturn ( fxNow = jQuery.now() );\n\ +}\n\ +\n\ +function createTweens( animation, props ) {\n\ +\tjQuery.each( props, function( prop, value ) {\n\ +\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\ +\t\t\tindex = 0,\n\ +\t\t\tlength = collection.length;\n\ +\t\tfor ( ; index < length; index++ ) {\n\ +\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\ +\n\ +\t\t\t\t// we're done with this property\n\ +\t\t\t\treturn;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t});\n\ +}\n\ +\n\ +function Animation( elem, properties, options ) {\n\ +\tvar result,\n\ +\t\tstopped,\n\ +\t\tindex = 0,\n\ +\t\tlength = animationPrefilters.length,\n\ +\t\tdeferred = jQuery.Deferred().always( function() {\n\ +\t\t\t// don't match elem in the :animated selector\n\ +\t\t\tdelete tick.elem;\n\ +\t\t}),\n\ +\t\ttick = function() {\n\ +\t\t\tif ( stopped ) {\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\t\t\tvar currentTime = fxNow || createFxNow(),\n\ +\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\ +\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\ +\t\t\t\ttemp = remaining / animation.duration || 0,\n\ +\t\t\t\tpercent = 1 - temp,\n\ +\t\t\t\tindex = 0,\n\ +\t\t\t\tlength = animation.tweens.length;\n\ +\n\ +\t\t\tfor ( ; index < length ; index++ ) {\n\ +\t\t\t\tanimation.tweens[ index ].run( percent );\n\ +\t\t\t}\n\ +\n\ +\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\ +\n\ +\t\t\tif ( percent < 1 && length ) {\n\ +\t\t\t\treturn remaining;\n\ +\t\t\t} else {\n\ +\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\ +\t\t\t\treturn false;\n\ +\t\t\t}\n\ +\t\t},\n\ +\t\tanimation = deferred.promise({\n\ +\t\t\telem: elem,\n\ +\t\t\tprops: jQuery.extend( {}, properties ),\n\ +\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\ +\t\t\toriginalProperties: properties,\n\ +\t\t\toriginalOptions: options,\n\ +\t\t\tstartTime: fxNow || createFxNow(),\n\ +\t\t\tduration: options.duration,\n\ +\t\t\ttweens: [],\n\ +\t\t\tcreateTween: function( prop, end ) {\n\ +\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\ +\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\ +\t\t\t\tanimation.tweens.push( tween );\n\ +\t\t\t\treturn tween;\n\ +\t\t\t},\n\ +\t\t\tstop: function( gotoEnd ) {\n\ +\t\t\t\tvar index = 0,\n\ +\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\ +\t\t\t\t\t// otherwise we skip this part\n\ +\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\ +\t\t\t\tif ( stopped ) {\n\ +\t\t\t\t\treturn this;\n\ +\t\t\t\t}\n\ +\t\t\t\tstopped = true;\n\ +\t\t\t\tfor ( ; index < length ; index++ ) {\n\ +\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// resolve when we played the last frame\n\ +\t\t\t\t// otherwise, reject\n\ +\t\t\t\tif ( gotoEnd ) {\n\ +\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\ +\t\t\t\t} else {\n\ +\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\ +\t\t\t\t}\n\ +\t\t\t\treturn this;\n\ +\t\t\t}\n\ +\t\t}),\n\ +\t\tprops = animation.props;\n\ +\n\ +\tpropFilter( props, animation.opts.specialEasing );\n\ +\n\ +\tfor ( ; index < length ; index++ ) {\n\ +\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\ +\t\tif ( result ) {\n\ +\t\t\treturn result;\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tcreateTweens( animation, props );\n\ +\n\ +\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\ +\t\tanimation.opts.start.call( elem, animation );\n\ +\t}\n\ +\n\ +\tjQuery.fx.timer(\n\ +\t\tjQuery.extend( tick, {\n\ +\t\t\telem: elem,\n\ +\t\t\tanim: animation,\n\ +\t\t\tqueue: animation.opts.queue\n\ +\t\t})\n\ +\t);\n\ +\n\ +\t// attach callbacks from options\n\ +\treturn animation.progress( animation.opts.progress )\n\ +\t\t.done( animation.opts.done, animation.opts.complete )\n\ +\t\t.fail( animation.opts.fail )\n\ +\t\t.always( animation.opts.always );\n\ +}\n\ +\n\ +function propFilter( props, specialEasing ) {\n\ +\tvar value, name, index, easing, hooks;\n\ +\n\ +\t// camelCase, specialEasing and expand cssHook pass\n\ +\tfor ( index in props ) {\n\ +\t\tname = jQuery.camelCase( index );\n\ +\t\teasing = specialEasing[ name ];\n\ +\t\tvalue = props[ index ];\n\ +\t\tif ( jQuery.isArray( value ) ) {\n\ +\t\t\teasing = value[ 1 ];\n\ +\t\t\tvalue = props[ index ] = value[ 0 ];\n\ +\t\t}\n\ +\n\ +\t\tif ( index !== name ) {\n\ +\t\t\tprops[ name ] = value;\n\ +\t\t\tdelete props[ index ];\n\ +\t\t}\n\ +\n\ +\t\thooks = jQuery.cssHooks[ name ];\n\ +\t\tif ( hooks && \"expand\" in hooks ) {\n\ +\t\t\tvalue = hooks.expand( value );\n\ +\t\t\tdelete props[ name ];\n\ +\n\ +\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\ +\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\ +\t\t\tfor ( index in value ) {\n\ +\t\t\t\tif ( !( index in props ) ) {\n\ +\t\t\t\t\tprops[ index ] = value[ index ];\n\ +\t\t\t\t\tspecialEasing[ index ] = easing;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t} else {\n\ +\t\t\tspecialEasing[ name ] = easing;\n\ +\t\t}\n\ +\t}\n\ +}\n\ +\n\ +jQuery.Animation = jQuery.extend( Animation, {\n\ +\n\ +\ttweener: function( props, callback ) {\n\ +\t\tif ( jQuery.isFunction( props ) ) {\n\ +\t\t\tcallback = props;\n\ +\t\t\tprops = [ \"*\" ];\n\ +\t\t} else {\n\ +\t\t\tprops = props.split(\" \");\n\ +\t\t}\n\ +\n\ +\t\tvar prop,\n\ +\t\t\tindex = 0,\n\ +\t\t\tlength = props.length;\n\ +\n\ +\t\tfor ( ; index < length ; index++ ) {\n\ +\t\t\tprop = props[ index ];\n\ +\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\ +\t\t\ttweeners[ prop ].unshift( callback );\n\ +\t\t}\n\ +\t},\n\ +\n\ +\tprefilter: function( callback, prepend ) {\n\ +\t\tif ( prepend ) {\n\ +\t\t\tanimationPrefilters.unshift( callback );\n\ +\t\t} else {\n\ +\t\t\tanimationPrefilters.push( callback );\n\ +\t\t}\n\ +\t}\n\ +});\n\ +\n\ +function defaultPrefilter( elem, props, opts ) {\n\ +\t/*jshint validthis:true */\n\ +\tvar prop, index, length,\n\ +\t\tvalue, dataShow, toggle,\n\ +\t\ttween, hooks, oldfire,\n\ +\t\tanim = this,\n\ +\t\tstyle = elem.style,\n\ +\t\torig = {},\n\ +\t\thandled = [],\n\ +\t\thidden = elem.nodeType && isHidden( elem );\n\ +\n\ +\t// handle queue: false promises\n\ +\tif ( !opts.queue ) {\n\ +\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\ +\t\tif ( hooks.unqueued == null ) {\n\ +\t\t\thooks.unqueued = 0;\n\ +\t\t\toldfire = hooks.empty.fire;\n\ +\t\t\thooks.empty.fire = function() {\n\ +\t\t\t\tif ( !hooks.unqueued ) {\n\ +\t\t\t\t\toldfire();\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\t\t}\n\ +\t\thooks.unqueued++;\n\ +\n\ +\t\tanim.always(function() {\n\ +\t\t\t// doing this makes sure that the complete handler will be called\n\ +\t\t\t// before this completes\n\ +\t\t\tanim.always(function() {\n\ +\t\t\t\thooks.unqueued--;\n\ +\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\ +\t\t\t\t\thooks.empty.fire();\n\ +\t\t\t\t}\n\ +\t\t\t});\n\ +\t\t});\n\ +\t}\n\ +\n\ +\t// height/width overflow pass\n\ +\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\ +\t\t// Make sure that nothing sneaks out\n\ +\t\t// Record all 3 overflow attributes because IE does not\n\ +\t\t// change the overflow attribute when overflowX and\n\ +\t\t// overflowY are set to the same value\n\ +\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\ +\n\ +\t\t// Set display property to inline-block for height/width\n\ +\t\t// animations on inline elements that are having width/height animated\n\ +\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\ +\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\ +\n\ +\t\t\t// inline-level elements accept inline-block;\n\ +\t\t\t// block-level elements need to be inline with layout\n\ +\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\ +\t\t\t\tstyle.display = \"inline-block\";\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\tstyle.zoom = 1;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tif ( opts.overflow ) {\n\ +\t\tstyle.overflow = \"hidden\";\n\ +\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\ +\t\t\tanim.always(function() {\n\ +\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\ +\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\ +\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\ +\t\t\t});\n\ +\t\t}\n\ +\t}\n\ +\n\ +\n\ +\t// show/hide pass\n\ +\tfor ( index in props ) {\n\ +\t\tvalue = props[ index ];\n\ +\t\tif ( rfxtypes.exec( value ) ) {\n\ +\t\t\tdelete props[ index ];\n\ +\t\t\ttoggle = toggle || value === \"toggle\";\n\ +\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\ +\t\t\t\tcontinue;\n\ +\t\t\t}\n\ +\t\t\thandled.push( index );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tlength = handled.length;\n\ +\tif ( length ) {\n\ +\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\ +\t\tif ( \"hidden\" in dataShow ) {\n\ +\t\t\thidden = dataShow.hidden;\n\ +\t\t}\n\ +\n\ +\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\ +\t\tif ( toggle ) {\n\ +\t\t\tdataShow.hidden = !hidden;\n\ +\t\t}\n\ +\t\tif ( hidden ) {\n\ +\t\t\tjQuery( elem ).show();\n\ +\t\t} else {\n\ +\t\t\tanim.done(function() {\n\ +\t\t\t\tjQuery( elem ).hide();\n\ +\t\t\t});\n\ +\t\t}\n\ +\t\tanim.done(function() {\n\ +\t\t\tvar prop;\n\ +\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\ +\t\t\tfor ( prop in orig ) {\n\ +\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t\tfor ( index = 0 ; index < length ; index++ ) {\n\ +\t\t\tprop = handled[ index ];\n\ +\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\ +\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\ +\n\ +\t\t\tif ( !( prop in dataShow ) ) {\n\ +\t\t\t\tdataShow[ prop ] = tween.start;\n\ +\t\t\t\tif ( hidden ) {\n\ +\t\t\t\t\ttween.end = tween.start;\n\ +\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +}\n\ +\n\ +function Tween( elem, options, prop, end, easing ) {\n\ +\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n\ +}\n\ +jQuery.Tween = Tween;\n\ +\n\ +Tween.prototype = {\n\ +\tconstructor: Tween,\n\ +\tinit: function( elem, options, prop, end, easing, unit ) {\n\ +\t\tthis.elem = elem;\n\ +\t\tthis.prop = prop;\n\ +\t\tthis.easing = easing || \"swing\";\n\ +\t\tthis.options = options;\n\ +\t\tthis.start = this.now = this.cur();\n\ +\t\tthis.end = end;\n\ +\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\ +\t},\n\ +\tcur: function() {\n\ +\t\tvar hooks = Tween.propHooks[ this.prop ];\n\ +\n\ +\t\treturn hooks && hooks.get ?\n\ +\t\t\thooks.get( this ) :\n\ +\t\t\tTween.propHooks._default.get( this );\n\ +\t},\n\ +\trun: function( percent ) {\n\ +\t\tvar eased,\n\ +\t\t\thooks = Tween.propHooks[ this.prop ];\n\ +\n\ +\t\tif ( this.options.duration ) {\n\ +\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\ +\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\ +\t\t\t);\n\ +\t\t} else {\n\ +\t\t\tthis.pos = eased = percent;\n\ +\t\t}\n\ +\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\ +\n\ +\t\tif ( this.options.step ) {\n\ +\t\t\tthis.options.step.call( this.elem, this.now, this );\n\ +\t\t}\n\ +\n\ +\t\tif ( hooks && hooks.set ) {\n\ +\t\t\thooks.set( this );\n\ +\t\t} else {\n\ +\t\t\tTween.propHooks._default.set( this );\n\ +\t\t}\n\ +\t\treturn this;\n\ +\t}\n\ +};\n\ +\n\ +Tween.prototype.init.prototype = Tween.prototype;\n\ +\n\ +Tween.propHooks = {\n\ +\t_default: {\n\ +\t\tget: function( tween ) {\n\ +\t\t\tvar result;\n\ +\n\ +\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\ +\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\ +\t\t\t\treturn tween.elem[ tween.prop ];\n\ +\t\t\t}\n\ +\n\ +\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\ +\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\ +\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\ +\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\ +\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\ +\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\ +\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\ +\t\t},\n\ +\t\tset: function( tween ) {\n\ +\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\ +\t\t\t// available and use plain properties where available\n\ +\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\ +\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\ +\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\ +\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\ +\t\t\t} else {\n\ +\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\ +\t\t\t}\n\ +\t\t}\n\ +\t}\n\ +};\n\ +\n\ +// Remove in 2.0 - this supports IE8's panic based approach\n\ +// to setting things on disconnected nodes\n\ +\n\ +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\ +\tset: function( tween ) {\n\ +\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\ +\t\t\ttween.elem[ tween.prop ] = tween.now;\n\ +\t\t}\n\ +\t}\n\ +};\n\ +\n\ +jQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\ +\tvar cssFn = jQuery.fn[ name ];\n\ +\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\ +\t\treturn speed == null || typeof speed === \"boolean\" ?\n\ +\t\t\tcssFn.apply( this, arguments ) :\n\ +\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\ +\t};\n\ +});\n\ +\n\ +jQuery.fn.extend({\n\ +\tfadeTo: function( speed, to, easing, callback ) {\n\ +\n\ +\t\t// show any hidden elements after setting opacity to 0\n\ +\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\ +\n\ +\t\t\t// animate to the value specified\n\ +\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\ +\t},\n\ +\tanimate: function( prop, speed, easing, callback ) {\n\ +\t\tvar empty = jQuery.isEmptyObject( prop ),\n\ +\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\ +\t\t\tdoAnimation = function() {\n\ +\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\ +\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\ +\t\t\t\tdoAnimation.finish = function() {\n\ +\t\t\t\t\tanim.stop( true );\n\ +\t\t\t\t};\n\ +\t\t\t\t// Empty animations, or finishing resolves immediately\n\ +\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\ +\t\t\t\t\tanim.stop( true );\n\ +\t\t\t\t}\n\ +\t\t\t};\n\ +\t\t\tdoAnimation.finish = doAnimation;\n\ +\n\ +\t\treturn empty || optall.queue === false ?\n\ +\t\t\tthis.each( doAnimation ) :\n\ +\t\t\tthis.queue( optall.queue, doAnimation );\n\ +\t},\n\ +\tstop: function( type, clearQueue, gotoEnd ) {\n\ +\t\tvar stopQueue = function( hooks ) {\n\ +\t\t\tvar stop = hooks.stop;\n\ +\t\t\tdelete hooks.stop;\n\ +\t\t\tstop( gotoEnd );\n\ +\t\t};\n\ +\n\ +\t\tif ( typeof type !== \"string\" ) {\n\ +\t\t\tgotoEnd = clearQueue;\n\ +\t\t\tclearQueue = type;\n\ +\t\t\ttype = undefined;\n\ +\t\t}\n\ +\t\tif ( clearQueue && type !== false ) {\n\ +\t\t\tthis.queue( type || \"fx\", [] );\n\ +\t\t}\n\ +\n\ +\t\treturn this.each(function() {\n\ +\t\t\tvar dequeue = true,\n\ +\t\t\t\tindex = type != null && type + \"queueHooks\",\n\ +\t\t\t\ttimers = jQuery.timers,\n\ +\t\t\t\tdata = jQuery._data( this );\n\ +\n\ +\t\t\tif ( index ) {\n\ +\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\ +\t\t\t\t\tstopQueue( data[ index ] );\n\ +\t\t\t\t}\n\ +\t\t\t} else {\n\ +\t\t\t\tfor ( index in data ) {\n\ +\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\ +\t\t\t\t\t\tstopQueue( data[ index ] );\n\ +\t\t\t\t\t}\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\tfor ( index = timers.length; index--; ) {\n\ +\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\ +\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\ +\t\t\t\t\tdequeue = false;\n\ +\t\t\t\t\ttimers.splice( index, 1 );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// start the next in the queue if the last step wasn't forced\n\ +\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\ +\t\t\t// but only if they were gotoEnd\n\ +\t\t\tif ( dequeue || !gotoEnd ) {\n\ +\t\t\t\tjQuery.dequeue( this, type );\n\ +\t\t\t}\n\ +\t\t});\n\ +\t},\n\ +\tfinish: function( type ) {\n\ +\t\tif ( type !== false ) {\n\ +\t\t\ttype = type || \"fx\";\n\ +\t\t}\n\ +\t\treturn this.each(function() {\n\ +\t\t\tvar index,\n\ +\t\t\t\tdata = jQuery._data( this ),\n\ +\t\t\t\tqueue = data[ type + \"queue\" ],\n\ +\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\ +\t\t\t\ttimers = jQuery.timers,\n\ +\t\t\t\tlength = queue ? queue.length : 0;\n\ +\n\ +\t\t\t// enable finishing flag on private data\n\ +\t\t\tdata.finish = true;\n\ +\n\ +\t\t\t// empty the queue first\n\ +\t\t\tjQuery.queue( this, type, [] );\n\ +\n\ +\t\t\tif ( hooks && hooks.cur && hooks.cur.finish ) {\n\ +\t\t\t\thooks.cur.finish.call( this );\n\ +\t\t\t}\n\ +\n\ +\t\t\t// look for any active animations, and finish them\n\ +\t\t\tfor ( index = timers.length; index--; ) {\n\ +\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\ +\t\t\t\t\ttimers[ index ].anim.stop( true );\n\ +\t\t\t\t\ttimers.splice( index, 1 );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// look for any animations in the old queue and finish them\n\ +\t\t\tfor ( index = 0; index < length; index++ ) {\n\ +\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\ +\t\t\t\t\tqueue[ index ].finish.call( this );\n\ +\t\t\t\t}\n\ +\t\t\t}\n\ +\n\ +\t\t\t// turn off finishing flag\n\ +\t\t\tdelete data.finish;\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +// Generate parameters to create a standard animation\n\ +function genFx( type, includeWidth ) {\n\ +\tvar which,\n\ +\t\tattrs = { height: type },\n\ +\t\ti = 0;\n\ +\n\ +\t// if we include width, step value is 1 to do all cssExpand values,\n\ +\t// if we don't include width, step value is 2 to skip over Left and Right\n\ +\tincludeWidth = includeWidth? 1 : 0;\n\ +\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\ +\t\twhich = cssExpand[ i ];\n\ +\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\ +\t}\n\ +\n\ +\tif ( includeWidth ) {\n\ +\t\tattrs.opacity = attrs.width = type;\n\ +\t}\n\ +\n\ +\treturn attrs;\n\ +}\n\ +\n\ +// Generate shortcuts for custom animations\n\ +jQuery.each({\n\ +\tslideDown: genFx(\"show\"),\n\ +\tslideUp: genFx(\"hide\"),\n\ +\tslideToggle: genFx(\"toggle\"),\n\ +\tfadeIn: { opacity: \"show\" },\n\ +\tfadeOut: { opacity: \"hide\" },\n\ +\tfadeToggle: { opacity: \"toggle\" }\n\ +}, function( name, props ) {\n\ +\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\ +\t\treturn this.animate( props, speed, easing, callback );\n\ +\t};\n\ +});\n\ +\n\ +jQuery.speed = function( speed, easing, fn ) {\n\ +\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\ +\t\tcomplete: fn || !fn && easing ||\n\ +\t\t\tjQuery.isFunction( speed ) && speed,\n\ +\t\tduration: speed,\n\ +\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\ +\t};\n\ +\n\ +\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\ +\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\ +\n\ +\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\ +\tif ( opt.queue == null || opt.queue === true ) {\n\ +\t\topt.queue = \"fx\";\n\ +\t}\n\ +\n\ +\t// Queueing\n\ +\topt.old = opt.complete;\n\ +\n\ +\topt.complete = function() {\n\ +\t\tif ( jQuery.isFunction( opt.old ) ) {\n\ +\t\t\topt.old.call( this );\n\ +\t\t}\n\ +\n\ +\t\tif ( opt.queue ) {\n\ +\t\t\tjQuery.dequeue( this, opt.queue );\n\ +\t\t}\n\ +\t};\n\ +\n\ +\treturn opt;\n\ +};\n\ +\n\ +jQuery.easing = {\n\ +\tlinear: function( p ) {\n\ +\t\treturn p;\n\ +\t},\n\ +\tswing: function( p ) {\n\ +\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\ +\t}\n\ +};\n\ +\n\ +jQuery.timers = [];\n\ +jQuery.fx = Tween.prototype.init;\n\ +jQuery.fx.tick = function() {\n\ +\tvar timer,\n\ +\t\ttimers = jQuery.timers,\n\ +\t\ti = 0;\n\ +\n\ +\tfxNow = jQuery.now();\n\ +\n\ +\tfor ( ; i < timers.length; i++ ) {\n\ +\t\ttimer = timers[ i ];\n\ +\t\t// Checks the timer has not already been removed\n\ +\t\tif ( !timer() && timers[ i ] === timer ) {\n\ +\t\t\ttimers.splice( i--, 1 );\n\ +\t\t}\n\ +\t}\n\ +\n\ +\tif ( !timers.length ) {\n\ +\t\tjQuery.fx.stop();\n\ +\t}\n\ +\tfxNow = undefined;\n\ +};\n\ +\n\ +jQuery.fx.timer = function( timer ) {\n\ +\tif ( timer() && jQuery.timers.push( timer ) ) {\n\ +\t\tjQuery.fx.start();\n\ +\t}\n\ +};\n\ +\n\ +jQuery.fx.interval = 13;\n\ +\n\ +jQuery.fx.start = function() {\n\ +\tif ( !timerId ) {\n\ +\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\ +\t}\n\ +};\n\ +\n\ +jQuery.fx.stop = function() {\n\ +\tclearInterval( timerId );\n\ +\ttimerId = null;\n\ +};\n\ +\n\ +jQuery.fx.speeds = {\n\ +\tslow: 600,\n\ +\tfast: 200,\n\ +\t// Default speed\n\ +\t_default: 400\n\ +};\n\ +\n\ +// Back Compat <1.8 extension point\n\ +jQuery.fx.step = {};\n\ +\n\ +if ( jQuery.expr && jQuery.expr.filters ) {\n\ +\tjQuery.expr.filters.animated = function( elem ) {\n\ +\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\ +\t\t\treturn elem === fn.elem;\n\ +\t\t}).length;\n\ +\t};\n\ +}\n\ +jQuery.fn.offset = function( options ) {\n\ +\tif ( arguments.length ) {\n\ +\t\treturn options === undefined ?\n\ +\t\t\tthis :\n\ +\t\t\tthis.each(function( i ) {\n\ +\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\ +\t\t\t});\n\ +\t}\n\ +\n\ +\tvar docElem, win,\n\ +\t\tbox = { top: 0, left: 0 },\n\ +\t\telem = this[ 0 ],\n\ +\t\tdoc = elem && elem.ownerDocument;\n\ +\n\ +\tif ( !doc ) {\n\ +\t\treturn;\n\ +\t}\n\ +\n\ +\tdocElem = doc.documentElement;\n\ +\n\ +\t// Make sure it's not a disconnected DOM node\n\ +\tif ( !jQuery.contains( docElem, elem ) ) {\n\ +\t\treturn box;\n\ +\t}\n\ +\n\ +\t// If we don't have gBCR, just use 0,0 rather than error\n\ +\t// BlackBerry 5, iOS 3 (original iPhone)\n\ +\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\ +\t\tbox = elem.getBoundingClientRect();\n\ +\t}\n\ +\twin = getWindow( doc );\n\ +\treturn {\n\ +\t\ttop: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),\n\ +\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\ +\t};\n\ +};\n\ +\n\ +jQuery.offset = {\n\ +\n\ +\tsetOffset: function( elem, options, i ) {\n\ +\t\tvar position = jQuery.css( elem, \"position\" );\n\ +\n\ +\t\t// set position first, in-case top/left are set even on static elem\n\ +\t\tif ( position === \"static\" ) {\n\ +\t\t\telem.style.position = \"relative\";\n\ +\t\t}\n\ +\n\ +\t\tvar curElem = jQuery( elem ),\n\ +\t\t\tcurOffset = curElem.offset(),\n\ +\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\ +\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\ +\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\ +\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\ +\n\ +\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\ +\t\tif ( calculatePosition ) {\n\ +\t\t\tcurPosition = curElem.position();\n\ +\t\t\tcurTop = curPosition.top;\n\ +\t\t\tcurLeft = curPosition.left;\n\ +\t\t} else {\n\ +\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\ +\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\ +\t\t}\n\ +\n\ +\t\tif ( jQuery.isFunction( options ) ) {\n\ +\t\t\toptions = options.call( elem, i, curOffset );\n\ +\t\t}\n\ +\n\ +\t\tif ( options.top != null ) {\n\ +\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\ +\t\t}\n\ +\t\tif ( options.left != null ) {\n\ +\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\ +\t\t}\n\ +\n\ +\t\tif ( \"using\" in options ) {\n\ +\t\t\toptions.using.call( elem, props );\n\ +\t\t} else {\n\ +\t\t\tcurElem.css( props );\n\ +\t\t}\n\ +\t}\n\ +};\n\ +\n\ +\n\ +jQuery.fn.extend({\n\ +\n\ +\tposition: function() {\n\ +\t\tif ( !this[ 0 ] ) {\n\ +\t\t\treturn;\n\ +\t\t}\n\ +\n\ +\t\tvar offsetParent, offset,\n\ +\t\t\tparentOffset = { top: 0, left: 0 },\n\ +\t\t\telem = this[ 0 ];\n\ +\n\ +\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\ +\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\ +\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\ +\t\t\toffset = elem.getBoundingClientRect();\n\ +\t\t} else {\n\ +\t\t\t// Get *real* offsetParent\n\ +\t\t\toffsetParent = this.offsetParent();\n\ +\n\ +\t\t\t// Get correct offsets\n\ +\t\t\toffset = this.offset();\n\ +\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\ +\t\t\t\tparentOffset = offsetParent.offset();\n\ +\t\t\t}\n\ +\n\ +\t\t\t// Add offsetParent borders\n\ +\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\ +\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\ +\t\t}\n\ +\n\ +\t\t// Subtract parent offsets and element margins\n\ +\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\ +\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\ +\t\treturn {\n\ +\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\ +\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\ +\t\t};\n\ +\t},\n\ +\n\ +\toffsetParent: function() {\n\ +\t\treturn this.map(function() {\n\ +\t\t\tvar offsetParent = this.offsetParent || document.documentElement;\n\ +\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\ +\t\t\t\toffsetParent = offsetParent.offsetParent;\n\ +\t\t\t}\n\ +\t\t\treturn offsetParent || document.documentElement;\n\ +\t\t});\n\ +\t}\n\ +});\n\ +\n\ +\n\ +// Create scrollLeft and scrollTop methods\n\ +jQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\ +\tvar top = /Y/.test( prop );\n\ +\n\ +\tjQuery.fn[ method ] = function( val ) {\n\ +\t\treturn jQuery.access( this, function( elem, method, val ) {\n\ +\t\t\tvar win = getWindow( elem );\n\ +\n\ +\t\t\tif ( val === undefined ) {\n\ +\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\ +\t\t\t\t\twin.document.documentElement[ method ] :\n\ +\t\t\t\t\telem[ method ];\n\ +\t\t\t}\n\ +\n\ +\t\t\tif ( win ) {\n\ +\t\t\t\twin.scrollTo(\n\ +\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\ +\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\ +\t\t\t\t);\n\ +\n\ +\t\t\t} else {\n\ +\t\t\t\telem[ method ] = val;\n\ +\t\t\t}\n\ +\t\t}, method, val, arguments.length, null );\n\ +\t};\n\ +});\n\ +\n\ +function getWindow( elem ) {\n\ +\treturn jQuery.isWindow( elem ) ?\n\ +\t\telem :\n\ +\t\telem.nodeType === 9 ?\n\ +\t\t\telem.defaultView || elem.parentWindow :\n\ +\t\t\tfalse;\n\ +}\n\ +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\n\ +jQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\ +\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\ +\t\t// margin is only for outerHeight, outerWidth\n\ +\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\ +\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\ +\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\ +\n\ +\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\ +\t\t\t\tvar doc;\n\ +\n\ +\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\ +\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\ +\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\ +\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\ +\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\t// Get document width or height\n\ +\t\t\t\tif ( elem.nodeType === 9 ) {\n\ +\t\t\t\t\tdoc = elem.documentElement;\n\ +\n\ +\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\ +\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\ +\t\t\t\t\treturn Math.max(\n\ +\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\ +\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\ +\t\t\t\t\t\tdoc[ \"client\" + name ]\n\ +\t\t\t\t\t);\n\ +\t\t\t\t}\n\ +\n\ +\t\t\t\treturn value === undefined ?\n\ +\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\ +\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\ +\n\ +\t\t\t\t\t// Set width or height on the element\n\ +\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\ +\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\ +\t\t};\n\ +\t});\n\ +});\n\ +// Limit scope pollution from any deprecated API\n\ +// (function() {\n\ +\n\ +// })();\n\ +\n\ +// Expose for component\n\ +module.exports = jQuery;\n\ +\n\ +// Expose jQuery to the global object\n\ +//window.jQuery = window.$ = jQuery;\n\ +\n\ +// Expose jQuery as an AMD module, but only for AMD loaders that\n\ +// understand the issues with loading multiple versions of jQuery\n\ +// in a page that all might call define(). The loader will indicate\n\ +// they have special allowances for multiple jQuery versions by\n\ +// specifying define.amd.jQuery = true. Register as a named module,\n\ +// since jQuery can be concatenated with other files that may use define,\n\ +// but not use a proper concatenation script that understands anonymous\n\ +// AMD modules. A named AMD is safest and most robust way to register.\n\ +// Lowercase jquery is used because AMD module names are derived from\n\ +// file names, and jQuery is normally delivered in a lowercase file name.\n\ +// Do this after creating the global so that if an AMD module wants to call\n\ +// noConflict to hide this version of jQuery, it will work.\n\ +if ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\ +\tdefine( \"jquery\", [], function () { return jQuery; } );\n\ +}\n\ +\n\ +})( window );\n\ +//@ sourceURL=component-jquery/index.js" )); require.register("indefinido-observable/components/cjohansen-sinon/sinon.js", Function("exports, require, module", -"/**\n * Sinon.JS 1.7.3, 2013/06/20\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n *\n * (The BSD License)\n * \n * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n * * Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * * Neither the name of Christian Johansen nor the names of his contributors\n * may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nthis.sinon = (function () {\nvar buster = (function (setTimeout, B) {\n var isNode = typeof require == \"function\" && typeof module == \"object\";\n var div = typeof document != \"undefined\" && document.createElement(\"div\");\n var F = function () {};\n\n var buster = {\n bind: function bind(obj, methOrProp) {\n var method = typeof methOrProp == \"string\" ? obj[methOrProp] : methOrProp;\n var args = Array.prototype.slice.call(arguments, 2);\n return function () {\n var allArgs = args.concat(Array.prototype.slice.call(arguments));\n return method.apply(obj, allArgs);\n };\n },\n\n partial: function partial(fn) {\n var args = [].slice.call(arguments, 1);\n return function () {\n return fn.apply(this, args.concat([].slice.call(arguments)));\n };\n },\n\n create: function create(object) {\n F.prototype = object;\n return new F();\n },\n\n extend: function extend(target) {\n if (!target) { return; }\n for (var i = 1, l = arguments.length, prop; i < l; ++i) {\n for (prop in arguments[i]) {\n target[prop] = arguments[i][prop];\n }\n }\n return target;\n },\n\n nextTick: function nextTick(callback) {\n if (typeof process != \"undefined\" && process.nextTick) {\n return process.nextTick(callback);\n }\n setTimeout(callback, 0);\n },\n\n functionName: function functionName(func) {\n if (!func) return \"\";\n if (func.displayName) return func.displayName;\n if (func.name) return func.name;\n var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n return matches && matches[1] || \"\";\n },\n\n isNode: function isNode(obj) {\n if (!div) return false;\n try {\n obj.appendChild(div);\n obj.removeChild(div);\n } catch (e) {\n return false;\n }\n return true;\n },\n\n isElement: function isElement(obj) {\n return obj && obj.nodeType === 1 && buster.isNode(obj);\n },\n\n isArray: function isArray(arr) {\n return Object.prototype.toString.call(arr) == \"[object Array]\";\n },\n\n flatten: function flatten(arr) {\n var result = [], arr = arr || [];\n for (var i = 0, l = arr.length; i < l; ++i) {\n result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);\n }\n return result;\n },\n\n each: function each(arr, callback) {\n for (var i = 0, l = arr.length; i < l; ++i) {\n callback(arr[i]);\n }\n },\n\n map: function map(arr, callback) {\n var results = [];\n for (var i = 0, l = arr.length; i < l; ++i) {\n results.push(callback(arr[i]));\n }\n return results;\n },\n\n parallel: function parallel(fns, callback) {\n function cb(err, res) {\n if (typeof callback == \"function\") {\n callback(err, res);\n callback = null;\n }\n }\n if (fns.length == 0) { return cb(null, []); }\n var remaining = fns.length, results = [];\n function makeDone(num) {\n return function done(err, result) {\n if (err) { return cb(err); }\n results[num] = result;\n if (--remaining == 0) { cb(null, results); }\n };\n }\n for (var i = 0, l = fns.length; i < l; ++i) {\n fns[i](makeDone(i));\n }\n },\n\n series: function series(fns, callback) {\n function cb(err, res) {\n if (typeof callback == \"function\") {\n callback(err, res);\n }\n }\n var remaining = fns.slice();\n var results = [];\n function callNext() {\n if (remaining.length == 0) return cb(null, results);\n var promise = remaining.shift()(next);\n if (promise && typeof promise.then == \"function\") {\n promise.then(buster.partial(next, null), next);\n }\n }\n function next(err, result) {\n if (err) return cb(err);\n results.push(result);\n callNext();\n }\n callNext();\n },\n\n countdown: function countdown(num, done) {\n return function () {\n if (--num == 0) done();\n };\n }\n };\n\n if (typeof process === \"object\" &&\n typeof require === \"function\" && typeof module === \"object\") {\n var crypto = require(\"crypto\");\n var path = require(\"path\");\n\n buster.tmpFile = function (fileName) {\n var hashed = crypto.createHash(\"sha1\");\n hashed.update(fileName);\n var tmpfileName = hashed.digest(\"hex\");\n\n if (process.platform == \"win32\") {\n return path.join(process.env[\"TEMP\"], tmpfileName);\n } else {\n return path.join(\"/tmp\", tmpfileName);\n }\n };\n }\n\n if (Array.prototype.some) {\n buster.some = function (arr, fn, thisp) {\n return arr.some(fn, thisp);\n };\n } else {\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n buster.some = function (arr, fun, thisp) {\n if (arr == null) { throw new TypeError(); }\n arr = Object(arr);\n var len = arr.length >>> 0;\n if (typeof fun !== \"function\") { throw new TypeError(); }\n\n for (var i = 0; i < len; i++) {\n if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n if (Array.prototype.filter) {\n buster.filter = function (arr, fn, thisp) {\n return arr.filter(fn, thisp);\n };\n } else {\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter\n buster.filter = function (fn, thisp) {\n if (this == null) { throw new TypeError(); }\n\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fn != \"function\") { throw new TypeError(); }\n\n var res = [];\n for (var i = 0; i < len; i++) {\n if (i in t) {\n var val = t[i]; // in case fun mutates this\n if (fn.call(thisp, val, i, t)) { res.push(val); }\n }\n }\n\n return res;\n };\n }\n\n if (isNode) {\n module.exports = buster;\n buster.eventEmitter = require(\"./buster-event-emitter\");\n Object.defineProperty(buster, \"defineVersionGetter\", {\n get: function () {\n return require(\"./define-version-getter\");\n }\n });\n }\n\n return buster.extend(B || {}, buster);\n}(setTimeout, buster));\nif (typeof buster === \"undefined\") {\n var buster = {};\n}\n\nif (typeof module === \"object\" && typeof require === \"function\") {\n buster = require(\"buster-core\");\n}\n\nbuster.format = buster.format || {};\nbuster.format.excludeConstructors = [\"Object\", /^.$/];\nbuster.format.quoteStrings = true;\n\nbuster.format.ascii = (function () {\n \n var hasOwn = Object.prototype.hasOwnProperty;\n\n var specialObjects = [];\n if (typeof global != \"undefined\") {\n specialObjects.push({ obj: global, value: \"[object global]\" });\n }\n if (typeof document != \"undefined\") {\n specialObjects.push({ obj: document, value: \"[object HTMLDocument]\" });\n }\n if (typeof window != \"undefined\") {\n specialObjects.push({ obj: window, value: \"[object Window]\" });\n }\n\n function keys(object) {\n var k = Object.keys && Object.keys(object) || [];\n\n if (k.length == 0) {\n for (var prop in object) {\n if (hasOwn.call(object, prop)) {\n k.push(prop);\n }\n }\n }\n\n return k.sort();\n }\n\n function isCircular(object, objects) {\n if (typeof object != \"object\") {\n return false;\n }\n\n for (var i = 0, l = objects.length; i < l; ++i) {\n if (objects[i] === object) {\n return true;\n }\n }\n\n return false;\n }\n\n function ascii(object, processed, indent) {\n if (typeof object == \"string\") {\n var quote = typeof this.quoteStrings != \"boolean\" || this.quoteStrings;\n return processed || quote ? '\"' + object + '\"' : object;\n }\n\n if (typeof object == \"function\" && !(object instanceof RegExp)) {\n return ascii.func(object);\n }\n\n processed = processed || [];\n\n if (isCircular(object, processed)) {\n return \"[Circular]\";\n }\n\n if (Object.prototype.toString.call(object) == \"[object Array]\") {\n return ascii.array.call(this, object, processed);\n }\n\n if (!object) {\n return \"\" + object;\n }\n\n if (buster.isElement(object)) {\n return ascii.element(object);\n }\n\n if (typeof object.toString == \"function\" &&\n object.toString !== Object.prototype.toString) {\n return object.toString();\n }\n\n for (var i = 0, l = specialObjects.length; i < l; i++) {\n if (object === specialObjects[i].obj) {\n return specialObjects[i].value;\n }\n }\n\n return ascii.object.call(this, object, processed, indent);\n }\n\n ascii.func = function (func) {\n return \"function \" + buster.functionName(func) + \"() {}\";\n };\n\n ascii.array = function (array, processed) {\n processed = processed || [];\n processed.push(array);\n var pieces = [];\n\n for (var i = 0, l = array.length; i < l; ++i) {\n pieces.push(ascii.call(this, array[i], processed));\n }\n\n return \"[\" + pieces.join(\", \") + \"]\";\n };\n\n ascii.object = function (object, processed, indent) {\n processed = processed || [];\n processed.push(object);\n indent = indent || 0;\n var pieces = [], properties = keys(object), prop, str, obj;\n var is = \"\";\n var length = 3;\n\n for (var i = 0, l = indent; i < l; ++i) {\n is += \" \";\n }\n\n for (i = 0, l = properties.length; i < l; ++i) {\n prop = properties[i];\n obj = object[prop];\n\n if (isCircular(obj, processed)) {\n str = \"[Circular]\";\n } else {\n str = ascii.call(this, obj, processed, indent + 2);\n }\n\n str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n length += str.length;\n pieces.push(str);\n }\n\n var cons = ascii.constructorName.call(this, object);\n var prefix = cons ? \"[\" + cons + \"] \" : \"\"\n\n return (length + indent) > 80 ?\n prefix + \"{\\n \" + is + pieces.join(\",\\n \" + is) + \"\\n\" + is + \"}\" :\n prefix + \"{ \" + pieces.join(\", \") + \" }\";\n };\n\n ascii.element = function (element) {\n var tagName = element.tagName.toLowerCase();\n var attrs = element.attributes, attribute, pairs = [], attrName;\n\n for (var i = 0, l = attrs.length; i < l; ++i) {\n attribute = attrs.item(i);\n attrName = attribute.nodeName.toLowerCase().replace(\"html:\", \"\");\n\n if (attrName == \"contenteditable\" && attribute.nodeValue == \"inherit\") {\n continue;\n }\n\n if (!!attribute.nodeValue) {\n pairs.push(attrName + \"=\\\"\" + attribute.nodeValue + \"\\\"\");\n }\n }\n\n var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n var content = element.innerHTML;\n\n if (content.length > 20) {\n content = content.substr(0, 20) + \"[...]\";\n }\n\n var res = formatted + pairs.join(\" \") + \">\" + content + \"</\" + tagName + \">\";\n\n return res.replace(/ contentEditable=\"inherit\"/, \"\");\n };\n\n ascii.constructorName = function (object) {\n var name = buster.functionName(object && object.constructor);\n var excludes = this.excludeConstructors || buster.format.excludeConstructors || [];\n\n for (var i = 0, l = excludes.length; i < l; ++i) {\n if (typeof excludes[i] == \"string\" && excludes[i] == name) {\n return \"\";\n } else if (excludes[i].test && excludes[i].test(name)) {\n return \"\";\n }\n }\n\n return name;\n };\n\n return ascii;\n}());\n\nif (typeof module != \"undefined\") {\n module.exports = buster.format;\n}\n/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/\n/*global module, require, __dirname, document*/\n/**\n * Sinon core utilities. For internal use only.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nvar sinon = (function (buster) {\n var div = typeof document != \"undefined\" && document.createElement(\"div\");\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function isDOMNode(obj) {\n var success = false;\n\n try {\n obj.appendChild(div);\n success = div.parentNode == obj;\n } catch (e) {\n return false;\n } finally {\n try {\n obj.removeChild(div);\n } catch (e) {\n // Remove failed, not much we can do about that\n }\n }\n\n return success;\n }\n\n function isElement(obj) {\n return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n }\n\n function isFunction(obj) {\n return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n }\n\n function mirrorProperties(target, source) {\n for (var prop in source) {\n if (!hasOwn.call(target, prop)) {\n target[prop] = source[prop];\n }\n }\n }\n\n function isRestorable (obj) {\n return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n }\n\n var sinon = {\n wrapMethod: function wrapMethod(object, property, method) {\n if (!object) {\n throw new TypeError(\"Should wrap property of object\");\n }\n\n if (typeof method != \"function\") {\n throw new TypeError(\"Method wrapper should be function\");\n }\n\n var wrappedMethod = object[property];\n\n if (!isFunction(wrappedMethod)) {\n throw new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n property + \" as function\");\n }\n\n if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n throw new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n }\n\n if (wrappedMethod.calledBefore) {\n var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n throw new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n }\n\n // IE 8 does not support hasOwnProperty on the window object.\n var owned = hasOwn.call(object, property);\n object[property] = method;\n method.displayName = property;\n\n method.restore = function () {\n // For prototype properties try to reset by delete first.\n // If this fails (ex: localStorage on mobile safari) then force a reset\n // via direct assignment.\n if (!owned) {\n delete object[property];\n }\n if (object[property] === method) {\n object[property] = wrappedMethod;\n }\n };\n\n method.restore.sinon = true;\n mirrorProperties(method, wrappedMethod);\n\n return method;\n },\n\n extend: function extend(target) {\n for (var i = 1, l = arguments.length; i < l; i += 1) {\n for (var prop in arguments[i]) {\n if (arguments[i].hasOwnProperty(prop)) {\n target[prop] = arguments[i][prop];\n }\n\n // DONT ENUM bug, only care about toString\n if (arguments[i].hasOwnProperty(\"toString\") &&\n arguments[i].toString != target.toString) {\n target.toString = arguments[i].toString;\n }\n }\n }\n\n return target;\n },\n\n create: function create(proto) {\n var F = function () {};\n F.prototype = proto;\n return new F();\n },\n\n deepEqual: function deepEqual(a, b) {\n if (sinon.match && sinon.match.isMatcher(a)) {\n return a.test(b);\n }\n if (typeof a != \"object\" || typeof b != \"object\") {\n return a === b;\n }\n\n if (isElement(a) || isElement(b)) {\n return a === b;\n }\n\n if (a === b) {\n return true;\n }\n\n if ((a === null && b !== null) || (a !== null && b === null)) {\n return false;\n }\n\n var aString = Object.prototype.toString.call(a);\n if (aString != Object.prototype.toString.call(b)) {\n return false;\n }\n\n if (aString == \"[object Array]\") {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0, l = a.length; i < l; i += 1) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (aString == \"[object Date]\") {\n return a.valueOf() === b.valueOf();\n }\n\n var prop, aLength = 0, bLength = 0;\n\n for (prop in a) {\n aLength += 1;\n\n if (!deepEqual(a[prop], b[prop])) {\n return false;\n }\n }\n\n for (prop in b) {\n bLength += 1;\n }\n\n return aLength == bLength;\n },\n\n functionName: function functionName(func) {\n var name = func.displayName || func.name;\n\n // Use function decomposition as a last resort to get function\n // name. Does not rely on function decomposition to work - if it\n // doesn't debugging will be slightly less informative\n // (i.e. toString will say 'spy' rather than 'myFunc').\n if (!name) {\n var matches = func.toString().match(/function ([^\\s\\(]+)/);\n name = matches && matches[1];\n }\n\n return name;\n },\n\n functionToString: function toString() {\n if (this.getCall && this.callCount) {\n var thisValue, prop, i = this.callCount;\n\n while (i--) {\n thisValue = this.getCall(i).thisValue;\n\n for (prop in thisValue) {\n if (thisValue[prop] === this) {\n return prop;\n }\n }\n }\n }\n\n return this.displayName || \"sinon fake\";\n },\n\n getConfig: function (custom) {\n var config = {};\n custom = custom || {};\n var defaults = sinon.defaultConfig;\n\n for (var prop in defaults) {\n if (defaults.hasOwnProperty(prop)) {\n config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n }\n }\n\n return config;\n },\n\n format: function (val) {\n return \"\" + val;\n },\n\n defaultConfig: {\n injectIntoThis: true,\n injectInto: null,\n properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n useFakeTimers: true,\n useFakeServer: true\n },\n\n timesInWords: function timesInWords(count) {\n return count == 1 && \"once\" ||\n count == 2 && \"twice\" ||\n count == 3 && \"thrice\" ||\n (count || 0) + \" times\";\n },\n\n calledInOrder: function (spies) {\n for (var i = 1, l = spies.length; i < l; i++) {\n if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n return false;\n }\n }\n\n return true;\n },\n\n orderByFirstCall: function (spies) {\n return spies.sort(function (a, b) {\n // uuid, won't ever be equal\n var aCall = a.getCall(0);\n var bCall = b.getCall(0);\n var aId = aCall && aCall.callId || -1;\n var bId = bCall && bCall.callId || -1;\n\n return aId < bId ? -1 : 1;\n });\n },\n\n log: function () {},\n\n logError: function (label, err) {\n var msg = label + \" threw exception: \"\n sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n if (err.stack) { sinon.log(err.stack); }\n\n setTimeout(function () {\n err.message = msg + err.message;\n throw err;\n }, 0);\n },\n\n typeOf: function (value) {\n if (value === null) {\n return \"null\";\n }\n else if (value === undefined) {\n return \"undefined\";\n }\n var string = Object.prototype.toString.call(value);\n return string.substring(8, string.length - 1).toLowerCase();\n },\n\n createStubInstance: function (constructor) {\n if (typeof constructor !== \"function\") {\n throw new TypeError(\"The constructor should be a function.\");\n }\n return sinon.stub(sinon.create(constructor.prototype));\n },\n\n restore: function (object) {\n if (object !== null && typeof object === \"object\") {\n for (var prop in object) {\n if (isRestorable(object[prop])) {\n object[prop].restore();\n }\n }\n }\n else if (isRestorable(object)) {\n object.restore();\n }\n }\n };\n\n var isNode = typeof module == \"object\" && typeof require == \"function\";\n\n if (isNode) {\n try {\n buster = { format: require(\"buster-format\") };\n } catch (e) {}\n module.exports = sinon;\n module.exports.spy = require(\"./sinon/spy\");\n module.exports.stub = require(\"./sinon/stub\");\n module.exports.mock = require(\"./sinon/mock\");\n module.exports.collection = require(\"./sinon/collection\");\n module.exports.assert = require(\"./sinon/assert\");\n module.exports.sandbox = require(\"./sinon/sandbox\");\n module.exports.test = require(\"./sinon/test\");\n module.exports.testCase = require(\"./sinon/test_case\");\n module.exports.assert = require(\"./sinon/assert\");\n module.exports.match = require(\"./sinon/match\");\n }\n\n if (buster) {\n var formatter = sinon.create(buster.format);\n formatter.quoteStrings = false;\n sinon.format = function () {\n return formatter.ascii.apply(formatter, arguments);\n };\n } else if (isNode) {\n try {\n var util = require(\"util\");\n sinon.format = function (value) {\n return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n };\n } catch (e) {\n /* Node, but no util module - would be very old, but better safe than\n sorry */\n }\n }\n\n return sinon;\n}(typeof buster == \"object\" && buster));\n\n/* @depend ../sinon.js */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Match functions\n *\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2012 Maximilian Antoni\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function assertType(value, type, name) {\n var actual = sinon.typeOf(value);\n if (actual !== type) {\n throw new TypeError(\"Expected type of \" + name + \" to be \" +\n type + \", but was \" + actual);\n }\n }\n\n var matcher = {\n toString: function () {\n return this.message;\n }\n };\n\n function isMatcher(object) {\n return matcher.isPrototypeOf(object);\n }\n\n function matchObject(expectation, actual) {\n if (actual === null || actual === undefined) {\n return false;\n }\n for (var key in expectation) {\n if (expectation.hasOwnProperty(key)) {\n var exp = expectation[key];\n var act = actual[key];\n if (match.isMatcher(exp)) {\n if (!exp.test(act)) {\n return false;\n }\n } else if (sinon.typeOf(exp) === \"object\") {\n if (!matchObject(exp, act)) {\n return false;\n }\n } else if (!sinon.deepEqual(exp, act)) {\n return false;\n }\n }\n }\n return true;\n }\n\n matcher.or = function (m2) {\n if (!isMatcher(m2)) {\n throw new TypeError(\"Matcher expected\");\n }\n var m1 = this;\n var or = sinon.create(matcher);\n or.test = function (actual) {\n return m1.test(actual) || m2.test(actual);\n };\n or.message = m1.message + \".or(\" + m2.message + \")\";\n return or;\n };\n\n matcher.and = function (m2) {\n if (!isMatcher(m2)) {\n throw new TypeError(\"Matcher expected\");\n }\n var m1 = this;\n var and = sinon.create(matcher);\n and.test = function (actual) {\n return m1.test(actual) && m2.test(actual);\n };\n and.message = m1.message + \".and(\" + m2.message + \")\";\n return and;\n };\n\n var match = function (expectation, message) {\n var m = sinon.create(matcher);\n var type = sinon.typeOf(expectation);\n switch (type) {\n case \"object\":\n if (typeof expectation.test === \"function\") {\n m.test = function (actual) {\n return expectation.test(actual) === true;\n };\n m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n return m;\n }\n var str = [];\n for (var key in expectation) {\n if (expectation.hasOwnProperty(key)) {\n str.push(key + \": \" + expectation[key]);\n }\n }\n m.test = function (actual) {\n return matchObject(expectation, actual);\n };\n m.message = \"match(\" + str.join(\", \") + \")\";\n break;\n case \"number\":\n m.test = function (actual) {\n return expectation == actual;\n };\n break;\n case \"string\":\n m.test = function (actual) {\n if (typeof actual !== \"string\") {\n return false;\n }\n return actual.indexOf(expectation) !== -1;\n };\n m.message = \"match(\\\"\" + expectation + \"\\\")\";\n break;\n case \"regexp\":\n m.test = function (actual) {\n if (typeof actual !== \"string\") {\n return false;\n }\n return expectation.test(actual);\n };\n break;\n case \"function\":\n m.test = expectation;\n if (message) {\n m.message = message;\n } else {\n m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n }\n break;\n default:\n m.test = function (actual) {\n return sinon.deepEqual(expectation, actual);\n };\n }\n if (!m.message) {\n m.message = \"match(\" + expectation + \")\";\n }\n return m;\n };\n\n match.isMatcher = isMatcher;\n\n match.any = match(function () {\n return true;\n }, \"any\");\n\n match.defined = match(function (actual) {\n return actual !== null && actual !== undefined;\n }, \"defined\");\n\n match.truthy = match(function (actual) {\n return !!actual;\n }, \"truthy\");\n\n match.falsy = match(function (actual) {\n return !actual;\n }, \"falsy\");\n\n match.same = function (expectation) {\n return match(function (actual) {\n return expectation === actual;\n }, \"same(\" + expectation + \")\");\n };\n\n match.typeOf = function (type) {\n assertType(type, \"string\", \"type\");\n return match(function (actual) {\n return sinon.typeOf(actual) === type;\n }, \"typeOf(\\\"\" + type + \"\\\")\");\n };\n\n match.instanceOf = function (type) {\n assertType(type, \"function\", \"type\");\n return match(function (actual) {\n return actual instanceof type;\n }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n };\n\n function createPropertyMatcher(propertyTest, messagePrefix) {\n return function (property, value) {\n assertType(property, \"string\", \"property\");\n var onlyProperty = arguments.length === 1;\n var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n if (!onlyProperty) {\n message += \", \" + value;\n }\n message += \")\";\n return match(function (actual) {\n if (actual === undefined || actual === null ||\n !propertyTest(actual, property)) {\n return false;\n }\n return onlyProperty || sinon.deepEqual(value, actual[property]);\n }, message);\n };\n }\n\n match.has = createPropertyMatcher(function (actual, property) {\n if (typeof actual === \"object\") {\n return property in actual;\n }\n return actual[property] !== undefined;\n }, \"has\");\n\n match.hasOwn = createPropertyMatcher(function (actual, property) {\n return actual.hasOwnProperty(property);\n }, \"hasOwn\");\n\n match.bool = match.typeOf(\"boolean\");\n match.number = match.typeOf(\"number\");\n match.string = match.typeOf(\"string\");\n match.object = match.typeOf(\"object\");\n match.func = match.typeOf(\"function\");\n match.array = match.typeOf(\"array\");\n match.regexp = match.typeOf(\"regexp\");\n match.date = match.typeOf(\"date\");\n\n if (commonJSModule) {\n module.exports = match;\n } else {\n sinon.match = match;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend match.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Spy calls\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n * Copyright (c) 2013 Maximilian Antoni\n */\n\nvar commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\nif (!this.sinon && commonJSModule) {\n var sinon = require(\"../sinon\");\n}\n\n(function (sinon) {\n function throwYieldError(proxy, text, args) {\n var msg = sinon.functionName(proxy) + text;\n if (args.length) {\n msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n }\n throw new Error(msg);\n }\n\n var slice = Array.prototype.slice;\n\n var callProto = {\n calledOn: function calledOn(thisValue) {\n if (sinon.match && sinon.match.isMatcher(thisValue)) {\n return thisValue.test(this.thisValue);\n }\n return this.thisValue === thisValue;\n },\n\n calledWith: function calledWith() {\n for (var i = 0, l = arguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(arguments[i], this.args[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n calledWithMatch: function calledWithMatch() {\n for (var i = 0, l = arguments.length; i < l; i += 1) {\n var actual = this.args[i];\n var expectation = arguments[i];\n if (!sinon.match || !sinon.match(expectation).test(actual)) {\n return false;\n }\n }\n return true;\n },\n\n calledWithExactly: function calledWithExactly() {\n return arguments.length == this.args.length &&\n this.calledWith.apply(this, arguments);\n },\n\n notCalledWith: function notCalledWith() {\n return !this.calledWith.apply(this, arguments);\n },\n\n notCalledWithMatch: function notCalledWithMatch() {\n return !this.calledWithMatch.apply(this, arguments);\n },\n\n returned: function returned(value) {\n return sinon.deepEqual(value, this.returnValue);\n },\n\n threw: function threw(error) {\n if (typeof error === \"undefined\" || !this.exception) {\n return !!this.exception;\n }\n\n return this.exception === error || this.exception.name === error;\n },\n\n calledWithNew: function calledWithNew(thisValue) {\n return this.thisValue instanceof this.proxy;\n },\n\n calledBefore: function (other) {\n return this.callId < other.callId;\n },\n\n calledAfter: function (other) {\n return this.callId > other.callId;\n },\n\n callArg: function (pos) {\n this.args[pos]();\n },\n\n callArgOn: function (pos, thisValue) {\n this.args[pos].apply(thisValue);\n },\n\n callArgWith: function (pos) {\n this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n },\n\n callArgOnWith: function (pos, thisValue) {\n var args = slice.call(arguments, 2);\n this.args[pos].apply(thisValue, args);\n },\n\n \"yield\": function () {\n this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n },\n\n yieldOn: function (thisValue) {\n var args = this.args;\n for (var i = 0, l = args.length; i < l; ++i) {\n if (typeof args[i] === \"function\") {\n args[i].apply(thisValue, slice.call(arguments, 1));\n return;\n }\n }\n throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n },\n\n yieldTo: function (prop) {\n this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n },\n\n yieldToOn: function (prop, thisValue) {\n var args = this.args;\n for (var i = 0, l = args.length; i < l; ++i) {\n if (args[i] && typeof args[i][prop] === \"function\") {\n args[i][prop].apply(thisValue, slice.call(arguments, 2));\n return;\n }\n }\n throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n \"' since no callback was passed.\", args);\n },\n\n toString: function () {\n var callStr = this.proxy.toString() + \"(\";\n var args = [];\n\n for (var i = 0, l = this.args.length; i < l; ++i) {\n args.push(sinon.format(this.args[i]));\n }\n\n callStr = callStr + args.join(\", \") + \")\";\n\n if (typeof this.returnValue != \"undefined\") {\n callStr += \" => \" + sinon.format(this.returnValue);\n }\n\n if (this.exception) {\n callStr += \" !\" + this.exception.name;\n\n if (this.exception.message) {\n callStr += \"(\" + this.exception.message + \")\";\n }\n }\n\n return callStr;\n }\n };\n\n callProto.invokeCallback = callProto.yield;\n\n function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n if (typeof id !== \"number\") {\n throw new TypeError(\"Call id is not a number\");\n }\n var proxyCall = sinon.create(callProto);\n proxyCall.proxy = spy;\n proxyCall.thisValue = thisValue;\n proxyCall.args = args;\n proxyCall.returnValue = returnValue;\n proxyCall.exception = exception;\n proxyCall.callId = id;\n\n return proxyCall;\n };\n createSpyCall.toString = callProto.toString; // used by mocks\n\n sinon.spyCall = createSpyCall;\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Spy functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = Array.prototype.push;\n var slice = Array.prototype.slice;\n var callId = 0;\n\n function spy(object, property) {\n if (!property && typeof object == \"function\") {\n return spy.create(object);\n }\n\n if (!object && !property) {\n return spy.create(function () { });\n }\n\n var method = object[property];\n return sinon.wrapMethod(object, property, spy.create(method));\n }\n\n function matchingFake(fakes, args, strict) {\n if (!fakes) {\n return;\n }\n\n var alen = args.length;\n\n for (var i = 0, l = fakes.length; i < l; i++) {\n if (fakes[i].matches(args, strict)) {\n return fakes[i];\n }\n }\n }\n\n function incrementCallCount() {\n this.called = true;\n this.callCount += 1;\n this.notCalled = false;\n this.calledOnce = this.callCount == 1;\n this.calledTwice = this.callCount == 2;\n this.calledThrice = this.callCount == 3;\n }\n\n function createCallProperties() {\n this.firstCall = this.getCall(0);\n this.secondCall = this.getCall(1);\n this.thirdCall = this.getCall(2);\n this.lastCall = this.getCall(this.callCount - 1);\n }\n\n var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n function createProxy(func) {\n // Retain the function length:\n var p;\n if (func.length) {\n eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n \") { return p.invoke(func, this, slice.call(arguments)); });\");\n }\n else {\n p = function proxy() {\n return p.invoke(func, this, slice.call(arguments));\n };\n }\n return p;\n }\n\n var uuid = 0;\n\n // Public API\n var spyApi = {\n reset: function () {\n this.called = false;\n this.notCalled = true;\n this.calledOnce = false;\n this.calledTwice = false;\n this.calledThrice = false;\n this.callCount = 0;\n this.firstCall = null;\n this.secondCall = null;\n this.thirdCall = null;\n this.lastCall = null;\n this.args = [];\n this.returnValues = [];\n this.thisValues = [];\n this.exceptions = [];\n this.callIds = [];\n if (this.fakes) {\n for (var i = 0; i < this.fakes.length; i++) {\n this.fakes[i].reset();\n }\n }\n },\n\n create: function create(func) {\n var name;\n\n if (typeof func != \"function\") {\n func = function () { };\n } else {\n name = sinon.functionName(func);\n }\n\n var proxy = createProxy(func);\n\n sinon.extend(proxy, spy);\n delete proxy.create;\n sinon.extend(proxy, func);\n\n proxy.reset();\n proxy.prototype = func.prototype;\n proxy.displayName = name || \"spy\";\n proxy.toString = sinon.functionToString;\n proxy._create = sinon.spy.create;\n proxy.id = \"spy#\" + uuid++;\n\n return proxy;\n },\n\n invoke: function invoke(func, thisValue, args) {\n var matching = matchingFake(this.fakes, args);\n var exception, returnValue;\n\n incrementCallCount.call(this);\n push.call(this.thisValues, thisValue);\n push.call(this.args, args);\n push.call(this.callIds, callId++);\n\n try {\n if (matching) {\n returnValue = matching.invoke(func, thisValue, args);\n } else {\n returnValue = (this.func || func).apply(thisValue, args);\n }\n } catch (e) {\n push.call(this.returnValues, undefined);\n exception = e;\n throw e;\n } finally {\n push.call(this.exceptions, exception);\n }\n\n push.call(this.returnValues, returnValue);\n\n createCallProperties.call(this);\n\n return returnValue;\n },\n\n getCall: function getCall(i) {\n if (i < 0 || i >= this.callCount) {\n return null;\n }\n\n return sinon.spyCall(this, this.thisValues[i], this.args[i],\n this.returnValues[i], this.exceptions[i],\n this.callIds[i]);\n },\n\n calledBefore: function calledBefore(spyFn) {\n if (!this.called) {\n return false;\n }\n\n if (!spyFn.called) {\n return true;\n }\n\n return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n },\n\n calledAfter: function calledAfter(spyFn) {\n if (!this.called || !spyFn.called) {\n return false;\n }\n\n return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n },\n\n withArgs: function () {\n var args = slice.call(arguments);\n\n if (this.fakes) {\n var match = matchingFake(this.fakes, args, true);\n\n if (match) {\n return match;\n }\n } else {\n this.fakes = [];\n }\n\n var original = this;\n var fake = this._create();\n fake.matchingAguments = args;\n push.call(this.fakes, fake);\n\n fake.withArgs = function () {\n return original.withArgs.apply(original, arguments);\n };\n\n for (var i = 0; i < this.args.length; i++) {\n if (fake.matches(this.args[i])) {\n incrementCallCount.call(fake);\n push.call(fake.thisValues, this.thisValues[i]);\n push.call(fake.args, this.args[i]);\n push.call(fake.returnValues, this.returnValues[i]);\n push.call(fake.exceptions, this.exceptions[i]);\n push.call(fake.callIds, this.callIds[i]);\n }\n }\n createCallProperties.call(fake);\n\n return fake;\n },\n\n matches: function (args, strict) {\n var margs = this.matchingAguments;\n\n if (margs.length <= args.length &&\n sinon.deepEqual(margs, args.slice(0, margs.length))) {\n return !strict || margs.length == args.length;\n }\n },\n\n printf: function (format) {\n var spy = this;\n var args = slice.call(arguments, 1);\n var formatter;\n\n return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n formatter = spyApi.formatters[specifyer];\n\n if (typeof formatter == \"function\") {\n return formatter.call(null, spy, args);\n } else if (!isNaN(parseInt(specifyer), 10)) {\n return sinon.format(args[specifyer - 1]);\n }\n\n return \"%\" + specifyer;\n });\n }\n };\n\n function delegateToCalls(method, matchAny, actual, notCalled) {\n spyApi[method] = function () {\n if (!this.called) {\n if (notCalled) {\n return notCalled.apply(this, arguments);\n }\n return false;\n }\n\n var currentCall;\n var matches = 0;\n\n for (var i = 0, l = this.callCount; i < l; i += 1) {\n currentCall = this.getCall(i);\n\n if (currentCall[actual || method].apply(currentCall, arguments)) {\n matches += 1;\n\n if (matchAny) {\n return true;\n }\n }\n }\n\n return matches === this.callCount;\n };\n }\n\n delegateToCalls(\"calledOn\", true);\n delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n delegateToCalls(\"calledWith\", true);\n delegateToCalls(\"calledWithMatch\", true);\n delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n delegateToCalls(\"calledWithExactly\", true);\n delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n function () { return true; });\n delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n function () { return true; });\n delegateToCalls(\"threw\", true);\n delegateToCalls(\"alwaysThrew\", false, \"threw\");\n delegateToCalls(\"returned\", true);\n delegateToCalls(\"alwaysReturned\", false, \"returned\");\n delegateToCalls(\"calledWithNew\", true);\n delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n });\n spyApi.callArgWith = spyApi.callArg;\n delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n });\n spyApi.callArgOnWith = spyApi.callArgOn;\n delegateToCalls(\"yield\", false, \"yield\", function () {\n throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n });\n // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n spyApi.invokeCallback = spyApi.yield;\n delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n });\n delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n throw new Error(this.toString() + \" cannot yield to '\" + property +\n \"' since it was not yet invoked.\");\n });\n delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n throw new Error(this.toString() + \" cannot yield to '\" + property +\n \"' since it was not yet invoked.\");\n });\n\n spyApi.formatters = {\n \"c\": function (spy) {\n return sinon.timesInWords(spy.callCount);\n },\n\n \"n\": function (spy) {\n return spy.toString();\n },\n\n \"C\": function (spy) {\n var calls = [];\n\n for (var i = 0, l = spy.callCount; i < l; ++i) {\n var stringifiedCall = \" \" + spy.getCall(i).toString();\n if (/\\n/.test(calls[i - 1])) {\n stringifiedCall = \"\\n\" + stringifiedCall;\n }\n push.call(calls, stringifiedCall);\n }\n\n return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n },\n\n \"t\": function (spy) {\n var objects = [];\n\n for (var i = 0, l = spy.callCount; i < l; ++i) {\n push.call(objects, sinon.format(spy.thisValues[i]));\n }\n\n return objects.join(\", \");\n },\n\n \"*\": function (spy, args) {\n var formatted = [];\n\n for (var i = 0, l = args.length; i < l; ++i) {\n push.call(formatted, sinon.format(args[i]));\n }\n\n return formatted.join(\", \");\n }\n };\n\n sinon.extend(spy, spyApi);\n\n spy.spyCall = sinon.spyCall;\n\n if (commonJSModule) {\n module.exports = spy;\n } else {\n sinon.spy = spy;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend spy.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global module, require, sinon*/\n/**\n * Stub functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function stub(object, property, func) {\n if (!!func && typeof func != \"function\") {\n throw new TypeError(\"Custom stub should be function\");\n }\n\n var wrapper;\n\n if (func) {\n wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n } else {\n wrapper = stub.create();\n }\n\n if (!object && !property) {\n return sinon.stub.create();\n }\n\n if (!property && !!object && typeof object == \"object\") {\n for (var prop in object) {\n if (typeof object[prop] === \"function\") {\n stub(object, prop);\n }\n }\n\n return object;\n }\n\n return sinon.wrapMethod(object, property, wrapper);\n }\n\n function getChangingValue(stub, property) {\n var index = stub.callCount - 1;\n var values = stub[property];\n var prop = index in values ? values[index] : values[values.length - 1];\n stub[property + \"Last\"] = prop;\n\n return prop;\n }\n\n function getCallback(stub, args) {\n var callArgAt = getChangingValue(stub, \"callArgAts\");\n\n if (callArgAt < 0) {\n var callArgProp = getChangingValue(stub, \"callArgProps\");\n\n for (var i = 0, l = args.length; i < l; ++i) {\n if (!callArgProp && typeof args[i] == \"function\") {\n return args[i];\n }\n\n if (callArgProp && args[i] &&\n typeof args[i][callArgProp] == \"function\") {\n return args[i][callArgProp];\n }\n }\n\n return null;\n }\n\n return args[callArgAt];\n }\n\n var join = Array.prototype.join;\n\n function getCallbackError(stub, func, args) {\n if (stub.callArgAtsLast < 0) {\n var msg;\n\n if (stub.callArgPropsLast) {\n msg = sinon.functionName(stub) +\n \" expected to yield to '\" + stub.callArgPropsLast +\n \"', but no object with such a property was passed.\"\n } else {\n msg = sinon.functionName(stub) +\n \" expected to yield, but no callback was passed.\"\n }\n\n if (args.length > 0) {\n msg += \" Received [\" + join.call(args, \", \") + \"]\";\n }\n\n return msg;\n }\n\n return \"argument at index \" + stub.callArgAtsLast + \" is not a function: \" + func;\n }\n\n var nextTick = (function () {\n if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n return process.nextTick;\n } else if (typeof setImmediate === \"function\") {\n return setImmediate;\n } else {\n return function (callback) {\n setTimeout(callback, 0);\n };\n }\n })();\n\n function callCallback(stub, args) {\n if (stub.callArgAts.length > 0) {\n var func = getCallback(stub, args);\n\n if (typeof func != \"function\") {\n throw new TypeError(getCallbackError(stub, func, args));\n }\n\n var callbackArguments = getChangingValue(stub, \"callbackArguments\");\n var callbackContext = getChangingValue(stub, \"callbackContexts\");\n\n if (stub.callbackAsync) {\n nextTick(function() {\n func.apply(callbackContext, callbackArguments);\n });\n } else {\n func.apply(callbackContext, callbackArguments);\n }\n }\n }\n\n var uuid = 0;\n\n sinon.extend(stub, (function () {\n var slice = Array.prototype.slice, proto;\n\n function throwsException(error, message) {\n if (typeof error == \"string\") {\n this.exception = new Error(message || \"\");\n this.exception.name = error;\n } else if (!error) {\n this.exception = new Error(\"Error\");\n } else {\n this.exception = error;\n }\n\n return this;\n }\n\n proto = {\n create: function create() {\n var functionStub = function () {\n\n callCallback(functionStub, arguments);\n\n if (functionStub.exception) {\n throw functionStub.exception;\n } else if (typeof functionStub.returnArgAt == 'number') {\n return arguments[functionStub.returnArgAt];\n } else if (functionStub.returnThis) {\n return this;\n }\n return functionStub.returnValue;\n };\n\n functionStub.id = \"stub#\" + uuid++;\n var orig = functionStub;\n functionStub = sinon.spy.create(functionStub);\n functionStub.func = orig;\n\n functionStub.callArgAts = [];\n functionStub.callbackArguments = [];\n functionStub.callbackContexts = [];\n functionStub.callArgProps = [];\n\n sinon.extend(functionStub, stub);\n functionStub._create = sinon.stub.create;\n functionStub.displayName = \"stub\";\n functionStub.toString = sinon.functionToString;\n\n return functionStub;\n },\n\n resetBehavior: function () {\n var i;\n\n this.callArgAts = [];\n this.callbackArguments = [];\n this.callbackContexts = [];\n this.callArgProps = [];\n\n delete this.returnValue;\n delete this.returnArgAt;\n this.returnThis = false;\n\n if (this.fakes) {\n for (i = 0; i < this.fakes.length; i++) {\n this.fakes[i].resetBehavior();\n }\n }\n },\n\n returns: function returns(value) {\n this.returnValue = value;\n\n return this;\n },\n\n returnsArg: function returnsArg(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.returnArgAt = pos;\n\n return this;\n },\n\n returnsThis: function returnsThis() {\n this.returnThis = true;\n\n return this;\n },\n\n \"throws\": throwsException,\n throwsException: throwsException,\n\n callsArg: function callsArg(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push([]);\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgOn: function callsArgOn(pos, context) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push([]);\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgWith: function callsArgWith(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgOnWith: function callsArgWith(pos, context) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push(slice.call(arguments, 2));\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yields: function () {\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 0));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yieldsOn: function (context) {\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yieldsTo: function (prop) {\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(prop);\n\n return this;\n },\n\n yieldsToOn: function (prop, context) {\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 2));\n this.callbackContexts.push(context);\n this.callArgProps.push(prop);\n\n return this;\n }\n };\n\n // create asynchronous versions of callsArg* and yields* methods\n for (var method in proto) {\n // need to avoid creating anotherasync versions of the newly added async methods\n if (proto.hasOwnProperty(method) &&\n method.match(/^(callsArg|yields|thenYields$)/) &&\n !method.match(/Async/)) {\n proto[method + 'Async'] = (function (syncFnName) {\n return function () {\n this.callbackAsync = true;\n return this[syncFnName].apply(this, arguments);\n };\n })(method);\n }\n }\n\n return proto;\n\n }()));\n\n if (commonJSModule) {\n module.exports = stub;\n } else {\n sinon.stub = stub;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false*/\n/*global module, require, sinon*/\n/**\n * Mock functions.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = [].push;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function mock(object) {\n if (!object) {\n return sinon.expectation.create(\"Anonymous mock\");\n }\n\n return mock.create(object);\n }\n\n sinon.mock = mock;\n\n sinon.extend(mock, (function () {\n function each(collection, callback) {\n if (!collection) {\n return;\n }\n\n for (var i = 0, l = collection.length; i < l; i += 1) {\n callback(collection[i]);\n }\n }\n\n return {\n create: function create(object) {\n if (!object) {\n throw new TypeError(\"object is null\");\n }\n\n var mockObject = sinon.extend({}, mock);\n mockObject.object = object;\n delete mockObject.create;\n\n return mockObject;\n },\n\n expects: function expects(method) {\n if (!method) {\n throw new TypeError(\"method is falsy\");\n }\n\n if (!this.expectations) {\n this.expectations = {};\n this.proxies = [];\n }\n\n if (!this.expectations[method]) {\n this.expectations[method] = [];\n var mockObject = this;\n\n sinon.wrapMethod(this.object, method, function () {\n return mockObject.invokeMethod(method, this, arguments);\n });\n\n push.call(this.proxies, method);\n }\n\n var expectation = sinon.expectation.create(method);\n push.call(this.expectations[method], expectation);\n\n return expectation;\n },\n\n restore: function restore() {\n var object = this.object;\n\n each(this.proxies, function (proxy) {\n if (typeof object[proxy].restore == \"function\") {\n object[proxy].restore();\n }\n });\n },\n\n verify: function verify() {\n var expectations = this.expectations || {};\n var messages = [], met = [];\n\n each(this.proxies, function (proxy) {\n each(expectations[proxy], function (expectation) {\n if (!expectation.met()) {\n push.call(messages, expectation.toString());\n } else {\n push.call(met, expectation.toString());\n }\n });\n });\n\n this.restore();\n\n if (messages.length > 0) {\n sinon.expectation.fail(messages.concat(met).join(\"\\n\"));\n } else {\n sinon.expectation.pass(messages.concat(met).join(\"\\n\"));\n }\n\n return true;\n },\n\n invokeMethod: function invokeMethod(method, thisValue, args) {\n var expectations = this.expectations && this.expectations[method];\n var length = expectations && expectations.length || 0, i;\n\n for (i = 0; i < length; i += 1) {\n if (!expectations[i].met() &&\n expectations[i].allowsCall(thisValue, args)) {\n return expectations[i].apply(thisValue, args);\n }\n }\n\n var messages = [], available, exhausted = 0;\n\n for (i = 0; i < length; i += 1) {\n if (expectations[i].allowsCall(thisValue, args)) {\n available = available || expectations[i];\n } else {\n exhausted += 1;\n }\n push.call(messages, \" \" + expectations[i].toString());\n }\n\n if (exhausted === 0) {\n return available.apply(thisValue, args);\n }\n\n messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n proxy: method,\n args: args\n }));\n\n sinon.expectation.fail(messages.join(\"\\n\"));\n }\n };\n }()));\n\n var times = sinon.timesInWords;\n\n sinon.expectation = (function () {\n var slice = Array.prototype.slice;\n var _invoke = sinon.spy.invoke;\n\n function callCountInWords(callCount) {\n if (callCount == 0) {\n return \"never called\";\n } else {\n return \"called \" + times(callCount);\n }\n }\n\n function expectedCallCountInWords(expectation) {\n var min = expectation.minCalls;\n var max = expectation.maxCalls;\n\n if (typeof min == \"number\" && typeof max == \"number\") {\n var str = times(min);\n\n if (min != max) {\n str = \"at least \" + str + \" and at most \" + times(max);\n }\n\n return str;\n }\n\n if (typeof min == \"number\") {\n return \"at least \" + times(min);\n }\n\n return \"at most \" + times(max);\n }\n\n function receivedMinCalls(expectation) {\n var hasMinLimit = typeof expectation.minCalls == \"number\";\n return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n }\n\n function receivedMaxCalls(expectation) {\n if (typeof expectation.maxCalls != \"number\") {\n return false;\n }\n\n return expectation.callCount == expectation.maxCalls;\n }\n\n return {\n minCalls: 1,\n maxCalls: 1,\n\n create: function create(methodName) {\n var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n delete expectation.create;\n expectation.method = methodName;\n\n return expectation;\n },\n\n invoke: function invoke(func, thisValue, args) {\n this.verifyCallAllowed(thisValue, args);\n\n return _invoke.apply(this, arguments);\n },\n\n atLeast: function atLeast(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not number\");\n }\n\n if (!this.limitsSet) {\n this.maxCalls = null;\n this.limitsSet = true;\n }\n\n this.minCalls = num;\n\n return this;\n },\n\n atMost: function atMost(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not number\");\n }\n\n if (!this.limitsSet) {\n this.minCalls = null;\n this.limitsSet = true;\n }\n\n this.maxCalls = num;\n\n return this;\n },\n\n never: function never() {\n return this.exactly(0);\n },\n\n once: function once() {\n return this.exactly(1);\n },\n\n twice: function twice() {\n return this.exactly(2);\n },\n\n thrice: function thrice() {\n return this.exactly(3);\n },\n\n exactly: function exactly(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not a number\");\n }\n\n this.atLeast(num);\n return this.atMost(num);\n },\n\n met: function met() {\n return !this.failed && receivedMinCalls(this);\n },\n\n verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n if (receivedMaxCalls(this)) {\n this.failed = true;\n sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n }\n\n if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n this.expectedThis);\n }\n\n if (!(\"expectedArguments\" in this)) {\n return;\n }\n\n if (!args) {\n sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n sinon.format(this.expectedArguments));\n }\n\n if (args.length < this.expectedArguments.length) {\n sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n \"), expected \" + sinon.format(this.expectedArguments));\n }\n\n if (this.expectsExactArgCount &&\n args.length != this.expectedArguments.length) {\n sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n \"), expected \" + sinon.format(this.expectedArguments));\n }\n\n for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n \", expected \" + sinon.format(this.expectedArguments));\n }\n }\n },\n\n allowsCall: function allowsCall(thisValue, args) {\n if (this.met() && receivedMaxCalls(this)) {\n return false;\n }\n\n if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n return false;\n }\n\n if (!(\"expectedArguments\" in this)) {\n return true;\n }\n\n args = args || [];\n\n if (args.length < this.expectedArguments.length) {\n return false;\n }\n\n if (this.expectsExactArgCount &&\n args.length != this.expectedArguments.length) {\n return false;\n }\n\n for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n withArgs: function withArgs() {\n this.expectedArguments = slice.call(arguments);\n return this;\n },\n\n withExactArgs: function withExactArgs() {\n this.withArgs.apply(this, arguments);\n this.expectsExactArgCount = true;\n return this;\n },\n\n on: function on(thisValue) {\n this.expectedThis = thisValue;\n return this;\n },\n\n toString: function () {\n var args = (this.expectedArguments || []).slice();\n\n if (!this.expectsExactArgCount) {\n push.call(args, \"[...]\");\n }\n\n var callStr = sinon.spyCall.toString.call({\n proxy: this.method || \"anonymous mock expectation\",\n args: args\n });\n\n var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n expectedCallCountInWords(this);\n\n if (this.met()) {\n return \"Expectation met: \" + message;\n }\n\n return \"Expected \" + message + \" (\" +\n callCountInWords(this.callCount) + \")\";\n },\n\n verify: function verify() {\n if (!this.met()) {\n sinon.expectation.fail(this.toString());\n } else {\n sinon.expectation.pass(this.toString());\n }\n\n return true;\n },\n\n pass: function(message) {\n sinon.assert.pass(message);\n },\n fail: function (message) {\n var exception = new Error(message);\n exception.name = \"ExpectationError\";\n\n throw exception;\n }\n };\n }());\n\n if (commonJSModule) {\n module.exports = mock;\n } else {\n sinon.mock = mock;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true*/\n/*global module, require, sinon*/\n/**\n * Collections of stubs, spies and mocks.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = [].push;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function getFakes(fakeCollection) {\n if (!fakeCollection.fakes) {\n fakeCollection.fakes = [];\n }\n\n return fakeCollection.fakes;\n }\n\n function each(fakeCollection, method) {\n var fakes = getFakes(fakeCollection);\n\n for (var i = 0, l = fakes.length; i < l; i += 1) {\n if (typeof fakes[i][method] == \"function\") {\n fakes[i][method]();\n }\n }\n }\n\n function compact(fakeCollection) {\n var fakes = getFakes(fakeCollection);\n var i = 0;\n while (i < fakes.length) {\n fakes.splice(i, 1);\n }\n }\n\n var collection = {\n verify: function resolve() {\n each(this, \"verify\");\n },\n\n restore: function restore() {\n each(this, \"restore\");\n compact(this);\n },\n\n verifyAndRestore: function verifyAndRestore() {\n var exception;\n\n try {\n this.verify();\n } catch (e) {\n exception = e;\n }\n\n this.restore();\n\n if (exception) {\n throw exception;\n }\n },\n\n add: function add(fake) {\n push.call(getFakes(this), fake);\n return fake;\n },\n\n spy: function spy() {\n return this.add(sinon.spy.apply(sinon, arguments));\n },\n\n stub: function stub(object, property, value) {\n if (property) {\n var original = object[property];\n\n if (typeof original != \"function\") {\n if (!hasOwnProperty.call(object, property)) {\n throw new TypeError(\"Cannot stub non-existent own property \" + property);\n }\n\n object[property] = value;\n\n return this.add({\n restore: function () {\n object[property] = original;\n }\n });\n }\n }\n if (!property && !!object && typeof object == \"object\") {\n var stubbedObj = sinon.stub.apply(sinon, arguments);\n\n for (var prop in stubbedObj) {\n if (typeof stubbedObj[prop] === \"function\") {\n this.add(stubbedObj[prop]);\n }\n }\n\n return stubbedObj;\n }\n\n return this.add(sinon.stub.apply(sinon, arguments));\n },\n\n mock: function mock() {\n return this.add(sinon.mock.apply(sinon, arguments));\n },\n\n inject: function inject(obj) {\n var col = this;\n\n obj.spy = function () {\n return col.spy.apply(col, arguments);\n };\n\n obj.stub = function () {\n return col.stub.apply(col, arguments);\n };\n\n obj.mock = function () {\n return col.mock.apply(col, arguments);\n };\n\n return obj;\n }\n };\n\n if (commonJSModule) {\n module.exports = collection;\n } else {\n sinon.collection = collection;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n/*global module, require, window*/\n/**\n * Fake timer API\n * setTimeout\n * setInterval\n * clearTimeout\n * clearInterval\n * tick\n * reset\n * Date\n *\n * Inspired by jsUnitMockTimeOut from JsUnit\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n var sinon = {};\n}\n\n(function (global) {\n var id = 1;\n\n function addTimer(args, recurring) {\n if (args.length === 0) {\n throw new Error(\"Function requires at least 1 parameter\");\n }\n\n var toId = id++;\n var delay = args[1] || 0;\n\n if (!this.timeouts) {\n this.timeouts = {};\n }\n\n this.timeouts[toId] = {\n id: toId,\n func: args[0],\n callAt: this.now + delay,\n invokeArgs: Array.prototype.slice.call(args, 2)\n };\n\n if (recurring === true) {\n this.timeouts[toId].interval = delay;\n }\n\n return toId;\n }\n\n function parseTime(str) {\n if (!str) {\n return 0;\n }\n\n var strings = str.split(\":\");\n var l = strings.length, i = l;\n var ms = 0, parsed;\n\n if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n throw new Error(\"tick only understands numbers and 'h:m:s'\");\n }\n\n while (i--) {\n parsed = parseInt(strings[i], 10);\n\n if (parsed >= 60) {\n throw new Error(\"Invalid time \" + str);\n }\n\n ms += parsed * Math.pow(60, (l - i - 1));\n }\n\n return ms * 1000;\n }\n\n function createObject(object) {\n var newObject;\n\n if (Object.create) {\n newObject = Object.create(object);\n } else {\n var F = function () {};\n F.prototype = object;\n newObject = new F();\n }\n\n newObject.Date.clock = newObject;\n return newObject;\n }\n\n sinon.clock = {\n now: 0,\n\n create: function create(now) {\n var clock = createObject(this);\n\n if (typeof now == \"number\") {\n clock.now = now;\n }\n\n if (!!now && typeof now == \"object\") {\n throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n }\n\n return clock;\n },\n\n setTimeout: function setTimeout(callback, timeout) {\n return addTimer.call(this, arguments, false);\n },\n\n clearTimeout: function clearTimeout(timerId) {\n if (!this.timeouts) {\n this.timeouts = [];\n }\n\n if (timerId in this.timeouts) {\n delete this.timeouts[timerId];\n }\n },\n\n setInterval: function setInterval(callback, timeout) {\n return addTimer.call(this, arguments, true);\n },\n\n clearInterval: function clearInterval(timerId) {\n this.clearTimeout(timerId);\n },\n\n tick: function tick(ms) {\n ms = typeof ms == \"number\" ? ms : parseTime(ms);\n var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;\n var timer = this.firstTimerInRange(tickFrom, tickTo);\n\n var firstException;\n while (timer && tickFrom <= tickTo) {\n if (this.timeouts[timer.id]) {\n tickFrom = this.now = timer.callAt;\n try {\n this.callTimer(timer);\n } catch (e) {\n firstException = firstException || e;\n }\n }\n\n timer = this.firstTimerInRange(previous, tickTo);\n previous = tickFrom;\n }\n\n this.now = tickTo;\n\n if (firstException) {\n throw firstException;\n }\n\n return this.now;\n },\n\n firstTimerInRange: function (from, to) {\n var timer, smallest, originalTimer;\n\n for (var id in this.timeouts) {\n if (this.timeouts.hasOwnProperty(id)) {\n if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {\n continue;\n }\n\n if (!smallest || this.timeouts[id].callAt < smallest) {\n originalTimer = this.timeouts[id];\n smallest = this.timeouts[id].callAt;\n\n timer = {\n func: this.timeouts[id].func,\n callAt: this.timeouts[id].callAt,\n interval: this.timeouts[id].interval,\n id: this.timeouts[id].id,\n invokeArgs: this.timeouts[id].invokeArgs\n };\n }\n }\n }\n\n return timer || null;\n },\n\n callTimer: function (timer) {\n if (typeof timer.interval == \"number\") {\n this.timeouts[timer.id].callAt += timer.interval;\n } else {\n delete this.timeouts[timer.id];\n }\n\n try {\n if (typeof timer.func == \"function\") {\n timer.func.apply(null, timer.invokeArgs);\n } else {\n eval(timer.func);\n }\n } catch (e) {\n var exception = e;\n }\n\n if (!this.timeouts[timer.id]) {\n if (exception) {\n throw exception;\n }\n return;\n }\n\n if (exception) {\n throw exception;\n }\n },\n\n reset: function reset() {\n this.timeouts = {};\n },\n\n Date: (function () {\n var NativeDate = Date;\n\n function ClockDate(year, month, date, hour, minute, second, ms) {\n // Defensive and verbose to avoid potential harm in passing\n // explicit undefined when user does not pass argument\n switch (arguments.length) {\n case 0:\n return new NativeDate(ClockDate.clock.now);\n case 1:\n return new NativeDate(year);\n case 2:\n return new NativeDate(year, month);\n case 3:\n return new NativeDate(year, month, date);\n case 4:\n return new NativeDate(year, month, date, hour);\n case 5:\n return new NativeDate(year, month, date, hour, minute);\n case 6:\n return new NativeDate(year, month, date, hour, minute, second);\n default:\n return new NativeDate(year, month, date, hour, minute, second, ms);\n }\n }\n\n return mirrorDateProperties(ClockDate, NativeDate);\n }())\n };\n\n function mirrorDateProperties(target, source) {\n if (source.now) {\n target.now = function now() {\n return target.clock.now;\n };\n } else {\n delete target.now;\n }\n\n if (source.toSource) {\n target.toSource = function toSource() {\n return source.toSource();\n };\n } else {\n delete target.toSource;\n }\n\n target.toString = function toString() {\n return source.toString();\n };\n\n target.prototype = source.prototype;\n target.parse = source.parse;\n target.UTC = source.UTC;\n target.prototype.toUTCString = source.prototype.toUTCString;\n return target;\n }\n\n var methods = [\"Date\", \"setTimeout\", \"setInterval\",\n \"clearTimeout\", \"clearInterval\"];\n\n function restore() {\n var method;\n\n for (var i = 0, l = this.methods.length; i < l; i++) {\n method = this.methods[i];\n if (global[method].hadOwnProperty) {\n global[method] = this[\"_\" + method];\n } else {\n delete global[method];\n }\n }\n\n // Prevent multiple executions which will completely remove these props\n this.methods = [];\n }\n\n function stubGlobal(method, clock) {\n clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);\n clock[\"_\" + method] = global[method];\n\n if (method == \"Date\") {\n var date = mirrorDateProperties(clock[method], global[method]);\n global[method] = date;\n } else {\n global[method] = function () {\n return clock[method].apply(clock, arguments);\n };\n\n for (var prop in clock[method]) {\n if (clock[method].hasOwnProperty(prop)) {\n global[method][prop] = clock[method][prop];\n }\n }\n }\n\n global[method].clock = clock;\n }\n\n sinon.useFakeTimers = function useFakeTimers(now) {\n var clock = sinon.clock.create(now);\n clock.restore = restore;\n clock.methods = Array.prototype.slice.call(arguments,\n typeof now == \"number\" ? 1 : 0);\n\n if (clock.methods.length === 0) {\n clock.methods = methods;\n }\n\n for (var i = 0, l = clock.methods.length; i < l; i++) {\n stubGlobal(clock.methods[i], clock);\n }\n\n return clock;\n };\n}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\nsinon.timers = {\n setTimeout: setTimeout,\n clearTimeout: clearTimeout,\n setInterval: setInterval,\n clearInterval: clearInterval,\n Date: Date\n};\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Minimal Event interface implementation\n *\n * Original implementation by Sven Fuchs: https://gist.github.com/995028\n * Modifications and tests by Christian Johansen.\n *\n * @author Sven Fuchs (svenfuchs@artweb-design.de)\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n this.sinon = {};\n}\n\n(function () {\n var push = [].push;\n\n sinon.Event = function Event(type, bubbles, cancelable, target) {\n this.initEvent(type, bubbles, cancelable, target);\n };\n\n sinon.Event.prototype = {\n initEvent: function(type, bubbles, cancelable, target) {\n this.type = type;\n this.bubbles = bubbles;\n this.cancelable = cancelable;\n this.target = target;\n },\n\n stopPropagation: function () {},\n\n preventDefault: function () {\n this.defaultPrevented = true;\n }\n };\n\n sinon.EventTarget = {\n addEventListener: function addEventListener(event, listener, useCapture) {\n this.eventListeners = this.eventListeners || {};\n this.eventListeners[event] = this.eventListeners[event] || [];\n push.call(this.eventListeners[event], listener);\n },\n\n removeEventListener: function removeEventListener(event, listener, useCapture) {\n var listeners = this.eventListeners && this.eventListeners[event] || [];\n\n for (var i = 0, l = listeners.length; i < l; ++i) {\n if (listeners[i] == listener) {\n return listeners.splice(i, 1);\n }\n }\n },\n\n dispatchEvent: function dispatchEvent(event) {\n var type = event.type;\n var listeners = this.eventListeners && this.eventListeners[type] || [];\n\n for (var i = 0; i < listeners.length; i++) {\n if (typeof listeners[i] == \"function\") {\n listeners[i].call(this, event);\n } else {\n listeners[i].handleEvent(event);\n }\n }\n\n return !!event.defaultPrevented;\n }\n };\n}());\n\n/**\n * @depend ../../sinon.js\n * @depend event.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Fake XMLHttpRequest object\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n this.sinon = {};\n}\nsinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };\n\n// wrapper for global\n(function(global) {\n var xhr = sinon.xhr;\n xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n xhr.GlobalActiveXObject = global.ActiveXObject;\n xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != \"undefined\";\n xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != \"undefined\";\n xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX\n ? function() { return new xhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n\n /*jsl:ignore*/\n var unsafeHeaders = {\n \"Accept-Charset\": true,\n \"Accept-Encoding\": true,\n \"Connection\": true,\n \"Content-Length\": true,\n \"Cookie\": true,\n \"Cookie2\": true,\n \"Content-Transfer-Encoding\": true,\n \"Date\": true,\n \"Expect\": true,\n \"Host\": true,\n \"Keep-Alive\": true,\n \"Referer\": true,\n \"TE\": true,\n \"Trailer\": true,\n \"Transfer-Encoding\": true,\n \"Upgrade\": true,\n \"User-Agent\": true,\n \"Via\": true\n };\n /*jsl:end*/\n\n function FakeXMLHttpRequest() {\n this.readyState = FakeXMLHttpRequest.UNSENT;\n this.requestHeaders = {};\n this.requestBody = null;\n this.status = 0;\n this.statusText = \"\";\n\n var xhr = this;\n var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\n function addEventListener(eventName) {\n xhr.addEventListener(eventName, function (event) {\n var listener = xhr[\"on\" + eventName];\n\n if (listener && typeof listener == \"function\") {\n listener(event);\n }\n });\n }\n\n for (var i = events.length - 1; i >= 0; i--) {\n addEventListener(events[i]);\n }\n\n if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n FakeXMLHttpRequest.onCreate(this);\n }\n }\n\n function verifyState(xhr) {\n if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n throw new Error(\"INVALID_STATE_ERR\");\n }\n\n if (xhr.sendFlag) {\n throw new Error(\"INVALID_STATE_ERR\");\n }\n }\n\n // filtering to enable a white-list version of Sinon FakeXhr,\n // where whitelisted requests are passed through to real XHR\n function each(collection, callback) {\n if (!collection) return;\n for (var i = 0, l = collection.length; i < l; i += 1) {\n callback(collection[i]);\n }\n }\n function some(collection, callback) {\n for (var index = 0; index < collection.length; index++) {\n if(callback(collection[index]) === true) return true;\n };\n return false;\n }\n // largest arity in XHR is 5 - XHR#open\n var apply = function(obj,method,args) {\n switch(args.length) {\n case 0: return obj[method]();\n case 1: return obj[method](args[0]);\n case 2: return obj[method](args[0],args[1]);\n case 3: return obj[method](args[0],args[1],args[2]);\n case 4: return obj[method](args[0],args[1],args[2],args[3]);\n case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);\n };\n };\n\n FakeXMLHttpRequest.filters = [];\n FakeXMLHttpRequest.addFilter = function(fn) {\n this.filters.push(fn)\n };\n var IE6Re = /MSIE 6/;\n FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {\n var xhr = new sinon.xhr.workingXHR();\n each([\"open\",\"setRequestHeader\",\"send\",\"abort\",\"getResponseHeader\",\n \"getAllResponseHeaders\",\"addEventListener\",\"overrideMimeType\",\"removeEventListener\"],\n function(method) {\n fakeXhr[method] = function() {\n return apply(xhr,method,arguments);\n };\n });\n\n var copyAttrs = function(args) {\n each(args, function(attr) {\n try {\n fakeXhr[attr] = xhr[attr]\n } catch(e) {\n if(!IE6Re.test(navigator.userAgent)) throw e;\n }\n });\n };\n\n var stateChange = function() {\n fakeXhr.readyState = xhr.readyState;\n if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n copyAttrs([\"status\",\"statusText\"]);\n }\n if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n copyAttrs([\"responseText\"]);\n }\n if(xhr.readyState === FakeXMLHttpRequest.DONE) {\n copyAttrs([\"responseXML\"]);\n }\n if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);\n };\n if(xhr.addEventListener) {\n for(var event in fakeXhr.eventListeners) {\n if(fakeXhr.eventListeners.hasOwnProperty(event)) {\n each(fakeXhr.eventListeners[event],function(handler) {\n xhr.addEventListener(event, handler);\n });\n }\n }\n xhr.addEventListener(\"readystatechange\",stateChange);\n } else {\n xhr.onreadystatechange = stateChange;\n }\n apply(xhr,\"open\",xhrArgs);\n };\n FakeXMLHttpRequest.useFilters = false;\n\n function verifyRequestSent(xhr) {\n if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n throw new Error(\"Request done\");\n }\n }\n\n function verifyHeadersReceived(xhr) {\n if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n throw new Error(\"No headers received\");\n }\n }\n\n function verifyResponseBodyType(body) {\n if (typeof body != \"string\") {\n var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n body + \", which is not a string.\");\n error.name = \"InvalidBodyException\";\n throw error;\n }\n }\n\n sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n async: true,\n\n open: function open(method, url, async, username, password) {\n this.method = method;\n this.url = url;\n this.async = typeof async == \"boolean\" ? async : true;\n this.username = username;\n this.password = password;\n this.responseText = null;\n this.responseXML = null;\n this.requestHeaders = {};\n this.sendFlag = false;\n if(sinon.FakeXMLHttpRequest.useFilters === true) {\n var xhrArgs = arguments;\n var defake = some(FakeXMLHttpRequest.filters,function(filter) {\n return filter.apply(this,xhrArgs)\n });\n if (defake) {\n return sinon.FakeXMLHttpRequest.defake(this,arguments);\n }\n }\n this.readyStateChange(FakeXMLHttpRequest.OPENED);\n },\n\n readyStateChange: function readyStateChange(state) {\n this.readyState = state;\n\n if (typeof this.onreadystatechange == \"function\") {\n try {\n this.onreadystatechange();\n } catch (e) {\n sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n }\n }\n\n this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\n switch (this.readyState) {\n case FakeXMLHttpRequest.DONE:\n this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n break;\n }\n },\n\n setRequestHeader: function setRequestHeader(header, value) {\n verifyState(this);\n\n if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n }\n\n if (this.requestHeaders[header]) {\n this.requestHeaders[header] += \",\" + value;\n } else {\n this.requestHeaders[header] = value;\n }\n },\n\n // Helps testing\n setResponseHeaders: function setResponseHeaders(headers) {\n this.responseHeaders = {};\n\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n this.responseHeaders[header] = headers[header];\n }\n }\n\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n } else {\n this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n }\n },\n\n // Currently treats ALL data as a DOMString (i.e. no Document)\n send: function send(data) {\n verifyState(this);\n\n if (!/^(get|head)$/i.test(this.method)) {\n if (this.requestHeaders[\"Content-Type\"]) {\n var value = this.requestHeaders[\"Content-Type\"].split(\";\");\n this.requestHeaders[\"Content-Type\"] = value[0] + \";charset=utf-8\";\n } else {\n this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n }\n\n this.requestBody = data;\n }\n\n this.errorFlag = false;\n this.sendFlag = this.async;\n this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n if (typeof this.onSend == \"function\") {\n this.onSend(this);\n }\n\n this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n },\n\n abort: function abort() {\n this.aborted = true;\n this.responseText = null;\n this.errorFlag = true;\n this.requestHeaders = {};\n\n if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);\n this.sendFlag = false;\n }\n\n this.readyState = sinon.FakeXMLHttpRequest.UNSENT;\n\n this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n if (typeof this.onerror === \"function\") {\n this.onerror();\n }\n },\n\n getResponseHeader: function getResponseHeader(header) {\n if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n return null;\n }\n\n if (/^Set-Cookie2?$/i.test(header)) {\n return null;\n }\n\n header = header.toLowerCase();\n\n for (var h in this.responseHeaders) {\n if (h.toLowerCase() == header) {\n return this.responseHeaders[h];\n }\n }\n\n return null;\n },\n\n getAllResponseHeaders: function getAllResponseHeaders() {\n if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n return \"\";\n }\n\n var headers = \"\";\n\n for (var header in this.responseHeaders) {\n if (this.responseHeaders.hasOwnProperty(header) &&\n !/^Set-Cookie2?$/i.test(header)) {\n headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n }\n }\n\n return headers;\n },\n\n setResponseBody: function setResponseBody(body) {\n verifyRequestSent(this);\n verifyHeadersReceived(this);\n verifyResponseBodyType(body);\n\n var chunkSize = this.chunkSize || 10;\n var index = 0;\n this.responseText = \"\";\n\n do {\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.LOADING);\n }\n\n this.responseText += body.substring(index, index + chunkSize);\n index += chunkSize;\n } while (index < body.length);\n\n var type = this.getResponseHeader(\"Content-Type\");\n\n if (this.responseText &&\n (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n try {\n this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n } catch (e) {\n // Unable to parse XML - no biggie\n }\n }\n\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.DONE);\n } else {\n this.readyState = FakeXMLHttpRequest.DONE;\n }\n },\n\n respond: function respond(status, headers, body) {\n this.setResponseHeaders(headers || {});\n this.status = typeof status == \"number\" ? status : 200;\n this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n this.setResponseBody(body || \"\");\n if (typeof this.onload === \"function\"){\n this.onload();\n }\n\n }\n });\n\n sinon.extend(FakeXMLHttpRequest, {\n UNSENT: 0,\n OPENED: 1,\n HEADERS_RECEIVED: 2,\n LOADING: 3,\n DONE: 4\n });\n\n // Borrowed from JSpec\n FakeXMLHttpRequest.parseXML = function parseXML(text) {\n var xmlDoc;\n\n if (typeof DOMParser != \"undefined\") {\n var parser = new DOMParser();\n xmlDoc = parser.parseFromString(text, \"text/xml\");\n } else {\n xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(text);\n }\n\n return xmlDoc;\n };\n\n FakeXMLHttpRequest.statusCodes = {\n 100: \"Continue\",\n 101: \"Switching Protocols\",\n 200: \"OK\",\n 201: \"Created\",\n 202: \"Accepted\",\n 203: \"Non-Authoritative Information\",\n 204: \"No Content\",\n 205: \"Reset Content\",\n 206: \"Partial Content\",\n 300: \"Multiple Choice\",\n 301: \"Moved Permanently\",\n 302: \"Found\",\n 303: \"See Other\",\n 304: \"Not Modified\",\n 305: \"Use Proxy\",\n 307: \"Temporary Redirect\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 407: \"Proxy Authentication Required\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Request Entity Too Large\",\n 414: \"Request-URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Requested Range Not Satisfiable\",\n 417: \"Expectation Failed\",\n 422: \"Unprocessable Entity\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\"\n };\n\n sinon.useFakeXMLHttpRequest = function () {\n sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n if (xhr.supportsXHR) {\n global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;\n }\n\n if (xhr.supportsActiveX) {\n global.ActiveXObject = xhr.GlobalActiveXObject;\n }\n\n delete sinon.FakeXMLHttpRequest.restore;\n\n if (keepOnCreate !== true) {\n delete sinon.FakeXMLHttpRequest.onCreate;\n }\n };\n if (xhr.supportsXHR) {\n global.XMLHttpRequest = sinon.FakeXMLHttpRequest;\n }\n\n if (xhr.supportsActiveX) {\n global.ActiveXObject = function ActiveXObject(objId) {\n if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n return new sinon.FakeXMLHttpRequest();\n }\n\n return new xhr.GlobalActiveXObject(objId);\n };\n }\n\n return sinon.FakeXMLHttpRequest;\n };\n\n sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n})(this);\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/**\n * @depend fake_xml_http_request.js\n */\n/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/\n/*global module, require, window*/\n/**\n * The Sinon \"server\" mimics a web server that receives requests from\n * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n * both synchronously and asynchronously. To respond synchronuously, canned\n * answers have to be provided upfront.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n var sinon = {};\n}\n\nsinon.fakeServer = (function () {\n var push = [].push;\n function F() {}\n\n function create(proto) {\n F.prototype = proto;\n return new F();\n }\n\n function responseArray(handler) {\n var response = handler;\n\n if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n response = [200, {}, handler];\n }\n\n if (typeof response[2] != \"string\") {\n throw new TypeError(\"Fake server response body should be string, but was \" +\n typeof response[2]);\n }\n\n return response;\n }\n\n var wloc = typeof window !== \"undefined\" ? window.location : {};\n var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n function matchOne(response, reqMethod, reqUrl) {\n var rmeth = response.method;\n var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n var url = response.url;\n var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\n return matchMethod && matchUrl;\n }\n\n function match(response, request) {\n var requestMethod = this.getHTTPMethod(request);\n var requestUrl = request.url;\n\n if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n requestUrl = requestUrl.replace(rCurrLoc, \"\");\n }\n\n if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n if (typeof response.response == \"function\") {\n var ru = response.url;\n var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1));\n return response.response.apply(response, args);\n }\n\n return true;\n }\n\n return false;\n }\n\n function log(response, request) {\n var str;\n\n str = \"Request:\\n\" + sinon.format(request) + \"\\n\\n\";\n str += \"Response:\\n\" + sinon.format(response) + \"\\n\\n\";\n\n sinon.log(str);\n }\n\n return {\n create: function () {\n var server = create(this);\n this.xhr = sinon.useFakeXMLHttpRequest();\n server.requests = [];\n\n this.xhr.onCreate = function (xhrObj) {\n server.addRequest(xhrObj);\n };\n\n return server;\n },\n\n addRequest: function addRequest(xhrObj) {\n var server = this;\n push.call(this.requests, xhrObj);\n\n xhrObj.onSend = function () {\n server.handleRequest(this);\n };\n\n if (this.autoRespond && !this.responding) {\n setTimeout(function () {\n server.responding = false;\n server.respond();\n }, this.autoRespondAfter || 10);\n\n this.responding = true;\n }\n },\n\n getHTTPMethod: function getHTTPMethod(request) {\n if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n return !!matches ? matches[1] : request.method;\n }\n\n return request.method;\n },\n\n handleRequest: function handleRequest(xhr) {\n if (xhr.async) {\n if (!this.queue) {\n this.queue = [];\n }\n\n push.call(this.queue, xhr);\n } else {\n this.processRequest(xhr);\n }\n },\n\n respondWith: function respondWith(method, url, body) {\n if (arguments.length == 1 && typeof method != \"function\") {\n this.response = responseArray(method);\n return;\n }\n\n if (!this.responses) { this.responses = []; }\n\n if (arguments.length == 1) {\n body = method;\n url = method = null;\n }\n\n if (arguments.length == 2) {\n body = url;\n url = method;\n method = null;\n }\n\n push.call(this.responses, {\n method: method,\n url: url,\n response: typeof body == \"function\" ? body : responseArray(body)\n });\n },\n\n respond: function respond() {\n if (arguments.length > 0) this.respondWith.apply(this, arguments);\n var queue = this.queue || [];\n var request;\n\n while(request = queue.shift()) {\n this.processRequest(request);\n }\n },\n\n processRequest: function processRequest(request) {\n try {\n if (request.aborted) {\n return;\n }\n\n var response = this.response || [404, {}, \"\"];\n\n if (this.responses) {\n for (var i = 0, l = this.responses.length; i < l; i++) {\n if (match.call(this, this.responses[i], request)) {\n response = this.responses[i].response;\n break;\n }\n }\n }\n\n if (request.readyState != 4) {\n log(response, request);\n\n request.respond(response[0], response[1], response[2]);\n }\n } catch (e) {\n sinon.logError(\"Fake server request processing\", e);\n }\n },\n\n restore: function restore() {\n return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n }\n };\n}());\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/**\n * @depend fake_server.js\n * @depend fake_timers.js\n */\n/*jslint browser: true, eqeqeq: false, onevar: false*/\n/*global sinon*/\n/**\n * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n * it polls the object for completion with setInterval. Dispite the direct\n * motivation, there is nothing jQuery-specific in this file, so it can be used\n * in any environment where the ajax implementation depends on setInterval or\n * setTimeout.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function () {\n function Server() {}\n Server.prototype = sinon.fakeServer;\n\n sinon.fakeServerWithClock = new Server();\n\n sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n if (xhr.async) {\n if (typeof setTimeout.clock == \"object\") {\n this.clock = setTimeout.clock;\n } else {\n this.clock = sinon.useFakeTimers();\n this.resetClock = true;\n }\n\n if (!this.longestTimeout) {\n var clockSetTimeout = this.clock.setTimeout;\n var clockSetInterval = this.clock.setInterval;\n var server = this;\n\n this.clock.setTimeout = function (fn, timeout) {\n server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n return clockSetTimeout.apply(this, arguments);\n };\n\n this.clock.setInterval = function (fn, timeout) {\n server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n return clockSetInterval.apply(this, arguments);\n };\n }\n }\n\n return sinon.fakeServer.addRequest.call(this, xhr);\n };\n\n sinon.fakeServerWithClock.respond = function respond() {\n var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\n if (this.clock) {\n this.clock.tick(this.longestTimeout || 0);\n this.longestTimeout = 0;\n\n if (this.resetClock) {\n this.clock.restore();\n this.resetClock = false;\n }\n }\n\n return returnVal;\n };\n\n sinon.fakeServerWithClock.restore = function restore() {\n if (this.clock) {\n this.clock.restore();\n }\n\n return sinon.fakeServer.restore.apply(this, arguments);\n };\n}());\n\n/**\n * @depend ../sinon.js\n * @depend collection.js\n * @depend util/fake_timers.js\n * @depend util/fake_server_with_clock.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global require, module*/\n/**\n * Manages fake collections as well as fake utilities such as Sinon's\n * timers and fake XHR implementation in one convenient object.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n var sinon = require(\"../sinon\");\n sinon.extend(sinon, require(\"./util/fake_timers\"));\n}\n\n(function () {\n var push = [].push;\n\n function exposeValue(sandbox, config, key, value) {\n if (!value) {\n return;\n }\n\n if (config.injectInto) {\n config.injectInto[key] = value;\n } else {\n push.call(sandbox.args, value);\n }\n }\n\n function prepareSandboxFromConfig(config) {\n var sandbox = sinon.create(sinon.sandbox);\n\n if (config.useFakeServer) {\n if (typeof config.useFakeServer == \"object\") {\n sandbox.serverPrototype = config.useFakeServer;\n }\n\n sandbox.useFakeServer();\n }\n\n if (config.useFakeTimers) {\n if (typeof config.useFakeTimers == \"object\") {\n sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n } else {\n sandbox.useFakeTimers();\n }\n }\n\n return sandbox;\n }\n\n sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n useFakeTimers: function useFakeTimers() {\n this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\n return this.add(this.clock);\n },\n\n serverPrototype: sinon.fakeServer,\n\n useFakeServer: function useFakeServer() {\n var proto = this.serverPrototype || sinon.fakeServer;\n\n if (!proto || !proto.create) {\n return null;\n }\n\n this.server = proto.create();\n return this.add(this.server);\n },\n\n inject: function (obj) {\n sinon.collection.inject.call(this, obj);\n\n if (this.clock) {\n obj.clock = this.clock;\n }\n\n if (this.server) {\n obj.server = this.server;\n obj.requests = this.server.requests;\n }\n\n return obj;\n },\n\n create: function (config) {\n if (!config) {\n return sinon.create(sinon.sandbox);\n }\n\n var sandbox = prepareSandboxFromConfig(config);\n sandbox.args = sandbox.args || [];\n var prop, value, exposed = sandbox.inject({});\n\n if (config.properties) {\n for (var i = 0, l = config.properties.length; i < l; i++) {\n prop = config.properties[i];\n value = exposed[prop] || prop == \"sandbox\" && sandbox;\n exposeValue(sandbox, config, prop, value);\n }\n } else {\n exposeValue(sandbox, config, \"sandbox\", value);\n }\n\n return sandbox;\n }\n });\n\n sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\n if (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon.sandbox;\n }\n}());\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n * @depend sandbox.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Test function, sandboxes fakes\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function test(callback) {\n var type = typeof callback;\n\n if (type != \"function\") {\n throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n }\n\n return function () {\n var config = sinon.getConfig(sinon.config);\n config.injectInto = config.injectIntoThis && this || config.injectInto;\n var sandbox = sinon.sandbox.create(config);\n var exception, result;\n var args = Array.prototype.slice.call(arguments).concat(sandbox.args);\n\n try {\n result = callback.apply(this, args);\n } catch (e) {\n exception = e;\n }\n\n if (typeof exception !== \"undefined\") {\n sandbox.restore();\n throw exception;\n }\n else {\n sandbox.verifyAndRestore();\n }\n\n return result;\n };\n }\n\n test.config = {\n injectIntoThis: true,\n injectInto: null,\n properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n useFakeTimers: true,\n useFakeServer: true\n };\n\n if (commonJSModule) {\n module.exports = test;\n } else {\n sinon.test = test;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend test.js\n */\n/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/\n/*global module, require, sinon*/\n/**\n * Test case, sandboxes all test functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon || !Object.prototype.hasOwnProperty) {\n return;\n }\n\n function createTest(property, setUp, tearDown) {\n return function () {\n if (setUp) {\n setUp.apply(this, arguments);\n }\n\n var exception, result;\n\n try {\n result = property.apply(this, arguments);\n } catch (e) {\n exception = e;\n }\n\n if (tearDown) {\n tearDown.apply(this, arguments);\n }\n\n if (exception) {\n throw exception;\n }\n\n return result;\n };\n }\n\n function testCase(tests, prefix) {\n /*jsl:ignore*/\n if (!tests || typeof tests != \"object\") {\n throw new TypeError(\"sinon.testCase needs an object with test functions\");\n }\n /*jsl:end*/\n\n prefix = prefix || \"test\";\n var rPrefix = new RegExp(\"^\" + prefix);\n var methods = {}, testName, property, method;\n var setUp = tests.setUp;\n var tearDown = tests.tearDown;\n\n for (testName in tests) {\n if (tests.hasOwnProperty(testName)) {\n property = tests[testName];\n\n if (/^(setUp|tearDown)$/.test(testName)) {\n continue;\n }\n\n if (typeof property == \"function\" && rPrefix.test(testName)) {\n method = property;\n\n if (setUp || tearDown) {\n method = createTest(property, setUp, tearDown);\n }\n\n methods[testName] = sinon.test(method);\n } else {\n methods[testName] = tests[testName];\n }\n }\n }\n\n return methods;\n }\n\n if (commonJSModule) {\n module.exports = testCase;\n } else {\n sinon.testCase = testCase;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Assertions matching the test spy retrieval interface.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon, global) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var slice = Array.prototype.slice;\n var assert;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function verifyIsStub() {\n var method;\n\n for (var i = 0, l = arguments.length; i < l; ++i) {\n method = arguments[i];\n\n if (!method) {\n assert.fail(\"fake is not a spy\");\n }\n\n if (typeof method != \"function\") {\n assert.fail(method + \" is not a function\");\n }\n\n if (typeof method.getCall != \"function\") {\n assert.fail(method + \" is not stubbed\");\n }\n }\n }\n\n function failAssertion(object, msg) {\n object = object || global;\n var failMethod = object.fail || assert.fail;\n failMethod.call(object, msg);\n }\n\n function mirrorPropAsAssertion(name, method, message) {\n if (arguments.length == 2) {\n message = method;\n method = name;\n }\n\n assert[name] = function (fake) {\n verifyIsStub(fake);\n\n var args = slice.call(arguments, 1);\n var failed = false;\n\n if (typeof method == \"function\") {\n failed = !method(fake);\n } else {\n failed = typeof fake[method] == \"function\" ?\n !fake[method].apply(fake, args) : !fake[method];\n }\n\n if (failed) {\n failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n } else {\n assert.pass(name);\n }\n };\n }\n\n function exposedName(prefix, prop) {\n return !prefix || /^fail/.test(prop) ? prop :\n prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n };\n\n assert = {\n failException: \"AssertError\",\n\n fail: function fail(message) {\n var error = new Error(message);\n error.name = this.failException || assert.failException;\n\n throw error;\n },\n\n pass: function pass(assertion) {},\n\n callOrder: function assertCallOrder() {\n verifyIsStub.apply(null, arguments);\n var expected = \"\", actual = \"\";\n\n if (!sinon.calledInOrder(arguments)) {\n try {\n expected = [].join.call(arguments, \", \");\n var calls = slice.call(arguments);\n var i = calls.length;\n while (i) {\n if (!calls[--i].called) {\n calls.splice(i, 1);\n }\n }\n actual = sinon.orderByFirstCall(calls).join(\", \");\n } catch (e) {\n // If this fails, we'll just fall back to the blank string\n }\n\n failAssertion(this, \"expected \" + expected + \" to be \" +\n \"called in order but were called as \" + actual);\n } else {\n assert.pass(\"callOrder\");\n }\n },\n\n callCount: function assertCallCount(method, count) {\n verifyIsStub(method);\n\n if (method.callCount != count) {\n var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n \" but was called %c%C\";\n failAssertion(this, method.printf(msg));\n } else {\n assert.pass(\"callCount\");\n }\n },\n\n expose: function expose(target, options) {\n if (!target) {\n throw new TypeError(\"target is null or undefined\");\n }\n\n var o = options || {};\n var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\n for (var method in this) {\n if (method != \"export\" && (includeFail || !/^(fail)/.test(method))) {\n target[exposedName(prefix, method)] = this[method];\n }\n }\n\n return target;\n }\n };\n\n mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n \"expected %n to not have been called but was called %c%C\");\n mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\n if (commonJSModule) {\n module.exports = assert;\n } else {\n sinon.assert = assert;\n }\n}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\nreturn sinon;}.call(typeof window != 'undefined' && window || {}));\n//@ sourceURL=indefinido-observable/components/cjohansen-sinon/sinon.js" +"/**\n\ + * Sinon.JS 1.7.3, 2013/06/20\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n\ + *\n\ + * (The BSD License)\n\ + * \n\ + * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no\n\ + * All rights reserved.\n\ + * \n\ + * Redistribution and use in source and binary forms, with or without modification,\n\ + * are permitted provided that the following conditions are met:\n\ + * \n\ + * * Redistributions of source code must retain the above copyright notice,\n\ + * this list of conditions and the following disclaimer.\n\ + * * Redistributions in binary form must reproduce the above copyright notice,\n\ + * this list of conditions and the following disclaimer in the documentation\n\ + * and/or other materials provided with the distribution.\n\ + * * Neither the name of Christian Johansen nor the names of his contributors\n\ + * may be used to endorse or promote products derived from this software\n\ + * without specific prior written permission.\n\ + * \n\ + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\ + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\ + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\ + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n\ + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n\ + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n\ + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n\ + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n\ + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n\ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ + */\n\ +\n\ +this.sinon = (function () {\n\ +var buster = (function (setTimeout, B) {\n\ + var isNode = typeof require == \"function\" && typeof module == \"object\";\n\ + var div = typeof document != \"undefined\" && document.createElement(\"div\");\n\ + var F = function () {};\n\ +\n\ + var buster = {\n\ + bind: function bind(obj, methOrProp) {\n\ + var method = typeof methOrProp == \"string\" ? obj[methOrProp] : methOrProp;\n\ + var args = Array.prototype.slice.call(arguments, 2);\n\ + return function () {\n\ + var allArgs = args.concat(Array.prototype.slice.call(arguments));\n\ + return method.apply(obj, allArgs);\n\ + };\n\ + },\n\ +\n\ + partial: function partial(fn) {\n\ + var args = [].slice.call(arguments, 1);\n\ + return function () {\n\ + return fn.apply(this, args.concat([].slice.call(arguments)));\n\ + };\n\ + },\n\ +\n\ + create: function create(object) {\n\ + F.prototype = object;\n\ + return new F();\n\ + },\n\ +\n\ + extend: function extend(target) {\n\ + if (!target) { return; }\n\ + for (var i = 1, l = arguments.length, prop; i < l; ++i) {\n\ + for (prop in arguments[i]) {\n\ + target[prop] = arguments[i][prop];\n\ + }\n\ + }\n\ + return target;\n\ + },\n\ +\n\ + nextTick: function nextTick(callback) {\n\ + if (typeof process != \"undefined\" && process.nextTick) {\n\ + return process.nextTick(callback);\n\ + }\n\ + setTimeout(callback, 0);\n\ + },\n\ +\n\ + functionName: function functionName(func) {\n\ + if (!func) return \"\";\n\ + if (func.displayName) return func.displayName;\n\ + if (func.name) return func.name;\n\ + var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n\ + return matches && matches[1] || \"\";\n\ + },\n\ +\n\ + isNode: function isNode(obj) {\n\ + if (!div) return false;\n\ + try {\n\ + obj.appendChild(div);\n\ + obj.removeChild(div);\n\ + } catch (e) {\n\ + return false;\n\ + }\n\ + return true;\n\ + },\n\ +\n\ + isElement: function isElement(obj) {\n\ + return obj && obj.nodeType === 1 && buster.isNode(obj);\n\ + },\n\ +\n\ + isArray: function isArray(arr) {\n\ + return Object.prototype.toString.call(arr) == \"[object Array]\";\n\ + },\n\ +\n\ + flatten: function flatten(arr) {\n\ + var result = [], arr = arr || [];\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);\n\ + }\n\ + return result;\n\ + },\n\ +\n\ + each: function each(arr, callback) {\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + callback(arr[i]);\n\ + }\n\ + },\n\ +\n\ + map: function map(arr, callback) {\n\ + var results = [];\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + results.push(callback(arr[i]));\n\ + }\n\ + return results;\n\ + },\n\ +\n\ + parallel: function parallel(fns, callback) {\n\ + function cb(err, res) {\n\ + if (typeof callback == \"function\") {\n\ + callback(err, res);\n\ + callback = null;\n\ + }\n\ + }\n\ + if (fns.length == 0) { return cb(null, []); }\n\ + var remaining = fns.length, results = [];\n\ + function makeDone(num) {\n\ + return function done(err, result) {\n\ + if (err) { return cb(err); }\n\ + results[num] = result;\n\ + if (--remaining == 0) { cb(null, results); }\n\ + };\n\ + }\n\ + for (var i = 0, l = fns.length; i < l; ++i) {\n\ + fns[i](makeDone(i));\n\ + }\n\ + },\n\ +\n\ + series: function series(fns, callback) {\n\ + function cb(err, res) {\n\ + if (typeof callback == \"function\") {\n\ + callback(err, res);\n\ + }\n\ + }\n\ + var remaining = fns.slice();\n\ + var results = [];\n\ + function callNext() {\n\ + if (remaining.length == 0) return cb(null, results);\n\ + var promise = remaining.shift()(next);\n\ + if (promise && typeof promise.then == \"function\") {\n\ + promise.then(buster.partial(next, null), next);\n\ + }\n\ + }\n\ + function next(err, result) {\n\ + if (err) return cb(err);\n\ + results.push(result);\n\ + callNext();\n\ + }\n\ + callNext();\n\ + },\n\ +\n\ + countdown: function countdown(num, done) {\n\ + return function () {\n\ + if (--num == 0) done();\n\ + };\n\ + }\n\ + };\n\ +\n\ + if (typeof process === \"object\" &&\n\ + typeof require === \"function\" && typeof module === \"object\") {\n\ + var crypto = require(\"crypto\");\n\ + var path = require(\"path\");\n\ +\n\ + buster.tmpFile = function (fileName) {\n\ + var hashed = crypto.createHash(\"sha1\");\n\ + hashed.update(fileName);\n\ + var tmpfileName = hashed.digest(\"hex\");\n\ +\n\ + if (process.platform == \"win32\") {\n\ + return path.join(process.env[\"TEMP\"], tmpfileName);\n\ + } else {\n\ + return path.join(\"/tmp\", tmpfileName);\n\ + }\n\ + };\n\ + }\n\ +\n\ + if (Array.prototype.some) {\n\ + buster.some = function (arr, fn, thisp) {\n\ + return arr.some(fn, thisp);\n\ + };\n\ + } else {\n\ + // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n\ + buster.some = function (arr, fun, thisp) {\n\ + if (arr == null) { throw new TypeError(); }\n\ + arr = Object(arr);\n\ + var len = arr.length >>> 0;\n\ + if (typeof fun !== \"function\") { throw new TypeError(); }\n\ +\n\ + for (var i = 0; i < len; i++) {\n\ + if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {\n\ + return true;\n\ + }\n\ + }\n\ +\n\ + return false;\n\ + };\n\ + }\n\ +\n\ + if (Array.prototype.filter) {\n\ + buster.filter = function (arr, fn, thisp) {\n\ + return arr.filter(fn, thisp);\n\ + };\n\ + } else {\n\ + // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter\n\ + buster.filter = function (fn, thisp) {\n\ + if (this == null) { throw new TypeError(); }\n\ +\n\ + var t = Object(this);\n\ + var len = t.length >>> 0;\n\ + if (typeof fn != \"function\") { throw new TypeError(); }\n\ +\n\ + var res = [];\n\ + for (var i = 0; i < len; i++) {\n\ + if (i in t) {\n\ + var val = t[i]; // in case fun mutates this\n\ + if (fn.call(thisp, val, i, t)) { res.push(val); }\n\ + }\n\ + }\n\ +\n\ + return res;\n\ + };\n\ + }\n\ +\n\ + if (isNode) {\n\ + module.exports = buster;\n\ + buster.eventEmitter = require(\"./buster-event-emitter\");\n\ + Object.defineProperty(buster, \"defineVersionGetter\", {\n\ + get: function () {\n\ + return require(\"./define-version-getter\");\n\ + }\n\ + });\n\ + }\n\ +\n\ + return buster.extend(B || {}, buster);\n\ +}(setTimeout, buster));\n\ +if (typeof buster === \"undefined\") {\n\ + var buster = {};\n\ +}\n\ +\n\ +if (typeof module === \"object\" && typeof require === \"function\") {\n\ + buster = require(\"buster-core\");\n\ +}\n\ +\n\ +buster.format = buster.format || {};\n\ +buster.format.excludeConstructors = [\"Object\", /^.$/];\n\ +buster.format.quoteStrings = true;\n\ +\n\ +buster.format.ascii = (function () {\n\ + \n\ + var hasOwn = Object.prototype.hasOwnProperty;\n\ +\n\ + var specialObjects = [];\n\ + if (typeof global != \"undefined\") {\n\ + specialObjects.push({ obj: global, value: \"[object global]\" });\n\ + }\n\ + if (typeof document != \"undefined\") {\n\ + specialObjects.push({ obj: document, value: \"[object HTMLDocument]\" });\n\ + }\n\ + if (typeof window != \"undefined\") {\n\ + specialObjects.push({ obj: window, value: \"[object Window]\" });\n\ + }\n\ +\n\ + function keys(object) {\n\ + var k = Object.keys && Object.keys(object) || [];\n\ +\n\ + if (k.length == 0) {\n\ + for (var prop in object) {\n\ + if (hasOwn.call(object, prop)) {\n\ + k.push(prop);\n\ + }\n\ + }\n\ + }\n\ +\n\ + return k.sort();\n\ + }\n\ +\n\ + function isCircular(object, objects) {\n\ + if (typeof object != \"object\") {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = objects.length; i < l; ++i) {\n\ + if (objects[i] === object) {\n\ + return true;\n\ + }\n\ + }\n\ +\n\ + return false;\n\ + }\n\ +\n\ + function ascii(object, processed, indent) {\n\ + if (typeof object == \"string\") {\n\ + var quote = typeof this.quoteStrings != \"boolean\" || this.quoteStrings;\n\ + return processed || quote ? '\"' + object + '\"' : object;\n\ + }\n\ +\n\ + if (typeof object == \"function\" && !(object instanceof RegExp)) {\n\ + return ascii.func(object);\n\ + }\n\ +\n\ + processed = processed || [];\n\ +\n\ + if (isCircular(object, processed)) {\n\ + return \"[Circular]\";\n\ + }\n\ +\n\ + if (Object.prototype.toString.call(object) == \"[object Array]\") {\n\ + return ascii.array.call(this, object, processed);\n\ + }\n\ +\n\ + if (!object) {\n\ + return \"\" + object;\n\ + }\n\ +\n\ + if (buster.isElement(object)) {\n\ + return ascii.element(object);\n\ + }\n\ +\n\ + if (typeof object.toString == \"function\" &&\n\ + object.toString !== Object.prototype.toString) {\n\ + return object.toString();\n\ + }\n\ +\n\ + for (var i = 0, l = specialObjects.length; i < l; i++) {\n\ + if (object === specialObjects[i].obj) {\n\ + return specialObjects[i].value;\n\ + }\n\ + }\n\ +\n\ + return ascii.object.call(this, object, processed, indent);\n\ + }\n\ +\n\ + ascii.func = function (func) {\n\ + return \"function \" + buster.functionName(func) + \"() {}\";\n\ + };\n\ +\n\ + ascii.array = function (array, processed) {\n\ + processed = processed || [];\n\ + processed.push(array);\n\ + var pieces = [];\n\ +\n\ + for (var i = 0, l = array.length; i < l; ++i) {\n\ + pieces.push(ascii.call(this, array[i], processed));\n\ + }\n\ +\n\ + return \"[\" + pieces.join(\", \") + \"]\";\n\ + };\n\ +\n\ + ascii.object = function (object, processed, indent) {\n\ + processed = processed || [];\n\ + processed.push(object);\n\ + indent = indent || 0;\n\ + var pieces = [], properties = keys(object), prop, str, obj;\n\ + var is = \"\";\n\ + var length = 3;\n\ +\n\ + for (var i = 0, l = indent; i < l; ++i) {\n\ + is += \" \";\n\ + }\n\ +\n\ + for (i = 0, l = properties.length; i < l; ++i) {\n\ + prop = properties[i];\n\ + obj = object[prop];\n\ +\n\ + if (isCircular(obj, processed)) {\n\ + str = \"[Circular]\";\n\ + } else {\n\ + str = ascii.call(this, obj, processed, indent + 2);\n\ + }\n\ +\n\ + str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n\ + length += str.length;\n\ + pieces.push(str);\n\ + }\n\ +\n\ + var cons = ascii.constructorName.call(this, object);\n\ + var prefix = cons ? \"[\" + cons + \"] \" : \"\"\n\ +\n\ + return (length + indent) > 80 ?\n\ + prefix + \"{\\n\ + \" + is + pieces.join(\",\\n\ + \" + is) + \"\\n\ +\" + is + \"}\" :\n\ + prefix + \"{ \" + pieces.join(\", \") + \" }\";\n\ + };\n\ +\n\ + ascii.element = function (element) {\n\ + var tagName = element.tagName.toLowerCase();\n\ + var attrs = element.attributes, attribute, pairs = [], attrName;\n\ +\n\ + for (var i = 0, l = attrs.length; i < l; ++i) {\n\ + attribute = attrs.item(i);\n\ + attrName = attribute.nodeName.toLowerCase().replace(\"html:\", \"\");\n\ +\n\ + if (attrName == \"contenteditable\" && attribute.nodeValue == \"inherit\") {\n\ + continue;\n\ + }\n\ +\n\ + if (!!attribute.nodeValue) {\n\ + pairs.push(attrName + \"=\\\"\" + attribute.nodeValue + \"\\\"\");\n\ + }\n\ + }\n\ +\n\ + var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n\ + var content = element.innerHTML;\n\ +\n\ + if (content.length > 20) {\n\ + content = content.substr(0, 20) + \"[...]\";\n\ + }\n\ +\n\ + var res = formatted + pairs.join(\" \") + \">\" + content + \"</\" + tagName + \">\";\n\ +\n\ + return res.replace(/ contentEditable=\"inherit\"/, \"\");\n\ + };\n\ +\n\ + ascii.constructorName = function (object) {\n\ + var name = buster.functionName(object && object.constructor);\n\ + var excludes = this.excludeConstructors || buster.format.excludeConstructors || [];\n\ +\n\ + for (var i = 0, l = excludes.length; i < l; ++i) {\n\ + if (typeof excludes[i] == \"string\" && excludes[i] == name) {\n\ + return \"\";\n\ + } else if (excludes[i].test && excludes[i].test(name)) {\n\ + return \"\";\n\ + }\n\ + }\n\ +\n\ + return name;\n\ + };\n\ +\n\ + return ascii;\n\ +}());\n\ +\n\ +if (typeof module != \"undefined\") {\n\ + module.exports = buster.format;\n\ +}\n\ +/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/\n\ +/*global module, require, __dirname, document*/\n\ +/**\n\ + * Sinon core utilities. For internal use only.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +var sinon = (function (buster) {\n\ + var div = typeof document != \"undefined\" && document.createElement(\"div\");\n\ + var hasOwn = Object.prototype.hasOwnProperty;\n\ +\n\ + function isDOMNode(obj) {\n\ + var success = false;\n\ +\n\ + try {\n\ + obj.appendChild(div);\n\ + success = div.parentNode == obj;\n\ + } catch (e) {\n\ + return false;\n\ + } finally {\n\ + try {\n\ + obj.removeChild(div);\n\ + } catch (e) {\n\ + // Remove failed, not much we can do about that\n\ + }\n\ + }\n\ +\n\ + return success;\n\ + }\n\ +\n\ + function isElement(obj) {\n\ + return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n\ + }\n\ +\n\ + function isFunction(obj) {\n\ + return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n\ + }\n\ +\n\ + function mirrorProperties(target, source) {\n\ + for (var prop in source) {\n\ + if (!hasOwn.call(target, prop)) {\n\ + target[prop] = source[prop];\n\ + }\n\ + }\n\ + }\n\ +\n\ + function isRestorable (obj) {\n\ + return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n\ + }\n\ +\n\ + var sinon = {\n\ + wrapMethod: function wrapMethod(object, property, method) {\n\ + if (!object) {\n\ + throw new TypeError(\"Should wrap property of object\");\n\ + }\n\ +\n\ + if (typeof method != \"function\") {\n\ + throw new TypeError(\"Method wrapper should be function\");\n\ + }\n\ +\n\ + var wrappedMethod = object[property];\n\ +\n\ + if (!isFunction(wrappedMethod)) {\n\ + throw new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n\ + property + \" as function\");\n\ + }\n\ +\n\ + if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n\ + throw new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n\ + }\n\ +\n\ + if (wrappedMethod.calledBefore) {\n\ + var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n\ + throw new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n\ + }\n\ +\n\ + // IE 8 does not support hasOwnProperty on the window object.\n\ + var owned = hasOwn.call(object, property);\n\ + object[property] = method;\n\ + method.displayName = property;\n\ +\n\ + method.restore = function () {\n\ + // For prototype properties try to reset by delete first.\n\ + // If this fails (ex: localStorage on mobile safari) then force a reset\n\ + // via direct assignment.\n\ + if (!owned) {\n\ + delete object[property];\n\ + }\n\ + if (object[property] === method) {\n\ + object[property] = wrappedMethod;\n\ + }\n\ + };\n\ +\n\ + method.restore.sinon = true;\n\ + mirrorProperties(method, wrappedMethod);\n\ +\n\ + return method;\n\ + },\n\ +\n\ + extend: function extend(target) {\n\ + for (var i = 1, l = arguments.length; i < l; i += 1) {\n\ + for (var prop in arguments[i]) {\n\ + if (arguments[i].hasOwnProperty(prop)) {\n\ + target[prop] = arguments[i][prop];\n\ + }\n\ +\n\ + // DONT ENUM bug, only care about toString\n\ + if (arguments[i].hasOwnProperty(\"toString\") &&\n\ + arguments[i].toString != target.toString) {\n\ + target.toString = arguments[i].toString;\n\ + }\n\ + }\n\ + }\n\ +\n\ + return target;\n\ + },\n\ +\n\ + create: function create(proto) {\n\ + var F = function () {};\n\ + F.prototype = proto;\n\ + return new F();\n\ + },\n\ +\n\ + deepEqual: function deepEqual(a, b) {\n\ + if (sinon.match && sinon.match.isMatcher(a)) {\n\ + return a.test(b);\n\ + }\n\ + if (typeof a != \"object\" || typeof b != \"object\") {\n\ + return a === b;\n\ + }\n\ +\n\ + if (isElement(a) || isElement(b)) {\n\ + return a === b;\n\ + }\n\ +\n\ + if (a === b) {\n\ + return true;\n\ + }\n\ +\n\ + if ((a === null && b !== null) || (a !== null && b === null)) {\n\ + return false;\n\ + }\n\ +\n\ + var aString = Object.prototype.toString.call(a);\n\ + if (aString != Object.prototype.toString.call(b)) {\n\ + return false;\n\ + }\n\ +\n\ + if (aString == \"[object Array]\") {\n\ + if (a.length !== b.length) {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = a.length; i < l; i += 1) {\n\ + if (!deepEqual(a[i], b[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + }\n\ +\n\ + if (aString == \"[object Date]\") {\n\ + return a.valueOf() === b.valueOf();\n\ + }\n\ +\n\ + var prop, aLength = 0, bLength = 0;\n\ +\n\ + for (prop in a) {\n\ + aLength += 1;\n\ +\n\ + if (!deepEqual(a[prop], b[prop])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + for (prop in b) {\n\ + bLength += 1;\n\ + }\n\ +\n\ + return aLength == bLength;\n\ + },\n\ +\n\ + functionName: function functionName(func) {\n\ + var name = func.displayName || func.name;\n\ +\n\ + // Use function decomposition as a last resort to get function\n\ + // name. Does not rely on function decomposition to work - if it\n\ + // doesn't debugging will be slightly less informative\n\ + // (i.e. toString will say 'spy' rather than 'myFunc').\n\ + if (!name) {\n\ + var matches = func.toString().match(/function ([^\\s\\(]+)/);\n\ + name = matches && matches[1];\n\ + }\n\ +\n\ + return name;\n\ + },\n\ +\n\ + functionToString: function toString() {\n\ + if (this.getCall && this.callCount) {\n\ + var thisValue, prop, i = this.callCount;\n\ +\n\ + while (i--) {\n\ + thisValue = this.getCall(i).thisValue;\n\ +\n\ + for (prop in thisValue) {\n\ + if (thisValue[prop] === this) {\n\ + return prop;\n\ + }\n\ + }\n\ + }\n\ + }\n\ +\n\ + return this.displayName || \"sinon fake\";\n\ + },\n\ +\n\ + getConfig: function (custom) {\n\ + var config = {};\n\ + custom = custom || {};\n\ + var defaults = sinon.defaultConfig;\n\ +\n\ + for (var prop in defaults) {\n\ + if (defaults.hasOwnProperty(prop)) {\n\ + config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n\ + }\n\ + }\n\ +\n\ + return config;\n\ + },\n\ +\n\ + format: function (val) {\n\ + return \"\" + val;\n\ + },\n\ +\n\ + defaultConfig: {\n\ + injectIntoThis: true,\n\ + injectInto: null,\n\ + properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n\ + useFakeTimers: true,\n\ + useFakeServer: true\n\ + },\n\ +\n\ + timesInWords: function timesInWords(count) {\n\ + return count == 1 && \"once\" ||\n\ + count == 2 && \"twice\" ||\n\ + count == 3 && \"thrice\" ||\n\ + (count || 0) + \" times\";\n\ + },\n\ +\n\ + calledInOrder: function (spies) {\n\ + for (var i = 1, l = spies.length; i < l; i++) {\n\ + if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + orderByFirstCall: function (spies) {\n\ + return spies.sort(function (a, b) {\n\ + // uuid, won't ever be equal\n\ + var aCall = a.getCall(0);\n\ + var bCall = b.getCall(0);\n\ + var aId = aCall && aCall.callId || -1;\n\ + var bId = bCall && bCall.callId || -1;\n\ +\n\ + return aId < bId ? -1 : 1;\n\ + });\n\ + },\n\ +\n\ + log: function () {},\n\ +\n\ + logError: function (label, err) {\n\ + var msg = label + \" threw exception: \"\n\ + sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n\ + if (err.stack) { sinon.log(err.stack); }\n\ +\n\ + setTimeout(function () {\n\ + err.message = msg + err.message;\n\ + throw err;\n\ + }, 0);\n\ + },\n\ +\n\ + typeOf: function (value) {\n\ + if (value === null) {\n\ + return \"null\";\n\ + }\n\ + else if (value === undefined) {\n\ + return \"undefined\";\n\ + }\n\ + var string = Object.prototype.toString.call(value);\n\ + return string.substring(8, string.length - 1).toLowerCase();\n\ + },\n\ +\n\ + createStubInstance: function (constructor) {\n\ + if (typeof constructor !== \"function\") {\n\ + throw new TypeError(\"The constructor should be a function.\");\n\ + }\n\ + return sinon.stub(sinon.create(constructor.prototype));\n\ + },\n\ +\n\ + restore: function (object) {\n\ + if (object !== null && typeof object === \"object\") {\n\ + for (var prop in object) {\n\ + if (isRestorable(object[prop])) {\n\ + object[prop].restore();\n\ + }\n\ + }\n\ + }\n\ + else if (isRestorable(object)) {\n\ + object.restore();\n\ + }\n\ + }\n\ + };\n\ +\n\ + var isNode = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (isNode) {\n\ + try {\n\ + buster = { format: require(\"buster-format\") };\n\ + } catch (e) {}\n\ + module.exports = sinon;\n\ + module.exports.spy = require(\"./sinon/spy\");\n\ + module.exports.stub = require(\"./sinon/stub\");\n\ + module.exports.mock = require(\"./sinon/mock\");\n\ + module.exports.collection = require(\"./sinon/collection\");\n\ + module.exports.assert = require(\"./sinon/assert\");\n\ + module.exports.sandbox = require(\"./sinon/sandbox\");\n\ + module.exports.test = require(\"./sinon/test\");\n\ + module.exports.testCase = require(\"./sinon/test_case\");\n\ + module.exports.assert = require(\"./sinon/assert\");\n\ + module.exports.match = require(\"./sinon/match\");\n\ + }\n\ +\n\ + if (buster) {\n\ + var formatter = sinon.create(buster.format);\n\ + formatter.quoteStrings = false;\n\ + sinon.format = function () {\n\ + return formatter.ascii.apply(formatter, arguments);\n\ + };\n\ + } else if (isNode) {\n\ + try {\n\ + var util = require(\"util\");\n\ + sinon.format = function (value) {\n\ + return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n\ + };\n\ + } catch (e) {\n\ + /* Node, but no util module - would be very old, but better safe than\n\ + sorry */\n\ + }\n\ + }\n\ +\n\ + return sinon;\n\ +}(typeof buster == \"object\" && buster));\n\ +\n\ +/* @depend ../sinon.js */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Match functions\n\ + *\n\ + * @author Maximilian Antoni (mail@maxantoni.de)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2012 Maximilian Antoni\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function assertType(value, type, name) {\n\ + var actual = sinon.typeOf(value);\n\ + if (actual !== type) {\n\ + throw new TypeError(\"Expected type of \" + name + \" to be \" +\n\ + type + \", but was \" + actual);\n\ + }\n\ + }\n\ +\n\ + var matcher = {\n\ + toString: function () {\n\ + return this.message;\n\ + }\n\ + };\n\ +\n\ + function isMatcher(object) {\n\ + return matcher.isPrototypeOf(object);\n\ + }\n\ +\n\ + function matchObject(expectation, actual) {\n\ + if (actual === null || actual === undefined) {\n\ + return false;\n\ + }\n\ + for (var key in expectation) {\n\ + if (expectation.hasOwnProperty(key)) {\n\ + var exp = expectation[key];\n\ + var act = actual[key];\n\ + if (match.isMatcher(exp)) {\n\ + if (!exp.test(act)) {\n\ + return false;\n\ + }\n\ + } else if (sinon.typeOf(exp) === \"object\") {\n\ + if (!matchObject(exp, act)) {\n\ + return false;\n\ + }\n\ + } else if (!sinon.deepEqual(exp, act)) {\n\ + return false;\n\ + }\n\ + }\n\ + }\n\ + return true;\n\ + }\n\ +\n\ + matcher.or = function (m2) {\n\ + if (!isMatcher(m2)) {\n\ + throw new TypeError(\"Matcher expected\");\n\ + }\n\ + var m1 = this;\n\ + var or = sinon.create(matcher);\n\ + or.test = function (actual) {\n\ + return m1.test(actual) || m2.test(actual);\n\ + };\n\ + or.message = m1.message + \".or(\" + m2.message + \")\";\n\ + return or;\n\ + };\n\ +\n\ + matcher.and = function (m2) {\n\ + if (!isMatcher(m2)) {\n\ + throw new TypeError(\"Matcher expected\");\n\ + }\n\ + var m1 = this;\n\ + var and = sinon.create(matcher);\n\ + and.test = function (actual) {\n\ + return m1.test(actual) && m2.test(actual);\n\ + };\n\ + and.message = m1.message + \".and(\" + m2.message + \")\";\n\ + return and;\n\ + };\n\ +\n\ + var match = function (expectation, message) {\n\ + var m = sinon.create(matcher);\n\ + var type = sinon.typeOf(expectation);\n\ + switch (type) {\n\ + case \"object\":\n\ + if (typeof expectation.test === \"function\") {\n\ + m.test = function (actual) {\n\ + return expectation.test(actual) === true;\n\ + };\n\ + m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n\ + return m;\n\ + }\n\ + var str = [];\n\ + for (var key in expectation) {\n\ + if (expectation.hasOwnProperty(key)) {\n\ + str.push(key + \": \" + expectation[key]);\n\ + }\n\ + }\n\ + m.test = function (actual) {\n\ + return matchObject(expectation, actual);\n\ + };\n\ + m.message = \"match(\" + str.join(\", \") + \")\";\n\ + break;\n\ + case \"number\":\n\ + m.test = function (actual) {\n\ + return expectation == actual;\n\ + };\n\ + break;\n\ + case \"string\":\n\ + m.test = function (actual) {\n\ + if (typeof actual !== \"string\") {\n\ + return false;\n\ + }\n\ + return actual.indexOf(expectation) !== -1;\n\ + };\n\ + m.message = \"match(\\\"\" + expectation + \"\\\")\";\n\ + break;\n\ + case \"regexp\":\n\ + m.test = function (actual) {\n\ + if (typeof actual !== \"string\") {\n\ + return false;\n\ + }\n\ + return expectation.test(actual);\n\ + };\n\ + break;\n\ + case \"function\":\n\ + m.test = expectation;\n\ + if (message) {\n\ + m.message = message;\n\ + } else {\n\ + m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n\ + }\n\ + break;\n\ + default:\n\ + m.test = function (actual) {\n\ + return sinon.deepEqual(expectation, actual);\n\ + };\n\ + }\n\ + if (!m.message) {\n\ + m.message = \"match(\" + expectation + \")\";\n\ + }\n\ + return m;\n\ + };\n\ +\n\ + match.isMatcher = isMatcher;\n\ +\n\ + match.any = match(function () {\n\ + return true;\n\ + }, \"any\");\n\ +\n\ + match.defined = match(function (actual) {\n\ + return actual !== null && actual !== undefined;\n\ + }, \"defined\");\n\ +\n\ + match.truthy = match(function (actual) {\n\ + return !!actual;\n\ + }, \"truthy\");\n\ +\n\ + match.falsy = match(function (actual) {\n\ + return !actual;\n\ + }, \"falsy\");\n\ +\n\ + match.same = function (expectation) {\n\ + return match(function (actual) {\n\ + return expectation === actual;\n\ + }, \"same(\" + expectation + \")\");\n\ + };\n\ +\n\ + match.typeOf = function (type) {\n\ + assertType(type, \"string\", \"type\");\n\ + return match(function (actual) {\n\ + return sinon.typeOf(actual) === type;\n\ + }, \"typeOf(\\\"\" + type + \"\\\")\");\n\ + };\n\ +\n\ + match.instanceOf = function (type) {\n\ + assertType(type, \"function\", \"type\");\n\ + return match(function (actual) {\n\ + return actual instanceof type;\n\ + }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n\ + };\n\ +\n\ + function createPropertyMatcher(propertyTest, messagePrefix) {\n\ + return function (property, value) {\n\ + assertType(property, \"string\", \"property\");\n\ + var onlyProperty = arguments.length === 1;\n\ + var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n\ + if (!onlyProperty) {\n\ + message += \", \" + value;\n\ + }\n\ + message += \")\";\n\ + return match(function (actual) {\n\ + if (actual === undefined || actual === null ||\n\ + !propertyTest(actual, property)) {\n\ + return false;\n\ + }\n\ + return onlyProperty || sinon.deepEqual(value, actual[property]);\n\ + }, message);\n\ + };\n\ + }\n\ +\n\ + match.has = createPropertyMatcher(function (actual, property) {\n\ + if (typeof actual === \"object\") {\n\ + return property in actual;\n\ + }\n\ + return actual[property] !== undefined;\n\ + }, \"has\");\n\ +\n\ + match.hasOwn = createPropertyMatcher(function (actual, property) {\n\ + return actual.hasOwnProperty(property);\n\ + }, \"hasOwn\");\n\ +\n\ + match.bool = match.typeOf(\"boolean\");\n\ + match.number = match.typeOf(\"number\");\n\ + match.string = match.typeOf(\"string\");\n\ + match.object = match.typeOf(\"object\");\n\ + match.func = match.typeOf(\"function\");\n\ + match.array = match.typeOf(\"array\");\n\ + match.regexp = match.typeOf(\"regexp\");\n\ + match.date = match.typeOf(\"date\");\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = match;\n\ + } else {\n\ + sinon.match = match;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend match.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Spy calls\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @author Maximilian Antoni (mail@maxantoni.de)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + * Copyright (c) 2013 Maximilian Antoni\n\ + */\n\ +\n\ +var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ +if (!this.sinon && commonJSModule) {\n\ + var sinon = require(\"../sinon\");\n\ +}\n\ +\n\ +(function (sinon) {\n\ + function throwYieldError(proxy, text, args) {\n\ + var msg = sinon.functionName(proxy) + text;\n\ + if (args.length) {\n\ + msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n\ + }\n\ + throw new Error(msg);\n\ + }\n\ +\n\ + var slice = Array.prototype.slice;\n\ +\n\ + var callProto = {\n\ + calledOn: function calledOn(thisValue) {\n\ + if (sinon.match && sinon.match.isMatcher(thisValue)) {\n\ + return thisValue.test(this.thisValue);\n\ + }\n\ + return this.thisValue === thisValue;\n\ + },\n\ +\n\ + calledWith: function calledWith() {\n\ + for (var i = 0, l = arguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(arguments[i], this.args[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + calledWithMatch: function calledWithMatch() {\n\ + for (var i = 0, l = arguments.length; i < l; i += 1) {\n\ + var actual = this.args[i];\n\ + var expectation = arguments[i];\n\ + if (!sinon.match || !sinon.match(expectation).test(actual)) {\n\ + return false;\n\ + }\n\ + }\n\ + return true;\n\ + },\n\ +\n\ + calledWithExactly: function calledWithExactly() {\n\ + return arguments.length == this.args.length &&\n\ + this.calledWith.apply(this, arguments);\n\ + },\n\ +\n\ + notCalledWith: function notCalledWith() {\n\ + return !this.calledWith.apply(this, arguments);\n\ + },\n\ +\n\ + notCalledWithMatch: function notCalledWithMatch() {\n\ + return !this.calledWithMatch.apply(this, arguments);\n\ + },\n\ +\n\ + returned: function returned(value) {\n\ + return sinon.deepEqual(value, this.returnValue);\n\ + },\n\ +\n\ + threw: function threw(error) {\n\ + if (typeof error === \"undefined\" || !this.exception) {\n\ + return !!this.exception;\n\ + }\n\ +\n\ + return this.exception === error || this.exception.name === error;\n\ + },\n\ +\n\ + calledWithNew: function calledWithNew(thisValue) {\n\ + return this.thisValue instanceof this.proxy;\n\ + },\n\ +\n\ + calledBefore: function (other) {\n\ + return this.callId < other.callId;\n\ + },\n\ +\n\ + calledAfter: function (other) {\n\ + return this.callId > other.callId;\n\ + },\n\ +\n\ + callArg: function (pos) {\n\ + this.args[pos]();\n\ + },\n\ +\n\ + callArgOn: function (pos, thisValue) {\n\ + this.args[pos].apply(thisValue);\n\ + },\n\ +\n\ + callArgWith: function (pos) {\n\ + this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n\ + },\n\ +\n\ + callArgOnWith: function (pos, thisValue) {\n\ + var args = slice.call(arguments, 2);\n\ + this.args[pos].apply(thisValue, args);\n\ + },\n\ +\n\ + \"yield\": function () {\n\ + this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n\ + },\n\ +\n\ + yieldOn: function (thisValue) {\n\ + var args = this.args;\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (typeof args[i] === \"function\") {\n\ + args[i].apply(thisValue, slice.call(arguments, 1));\n\ + return;\n\ + }\n\ + }\n\ + throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n\ + },\n\ +\n\ + yieldTo: function (prop) {\n\ + this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n\ + },\n\ +\n\ + yieldToOn: function (prop, thisValue) {\n\ + var args = this.args;\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (args[i] && typeof args[i][prop] === \"function\") {\n\ + args[i][prop].apply(thisValue, slice.call(arguments, 2));\n\ + return;\n\ + }\n\ + }\n\ + throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n\ + \"' since no callback was passed.\", args);\n\ + },\n\ +\n\ + toString: function () {\n\ + var callStr = this.proxy.toString() + \"(\";\n\ + var args = [];\n\ +\n\ + for (var i = 0, l = this.args.length; i < l; ++i) {\n\ + args.push(sinon.format(this.args[i]));\n\ + }\n\ +\n\ + callStr = callStr + args.join(\", \") + \")\";\n\ +\n\ + if (typeof this.returnValue != \"undefined\") {\n\ + callStr += \" => \" + sinon.format(this.returnValue);\n\ + }\n\ +\n\ + if (this.exception) {\n\ + callStr += \" !\" + this.exception.name;\n\ +\n\ + if (this.exception.message) {\n\ + callStr += \"(\" + this.exception.message + \")\";\n\ + }\n\ + }\n\ +\n\ + return callStr;\n\ + }\n\ + };\n\ +\n\ + callProto.invokeCallback = callProto.yield;\n\ +\n\ + function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n\ + if (typeof id !== \"number\") {\n\ + throw new TypeError(\"Call id is not a number\");\n\ + }\n\ + var proxyCall = sinon.create(callProto);\n\ + proxyCall.proxy = spy;\n\ + proxyCall.thisValue = thisValue;\n\ + proxyCall.args = args;\n\ + proxyCall.returnValue = returnValue;\n\ + proxyCall.exception = exception;\n\ + proxyCall.callId = id;\n\ +\n\ + return proxyCall;\n\ + };\n\ + createSpyCall.toString = callProto.toString; // used by mocks\n\ +\n\ + sinon.spyCall = createSpyCall;\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Spy functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = Array.prototype.push;\n\ + var slice = Array.prototype.slice;\n\ + var callId = 0;\n\ +\n\ + function spy(object, property) {\n\ + if (!property && typeof object == \"function\") {\n\ + return spy.create(object);\n\ + }\n\ +\n\ + if (!object && !property) {\n\ + return spy.create(function () { });\n\ + }\n\ +\n\ + var method = object[property];\n\ + return sinon.wrapMethod(object, property, spy.create(method));\n\ + }\n\ +\n\ + function matchingFake(fakes, args, strict) {\n\ + if (!fakes) {\n\ + return;\n\ + }\n\ +\n\ + var alen = args.length;\n\ +\n\ + for (var i = 0, l = fakes.length; i < l; i++) {\n\ + if (fakes[i].matches(args, strict)) {\n\ + return fakes[i];\n\ + }\n\ + }\n\ + }\n\ +\n\ + function incrementCallCount() {\n\ + this.called = true;\n\ + this.callCount += 1;\n\ + this.notCalled = false;\n\ + this.calledOnce = this.callCount == 1;\n\ + this.calledTwice = this.callCount == 2;\n\ + this.calledThrice = this.callCount == 3;\n\ + }\n\ +\n\ + function createCallProperties() {\n\ + this.firstCall = this.getCall(0);\n\ + this.secondCall = this.getCall(1);\n\ + this.thirdCall = this.getCall(2);\n\ + this.lastCall = this.getCall(this.callCount - 1);\n\ + }\n\ +\n\ + var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n\ + function createProxy(func) {\n\ + // Retain the function length:\n\ + var p;\n\ + if (func.length) {\n\ + eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n\ + \") { return p.invoke(func, this, slice.call(arguments)); });\");\n\ + }\n\ + else {\n\ + p = function proxy() {\n\ + return p.invoke(func, this, slice.call(arguments));\n\ + };\n\ + }\n\ + return p;\n\ + }\n\ +\n\ + var uuid = 0;\n\ +\n\ + // Public API\n\ + var spyApi = {\n\ + reset: function () {\n\ + this.called = false;\n\ + this.notCalled = true;\n\ + this.calledOnce = false;\n\ + this.calledTwice = false;\n\ + this.calledThrice = false;\n\ + this.callCount = 0;\n\ + this.firstCall = null;\n\ + this.secondCall = null;\n\ + this.thirdCall = null;\n\ + this.lastCall = null;\n\ + this.args = [];\n\ + this.returnValues = [];\n\ + this.thisValues = [];\n\ + this.exceptions = [];\n\ + this.callIds = [];\n\ + if (this.fakes) {\n\ + for (var i = 0; i < this.fakes.length; i++) {\n\ + this.fakes[i].reset();\n\ + }\n\ + }\n\ + },\n\ +\n\ + create: function create(func) {\n\ + var name;\n\ +\n\ + if (typeof func != \"function\") {\n\ + func = function () { };\n\ + } else {\n\ + name = sinon.functionName(func);\n\ + }\n\ +\n\ + var proxy = createProxy(func);\n\ +\n\ + sinon.extend(proxy, spy);\n\ + delete proxy.create;\n\ + sinon.extend(proxy, func);\n\ +\n\ + proxy.reset();\n\ + proxy.prototype = func.prototype;\n\ + proxy.displayName = name || \"spy\";\n\ + proxy.toString = sinon.functionToString;\n\ + proxy._create = sinon.spy.create;\n\ + proxy.id = \"spy#\" + uuid++;\n\ +\n\ + return proxy;\n\ + },\n\ +\n\ + invoke: function invoke(func, thisValue, args) {\n\ + var matching = matchingFake(this.fakes, args);\n\ + var exception, returnValue;\n\ +\n\ + incrementCallCount.call(this);\n\ + push.call(this.thisValues, thisValue);\n\ + push.call(this.args, args);\n\ + push.call(this.callIds, callId++);\n\ +\n\ + try {\n\ + if (matching) {\n\ + returnValue = matching.invoke(func, thisValue, args);\n\ + } else {\n\ + returnValue = (this.func || func).apply(thisValue, args);\n\ + }\n\ + } catch (e) {\n\ + push.call(this.returnValues, undefined);\n\ + exception = e;\n\ + throw e;\n\ + } finally {\n\ + push.call(this.exceptions, exception);\n\ + }\n\ +\n\ + push.call(this.returnValues, returnValue);\n\ +\n\ + createCallProperties.call(this);\n\ +\n\ + return returnValue;\n\ + },\n\ +\n\ + getCall: function getCall(i) {\n\ + if (i < 0 || i >= this.callCount) {\n\ + return null;\n\ + }\n\ +\n\ + return sinon.spyCall(this, this.thisValues[i], this.args[i],\n\ + this.returnValues[i], this.exceptions[i],\n\ + this.callIds[i]);\n\ + },\n\ +\n\ + calledBefore: function calledBefore(spyFn) {\n\ + if (!this.called) {\n\ + return false;\n\ + }\n\ +\n\ + if (!spyFn.called) {\n\ + return true;\n\ + }\n\ +\n\ + return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n\ + },\n\ +\n\ + calledAfter: function calledAfter(spyFn) {\n\ + if (!this.called || !spyFn.called) {\n\ + return false;\n\ + }\n\ +\n\ + return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n\ + },\n\ +\n\ + withArgs: function () {\n\ + var args = slice.call(arguments);\n\ +\n\ + if (this.fakes) {\n\ + var match = matchingFake(this.fakes, args, true);\n\ +\n\ + if (match) {\n\ + return match;\n\ + }\n\ + } else {\n\ + this.fakes = [];\n\ + }\n\ +\n\ + var original = this;\n\ + var fake = this._create();\n\ + fake.matchingAguments = args;\n\ + push.call(this.fakes, fake);\n\ +\n\ + fake.withArgs = function () {\n\ + return original.withArgs.apply(original, arguments);\n\ + };\n\ +\n\ + for (var i = 0; i < this.args.length; i++) {\n\ + if (fake.matches(this.args[i])) {\n\ + incrementCallCount.call(fake);\n\ + push.call(fake.thisValues, this.thisValues[i]);\n\ + push.call(fake.args, this.args[i]);\n\ + push.call(fake.returnValues, this.returnValues[i]);\n\ + push.call(fake.exceptions, this.exceptions[i]);\n\ + push.call(fake.callIds, this.callIds[i]);\n\ + }\n\ + }\n\ + createCallProperties.call(fake);\n\ +\n\ + return fake;\n\ + },\n\ +\n\ + matches: function (args, strict) {\n\ + var margs = this.matchingAguments;\n\ +\n\ + if (margs.length <= args.length &&\n\ + sinon.deepEqual(margs, args.slice(0, margs.length))) {\n\ + return !strict || margs.length == args.length;\n\ + }\n\ + },\n\ +\n\ + printf: function (format) {\n\ + var spy = this;\n\ + var args = slice.call(arguments, 1);\n\ + var formatter;\n\ +\n\ + return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n\ + formatter = spyApi.formatters[specifyer];\n\ +\n\ + if (typeof formatter == \"function\") {\n\ + return formatter.call(null, spy, args);\n\ + } else if (!isNaN(parseInt(specifyer), 10)) {\n\ + return sinon.format(args[specifyer - 1]);\n\ + }\n\ +\n\ + return \"%\" + specifyer;\n\ + });\n\ + }\n\ + };\n\ +\n\ + function delegateToCalls(method, matchAny, actual, notCalled) {\n\ + spyApi[method] = function () {\n\ + if (!this.called) {\n\ + if (notCalled) {\n\ + return notCalled.apply(this, arguments);\n\ + }\n\ + return false;\n\ + }\n\ +\n\ + var currentCall;\n\ + var matches = 0;\n\ +\n\ + for (var i = 0, l = this.callCount; i < l; i += 1) {\n\ + currentCall = this.getCall(i);\n\ +\n\ + if (currentCall[actual || method].apply(currentCall, arguments)) {\n\ + matches += 1;\n\ +\n\ + if (matchAny) {\n\ + return true;\n\ + }\n\ + }\n\ + }\n\ +\n\ + return matches === this.callCount;\n\ + };\n\ + }\n\ +\n\ + delegateToCalls(\"calledOn\", true);\n\ + delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n\ + delegateToCalls(\"calledWith\", true);\n\ + delegateToCalls(\"calledWithMatch\", true);\n\ + delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n\ + delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n\ + delegateToCalls(\"calledWithExactly\", true);\n\ + delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n\ + delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n\ + function () { return true; });\n\ + delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n\ + function () { return true; });\n\ + delegateToCalls(\"threw\", true);\n\ + delegateToCalls(\"alwaysThrew\", false, \"threw\");\n\ + delegateToCalls(\"returned\", true);\n\ + delegateToCalls(\"alwaysReturned\", false, \"returned\");\n\ + delegateToCalls(\"calledWithNew\", true);\n\ + delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n\ + delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n\ + throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n\ + });\n\ + spyApi.callArgWith = spyApi.callArg;\n\ + delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n\ + throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n\ + });\n\ + spyApi.callArgOnWith = spyApi.callArgOn;\n\ + delegateToCalls(\"yield\", false, \"yield\", function () {\n\ + throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n\ + });\n\ + // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n\ + spyApi.invokeCallback = spyApi.yield;\n\ + delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n\ + throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n\ + });\n\ + delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n\ + throw new Error(this.toString() + \" cannot yield to '\" + property +\n\ + \"' since it was not yet invoked.\");\n\ + });\n\ + delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n\ + throw new Error(this.toString() + \" cannot yield to '\" + property +\n\ + \"' since it was not yet invoked.\");\n\ + });\n\ +\n\ + spyApi.formatters = {\n\ + \"c\": function (spy) {\n\ + return sinon.timesInWords(spy.callCount);\n\ + },\n\ +\n\ + \"n\": function (spy) {\n\ + return spy.toString();\n\ + },\n\ +\n\ + \"C\": function (spy) {\n\ + var calls = [];\n\ +\n\ + for (var i = 0, l = spy.callCount; i < l; ++i) {\n\ + var stringifiedCall = \" \" + spy.getCall(i).toString();\n\ + if (/\\n\ +/.test(calls[i - 1])) {\n\ + stringifiedCall = \"\\n\ +\" + stringifiedCall;\n\ + }\n\ + push.call(calls, stringifiedCall);\n\ + }\n\ +\n\ + return calls.length > 0 ? \"\\n\ +\" + calls.join(\"\\n\ +\") : \"\";\n\ + },\n\ +\n\ + \"t\": function (spy) {\n\ + var objects = [];\n\ +\n\ + for (var i = 0, l = spy.callCount; i < l; ++i) {\n\ + push.call(objects, sinon.format(spy.thisValues[i]));\n\ + }\n\ +\n\ + return objects.join(\", \");\n\ + },\n\ +\n\ + \"*\": function (spy, args) {\n\ + var formatted = [];\n\ +\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + push.call(formatted, sinon.format(args[i]));\n\ + }\n\ +\n\ + return formatted.join(\", \");\n\ + }\n\ + };\n\ +\n\ + sinon.extend(spy, spyApi);\n\ +\n\ + spy.spyCall = sinon.spyCall;\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = spy;\n\ + } else {\n\ + sinon.spy = spy;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend spy.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Stub functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function stub(object, property, func) {\n\ + if (!!func && typeof func != \"function\") {\n\ + throw new TypeError(\"Custom stub should be function\");\n\ + }\n\ +\n\ + var wrapper;\n\ +\n\ + if (func) {\n\ + wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n\ + } else {\n\ + wrapper = stub.create();\n\ + }\n\ +\n\ + if (!object && !property) {\n\ + return sinon.stub.create();\n\ + }\n\ +\n\ + if (!property && !!object && typeof object == \"object\") {\n\ + for (var prop in object) {\n\ + if (typeof object[prop] === \"function\") {\n\ + stub(object, prop);\n\ + }\n\ + }\n\ +\n\ + return object;\n\ + }\n\ +\n\ + return sinon.wrapMethod(object, property, wrapper);\n\ + }\n\ +\n\ + function getChangingValue(stub, property) {\n\ + var index = stub.callCount - 1;\n\ + var values = stub[property];\n\ + var prop = index in values ? values[index] : values[values.length - 1];\n\ + stub[property + \"Last\"] = prop;\n\ +\n\ + return prop;\n\ + }\n\ +\n\ + function getCallback(stub, args) {\n\ + var callArgAt = getChangingValue(stub, \"callArgAts\");\n\ +\n\ + if (callArgAt < 0) {\n\ + var callArgProp = getChangingValue(stub, \"callArgProps\");\n\ +\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (!callArgProp && typeof args[i] == \"function\") {\n\ + return args[i];\n\ + }\n\ +\n\ + if (callArgProp && args[i] &&\n\ + typeof args[i][callArgProp] == \"function\") {\n\ + return args[i][callArgProp];\n\ + }\n\ + }\n\ +\n\ + return null;\n\ + }\n\ +\n\ + return args[callArgAt];\n\ + }\n\ +\n\ + var join = Array.prototype.join;\n\ +\n\ + function getCallbackError(stub, func, args) {\n\ + if (stub.callArgAtsLast < 0) {\n\ + var msg;\n\ +\n\ + if (stub.callArgPropsLast) {\n\ + msg = sinon.functionName(stub) +\n\ + \" expected to yield to '\" + stub.callArgPropsLast +\n\ + \"', but no object with such a property was passed.\"\n\ + } else {\n\ + msg = sinon.functionName(stub) +\n\ + \" expected to yield, but no callback was passed.\"\n\ + }\n\ +\n\ + if (args.length > 0) {\n\ + msg += \" Received [\" + join.call(args, \", \") + \"]\";\n\ + }\n\ +\n\ + return msg;\n\ + }\n\ +\n\ + return \"argument at index \" + stub.callArgAtsLast + \" is not a function: \" + func;\n\ + }\n\ +\n\ + var nextTick = (function () {\n\ + if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n\ + return process.nextTick;\n\ + } else if (typeof setImmediate === \"function\") {\n\ + return setImmediate;\n\ + } else {\n\ + return function (callback) {\n\ + setTimeout(callback, 0);\n\ + };\n\ + }\n\ + })();\n\ +\n\ + function callCallback(stub, args) {\n\ + if (stub.callArgAts.length > 0) {\n\ + var func = getCallback(stub, args);\n\ +\n\ + if (typeof func != \"function\") {\n\ + throw new TypeError(getCallbackError(stub, func, args));\n\ + }\n\ +\n\ + var callbackArguments = getChangingValue(stub, \"callbackArguments\");\n\ + var callbackContext = getChangingValue(stub, \"callbackContexts\");\n\ +\n\ + if (stub.callbackAsync) {\n\ + nextTick(function() {\n\ + func.apply(callbackContext, callbackArguments);\n\ + });\n\ + } else {\n\ + func.apply(callbackContext, callbackArguments);\n\ + }\n\ + }\n\ + }\n\ +\n\ + var uuid = 0;\n\ +\n\ + sinon.extend(stub, (function () {\n\ + var slice = Array.prototype.slice, proto;\n\ +\n\ + function throwsException(error, message) {\n\ + if (typeof error == \"string\") {\n\ + this.exception = new Error(message || \"\");\n\ + this.exception.name = error;\n\ + } else if (!error) {\n\ + this.exception = new Error(\"Error\");\n\ + } else {\n\ + this.exception = error;\n\ + }\n\ +\n\ + return this;\n\ + }\n\ +\n\ + proto = {\n\ + create: function create() {\n\ + var functionStub = function () {\n\ +\n\ + callCallback(functionStub, arguments);\n\ +\n\ + if (functionStub.exception) {\n\ + throw functionStub.exception;\n\ + } else if (typeof functionStub.returnArgAt == 'number') {\n\ + return arguments[functionStub.returnArgAt];\n\ + } else if (functionStub.returnThis) {\n\ + return this;\n\ + }\n\ + return functionStub.returnValue;\n\ + };\n\ +\n\ + functionStub.id = \"stub#\" + uuid++;\n\ + var orig = functionStub;\n\ + functionStub = sinon.spy.create(functionStub);\n\ + functionStub.func = orig;\n\ +\n\ + functionStub.callArgAts = [];\n\ + functionStub.callbackArguments = [];\n\ + functionStub.callbackContexts = [];\n\ + functionStub.callArgProps = [];\n\ +\n\ + sinon.extend(functionStub, stub);\n\ + functionStub._create = sinon.stub.create;\n\ + functionStub.displayName = \"stub\";\n\ + functionStub.toString = sinon.functionToString;\n\ +\n\ + return functionStub;\n\ + },\n\ +\n\ + resetBehavior: function () {\n\ + var i;\n\ +\n\ + this.callArgAts = [];\n\ + this.callbackArguments = [];\n\ + this.callbackContexts = [];\n\ + this.callArgProps = [];\n\ +\n\ + delete this.returnValue;\n\ + delete this.returnArgAt;\n\ + this.returnThis = false;\n\ +\n\ + if (this.fakes) {\n\ + for (i = 0; i < this.fakes.length; i++) {\n\ + this.fakes[i].resetBehavior();\n\ + }\n\ + }\n\ + },\n\ +\n\ + returns: function returns(value) {\n\ + this.returnValue = value;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + returnsArg: function returnsArg(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.returnArgAt = pos;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + returnsThis: function returnsThis() {\n\ + this.returnThis = true;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + \"throws\": throwsException,\n\ + throwsException: throwsException,\n\ +\n\ + callsArg: function callsArg(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push([]);\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgOn: function callsArgOn(pos, context) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push([]);\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgWith: function callsArgWith(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgOnWith: function callsArgWith(pos, context) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push(slice.call(arguments, 2));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yields: function () {\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 0));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsOn: function (context) {\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsTo: function (prop) {\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(prop);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsToOn: function (prop, context) {\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 2));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(prop);\n\ +\n\ + return this;\n\ + }\n\ + };\n\ +\n\ + // create asynchronous versions of callsArg* and yields* methods\n\ + for (var method in proto) {\n\ + // need to avoid creating anotherasync versions of the newly added async methods\n\ + if (proto.hasOwnProperty(method) &&\n\ + method.match(/^(callsArg|yields|thenYields$)/) &&\n\ + !method.match(/Async/)) {\n\ + proto[method + 'Async'] = (function (syncFnName) {\n\ + return function () {\n\ + this.callbackAsync = true;\n\ + return this[syncFnName].apply(this, arguments);\n\ + };\n\ + })(method);\n\ + }\n\ + }\n\ +\n\ + return proto;\n\ +\n\ + }()));\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = stub;\n\ + } else {\n\ + sinon.stub = stub;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, nomen: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Mock functions.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = [].push;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function mock(object) {\n\ + if (!object) {\n\ + return sinon.expectation.create(\"Anonymous mock\");\n\ + }\n\ +\n\ + return mock.create(object);\n\ + }\n\ +\n\ + sinon.mock = mock;\n\ +\n\ + sinon.extend(mock, (function () {\n\ + function each(collection, callback) {\n\ + if (!collection) {\n\ + return;\n\ + }\n\ +\n\ + for (var i = 0, l = collection.length; i < l; i += 1) {\n\ + callback(collection[i]);\n\ + }\n\ + }\n\ +\n\ + return {\n\ + create: function create(object) {\n\ + if (!object) {\n\ + throw new TypeError(\"object is null\");\n\ + }\n\ +\n\ + var mockObject = sinon.extend({}, mock);\n\ + mockObject.object = object;\n\ + delete mockObject.create;\n\ +\n\ + return mockObject;\n\ + },\n\ +\n\ + expects: function expects(method) {\n\ + if (!method) {\n\ + throw new TypeError(\"method is falsy\");\n\ + }\n\ +\n\ + if (!this.expectations) {\n\ + this.expectations = {};\n\ + this.proxies = [];\n\ + }\n\ +\n\ + if (!this.expectations[method]) {\n\ + this.expectations[method] = [];\n\ + var mockObject = this;\n\ +\n\ + sinon.wrapMethod(this.object, method, function () {\n\ + return mockObject.invokeMethod(method, this, arguments);\n\ + });\n\ +\n\ + push.call(this.proxies, method);\n\ + }\n\ +\n\ + var expectation = sinon.expectation.create(method);\n\ + push.call(this.expectations[method], expectation);\n\ +\n\ + return expectation;\n\ + },\n\ +\n\ + restore: function restore() {\n\ + var object = this.object;\n\ +\n\ + each(this.proxies, function (proxy) {\n\ + if (typeof object[proxy].restore == \"function\") {\n\ + object[proxy].restore();\n\ + }\n\ + });\n\ + },\n\ +\n\ + verify: function verify() {\n\ + var expectations = this.expectations || {};\n\ + var messages = [], met = [];\n\ +\n\ + each(this.proxies, function (proxy) {\n\ + each(expectations[proxy], function (expectation) {\n\ + if (!expectation.met()) {\n\ + push.call(messages, expectation.toString());\n\ + } else {\n\ + push.call(met, expectation.toString());\n\ + }\n\ + });\n\ + });\n\ +\n\ + this.restore();\n\ +\n\ + if (messages.length > 0) {\n\ + sinon.expectation.fail(messages.concat(met).join(\"\\n\ +\"));\n\ + } else {\n\ + sinon.expectation.pass(messages.concat(met).join(\"\\n\ +\"));\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + invokeMethod: function invokeMethod(method, thisValue, args) {\n\ + var expectations = this.expectations && this.expectations[method];\n\ + var length = expectations && expectations.length || 0, i;\n\ +\n\ + for (i = 0; i < length; i += 1) {\n\ + if (!expectations[i].met() &&\n\ + expectations[i].allowsCall(thisValue, args)) {\n\ + return expectations[i].apply(thisValue, args);\n\ + }\n\ + }\n\ +\n\ + var messages = [], available, exhausted = 0;\n\ +\n\ + for (i = 0; i < length; i += 1) {\n\ + if (expectations[i].allowsCall(thisValue, args)) {\n\ + available = available || expectations[i];\n\ + } else {\n\ + exhausted += 1;\n\ + }\n\ + push.call(messages, \" \" + expectations[i].toString());\n\ + }\n\ +\n\ + if (exhausted === 0) {\n\ + return available.apply(thisValue, args);\n\ + }\n\ +\n\ + messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n\ + proxy: method,\n\ + args: args\n\ + }));\n\ +\n\ + sinon.expectation.fail(messages.join(\"\\n\ +\"));\n\ + }\n\ + };\n\ + }()));\n\ +\n\ + var times = sinon.timesInWords;\n\ +\n\ + sinon.expectation = (function () {\n\ + var slice = Array.prototype.slice;\n\ + var _invoke = sinon.spy.invoke;\n\ +\n\ + function callCountInWords(callCount) {\n\ + if (callCount == 0) {\n\ + return \"never called\";\n\ + } else {\n\ + return \"called \" + times(callCount);\n\ + }\n\ + }\n\ +\n\ + function expectedCallCountInWords(expectation) {\n\ + var min = expectation.minCalls;\n\ + var max = expectation.maxCalls;\n\ +\n\ + if (typeof min == \"number\" && typeof max == \"number\") {\n\ + var str = times(min);\n\ +\n\ + if (min != max) {\n\ + str = \"at least \" + str + \" and at most \" + times(max);\n\ + }\n\ +\n\ + return str;\n\ + }\n\ +\n\ + if (typeof min == \"number\") {\n\ + return \"at least \" + times(min);\n\ + }\n\ +\n\ + return \"at most \" + times(max);\n\ + }\n\ +\n\ + function receivedMinCalls(expectation) {\n\ + var hasMinLimit = typeof expectation.minCalls == \"number\";\n\ + return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n\ + }\n\ +\n\ + function receivedMaxCalls(expectation) {\n\ + if (typeof expectation.maxCalls != \"number\") {\n\ + return false;\n\ + }\n\ +\n\ + return expectation.callCount == expectation.maxCalls;\n\ + }\n\ +\n\ + return {\n\ + minCalls: 1,\n\ + maxCalls: 1,\n\ +\n\ + create: function create(methodName) {\n\ + var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n\ + delete expectation.create;\n\ + expectation.method = methodName;\n\ +\n\ + return expectation;\n\ + },\n\ +\n\ + invoke: function invoke(func, thisValue, args) {\n\ + this.verifyCallAllowed(thisValue, args);\n\ +\n\ + return _invoke.apply(this, arguments);\n\ + },\n\ +\n\ + atLeast: function atLeast(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not number\");\n\ + }\n\ +\n\ + if (!this.limitsSet) {\n\ + this.maxCalls = null;\n\ + this.limitsSet = true;\n\ + }\n\ +\n\ + this.minCalls = num;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + atMost: function atMost(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not number\");\n\ + }\n\ +\n\ + if (!this.limitsSet) {\n\ + this.minCalls = null;\n\ + this.limitsSet = true;\n\ + }\n\ +\n\ + this.maxCalls = num;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + never: function never() {\n\ + return this.exactly(0);\n\ + },\n\ +\n\ + once: function once() {\n\ + return this.exactly(1);\n\ + },\n\ +\n\ + twice: function twice() {\n\ + return this.exactly(2);\n\ + },\n\ +\n\ + thrice: function thrice() {\n\ + return this.exactly(3);\n\ + },\n\ +\n\ + exactly: function exactly(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not a number\");\n\ + }\n\ +\n\ + this.atLeast(num);\n\ + return this.atMost(num);\n\ + },\n\ +\n\ + met: function met() {\n\ + return !this.failed && receivedMinCalls(this);\n\ + },\n\ +\n\ + verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n\ + if (receivedMaxCalls(this)) {\n\ + this.failed = true;\n\ + sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n\ + }\n\ +\n\ + if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n\ + sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n\ + this.expectedThis);\n\ + }\n\ +\n\ + if (!(\"expectedArguments\" in this)) {\n\ + return;\n\ + }\n\ +\n\ + if (!args) {\n\ + sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n\ + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + if (args.length < this.expectedArguments.length) {\n\ + sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n\ + \"), expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + if (this.expectsExactArgCount &&\n\ + args.length != this.expectedArguments.length) {\n\ + sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n\ + \"), expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n\ + sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n\ + \", expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ + }\n\ + },\n\ +\n\ + allowsCall: function allowsCall(thisValue, args) {\n\ + if (this.met() && receivedMaxCalls(this)) {\n\ + return false;\n\ + }\n\ +\n\ + if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n\ + return false;\n\ + }\n\ +\n\ + if (!(\"expectedArguments\" in this)) {\n\ + return true;\n\ + }\n\ +\n\ + args = args || [];\n\ +\n\ + if (args.length < this.expectedArguments.length) {\n\ + return false;\n\ + }\n\ +\n\ + if (this.expectsExactArgCount &&\n\ + args.length != this.expectedArguments.length) {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + withArgs: function withArgs() {\n\ + this.expectedArguments = slice.call(arguments);\n\ + return this;\n\ + },\n\ +\n\ + withExactArgs: function withExactArgs() {\n\ + this.withArgs.apply(this, arguments);\n\ + this.expectsExactArgCount = true;\n\ + return this;\n\ + },\n\ +\n\ + on: function on(thisValue) {\n\ + this.expectedThis = thisValue;\n\ + return this;\n\ + },\n\ +\n\ + toString: function () {\n\ + var args = (this.expectedArguments || []).slice();\n\ +\n\ + if (!this.expectsExactArgCount) {\n\ + push.call(args, \"[...]\");\n\ + }\n\ +\n\ + var callStr = sinon.spyCall.toString.call({\n\ + proxy: this.method || \"anonymous mock expectation\",\n\ + args: args\n\ + });\n\ +\n\ + var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n\ + expectedCallCountInWords(this);\n\ +\n\ + if (this.met()) {\n\ + return \"Expectation met: \" + message;\n\ + }\n\ +\n\ + return \"Expected \" + message + \" (\" +\n\ + callCountInWords(this.callCount) + \")\";\n\ + },\n\ +\n\ + verify: function verify() {\n\ + if (!this.met()) {\n\ + sinon.expectation.fail(this.toString());\n\ + } else {\n\ + sinon.expectation.pass(this.toString());\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + pass: function(message) {\n\ + sinon.assert.pass(message);\n\ + },\n\ + fail: function (message) {\n\ + var exception = new Error(message);\n\ + exception.name = \"ExpectationError\";\n\ +\n\ + throw exception;\n\ + }\n\ + };\n\ + }());\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = mock;\n\ + } else {\n\ + sinon.mock = mock;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + * @depend mock.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, forin: true*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Collections of stubs, spies and mocks.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = [].push;\n\ + var hasOwnProperty = Object.prototype.hasOwnProperty;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function getFakes(fakeCollection) {\n\ + if (!fakeCollection.fakes) {\n\ + fakeCollection.fakes = [];\n\ + }\n\ +\n\ + return fakeCollection.fakes;\n\ + }\n\ +\n\ + function each(fakeCollection, method) {\n\ + var fakes = getFakes(fakeCollection);\n\ +\n\ + for (var i = 0, l = fakes.length; i < l; i += 1) {\n\ + if (typeof fakes[i][method] == \"function\") {\n\ + fakes[i][method]();\n\ + }\n\ + }\n\ + }\n\ +\n\ + function compact(fakeCollection) {\n\ + var fakes = getFakes(fakeCollection);\n\ + var i = 0;\n\ + while (i < fakes.length) {\n\ + fakes.splice(i, 1);\n\ + }\n\ + }\n\ +\n\ + var collection = {\n\ + verify: function resolve() {\n\ + each(this, \"verify\");\n\ + },\n\ +\n\ + restore: function restore() {\n\ + each(this, \"restore\");\n\ + compact(this);\n\ + },\n\ +\n\ + verifyAndRestore: function verifyAndRestore() {\n\ + var exception;\n\ +\n\ + try {\n\ + this.verify();\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + this.restore();\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + },\n\ +\n\ + add: function add(fake) {\n\ + push.call(getFakes(this), fake);\n\ + return fake;\n\ + },\n\ +\n\ + spy: function spy() {\n\ + return this.add(sinon.spy.apply(sinon, arguments));\n\ + },\n\ +\n\ + stub: function stub(object, property, value) {\n\ + if (property) {\n\ + var original = object[property];\n\ +\n\ + if (typeof original != \"function\") {\n\ + if (!hasOwnProperty.call(object, property)) {\n\ + throw new TypeError(\"Cannot stub non-existent own property \" + property);\n\ + }\n\ +\n\ + object[property] = value;\n\ +\n\ + return this.add({\n\ + restore: function () {\n\ + object[property] = original;\n\ + }\n\ + });\n\ + }\n\ + }\n\ + if (!property && !!object && typeof object == \"object\") {\n\ + var stubbedObj = sinon.stub.apply(sinon, arguments);\n\ +\n\ + for (var prop in stubbedObj) {\n\ + if (typeof stubbedObj[prop] === \"function\") {\n\ + this.add(stubbedObj[prop]);\n\ + }\n\ + }\n\ +\n\ + return stubbedObj;\n\ + }\n\ +\n\ + return this.add(sinon.stub.apply(sinon, arguments));\n\ + },\n\ +\n\ + mock: function mock() {\n\ + return this.add(sinon.mock.apply(sinon, arguments));\n\ + },\n\ +\n\ + inject: function inject(obj) {\n\ + var col = this;\n\ +\n\ + obj.spy = function () {\n\ + return col.spy.apply(col, arguments);\n\ + };\n\ +\n\ + obj.stub = function () {\n\ + return col.stub.apply(col, arguments);\n\ + };\n\ +\n\ + obj.mock = function () {\n\ + return col.mock.apply(col, arguments);\n\ + };\n\ +\n\ + return obj;\n\ + }\n\ + };\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = collection;\n\ + } else {\n\ + sinon.collection = collection;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n\ +/*global module, require, window*/\n\ +/**\n\ + * Fake timer API\n\ + * setTimeout\n\ + * setInterval\n\ + * clearTimeout\n\ + * clearInterval\n\ + * tick\n\ + * reset\n\ + * Date\n\ + *\n\ + * Inspired by jsUnitMockTimeOut from JsUnit\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + var sinon = {};\n\ +}\n\ +\n\ +(function (global) {\n\ + var id = 1;\n\ +\n\ + function addTimer(args, recurring) {\n\ + if (args.length === 0) {\n\ + throw new Error(\"Function requires at least 1 parameter\");\n\ + }\n\ +\n\ + var toId = id++;\n\ + var delay = args[1] || 0;\n\ +\n\ + if (!this.timeouts) {\n\ + this.timeouts = {};\n\ + }\n\ +\n\ + this.timeouts[toId] = {\n\ + id: toId,\n\ + func: args[0],\n\ + callAt: this.now + delay,\n\ + invokeArgs: Array.prototype.slice.call(args, 2)\n\ + };\n\ +\n\ + if (recurring === true) {\n\ + this.timeouts[toId].interval = delay;\n\ + }\n\ +\n\ + return toId;\n\ + }\n\ +\n\ + function parseTime(str) {\n\ + if (!str) {\n\ + return 0;\n\ + }\n\ +\n\ + var strings = str.split(\":\");\n\ + var l = strings.length, i = l;\n\ + var ms = 0, parsed;\n\ +\n\ + if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n\ + throw new Error(\"tick only understands numbers and 'h:m:s'\");\n\ + }\n\ +\n\ + while (i--) {\n\ + parsed = parseInt(strings[i], 10);\n\ +\n\ + if (parsed >= 60) {\n\ + throw new Error(\"Invalid time \" + str);\n\ + }\n\ +\n\ + ms += parsed * Math.pow(60, (l - i - 1));\n\ + }\n\ +\n\ + return ms * 1000;\n\ + }\n\ +\n\ + function createObject(object) {\n\ + var newObject;\n\ +\n\ + if (Object.create) {\n\ + newObject = Object.create(object);\n\ + } else {\n\ + var F = function () {};\n\ + F.prototype = object;\n\ + newObject = new F();\n\ + }\n\ +\n\ + newObject.Date.clock = newObject;\n\ + return newObject;\n\ + }\n\ +\n\ + sinon.clock = {\n\ + now: 0,\n\ +\n\ + create: function create(now) {\n\ + var clock = createObject(this);\n\ +\n\ + if (typeof now == \"number\") {\n\ + clock.now = now;\n\ + }\n\ +\n\ + if (!!now && typeof now == \"object\") {\n\ + throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n\ + }\n\ +\n\ + return clock;\n\ + },\n\ +\n\ + setTimeout: function setTimeout(callback, timeout) {\n\ + return addTimer.call(this, arguments, false);\n\ + },\n\ +\n\ + clearTimeout: function clearTimeout(timerId) {\n\ + if (!this.timeouts) {\n\ + this.timeouts = [];\n\ + }\n\ +\n\ + if (timerId in this.timeouts) {\n\ + delete this.timeouts[timerId];\n\ + }\n\ + },\n\ +\n\ + setInterval: function setInterval(callback, timeout) {\n\ + return addTimer.call(this, arguments, true);\n\ + },\n\ +\n\ + clearInterval: function clearInterval(timerId) {\n\ + this.clearTimeout(timerId);\n\ + },\n\ +\n\ + tick: function tick(ms) {\n\ + ms = typeof ms == \"number\" ? ms : parseTime(ms);\n\ + var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;\n\ + var timer = this.firstTimerInRange(tickFrom, tickTo);\n\ +\n\ + var firstException;\n\ + while (timer && tickFrom <= tickTo) {\n\ + if (this.timeouts[timer.id]) {\n\ + tickFrom = this.now = timer.callAt;\n\ + try {\n\ + this.callTimer(timer);\n\ + } catch (e) {\n\ + firstException = firstException || e;\n\ + }\n\ + }\n\ +\n\ + timer = this.firstTimerInRange(previous, tickTo);\n\ + previous = tickFrom;\n\ + }\n\ +\n\ + this.now = tickTo;\n\ +\n\ + if (firstException) {\n\ + throw firstException;\n\ + }\n\ +\n\ + return this.now;\n\ + },\n\ +\n\ + firstTimerInRange: function (from, to) {\n\ + var timer, smallest, originalTimer;\n\ +\n\ + for (var id in this.timeouts) {\n\ + if (this.timeouts.hasOwnProperty(id)) {\n\ + if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {\n\ + continue;\n\ + }\n\ +\n\ + if (!smallest || this.timeouts[id].callAt < smallest) {\n\ + originalTimer = this.timeouts[id];\n\ + smallest = this.timeouts[id].callAt;\n\ +\n\ + timer = {\n\ + func: this.timeouts[id].func,\n\ + callAt: this.timeouts[id].callAt,\n\ + interval: this.timeouts[id].interval,\n\ + id: this.timeouts[id].id,\n\ + invokeArgs: this.timeouts[id].invokeArgs\n\ + };\n\ + }\n\ + }\n\ + }\n\ +\n\ + return timer || null;\n\ + },\n\ +\n\ + callTimer: function (timer) {\n\ + if (typeof timer.interval == \"number\") {\n\ + this.timeouts[timer.id].callAt += timer.interval;\n\ + } else {\n\ + delete this.timeouts[timer.id];\n\ + }\n\ +\n\ + try {\n\ + if (typeof timer.func == \"function\") {\n\ + timer.func.apply(null, timer.invokeArgs);\n\ + } else {\n\ + eval(timer.func);\n\ + }\n\ + } catch (e) {\n\ + var exception = e;\n\ + }\n\ +\n\ + if (!this.timeouts[timer.id]) {\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + return;\n\ + }\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + },\n\ +\n\ + reset: function reset() {\n\ + this.timeouts = {};\n\ + },\n\ +\n\ + Date: (function () {\n\ + var NativeDate = Date;\n\ +\n\ + function ClockDate(year, month, date, hour, minute, second, ms) {\n\ + // Defensive and verbose to avoid potential harm in passing\n\ + // explicit undefined when user does not pass argument\n\ + switch (arguments.length) {\n\ + case 0:\n\ + return new NativeDate(ClockDate.clock.now);\n\ + case 1:\n\ + return new NativeDate(year);\n\ + case 2:\n\ + return new NativeDate(year, month);\n\ + case 3:\n\ + return new NativeDate(year, month, date);\n\ + case 4:\n\ + return new NativeDate(year, month, date, hour);\n\ + case 5:\n\ + return new NativeDate(year, month, date, hour, minute);\n\ + case 6:\n\ + return new NativeDate(year, month, date, hour, minute, second);\n\ + default:\n\ + return new NativeDate(year, month, date, hour, minute, second, ms);\n\ + }\n\ + }\n\ +\n\ + return mirrorDateProperties(ClockDate, NativeDate);\n\ + }())\n\ + };\n\ +\n\ + function mirrorDateProperties(target, source) {\n\ + if (source.now) {\n\ + target.now = function now() {\n\ + return target.clock.now;\n\ + };\n\ + } else {\n\ + delete target.now;\n\ + }\n\ +\n\ + if (source.toSource) {\n\ + target.toSource = function toSource() {\n\ + return source.toSource();\n\ + };\n\ + } else {\n\ + delete target.toSource;\n\ + }\n\ +\n\ + target.toString = function toString() {\n\ + return source.toString();\n\ + };\n\ +\n\ + target.prototype = source.prototype;\n\ + target.parse = source.parse;\n\ + target.UTC = source.UTC;\n\ + target.prototype.toUTCString = source.prototype.toUTCString;\n\ + return target;\n\ + }\n\ +\n\ + var methods = [\"Date\", \"setTimeout\", \"setInterval\",\n\ + \"clearTimeout\", \"clearInterval\"];\n\ +\n\ + function restore() {\n\ + var method;\n\ +\n\ + for (var i = 0, l = this.methods.length; i < l; i++) {\n\ + method = this.methods[i];\n\ + if (global[method].hadOwnProperty) {\n\ + global[method] = this[\"_\" + method];\n\ + } else {\n\ + delete global[method];\n\ + }\n\ + }\n\ +\n\ + // Prevent multiple executions which will completely remove these props\n\ + this.methods = [];\n\ + }\n\ +\n\ + function stubGlobal(method, clock) {\n\ + clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);\n\ + clock[\"_\" + method] = global[method];\n\ +\n\ + if (method == \"Date\") {\n\ + var date = mirrorDateProperties(clock[method], global[method]);\n\ + global[method] = date;\n\ + } else {\n\ + global[method] = function () {\n\ + return clock[method].apply(clock, arguments);\n\ + };\n\ +\n\ + for (var prop in clock[method]) {\n\ + if (clock[method].hasOwnProperty(prop)) {\n\ + global[method][prop] = clock[method][prop];\n\ + }\n\ + }\n\ + }\n\ +\n\ + global[method].clock = clock;\n\ + }\n\ +\n\ + sinon.useFakeTimers = function useFakeTimers(now) {\n\ + var clock = sinon.clock.create(now);\n\ + clock.restore = restore;\n\ + clock.methods = Array.prototype.slice.call(arguments,\n\ + typeof now == \"number\" ? 1 : 0);\n\ +\n\ + if (clock.methods.length === 0) {\n\ + clock.methods = methods;\n\ + }\n\ +\n\ + for (var i = 0, l = clock.methods.length; i < l; i++) {\n\ + stubGlobal(clock.methods[i], clock);\n\ + }\n\ +\n\ + return clock;\n\ + };\n\ +}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\ +\n\ +sinon.timers = {\n\ + setTimeout: setTimeout,\n\ + clearTimeout: clearTimeout,\n\ + setInterval: setInterval,\n\ + clearInterval: clearInterval,\n\ + Date: Date\n\ +};\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n\ +/**\n\ + * Minimal Event interface implementation\n\ + *\n\ + * Original implementation by Sven Fuchs: https://gist.github.com/995028\n\ + * Modifications and tests by Christian Johansen.\n\ + *\n\ + * @author Sven Fuchs (svenfuchs@artweb-design.de)\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + this.sinon = {};\n\ +}\n\ +\n\ +(function () {\n\ + var push = [].push;\n\ +\n\ + sinon.Event = function Event(type, bubbles, cancelable, target) {\n\ + this.initEvent(type, bubbles, cancelable, target);\n\ + };\n\ +\n\ + sinon.Event.prototype = {\n\ + initEvent: function(type, bubbles, cancelable, target) {\n\ + this.type = type;\n\ + this.bubbles = bubbles;\n\ + this.cancelable = cancelable;\n\ + this.target = target;\n\ + },\n\ +\n\ + stopPropagation: function () {},\n\ +\n\ + preventDefault: function () {\n\ + this.defaultPrevented = true;\n\ + }\n\ + };\n\ +\n\ + sinon.EventTarget = {\n\ + addEventListener: function addEventListener(event, listener, useCapture) {\n\ + this.eventListeners = this.eventListeners || {};\n\ + this.eventListeners[event] = this.eventListeners[event] || [];\n\ + push.call(this.eventListeners[event], listener);\n\ + },\n\ +\n\ + removeEventListener: function removeEventListener(event, listener, useCapture) {\n\ + var listeners = this.eventListeners && this.eventListeners[event] || [];\n\ +\n\ + for (var i = 0, l = listeners.length; i < l; ++i) {\n\ + if (listeners[i] == listener) {\n\ + return listeners.splice(i, 1);\n\ + }\n\ + }\n\ + },\n\ +\n\ + dispatchEvent: function dispatchEvent(event) {\n\ + var type = event.type;\n\ + var listeners = this.eventListeners && this.eventListeners[type] || [];\n\ +\n\ + for (var i = 0; i < listeners.length; i++) {\n\ + if (typeof listeners[i] == \"function\") {\n\ + listeners[i].call(this, event);\n\ + } else {\n\ + listeners[i].handleEvent(event);\n\ + }\n\ + }\n\ +\n\ + return !!event.defaultPrevented;\n\ + }\n\ + };\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../../sinon.js\n\ + * @depend event.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n\ +/**\n\ + * Fake XMLHttpRequest object\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + this.sinon = {};\n\ +}\n\ +sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };\n\ +\n\ +// wrapper for global\n\ +(function(global) {\n\ + var xhr = sinon.xhr;\n\ + xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n\ + xhr.GlobalActiveXObject = global.ActiveXObject;\n\ + xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != \"undefined\";\n\ + xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != \"undefined\";\n\ + xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX\n\ + ? function() { return new xhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n\ +\n\ + /*jsl:ignore*/\n\ + var unsafeHeaders = {\n\ + \"Accept-Charset\": true,\n\ + \"Accept-Encoding\": true,\n\ + \"Connection\": true,\n\ + \"Content-Length\": true,\n\ + \"Cookie\": true,\n\ + \"Cookie2\": true,\n\ + \"Content-Transfer-Encoding\": true,\n\ + \"Date\": true,\n\ + \"Expect\": true,\n\ + \"Host\": true,\n\ + \"Keep-Alive\": true,\n\ + \"Referer\": true,\n\ + \"TE\": true,\n\ + \"Trailer\": true,\n\ + \"Transfer-Encoding\": true,\n\ + \"Upgrade\": true,\n\ + \"User-Agent\": true,\n\ + \"Via\": true\n\ + };\n\ + /*jsl:end*/\n\ +\n\ + function FakeXMLHttpRequest() {\n\ + this.readyState = FakeXMLHttpRequest.UNSENT;\n\ + this.requestHeaders = {};\n\ + this.requestBody = null;\n\ + this.status = 0;\n\ + this.statusText = \"\";\n\ +\n\ + var xhr = this;\n\ + var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\ +\n\ + function addEventListener(eventName) {\n\ + xhr.addEventListener(eventName, function (event) {\n\ + var listener = xhr[\"on\" + eventName];\n\ +\n\ + if (listener && typeof listener == \"function\") {\n\ + listener(event);\n\ + }\n\ + });\n\ + }\n\ +\n\ + for (var i = events.length - 1; i >= 0; i--) {\n\ + addEventListener(events[i]);\n\ + }\n\ +\n\ + if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n\ + FakeXMLHttpRequest.onCreate(this);\n\ + }\n\ + }\n\ +\n\ + function verifyState(xhr) {\n\ + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n\ + throw new Error(\"INVALID_STATE_ERR\");\n\ + }\n\ +\n\ + if (xhr.sendFlag) {\n\ + throw new Error(\"INVALID_STATE_ERR\");\n\ + }\n\ + }\n\ +\n\ + // filtering to enable a white-list version of Sinon FakeXhr,\n\ + // where whitelisted requests are passed through to real XHR\n\ + function each(collection, callback) {\n\ + if (!collection) return;\n\ + for (var i = 0, l = collection.length; i < l; i += 1) {\n\ + callback(collection[i]);\n\ + }\n\ + }\n\ + function some(collection, callback) {\n\ + for (var index = 0; index < collection.length; index++) {\n\ + if(callback(collection[index]) === true) return true;\n\ + };\n\ + return false;\n\ + }\n\ + // largest arity in XHR is 5 - XHR#open\n\ + var apply = function(obj,method,args) {\n\ + switch(args.length) {\n\ + case 0: return obj[method]();\n\ + case 1: return obj[method](args[0]);\n\ + case 2: return obj[method](args[0],args[1]);\n\ + case 3: return obj[method](args[0],args[1],args[2]);\n\ + case 4: return obj[method](args[0],args[1],args[2],args[3]);\n\ + case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);\n\ + };\n\ + };\n\ +\n\ + FakeXMLHttpRequest.filters = [];\n\ + FakeXMLHttpRequest.addFilter = function(fn) {\n\ + this.filters.push(fn)\n\ + };\n\ + var IE6Re = /MSIE 6/;\n\ + FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {\n\ + var xhr = new sinon.xhr.workingXHR();\n\ + each([\"open\",\"setRequestHeader\",\"send\",\"abort\",\"getResponseHeader\",\n\ + \"getAllResponseHeaders\",\"addEventListener\",\"overrideMimeType\",\"removeEventListener\"],\n\ + function(method) {\n\ + fakeXhr[method] = function() {\n\ + return apply(xhr,method,arguments);\n\ + };\n\ + });\n\ +\n\ + var copyAttrs = function(args) {\n\ + each(args, function(attr) {\n\ + try {\n\ + fakeXhr[attr] = xhr[attr]\n\ + } catch(e) {\n\ + if(!IE6Re.test(navigator.userAgent)) throw e;\n\ + }\n\ + });\n\ + };\n\ +\n\ + var stateChange = function() {\n\ + fakeXhr.readyState = xhr.readyState;\n\ + if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + copyAttrs([\"status\",\"statusText\"]);\n\ + }\n\ + if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n\ + copyAttrs([\"responseText\"]);\n\ + }\n\ + if(xhr.readyState === FakeXMLHttpRequest.DONE) {\n\ + copyAttrs([\"responseXML\"]);\n\ + }\n\ + if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);\n\ + };\n\ + if(xhr.addEventListener) {\n\ + for(var event in fakeXhr.eventListeners) {\n\ + if(fakeXhr.eventListeners.hasOwnProperty(event)) {\n\ + each(fakeXhr.eventListeners[event],function(handler) {\n\ + xhr.addEventListener(event, handler);\n\ + });\n\ + }\n\ + }\n\ + xhr.addEventListener(\"readystatechange\",stateChange);\n\ + } else {\n\ + xhr.onreadystatechange = stateChange;\n\ + }\n\ + apply(xhr,\"open\",xhrArgs);\n\ + };\n\ + FakeXMLHttpRequest.useFilters = false;\n\ +\n\ + function verifyRequestSent(xhr) {\n\ + if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n\ + throw new Error(\"Request done\");\n\ + }\n\ + }\n\ +\n\ + function verifyHeadersReceived(xhr) {\n\ + if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + throw new Error(\"No headers received\");\n\ + }\n\ + }\n\ +\n\ + function verifyResponseBodyType(body) {\n\ + if (typeof body != \"string\") {\n\ + var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n\ + body + \", which is not a string.\");\n\ + error.name = \"InvalidBodyException\";\n\ + throw error;\n\ + }\n\ + }\n\ +\n\ + sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n\ + async: true,\n\ +\n\ + open: function open(method, url, async, username, password) {\n\ + this.method = method;\n\ + this.url = url;\n\ + this.async = typeof async == \"boolean\" ? async : true;\n\ + this.username = username;\n\ + this.password = password;\n\ + this.responseText = null;\n\ + this.responseXML = null;\n\ + this.requestHeaders = {};\n\ + this.sendFlag = false;\n\ + if(sinon.FakeXMLHttpRequest.useFilters === true) {\n\ + var xhrArgs = arguments;\n\ + var defake = some(FakeXMLHttpRequest.filters,function(filter) {\n\ + return filter.apply(this,xhrArgs)\n\ + });\n\ + if (defake) {\n\ + return sinon.FakeXMLHttpRequest.defake(this,arguments);\n\ + }\n\ + }\n\ + this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\ + },\n\ +\n\ + readyStateChange: function readyStateChange(state) {\n\ + this.readyState = state;\n\ +\n\ + if (typeof this.onreadystatechange == \"function\") {\n\ + try {\n\ + this.onreadystatechange();\n\ + } catch (e) {\n\ + sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n\ + }\n\ + }\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\ +\n\ + switch (this.readyState) {\n\ + case FakeXMLHttpRequest.DONE:\n\ + this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n\ + this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n\ + break;\n\ + }\n\ + },\n\ +\n\ + setRequestHeader: function setRequestHeader(header, value) {\n\ + verifyState(this);\n\ +\n\ + if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n\ + throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n\ + }\n\ +\n\ + if (this.requestHeaders[header]) {\n\ + this.requestHeaders[header] += \",\" + value;\n\ + } else {\n\ + this.requestHeaders[header] = value;\n\ + }\n\ + },\n\ +\n\ + // Helps testing\n\ + setResponseHeaders: function setResponseHeaders(headers) {\n\ + this.responseHeaders = {};\n\ +\n\ + for (var header in headers) {\n\ + if (headers.hasOwnProperty(header)) {\n\ + this.responseHeaders[header] = headers[header];\n\ + }\n\ + }\n\ +\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n\ + } else {\n\ + this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n\ + }\n\ + },\n\ +\n\ + // Currently treats ALL data as a DOMString (i.e. no Document)\n\ + send: function send(data) {\n\ + verifyState(this);\n\ +\n\ + if (!/^(get|head)$/i.test(this.method)) {\n\ + if (this.requestHeaders[\"Content-Type\"]) {\n\ + var value = this.requestHeaders[\"Content-Type\"].split(\";\");\n\ + this.requestHeaders[\"Content-Type\"] = value[0] + \";charset=utf-8\";\n\ + } else {\n\ + this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n\ + }\n\ +\n\ + this.requestBody = data;\n\ + }\n\ +\n\ + this.errorFlag = false;\n\ + this.sendFlag = this.async;\n\ + this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\ +\n\ + if (typeof this.onSend == \"function\") {\n\ + this.onSend(this);\n\ + }\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n\ + },\n\ +\n\ + abort: function abort() {\n\ + this.aborted = true;\n\ + this.responseText = null;\n\ + this.errorFlag = true;\n\ + this.requestHeaders = {};\n\ +\n\ + if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n\ + this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);\n\ + this.sendFlag = false;\n\ + }\n\ +\n\ + this.readyState = sinon.FakeXMLHttpRequest.UNSENT;\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\ + if (typeof this.onerror === \"function\") {\n\ + this.onerror();\n\ + }\n\ + },\n\ +\n\ + getResponseHeader: function getResponseHeader(header) {\n\ + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + return null;\n\ + }\n\ +\n\ + if (/^Set-Cookie2?$/i.test(header)) {\n\ + return null;\n\ + }\n\ +\n\ + header = header.toLowerCase();\n\ +\n\ + for (var h in this.responseHeaders) {\n\ + if (h.toLowerCase() == header) {\n\ + return this.responseHeaders[h];\n\ + }\n\ + }\n\ +\n\ + return null;\n\ + },\n\ +\n\ + getAllResponseHeaders: function getAllResponseHeaders() {\n\ + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + return \"\";\n\ + }\n\ +\n\ + var headers = \"\";\n\ +\n\ + for (var header in this.responseHeaders) {\n\ + if (this.responseHeaders.hasOwnProperty(header) &&\n\ + !/^Set-Cookie2?$/i.test(header)) {\n\ + headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\ +\";\n\ + }\n\ + }\n\ +\n\ + return headers;\n\ + },\n\ +\n\ + setResponseBody: function setResponseBody(body) {\n\ + verifyRequestSent(this);\n\ + verifyHeadersReceived(this);\n\ + verifyResponseBodyType(body);\n\ +\n\ + var chunkSize = this.chunkSize || 10;\n\ + var index = 0;\n\ + this.responseText = \"\";\n\ +\n\ + do {\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.LOADING);\n\ + }\n\ +\n\ + this.responseText += body.substring(index, index + chunkSize);\n\ + index += chunkSize;\n\ + } while (index < body.length);\n\ +\n\ + var type = this.getResponseHeader(\"Content-Type\");\n\ +\n\ + if (this.responseText &&\n\ + (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n\ + try {\n\ + this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n\ + } catch (e) {\n\ + // Unable to parse XML - no biggie\n\ + }\n\ + }\n\ +\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.DONE);\n\ + } else {\n\ + this.readyState = FakeXMLHttpRequest.DONE;\n\ + }\n\ + },\n\ +\n\ + respond: function respond(status, headers, body) {\n\ + this.setResponseHeaders(headers || {});\n\ + this.status = typeof status == \"number\" ? status : 200;\n\ + this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n\ + this.setResponseBody(body || \"\");\n\ + if (typeof this.onload === \"function\"){\n\ + this.onload();\n\ + }\n\ +\n\ + }\n\ + });\n\ +\n\ + sinon.extend(FakeXMLHttpRequest, {\n\ + UNSENT: 0,\n\ + OPENED: 1,\n\ + HEADERS_RECEIVED: 2,\n\ + LOADING: 3,\n\ + DONE: 4\n\ + });\n\ +\n\ + // Borrowed from JSpec\n\ + FakeXMLHttpRequest.parseXML = function parseXML(text) {\n\ + var xmlDoc;\n\ +\n\ + if (typeof DOMParser != \"undefined\") {\n\ + var parser = new DOMParser();\n\ + xmlDoc = parser.parseFromString(text, \"text/xml\");\n\ + } else {\n\ + xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n\ + xmlDoc.async = \"false\";\n\ + xmlDoc.loadXML(text);\n\ + }\n\ +\n\ + return xmlDoc;\n\ + };\n\ +\n\ + FakeXMLHttpRequest.statusCodes = {\n\ + 100: \"Continue\",\n\ + 101: \"Switching Protocols\",\n\ + 200: \"OK\",\n\ + 201: \"Created\",\n\ + 202: \"Accepted\",\n\ + 203: \"Non-Authoritative Information\",\n\ + 204: \"No Content\",\n\ + 205: \"Reset Content\",\n\ + 206: \"Partial Content\",\n\ + 300: \"Multiple Choice\",\n\ + 301: \"Moved Permanently\",\n\ + 302: \"Found\",\n\ + 303: \"See Other\",\n\ + 304: \"Not Modified\",\n\ + 305: \"Use Proxy\",\n\ + 307: \"Temporary Redirect\",\n\ + 400: \"Bad Request\",\n\ + 401: \"Unauthorized\",\n\ + 402: \"Payment Required\",\n\ + 403: \"Forbidden\",\n\ + 404: \"Not Found\",\n\ + 405: \"Method Not Allowed\",\n\ + 406: \"Not Acceptable\",\n\ + 407: \"Proxy Authentication Required\",\n\ + 408: \"Request Timeout\",\n\ + 409: \"Conflict\",\n\ + 410: \"Gone\",\n\ + 411: \"Length Required\",\n\ + 412: \"Precondition Failed\",\n\ + 413: \"Request Entity Too Large\",\n\ + 414: \"Request-URI Too Long\",\n\ + 415: \"Unsupported Media Type\",\n\ + 416: \"Requested Range Not Satisfiable\",\n\ + 417: \"Expectation Failed\",\n\ + 422: \"Unprocessable Entity\",\n\ + 500: \"Internal Server Error\",\n\ + 501: \"Not Implemented\",\n\ + 502: \"Bad Gateway\",\n\ + 503: \"Service Unavailable\",\n\ + 504: \"Gateway Timeout\",\n\ + 505: \"HTTP Version Not Supported\"\n\ + };\n\ +\n\ + sinon.useFakeXMLHttpRequest = function () {\n\ + sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n\ + if (xhr.supportsXHR) {\n\ + global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;\n\ + }\n\ +\n\ + if (xhr.supportsActiveX) {\n\ + global.ActiveXObject = xhr.GlobalActiveXObject;\n\ + }\n\ +\n\ + delete sinon.FakeXMLHttpRequest.restore;\n\ +\n\ + if (keepOnCreate !== true) {\n\ + delete sinon.FakeXMLHttpRequest.onCreate;\n\ + }\n\ + };\n\ + if (xhr.supportsXHR) {\n\ + global.XMLHttpRequest = sinon.FakeXMLHttpRequest;\n\ + }\n\ +\n\ + if (xhr.supportsActiveX) {\n\ + global.ActiveXObject = function ActiveXObject(objId) {\n\ + if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\ +\n\ + return new sinon.FakeXMLHttpRequest();\n\ + }\n\ +\n\ + return new xhr.GlobalActiveXObject(objId);\n\ + };\n\ + }\n\ +\n\ + return sinon.FakeXMLHttpRequest;\n\ + };\n\ +\n\ + sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n\ +})(this);\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/**\n\ + * @depend fake_xml_http_request.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/\n\ +/*global module, require, window*/\n\ +/**\n\ + * The Sinon \"server\" mimics a web server that receives requests from\n\ + * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n\ + * both synchronously and asynchronously. To respond synchronuously, canned\n\ + * answers have to be provided upfront.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + var sinon = {};\n\ +}\n\ +\n\ +sinon.fakeServer = (function () {\n\ + var push = [].push;\n\ + function F() {}\n\ +\n\ + function create(proto) {\n\ + F.prototype = proto;\n\ + return new F();\n\ + }\n\ +\n\ + function responseArray(handler) {\n\ + var response = handler;\n\ +\n\ + if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n\ + response = [200, {}, handler];\n\ + }\n\ +\n\ + if (typeof response[2] != \"string\") {\n\ + throw new TypeError(\"Fake server response body should be string, but was \" +\n\ + typeof response[2]);\n\ + }\n\ +\n\ + return response;\n\ + }\n\ +\n\ + var wloc = typeof window !== \"undefined\" ? window.location : {};\n\ + var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\ +\n\ + function matchOne(response, reqMethod, reqUrl) {\n\ + var rmeth = response.method;\n\ + var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n\ + var url = response.url;\n\ + var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\ +\n\ + return matchMethod && matchUrl;\n\ + }\n\ +\n\ + function match(response, request) {\n\ + var requestMethod = this.getHTTPMethod(request);\n\ + var requestUrl = request.url;\n\ +\n\ + if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n\ + requestUrl = requestUrl.replace(rCurrLoc, \"\");\n\ + }\n\ +\n\ + if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n\ + if (typeof response.response == \"function\") {\n\ + var ru = response.url;\n\ + var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1));\n\ + return response.response.apply(response, args);\n\ + }\n\ +\n\ + return true;\n\ + }\n\ +\n\ + return false;\n\ + }\n\ +\n\ + function log(response, request) {\n\ + var str;\n\ +\n\ + str = \"Request:\\n\ +\" + sinon.format(request) + \"\\n\ +\\n\ +\";\n\ + str += \"Response:\\n\ +\" + sinon.format(response) + \"\\n\ +\\n\ +\";\n\ +\n\ + sinon.log(str);\n\ + }\n\ +\n\ + return {\n\ + create: function () {\n\ + var server = create(this);\n\ + this.xhr = sinon.useFakeXMLHttpRequest();\n\ + server.requests = [];\n\ +\n\ + this.xhr.onCreate = function (xhrObj) {\n\ + server.addRequest(xhrObj);\n\ + };\n\ +\n\ + return server;\n\ + },\n\ +\n\ + addRequest: function addRequest(xhrObj) {\n\ + var server = this;\n\ + push.call(this.requests, xhrObj);\n\ +\n\ + xhrObj.onSend = function () {\n\ + server.handleRequest(this);\n\ + };\n\ +\n\ + if (this.autoRespond && !this.responding) {\n\ + setTimeout(function () {\n\ + server.responding = false;\n\ + server.respond();\n\ + }, this.autoRespondAfter || 10);\n\ +\n\ + this.responding = true;\n\ + }\n\ + },\n\ +\n\ + getHTTPMethod: function getHTTPMethod(request) {\n\ + if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n\ + var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n\ + return !!matches ? matches[1] : request.method;\n\ + }\n\ +\n\ + return request.method;\n\ + },\n\ +\n\ + handleRequest: function handleRequest(xhr) {\n\ + if (xhr.async) {\n\ + if (!this.queue) {\n\ + this.queue = [];\n\ + }\n\ +\n\ + push.call(this.queue, xhr);\n\ + } else {\n\ + this.processRequest(xhr);\n\ + }\n\ + },\n\ +\n\ + respondWith: function respondWith(method, url, body) {\n\ + if (arguments.length == 1 && typeof method != \"function\") {\n\ + this.response = responseArray(method);\n\ + return;\n\ + }\n\ +\n\ + if (!this.responses) { this.responses = []; }\n\ +\n\ + if (arguments.length == 1) {\n\ + body = method;\n\ + url = method = null;\n\ + }\n\ +\n\ + if (arguments.length == 2) {\n\ + body = url;\n\ + url = method;\n\ + method = null;\n\ + }\n\ +\n\ + push.call(this.responses, {\n\ + method: method,\n\ + url: url,\n\ + response: typeof body == \"function\" ? body : responseArray(body)\n\ + });\n\ + },\n\ +\n\ + respond: function respond() {\n\ + if (arguments.length > 0) this.respondWith.apply(this, arguments);\n\ + var queue = this.queue || [];\n\ + var request;\n\ +\n\ + while(request = queue.shift()) {\n\ + this.processRequest(request);\n\ + }\n\ + },\n\ +\n\ + processRequest: function processRequest(request) {\n\ + try {\n\ + if (request.aborted) {\n\ + return;\n\ + }\n\ +\n\ + var response = this.response || [404, {}, \"\"];\n\ +\n\ + if (this.responses) {\n\ + for (var i = 0, l = this.responses.length; i < l; i++) {\n\ + if (match.call(this, this.responses[i], request)) {\n\ + response = this.responses[i].response;\n\ + break;\n\ + }\n\ + }\n\ + }\n\ +\n\ + if (request.readyState != 4) {\n\ + log(response, request);\n\ +\n\ + request.respond(response[0], response[1], response[2]);\n\ + }\n\ + } catch (e) {\n\ + sinon.logError(\"Fake server request processing\", e);\n\ + }\n\ + },\n\ +\n\ + restore: function restore() {\n\ + return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n\ + }\n\ + };\n\ +}());\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/**\n\ + * @depend fake_server.js\n\ + * @depend fake_timers.js\n\ + */\n\ +/*jslint browser: true, eqeqeq: false, onevar: false*/\n\ +/*global sinon*/\n\ +/**\n\ + * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n\ + * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n\ + * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n\ + * it polls the object for completion with setInterval. Dispite the direct\n\ + * motivation, there is nothing jQuery-specific in this file, so it can be used\n\ + * in any environment where the ajax implementation depends on setInterval or\n\ + * setTimeout.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function () {\n\ + function Server() {}\n\ + Server.prototype = sinon.fakeServer;\n\ +\n\ + sinon.fakeServerWithClock = new Server();\n\ +\n\ + sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n\ + if (xhr.async) {\n\ + if (typeof setTimeout.clock == \"object\") {\n\ + this.clock = setTimeout.clock;\n\ + } else {\n\ + this.clock = sinon.useFakeTimers();\n\ + this.resetClock = true;\n\ + }\n\ +\n\ + if (!this.longestTimeout) {\n\ + var clockSetTimeout = this.clock.setTimeout;\n\ + var clockSetInterval = this.clock.setInterval;\n\ + var server = this;\n\ +\n\ + this.clock.setTimeout = function (fn, timeout) {\n\ + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\ +\n\ + return clockSetTimeout.apply(this, arguments);\n\ + };\n\ +\n\ + this.clock.setInterval = function (fn, timeout) {\n\ + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\ +\n\ + return clockSetInterval.apply(this, arguments);\n\ + };\n\ + }\n\ + }\n\ +\n\ + return sinon.fakeServer.addRequest.call(this, xhr);\n\ + };\n\ +\n\ + sinon.fakeServerWithClock.respond = function respond() {\n\ + var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\ +\n\ + if (this.clock) {\n\ + this.clock.tick(this.longestTimeout || 0);\n\ + this.longestTimeout = 0;\n\ +\n\ + if (this.resetClock) {\n\ + this.clock.restore();\n\ + this.resetClock = false;\n\ + }\n\ + }\n\ +\n\ + return returnVal;\n\ + };\n\ +\n\ + sinon.fakeServerWithClock.restore = function restore() {\n\ + if (this.clock) {\n\ + this.clock.restore();\n\ + }\n\ +\n\ + return sinon.fakeServer.restore.apply(this, arguments);\n\ + };\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend collection.js\n\ + * @depend util/fake_timers.js\n\ + * @depend util/fake_server_with_clock.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global require, module*/\n\ +/**\n\ + * Manages fake collections as well as fake utilities such as Sinon's\n\ + * timers and fake XHR implementation in one convenient object.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + var sinon = require(\"../sinon\");\n\ + sinon.extend(sinon, require(\"./util/fake_timers\"));\n\ +}\n\ +\n\ +(function () {\n\ + var push = [].push;\n\ +\n\ + function exposeValue(sandbox, config, key, value) {\n\ + if (!value) {\n\ + return;\n\ + }\n\ +\n\ + if (config.injectInto) {\n\ + config.injectInto[key] = value;\n\ + } else {\n\ + push.call(sandbox.args, value);\n\ + }\n\ + }\n\ +\n\ + function prepareSandboxFromConfig(config) {\n\ + var sandbox = sinon.create(sinon.sandbox);\n\ +\n\ + if (config.useFakeServer) {\n\ + if (typeof config.useFakeServer == \"object\") {\n\ + sandbox.serverPrototype = config.useFakeServer;\n\ + }\n\ +\n\ + sandbox.useFakeServer();\n\ + }\n\ +\n\ + if (config.useFakeTimers) {\n\ + if (typeof config.useFakeTimers == \"object\") {\n\ + sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n\ + } else {\n\ + sandbox.useFakeTimers();\n\ + }\n\ + }\n\ +\n\ + return sandbox;\n\ + }\n\ +\n\ + sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n\ + useFakeTimers: function useFakeTimers() {\n\ + this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\ +\n\ + return this.add(this.clock);\n\ + },\n\ +\n\ + serverPrototype: sinon.fakeServer,\n\ +\n\ + useFakeServer: function useFakeServer() {\n\ + var proto = this.serverPrototype || sinon.fakeServer;\n\ +\n\ + if (!proto || !proto.create) {\n\ + return null;\n\ + }\n\ +\n\ + this.server = proto.create();\n\ + return this.add(this.server);\n\ + },\n\ +\n\ + inject: function (obj) {\n\ + sinon.collection.inject.call(this, obj);\n\ +\n\ + if (this.clock) {\n\ + obj.clock = this.clock;\n\ + }\n\ +\n\ + if (this.server) {\n\ + obj.server = this.server;\n\ + obj.requests = this.server.requests;\n\ + }\n\ +\n\ + return obj;\n\ + },\n\ +\n\ + create: function (config) {\n\ + if (!config) {\n\ + return sinon.create(sinon.sandbox);\n\ + }\n\ +\n\ + var sandbox = prepareSandboxFromConfig(config);\n\ + sandbox.args = sandbox.args || [];\n\ + var prop, value, exposed = sandbox.inject({});\n\ +\n\ + if (config.properties) {\n\ + for (var i = 0, l = config.properties.length; i < l; i++) {\n\ + prop = config.properties[i];\n\ + value = exposed[prop] || prop == \"sandbox\" && sandbox;\n\ + exposeValue(sandbox, config, prop, value);\n\ + }\n\ + } else {\n\ + exposeValue(sandbox, config, \"sandbox\", value);\n\ + }\n\ +\n\ + return sandbox;\n\ + }\n\ + });\n\ +\n\ + sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\ +\n\ + if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon.sandbox;\n\ + }\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + * @depend mock.js\n\ + * @depend sandbox.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Test function, sandboxes fakes\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function test(callback) {\n\ + var type = typeof callback;\n\ +\n\ + if (type != \"function\") {\n\ + throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n\ + }\n\ +\n\ + return function () {\n\ + var config = sinon.getConfig(sinon.config);\n\ + config.injectInto = config.injectIntoThis && this || config.injectInto;\n\ + var sandbox = sinon.sandbox.create(config);\n\ + var exception, result;\n\ + var args = Array.prototype.slice.call(arguments).concat(sandbox.args);\n\ +\n\ + try {\n\ + result = callback.apply(this, args);\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + if (typeof exception !== \"undefined\") {\n\ + sandbox.restore();\n\ + throw exception;\n\ + }\n\ + else {\n\ + sandbox.verifyAndRestore();\n\ + }\n\ +\n\ + return result;\n\ + };\n\ + }\n\ +\n\ + test.config = {\n\ + injectIntoThis: true,\n\ + injectInto: null,\n\ + properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n\ + useFakeTimers: true,\n\ + useFakeServer: true\n\ + };\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = test;\n\ + } else {\n\ + sinon.test = test;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend test.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Test case, sandboxes all test functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon || !Object.prototype.hasOwnProperty) {\n\ + return;\n\ + }\n\ +\n\ + function createTest(property, setUp, tearDown) {\n\ + return function () {\n\ + if (setUp) {\n\ + setUp.apply(this, arguments);\n\ + }\n\ +\n\ + var exception, result;\n\ +\n\ + try {\n\ + result = property.apply(this, arguments);\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + if (tearDown) {\n\ + tearDown.apply(this, arguments);\n\ + }\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ +\n\ + return result;\n\ + };\n\ + }\n\ +\n\ + function testCase(tests, prefix) {\n\ + /*jsl:ignore*/\n\ + if (!tests || typeof tests != \"object\") {\n\ + throw new TypeError(\"sinon.testCase needs an object with test functions\");\n\ + }\n\ + /*jsl:end*/\n\ +\n\ + prefix = prefix || \"test\";\n\ + var rPrefix = new RegExp(\"^\" + prefix);\n\ + var methods = {}, testName, property, method;\n\ + var setUp = tests.setUp;\n\ + var tearDown = tests.tearDown;\n\ +\n\ + for (testName in tests) {\n\ + if (tests.hasOwnProperty(testName)) {\n\ + property = tests[testName];\n\ +\n\ + if (/^(setUp|tearDown)$/.test(testName)) {\n\ + continue;\n\ + }\n\ +\n\ + if (typeof property == \"function\" && rPrefix.test(testName)) {\n\ + method = property;\n\ +\n\ + if (setUp || tearDown) {\n\ + method = createTest(property, setUp, tearDown);\n\ + }\n\ +\n\ + methods[testName] = sinon.test(method);\n\ + } else {\n\ + methods[testName] = tests[testName];\n\ + }\n\ + }\n\ + }\n\ +\n\ + return methods;\n\ + }\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = testCase;\n\ + } else {\n\ + sinon.testCase = testCase;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Assertions matching the test spy retrieval interface.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon, global) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var slice = Array.prototype.slice;\n\ + var assert;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function verifyIsStub() {\n\ + var method;\n\ +\n\ + for (var i = 0, l = arguments.length; i < l; ++i) {\n\ + method = arguments[i];\n\ +\n\ + if (!method) {\n\ + assert.fail(\"fake is not a spy\");\n\ + }\n\ +\n\ + if (typeof method != \"function\") {\n\ + assert.fail(method + \" is not a function\");\n\ + }\n\ +\n\ + if (typeof method.getCall != \"function\") {\n\ + assert.fail(method + \" is not stubbed\");\n\ + }\n\ + }\n\ + }\n\ +\n\ + function failAssertion(object, msg) {\n\ + object = object || global;\n\ + var failMethod = object.fail || assert.fail;\n\ + failMethod.call(object, msg);\n\ + }\n\ +\n\ + function mirrorPropAsAssertion(name, method, message) {\n\ + if (arguments.length == 2) {\n\ + message = method;\n\ + method = name;\n\ + }\n\ +\n\ + assert[name] = function (fake) {\n\ + verifyIsStub(fake);\n\ +\n\ + var args = slice.call(arguments, 1);\n\ + var failed = false;\n\ +\n\ + if (typeof method == \"function\") {\n\ + failed = !method(fake);\n\ + } else {\n\ + failed = typeof fake[method] == \"function\" ?\n\ + !fake[method].apply(fake, args) : !fake[method];\n\ + }\n\ +\n\ + if (failed) {\n\ + failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n\ + } else {\n\ + assert.pass(name);\n\ + }\n\ + };\n\ + }\n\ +\n\ + function exposedName(prefix, prop) {\n\ + return !prefix || /^fail/.test(prop) ? prop :\n\ + prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n\ + };\n\ +\n\ + assert = {\n\ + failException: \"AssertError\",\n\ +\n\ + fail: function fail(message) {\n\ + var error = new Error(message);\n\ + error.name = this.failException || assert.failException;\n\ +\n\ + throw error;\n\ + },\n\ +\n\ + pass: function pass(assertion) {},\n\ +\n\ + callOrder: function assertCallOrder() {\n\ + verifyIsStub.apply(null, arguments);\n\ + var expected = \"\", actual = \"\";\n\ +\n\ + if (!sinon.calledInOrder(arguments)) {\n\ + try {\n\ + expected = [].join.call(arguments, \", \");\n\ + var calls = slice.call(arguments);\n\ + var i = calls.length;\n\ + while (i) {\n\ + if (!calls[--i].called) {\n\ + calls.splice(i, 1);\n\ + }\n\ + }\n\ + actual = sinon.orderByFirstCall(calls).join(\", \");\n\ + } catch (e) {\n\ + // If this fails, we'll just fall back to the blank string\n\ + }\n\ +\n\ + failAssertion(this, \"expected \" + expected + \" to be \" +\n\ + \"called in order but were called as \" + actual);\n\ + } else {\n\ + assert.pass(\"callOrder\");\n\ + }\n\ + },\n\ +\n\ + callCount: function assertCallCount(method, count) {\n\ + verifyIsStub(method);\n\ +\n\ + if (method.callCount != count) {\n\ + var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n\ + \" but was called %c%C\";\n\ + failAssertion(this, method.printf(msg));\n\ + } else {\n\ + assert.pass(\"callCount\");\n\ + }\n\ + },\n\ +\n\ + expose: function expose(target, options) {\n\ + if (!target) {\n\ + throw new TypeError(\"target is null or undefined\");\n\ + }\n\ +\n\ + var o = options || {};\n\ + var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n\ + var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\ +\n\ + for (var method in this) {\n\ + if (method != \"export\" && (includeFail || !/^(fail)/.test(method))) {\n\ + target[exposedName(prefix, method)] = this[method];\n\ + }\n\ + }\n\ +\n\ + return target;\n\ + }\n\ + };\n\ +\n\ + mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n\ + mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n\ + \"expected %n to not have been called but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n\ + mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n\ + mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n\ + mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n\ + mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n\ + mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = assert;\n\ + } else {\n\ + sinon.assert = assert;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\ +\n\ +return sinon;}.call(typeof window != 'undefined' && window || {}));\n\ +//@ sourceURL=indefinido-observable/components/cjohansen-sinon/sinon.js" )); require.register("indefinido-observable/index.js", Function("exports, require, module", -"module.exports = require('./lib/observable');\n//@ sourceURL=indefinido-observable/index.js" +"module.exports = require('./lib/observable');\n\ +//@ sourceURL=indefinido-observable/index.js" )); require.register("indefinido-observable/lib/observable.js", Function("exports, require, module", -"// TODO Better keypath support\n\n// Shim older browsers\nif (!Object.create ) require('../vendor/shims/object.create');\nif (!Array.prototype.indexOf) require('../vendor/shims/array.indexOf');\n\n// Object.defineProperty (for ie5+)\nif (typeof require != 'undefined') {\n require('../vendor/shims/accessors.js');\n\n // __lookup*__ and __define*__ for browsers with defineProperty support\n // TODO Figure out why gives an infinity loop\n require('../vendor/shims/accessors-legacy.js');\n}\n\n// Require Dependencies\nif (!window['jQuery']) jQuery = $ = require('jquery');\n\n// Observable Implementation\nvar observable, requiresDomElement, check, lookup, mixin, generator, mutations;\n\n// Support objects\n\n// TODO implement Object.getOwnPropertyDescriptor\nlookup = {\n setter: Object.prototype.__lookupSetter__ || function (property) {\n return this.observed && this.observed[property + '_setter'];\n },\n getter: Object.prototype.__lookupGetter__ || function (property) {\n var default_getter;\n return this.observed && this.observed[property + '_getter'] || (\n (default_getter = $.proxy(lookup.default_getter, this, property)) &&\n (default_getter.is_default = true) &&\n (default_getter)\n );\n },\n types: {\n 'undefined': undefined,\n 'null': null,\n 'true': true,\n 'false': false,\n 'NaN': NaN\n },\n // overrides: [Object.prototype.toString, String.prototype.toString, Array.prototype.toString, Number.prototype.toString],\n basic_types: [undefined, null],\n default_getter: function (property) {\n var possible_value = this[property];\n\n // Getter is the toString property of object\n if (possible_value && possible_value.hasOwnProperty('toString')) {\n\n if (possible_value.toString.is_default) return this.observed[property];\n\n return possible_value.toString.call(this);\n\n } else if (possible_value in lookup.types) {\n\n return lookup.types[possible_value];\n\n } else return possible_value;\n }\n};\n\n\n// Core Implementation\n\nrequiresDomElement = Object.defineProperty['requiresDomElement'];\n\nmixin = {\n subscribe: function observable_subscribe (keypath, callback) {\n if (keypath == 'observed') throw new TypeError('observable.subscribe: cannot observe reserved property observed');\n if ($.isArray(this[keypath])) generator.mutations.call(this, keypath);\n generator.observe.call(this, keypath, callback);\n return true;\n },\n unsubscribe: function (object, keypath, callback) {\n console.error(\"observable.unsubscribe not implemented yet.\");\n console.log(object, keypath, callback);\n },\n publish: function observable_publish (keypath, value) {\n // TODO actually call callbacks\n return this[keypath] = value;\n }\n};\n\n\nif (requiresDomElement) {\n\n observable = function (object) {\n\n // observable() or observable(object)\n if (this.document && this.location) {\n if (!object) {\n object = {};\n }\n // observable.call(...)\n } else {\n // observable.call(param, param)\n if (object) {\n throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');\n // observable.call(object)\n } else {\n object = this;\n }\n }\n\n if (!jQuery.isReady) throw new Error('observable.call: For compatibility reasons, observable can only be called when dom is loaded.');\n var fix = document.createElement('fix');\n\n if (!jQuery.isReady) $(function () {document.body.appendChild(fix);});\n else document.body.appendChild(fix);\n\n if (!object.observed) generator.observable_for(fix);\n\n return $.extend(fix, object, mixin);\n };\n\n var ignores = document.createElement('fix'), fix_ignores = [], property;\n\n for (property in ignores) {\n fix_ignores.push(property);\n }\n\n observable.ignores = fix_ignores;\n\n} else {\n\n observable = function (object) {\n // observable() or observable(object)\n if (this === window) {\n if (!object) {\n object = {};\n }\n // observable.call(...)\n } else if (this !== window) {\n // observable.call(param, param)\n if (object) {\n throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');\n // observable.call(object)\n } else {\n object = this;\n }\n }\n\n if (!object.observed) generator.observable_for(object);\n\n return $.extend(object, mixin);\n };\n\n observable.ignores = [];\n}\n\n\nobservable.unobserve = function (object) {\n var property;\n\n for (property in mixin) {\n delete object[property];\n }\n\n delete object.observed;\n return true;\n};\n\ncheck = function (keypath, value) {\n this.observed[keypath] = value;\n\n // TODO implement subscription\n (this.dirty === false) && (this.dirty = true);\n return true;\n};\n\ngenerator = {\n observe: function(keypath, callback) {\n return Object.defineProperty(this, keypath, {\n get: generator.getter.call(this, keypath),\n set: generator.setter.call(this, keypath, callback),\n enumerable: true\n });\n },\n\n observable_for: function (object) {\n return Object.defineProperty(object, 'observed', {\n configurable: true,\n enumerable: false,\n value: {}\n });\n },\n\n // TODO improve readability\n // TODO implement linked list\n setter: function subscribed_setter (keypath, callback) {\n var setter = lookup.setter.call(this, keypath), current, getter, old_setter;\n\n // Set value\n this.observed[keypath] = lookup.getter.call(this, keypath) && lookup.getter.call(this, keypath)() || this[keypath];\n\n // First time subscribing\n if (!setter) {\n setter = function setter (value) {\n check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);\n };\n\n // First time subscribing but does not have callback_thread associated\n } else if (!setter.callback_thread) {\n old_setter = setter;\n setter = function setter (value) {\n check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);\n };\n\n setter.callback_thread = old_setter;\n }\n\n current = setter.callback_thread || $.noop;\n\n setter.callback_thread = function thread (value) {\n current.call(this, value) !== false && callback.call(this, value);\n };\n\n // TODO better implementation of loookup setter / lookup getter on accessors shim\n if (requiresDomElement) this.observed[keypath + '_setter'] = setter;\n\n return setter;\n },\n getter: function subscribed_getter (keypath) {\n var object = this, getter;\n\n getter = lookup.getter.call(this, keypath) || function root_getter () {\n return object.observed[keypath];\n };\n\n // TODO better implementation of loookup setter / lookup getter on accessors shim\n if (requiresDomElement) this.observed[keypath + '_getter'] = getter;\n\n return getter;\n },\n mutations: function(keypath) {\n var setter = lookup.setter.call(this, keypath),\n array = this[keypath];\n\n // First time subscribing, and it is an array\n if (!setter) {\n // TODO use this.subscribe instead of generator.observe.call\n generator.observe.call(this, keypath, function(new_array) {\n var i, type, j;\n\n // Avoid non push operations!\n // TODO remove jquery dependency\n if ($.type(new_array) !== 'array') return;\n\n // Skip this if it is not the first time\n if (new_array.object === array.object && new_array.thread === array.thread) return;\n i = new_array.length;\n j = new_array.length;\n\n new_array.thread = array.thread;\n new_array.object = array.object;\n new_array.key = keypath;\n\n while (i--) {\n // TODO remove jquery dependency\n type = $.type(arguments[i]);\n if (!new_array[i].observed\n && (type != 'object' || type != 'array')) {\n new_array[i] = observable(new_array[i]);\n }\n }\n\n new_array.length = j;\n\n // Update internal property value\n $.extend(new_array, mutations.overrides);\n });\n\n setter = lookup.setter.call(this, keypath);\n }\n\n // TODO Transform this code to define property\n array.thread = setter.callback_thread;\n array.object = this;\n array.key = keypath;\n\n // Override default array methods\n $.extend(array, mutations.overrides);\n\n if (!this.observed.mutate) this.observed.mutate = mutations.mutate;\n }\n};\n\nmutations = {\n mutate: function(thread, method, array) {\n array.method = method;\n thread.call(this, array);\n this.publish(array.key, array); // TODO ver se é uma boa\n delete array.method;\n },\n overrides: {\n push: function() {\n var i = arguments.length, operation;\n\n while (i--) {\n !arguments[i].observed && $.type(arguments[i]) == 'object' && (arguments[i] = observable(arguments[i]));\n }\n\n operation = Array.prototype.push.apply(this, arguments); // TODO Convert arguments for real array\n this.object.observed.mutate.call(this.object, this.thread, 'push', this);\n return operation;\n }\n }\n};\n\n$('pop shift unshift'.split(' ')).each(function (i, method) {\n mutations.overrides[method] = function () {\n Array.prototype[method].apply(this, arguments);\n this.object.observed.mutate.call(this.object, this.thread, method, this);\n };\n});\n\nif (typeof exports != 'undefined') {\n exports.mixin = observable;\n} else {\n window.observable = observable;\n}\n//@ sourceURL=indefinido-observable/lib/observable.js" +"// TODO Better keypath support\n\ +\n\ +// Shim older browsers\n\ +if (!Object.create ) require('../vendor/shims/object.create');\n\ +if (!Array.prototype.indexOf) require('../vendor/shims/array.indexOf');\n\ +\n\ +// Object.defineProperty (for ie5+)\n\ +if (typeof require != 'undefined') {\n\ + require('../vendor/shims/accessors.js');\n\ +\n\ + // __lookup*__ and __define*__ for browsers with defineProperty support\n\ + // TODO Figure out why gives an infinity loop\n\ + require('../vendor/shims/accessors-legacy.js');\n\ +}\n\ +\n\ +// Require Dependencies\n\ +if (!window['jQuery']) jQuery = $ = require('jquery');\n\ +\n\ +// Observable Implementation\n\ +var observable, requiresDomElement, check, lookup, mixin, generator, mutations;\n\ +\n\ +// Support objects\n\ +\n\ +// TODO implement Object.getOwnPropertyDescriptor\n\ +lookup = {\n\ + setter: Object.prototype.__lookupSetter__ || function (property) {\n\ + return this.observed && this.observed[property + '_setter'];\n\ + },\n\ + getter: Object.prototype.__lookupGetter__ || function (property) {\n\ + var default_getter;\n\ + return this.observed && this.observed[property + '_getter'] || (\n\ + (default_getter = $.proxy(lookup.default_getter, this, property)) &&\n\ + (default_getter.is_default = true) &&\n\ + (default_getter)\n\ + );\n\ + },\n\ + types: {\n\ + 'undefined': undefined,\n\ + 'null': null,\n\ + 'true': true,\n\ + 'false': false,\n\ + 'NaN': NaN\n\ + },\n\ + // overrides: [Object.prototype.toString, String.prototype.toString, Array.prototype.toString, Number.prototype.toString],\n\ + basic_types: [undefined, null],\n\ + default_getter: function (property) {\n\ + var possible_value = this[property];\n\ +\n\ + // Getter is the toString property of object\n\ + if (possible_value && possible_value.hasOwnProperty('toString')) {\n\ +\n\ + if (possible_value.toString.is_default) return this.observed[property];\n\ +\n\ + return possible_value.toString.call(this);\n\ +\n\ + } else if (possible_value in lookup.types) {\n\ +\n\ + return lookup.types[possible_value];\n\ +\n\ + } else return possible_value;\n\ + }\n\ +};\n\ +\n\ +\n\ +// Core Implementation\n\ +\n\ +requiresDomElement = Object.defineProperty['requiresDomElement'];\n\ +\n\ +mixin = {\n\ + subscribe: function observable_subscribe (keypath, callback) {\n\ + if (keypath == 'observed') throw new TypeError('observable.subscribe: cannot observe reserved property observed');\n\ + if ($.isArray(this[keypath])) generator.mutations.call(this, keypath);\n\ + generator.observe.call(this, keypath, callback);\n\ + return true;\n\ + },\n\ + unsubscribe: function (object, keypath, callback) {\n\ + console.error(\"observable.unsubscribe not implemented yet.\");\n\ + console.log(object, keypath, callback);\n\ + },\n\ + publish: function observable_publish (keypath, value) {\n\ + // TODO actually call callbacks\n\ + return this[keypath] = value;\n\ + }\n\ +};\n\ +\n\ +\n\ +if (requiresDomElement) {\n\ +\n\ + observable = function (object) {\n\ +\n\ + // observable() or observable(object)\n\ + if (this.document && this.location) {\n\ + if (!object) {\n\ + object = {};\n\ + }\n\ + // observable.call(...)\n\ + } else {\n\ + // observable.call(param, param)\n\ + if (object) {\n\ + throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');\n\ + // observable.call(object)\n\ + } else {\n\ + object = this;\n\ + }\n\ + }\n\ +\n\ + if (!jQuery.isReady) throw new Error('observable.call: For compatibility reasons, observable can only be called when dom is loaded.');\n\ + var fix = document.createElement('fix');\n\ +\n\ + if (!jQuery.isReady) $(function () {document.body.appendChild(fix);});\n\ + else document.body.appendChild(fix);\n\ +\n\ + if (!object.observed) generator.observable_for(fix);\n\ +\n\ + return $.extend(fix, object, mixin);\n\ + };\n\ +\n\ + var ignores = document.createElement('fix'), fix_ignores = [], property;\n\ +\n\ + for (property in ignores) {\n\ + fix_ignores.push(property);\n\ + }\n\ +\n\ + observable.ignores = fix_ignores;\n\ +\n\ +} else {\n\ +\n\ + observable = function (object) {\n\ + // observable() or observable(object)\n\ + if (this === window) {\n\ + if (!object) {\n\ + object = {};\n\ + }\n\ + // observable.call(...)\n\ + } else if (this !== window) {\n\ + // observable.call(param, param)\n\ + if (object) {\n\ + throw new TypeError('Two objects provided! Call either with observable.call(object) or observable(object), not with observable.call(param, param)');\n\ + // observable.call(object)\n\ + } else {\n\ + object = this;\n\ + }\n\ + }\n\ +\n\ + if (!object.observed) generator.observable_for(object);\n\ +\n\ + return $.extend(object, mixin);\n\ + };\n\ +\n\ + observable.ignores = [];\n\ +}\n\ +\n\ +\n\ +observable.unobserve = function (object) {\n\ + var property;\n\ +\n\ + for (property in mixin) {\n\ + delete object[property];\n\ + }\n\ +\n\ + delete object.observed;\n\ + return true;\n\ +};\n\ +\n\ +check = function (keypath, value) {\n\ + this.observed[keypath] = value;\n\ +\n\ + // TODO implement subscription\n\ + (this.dirty === false) && (this.dirty = true);\n\ + return true;\n\ +};\n\ +\n\ +generator = {\n\ + observe: function(keypath, callback) {\n\ + return Object.defineProperty(this, keypath, {\n\ + get: generator.getter.call(this, keypath),\n\ + set: generator.setter.call(this, keypath, callback),\n\ + enumerable: true\n\ + });\n\ + },\n\ +\n\ + observable_for: function (object) {\n\ + return Object.defineProperty(object, 'observed', {\n\ + configurable: true,\n\ + enumerable: false,\n\ + value: {}\n\ + });\n\ + },\n\ +\n\ + // TODO improve readability\n\ + // TODO implement linked list\n\ + setter: function subscribed_setter (keypath, callback) {\n\ + var setter = lookup.setter.call(this, keypath), current, getter, old_setter;\n\ +\n\ + // Set value\n\ + this.observed[keypath] = lookup.getter.call(this, keypath) && lookup.getter.call(this, keypath)() || this[keypath];\n\ +\n\ + // First time subscribing\n\ + if (!setter) {\n\ + setter = function setter (value) {\n\ + check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);\n\ + };\n\ +\n\ + // First time subscribing but does not have callback_thread associated\n\ + } else if (!setter.callback_thread) {\n\ + old_setter = setter;\n\ + setter = function setter (value) {\n\ + check.call(this, keypath, value) !== false && setter.callback_thread.call(this, value);\n\ + };\n\ +\n\ + setter.callback_thread = old_setter;\n\ + }\n\ +\n\ + current = setter.callback_thread || $.noop;\n\ +\n\ + setter.callback_thread = function thread (value) {\n\ + current.call(this, value) !== false && callback.call(this, value);\n\ + };\n\ +\n\ + // TODO better implementation of loookup setter / lookup getter on accessors shim\n\ + if (requiresDomElement) this.observed[keypath + '_setter'] = setter;\n\ +\n\ + return setter;\n\ + },\n\ + getter: function subscribed_getter (keypath) {\n\ + var object = this, getter;\n\ +\n\ + getter = lookup.getter.call(this, keypath) || function root_getter () {\n\ + return object.observed[keypath];\n\ + };\n\ +\n\ + // TODO better implementation of loookup setter / lookup getter on accessors shim\n\ + if (requiresDomElement) this.observed[keypath + '_getter'] = getter;\n\ +\n\ + return getter;\n\ + },\n\ + mutations: function(keypath) {\n\ + var setter = lookup.setter.call(this, keypath),\n\ + array = this[keypath];\n\ +\n\ + // First time subscribing, and it is an array\n\ + if (!setter) {\n\ + // TODO use this.subscribe instead of generator.observe.call\n\ + generator.observe.call(this, keypath, function(new_array) {\n\ + var i, type, j;\n\ +\n\ + // Avoid non push operations!\n\ + // TODO remove jquery dependency\n\ + if ($.type(new_array) !== 'array') return;\n\ +\n\ + // Skip this if it is not the first time\n\ + if (new_array.object === array.object && new_array.thread === array.thread) return;\n\ + i = new_array.length;\n\ + j = new_array.length;\n\ +\n\ + new_array.thread = array.thread;\n\ + new_array.object = array.object;\n\ + new_array.key = keypath;\n\ +\n\ + while (i--) {\n\ + // TODO remove jquery dependency\n\ + type = $.type(arguments[i]);\n\ + if (!new_array[i].observed\n\ + && (type != 'object' || type != 'array')) {\n\ + new_array[i] = observable(new_array[i]);\n\ + }\n\ + }\n\ +\n\ + new_array.length = j;\n\ +\n\ + // Update internal property value\n\ + $.extend(new_array, mutations.overrides);\n\ + });\n\ +\n\ + setter = lookup.setter.call(this, keypath);\n\ + }\n\ +\n\ + // TODO Transform this code to define property\n\ + array.thread = setter.callback_thread;\n\ + array.object = this;\n\ + array.key = keypath;\n\ +\n\ + // Override default array methods\n\ + $.extend(array, mutations.overrides);\n\ +\n\ + if (!this.observed.mutate) this.observed.mutate = mutations.mutate;\n\ + }\n\ +};\n\ +\n\ +mutations = {\n\ + mutate: function(thread, method, array) {\n\ + array.method = method;\n\ + thread.call(this, array);\n\ + this.publish(array.key, array); // TODO ver se é uma boa\n\ + delete array.method;\n\ + },\n\ + overrides: {\n\ + push: function() {\n\ + var i = arguments.length, operation;\n\ +\n\ + while (i--) {\n\ + !arguments[i].observed && $.type(arguments[i]) == 'object' && (arguments[i] = observable(arguments[i]));\n\ + }\n\ +\n\ + operation = Array.prototype.push.apply(this, arguments); // TODO Convert arguments for real array\n\ + this.object.observed.mutate.call(this.object, this.thread, 'push', this);\n\ + return operation;\n\ + }\n\ + }\n\ +};\n\ +\n\ +$('pop shift unshift'.split(' ')).each(function (i, method) {\n\ + mutations.overrides[method] = function () {\n\ + Array.prototype[method].apply(this, arguments);\n\ + this.object.observed.mutate.call(this.object, this.thread, method, this);\n\ + };\n\ +});\n\ +\n\ +if (typeof exports != 'undefined') {\n\ + exports.mixin = observable;\n\ +} else {\n\ + window.observable = observable;\n\ +}\n\ +//@ sourceURL=indefinido-observable/lib/observable.js" )); require.register("indefinido-observable/lib/adapters/rivets.js", Function("exports, require, module", -"exports.adapter = {\n subscribe: function(record, attribute_path, callback) {\n if (record == null) {\n throw new TypeError('observable.adapters.rivets.subscribe: No record provided for subscription');\n }\n return record.subscribe(attribute_path, callback);\n },\n unsubscribe: function(record, attribute_path, callback) {\n if (record == null) {\n throw new TypeError('observable.adapters.rivets.unsubscribe: No record provided for subscription');\n }\n return record.unsubscribe(attribute_path, callback);\n },\n read: function(record, attribute_path) {\n if (record == null) {\n throw new TypeError('observable.adapters.rivets.read: No record provided for subscription');\n }\n return record[attribute_path];\n },\n publish: function(record, attribute_path, value) {\n if (record == null) {\n throw new TypeError('observable.adapters.rivets.publish: No record provided for subscription');\n }\n return record[attribute_path] = value;\n }\n};\n//@ sourceURL=indefinido-observable/lib/adapters/rivets.js" +"exports.adapter = {\n\ + subscribe: function(record, attribute_path, callback) {\n\ + if (record == null) {\n\ + throw new TypeError('observable.adapters.rivets.subscribe: No record provided for subscription');\n\ + }\n\ + return record.subscribe(attribute_path, callback);\n\ + },\n\ + unsubscribe: function(record, attribute_path, callback) {\n\ + if (record == null) {\n\ + throw new TypeError('observable.adapters.rivets.unsubscribe: No record provided for subscription');\n\ + }\n\ + return record.unsubscribe(attribute_path, callback);\n\ + },\n\ + read: function(record, attribute_path) {\n\ + if (record == null) {\n\ + throw new TypeError('observable.adapters.rivets.read: No record provided for subscription');\n\ + }\n\ + return record[attribute_path];\n\ + },\n\ + publish: function(record, attribute_path, value) {\n\ + if (record == null) {\n\ + throw new TypeError('observable.adapters.rivets.publish: No record provided for subscription');\n\ + }\n\ + return record[attribute_path] = value;\n\ + }\n\ +};\n\ +//@ sourceURL=indefinido-observable/lib/adapters/rivets.js" )); require.register("indefinido-observable/vendor/shims/accessors.js", Function("exports, require, module", -"'use strict';\n\n(function () {\n // Cache native objects for better performacy and easy to use\n // references\n var ObjectProto = Object.prototype,\n hasOwnProp = ObjectProto.hasOwnProperty,\n getProp = Object.getOwnPropertyDescriptor,\n defineProp = Object.defineProperty,\n toStrings = [],\n features = null,\n stack = [], detach,\n prototypeBase = [Object, String, Array, Function, Boolean, Number, RegExp, Date, Error];\n\n // IE7 Does not have Element and Window defined, so only add them if\n // they exists check here\n if (typeof Element != 'undefined') prototypeBase.push(Element);\n if (typeof Window != 'undefined') prototypeBase.push(Window);\n\n features = {\n allowsNonEnumerableProperty: function () {\n var broken = false;\n try {\n defineProp({}, 'x', {})\n } catch(e) {\n broken = true;\n }\n\n return (!broken) && (!!defineProp);\n },\n supportsOnPropertyChangeEvent: function () {\n var test = document.createElement('domo');\n return 'onpropertychange' in test\n }\n }\n\n if (!features.allowsNonEnumerableProperty() && features.supportsOnPropertyChangeEvent()) {\n\n // Check if node is on document\n var inDocument = function inDocument (node) {\n var curr = node;\n while (curr != null) {\n curr = curr.parentNode;\n if (curr == document) return true;\n }\n return false;\n },\n\n // Generate property event handler for setting some property\n generate_setter = function generate_setter (object, property, descriptor) {\n var setter = function object_define_property_shim_change_listener (event) {\n var current_value, changed_value;\n if (\n // if we are setting this property\n event.propertyName == property\n\n // prevent firing setters again\n // by checking callstack\n && stack.indexOf(property) === -1\n ) {\n // Remove the event so it doesn't fire again and\n // create a loop\n object.detachEvent(\"onpropertychange\", setter);\n\n // If detaching the current setter\n // just remove the event listener\n if (detach) return;\n\n // get the changed value, run it through the set function\n changed_value = object[property];\n descriptor.set.call(object, changed_value);\n\n // Restore get function if it exists and there's no falsey value\n if (descriptor.get && descriptor.value && descriptor.value.toString != descriptor.bound_getter) {\n // TODO if (descriptor.get + '' === 'undefined') descriptor.get = ''; // Handle undefined getter\n descriptor.value.toString = descriptor.bound_getter\n }\n\n // Update stored values\n object[property] = descriptor.value = changed_value;\n\n // restore the event handler\n object.attachEvent(\"onpropertychange\", setter);\n\n // stack.pop();\n return false;\n }\n }\n\n return setter;\n }\n\n // Shim define property with apropriated fail cases exceptions\n Object.defineProperty = function (obj, prop, descriptor) {\n var fix;\n\n if (!obj.attachEvent) throw new TypeError('Object.defineProperty: First parameter must be a dom element.');\n\n if (!fix && !inDocument(obj)) throw new TypeError('Object.defineProperty: Dom element must be attached in document.');\n\n if (!descriptor) throw new TypeError('Object.defineProperty (object, property, descriptor): Descriptor must be an object, was \\'' + descriptor + '\\'.');\n\n if ((descriptor.get || descriptor.set) && descriptor.value) throw new TypeError('Object.defineProperty: Descriptor must have only getters and setters or value.');\n\n // Store current value in descriptor\n descriptor.value = descriptor.value || (descriptor.get && descriptor.get.call(obj)) || obj[prop];\n\n if (descriptor.get || descriptor.set) {\n // Detach old listeners if any\n detach = true;\n obj[prop] = 'detaching';\n detach = false;\n\n if (descriptor.get) {\n descriptor.bound_getter = $.extend($.proxy(descriptor.get, obj), descriptor.get);\n\n // We only bind the getter when we have a non falsey value\n if (descriptor.value) descriptor.value.toString = descriptor.bound_getter;\n\n // Although its not allowed for convention to have getters\n // and setters with the descriptor value, here we just reuse\n // the descriptor stored value\n obj[prop] = descriptor.value;\n }\n\n (fix || obj).attachEvent(\"onpropertychange\", generate_setter(obj, prop, descriptor));\n\n } else {\n obj[prop] = descriptor.value;\n }\n\n return obj;\n }\n\n // Allow others to check requirements for define property\n Object.defineProperty.requiresDomElement = true\n }\n\n\n // Since we shimed define property, we can also shim defineProperties\n if (!Object.defineProperties) {\n Object.defineProperties = function (obj, props) {\n for (var prop in props) {\n if (hasOwnProp.call(props, prop)) {\n Object.defineProperty(obj, prop, props[prop]);\n }\n }\n };\n }\n\n /* TODO Use define Property, and only define if\n non-enumerable properties are allowed\n\n also define __defineGetter__ and __defineSetter__\n if (!Object.defineProperty.requiresDomElement) {\n if (!Object.prototype.__lookupGetter__) {\n Object.__lookupGetter__ = function () {\n console && console.log('__lookupGetter__ not implemented yet');\n return null;\n }\n }\n\n if (!Object.__lookupSetter__) {\n Object.prototype.__lookupSetter__ = function () {\n console && console.log('__lookupSetter__ not implemented yet');\n return null;\n }\n }\n }\n */\n\n})();\n\n//@ sourceURL=indefinido-observable/vendor/shims/accessors.js" +"'use strict';\n\ +\n\ +(function () {\n\ + // Cache native objects for better performacy and easy to use\n\ + // references\n\ + var ObjectProto = Object.prototype,\n\ + hasOwnProp = ObjectProto.hasOwnProperty,\n\ + getProp = Object.getOwnPropertyDescriptor,\n\ + defineProp = Object.defineProperty,\n\ + toStrings = [],\n\ + features = null,\n\ + stack = [], detach,\n\ + prototypeBase = [Object, String, Array, Function, Boolean, Number, RegExp, Date, Error];\n\ +\n\ + // IE7 Does not have Element and Window defined, so only add them if\n\ + // they exists check here\n\ + if (typeof Element != 'undefined') prototypeBase.push(Element);\n\ + if (typeof Window != 'undefined') prototypeBase.push(Window);\n\ +\n\ + features = {\n\ + allowsNonEnumerableProperty: function () {\n\ + var broken = false;\n\ + try {\n\ + defineProp({}, 'x', {})\n\ + } catch(e) {\n\ + broken = true;\n\ + }\n\ +\n\ + return (!broken) && (!!defineProp);\n\ + },\n\ + supportsOnPropertyChangeEvent: function () {\n\ + var test = document.createElement('domo');\n\ + return 'onpropertychange' in test\n\ + }\n\ + }\n\ +\n\ + if (!features.allowsNonEnumerableProperty() && features.supportsOnPropertyChangeEvent()) {\n\ +\n\ + // Check if node is on document\n\ + var inDocument = function inDocument (node) {\n\ + var curr = node;\n\ + while (curr != null) {\n\ + curr = curr.parentNode;\n\ + if (curr == document) return true;\n\ + }\n\ + return false;\n\ + },\n\ +\n\ + // Generate property event handler for setting some property\n\ + generate_setter = function generate_setter (object, property, descriptor) {\n\ + var setter = function object_define_property_shim_change_listener (event) {\n\ + var current_value, changed_value;\n\ + if (\n\ + // if we are setting this property\n\ + event.propertyName == property\n\ +\n\ + // prevent firing setters again\n\ + // by checking callstack\n\ + && stack.indexOf(property) === -1\n\ + ) {\n\ + // Remove the event so it doesn't fire again and\n\ + // create a loop\n\ + object.detachEvent(\"onpropertychange\", setter);\n\ +\n\ + // If detaching the current setter\n\ + // just remove the event listener\n\ + if (detach) return;\n\ +\n\ + // get the changed value, run it through the set function\n\ + changed_value = object[property];\n\ + descriptor.set.call(object, changed_value);\n\ +\n\ + // Restore get function if it exists and there's no falsey value\n\ + if (descriptor.get && descriptor.value && descriptor.value.toString != descriptor.bound_getter) {\n\ + // TODO if (descriptor.get + '' === 'undefined') descriptor.get = ''; // Handle undefined getter\n\ + descriptor.value.toString = descriptor.bound_getter\n\ + }\n\ +\n\ + // Update stored values\n\ + object[property] = descriptor.value = changed_value;\n\ +\n\ + // restore the event handler\n\ + object.attachEvent(\"onpropertychange\", setter);\n\ +\n\ + // stack.pop();\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return setter;\n\ + }\n\ +\n\ + // Shim define property with apropriated fail cases exceptions\n\ + Object.defineProperty = function (obj, prop, descriptor) {\n\ + var fix;\n\ +\n\ + if (!obj.attachEvent) throw new TypeError('Object.defineProperty: First parameter must be a dom element.');\n\ +\n\ + if (!fix && !inDocument(obj)) throw new TypeError('Object.defineProperty: Dom element must be attached in document.');\n\ +\n\ + if (!descriptor) throw new TypeError('Object.defineProperty (object, property, descriptor): Descriptor must be an object, was \\'' + descriptor + '\\'.');\n\ +\n\ + if ((descriptor.get || descriptor.set) && descriptor.value) throw new TypeError('Object.defineProperty: Descriptor must have only getters and setters or value.');\n\ +\n\ + // Store current value in descriptor\n\ + descriptor.value = descriptor.value || (descriptor.get && descriptor.get.call(obj)) || obj[prop];\n\ +\n\ + if (descriptor.get || descriptor.set) {\n\ + // Detach old listeners if any\n\ + detach = true;\n\ + obj[prop] = 'detaching';\n\ + detach = false;\n\ +\n\ + if (descriptor.get) {\n\ + descriptor.bound_getter = $.extend($.proxy(descriptor.get, obj), descriptor.get);\n\ +\n\ + // We only bind the getter when we have a non falsey value\n\ + if (descriptor.value) descriptor.value.toString = descriptor.bound_getter;\n\ +\n\ + // Although its not allowed for convention to have getters\n\ + // and setters with the descriptor value, here we just reuse\n\ + // the descriptor stored value\n\ + obj[prop] = descriptor.value;\n\ + }\n\ +\n\ + (fix || obj).attachEvent(\"onpropertychange\", generate_setter(obj, prop, descriptor));\n\ +\n\ + } else {\n\ + obj[prop] = descriptor.value;\n\ + }\n\ +\n\ + return obj;\n\ + }\n\ +\n\ + // Allow others to check requirements for define property\n\ + Object.defineProperty.requiresDomElement = true\n\ + }\n\ +\n\ +\n\ + // Since we shimed define property, we can also shim defineProperties\n\ + if (!Object.defineProperties) {\n\ + Object.defineProperties = function (obj, props) {\n\ + for (var prop in props) {\n\ + if (hasOwnProp.call(props, prop)) {\n\ + Object.defineProperty(obj, prop, props[prop]);\n\ + }\n\ + }\n\ + };\n\ + }\n\ +\n\ + /* TODO Use define Property, and only define if\n\ + non-enumerable properties are allowed\n\ +\n\ + also define __defineGetter__ and __defineSetter__\n\ + if (!Object.defineProperty.requiresDomElement) {\n\ + if (!Object.prototype.__lookupGetter__) {\n\ + Object.__lookupGetter__ = function () {\n\ + console && console.log('__lookupGetter__ not implemented yet');\n\ + return null;\n\ + }\n\ + }\n\ +\n\ + if (!Object.__lookupSetter__) {\n\ + Object.prototype.__lookupSetter__ = function () {\n\ + console && console.log('__lookupSetter__ not implemented yet');\n\ + return null;\n\ + }\n\ + }\n\ + }\n\ + */\n\ +\n\ +})();\n\ +\n\ +//@ sourceURL=indefinido-observable/vendor/shims/accessors.js" )); require.register("indefinido-observable/vendor/shims/accessors-legacy.js", Function("exports, require, module", -"/*\n * Xccessors Legacy: Cross-browser legacy non-standard accessors\n * http://github.com/eligrey/Xccessors\n *\n * 2010-03-21\n *\n * By Elijah Grey, http://eligrey.com\n *\n * A shim that implements __defineGetter__, __defineSetter__, __lookupGetter__,\n * and __lookupSetter__\n * in browsers that have ECMAScript 5 accessor support but not the legacy methods.\n *\n * Public Domain.\n * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n*/\n\n/*global Element, Window, HTMLDocument */\n\n/*jslint white: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true,\n strict: true, newcap: true, immed: true, maxlen: 90 */\n\n/*! @source http://purl.eligrey.com/github/Xccessors/blob/master/xccessors-legacy.js*/\n\n\"use strict\";\n\n(function () {\n var\n defineProp = Object.defineProperty,\n getProp = Object.getOwnPropertyDescriptor,\n\n // methods being implemented\n methods = [\n \"__defineGetter__\", \"__defineSetter__\", \"__lookupGetter__\", \"__lookupSetter__\"\n ],\n\n // objects to implement legacy methods onto their prototypes\n // Object.prototype[method] doesn't work on everything for IE\n extend = [Object, String, Array, Function, Boolean, Number,\n RegExp, Date, Error],\n len = extend.length,\n proto = \"prototype\",\n extendMethod = function (method, fun) {\n var i = len;\n if (!(method in {})) {\n while (i--) {\n defineProp(extend[i][proto], method, {value: fun, enumerable: false})\n }\n }\n };\n\n // IE8 Does not support enumerable key so we abort!\n // TODO Fix this without cluttering the prototype\n try {defineProp({}, 'domo', {value: true, enumerable: false})} catch (e) {return;}\n\n // IE7 Does not have Element, Window defined, so we check here\n if (typeof Element != 'undefined') extend.push(Element);\n if (typeof Window != 'undefined') extend.push(Window);\n\n // IE9 Does not have html document defined, so we check here\n if (typeof HTMLDocument != 'undefined') extend.push(HTMLDocument);\n\n\n if (defineProp) {\n extendMethod(methods[0], function (prop, fun) { // __defineGetter__\n defineProp(this, prop, { get: fun });\n });\n\n extendMethod(methods[1], function (prop, fun) { // __defineSetter__\n defineProp(this, prop, { set: fun });\n });\n }\n\n if (getProp && !defineProp.requiresDomElement) {\n extendMethod(methods[2], function (prop) { // __lookupGetter__\n var descriptor = getProp(this, prop);\n if (descriptor && descriptor.get) return descriptor.get;\n\n // look in prototype too\n descriptor = getProp(this.constructor[proto], prop);\n if (descriptor && descriptor.get) return descriptor.get;\n });\n\n extendMethod(methods[3], function (prop) { // __lookupSetter__\n var descriptor = getProp(this, prop);\n if (descriptor && descriptor.set) return descriptor.set;\n\n // look in prototype too\n descriptor = getProp(this.constructor[proto], prop);\n if (descriptor && descriptor.set) return descriptor.set;\n });\n }\n}());\n//@ sourceURL=indefinido-observable/vendor/shims/accessors-legacy.js" +"/*\n\ + * Xccessors Legacy: Cross-browser legacy non-standard accessors\n\ + * http://github.com/eligrey/Xccessors\n\ + *\n\ + * 2010-03-21\n\ + *\n\ + * By Elijah Grey, http://eligrey.com\n\ + *\n\ + * A shim that implements __defineGetter__, __defineSetter__, __lookupGetter__,\n\ + * and __lookupSetter__\n\ + * in browsers that have ECMAScript 5 accessor support but not the legacy methods.\n\ + *\n\ + * Public Domain.\n\ + * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\ +*/\n\ +\n\ +/*global Element, Window, HTMLDocument */\n\ +\n\ +/*jslint white: true, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true,\n\ + strict: true, newcap: true, immed: true, maxlen: 90 */\n\ +\n\ +/*! @source http://purl.eligrey.com/github/Xccessors/blob/master/xccessors-legacy.js*/\n\ +\n\ +\"use strict\";\n\ +\n\ +(function () {\n\ + var\n\ + defineProp = Object.defineProperty,\n\ + getProp = Object.getOwnPropertyDescriptor,\n\ +\n\ + // methods being implemented\n\ + methods = [\n\ + \"__defineGetter__\", \"__defineSetter__\", \"__lookupGetter__\", \"__lookupSetter__\"\n\ + ],\n\ +\n\ + // objects to implement legacy methods onto their prototypes\n\ + // Object.prototype[method] doesn't work on everything for IE\n\ + extend = [Object, String, Array, Function, Boolean, Number,\n\ + RegExp, Date, Error],\n\ + len = extend.length,\n\ + proto = \"prototype\",\n\ + extendMethod = function (method, fun) {\n\ + var i = len;\n\ + if (!(method in {})) {\n\ + while (i--) {\n\ + defineProp(extend[i][proto], method, {value: fun, enumerable: false})\n\ + }\n\ + }\n\ + };\n\ +\n\ + // IE8 Does not support enumerable key so we abort!\n\ + // TODO Fix this without cluttering the prototype\n\ + try {defineProp({}, 'domo', {value: true, enumerable: false})} catch (e) {return;}\n\ +\n\ + // IE7 Does not have Element, Window defined, so we check here\n\ + if (typeof Element != 'undefined') extend.push(Element);\n\ + if (typeof Window != 'undefined') extend.push(Window);\n\ +\n\ + // IE9 Does not have html document defined, so we check here\n\ + if (typeof HTMLDocument != 'undefined') extend.push(HTMLDocument);\n\ +\n\ +\n\ + if (defineProp) {\n\ + extendMethod(methods[0], function (prop, fun) { // __defineGetter__\n\ + defineProp(this, prop, { get: fun });\n\ + });\n\ +\n\ + extendMethod(methods[1], function (prop, fun) { // __defineSetter__\n\ + defineProp(this, prop, { set: fun });\n\ + });\n\ + }\n\ +\n\ + if (getProp && !defineProp.requiresDomElement) {\n\ + extendMethod(methods[2], function (prop) { // __lookupGetter__\n\ + var descriptor = getProp(this, prop);\n\ + if (descriptor && descriptor.get) return descriptor.get;\n\ +\n\ + // look in prototype too\n\ + descriptor = getProp(this.constructor[proto], prop);\n\ + if (descriptor && descriptor.get) return descriptor.get;\n\ + });\n\ +\n\ + extendMethod(methods[3], function (prop) { // __lookupSetter__\n\ + var descriptor = getProp(this, prop);\n\ + if (descriptor && descriptor.set) return descriptor.set;\n\ +\n\ + // look in prototype too\n\ + descriptor = getProp(this.constructor[proto], prop);\n\ + if (descriptor && descriptor.set) return descriptor.set;\n\ + });\n\ + }\n\ +}());\n\ +//@ sourceURL=indefinido-observable/vendor/shims/accessors-legacy.js" )); require.register("indefinido-observable/vendor/shims/array.indexOf.js", Function("exports, require, module", -"if (!Array.prototype.indexOf) { \n Array.prototype.indexOf = function(obj, start) {\n for (var i = (start || 0), j = this.length; i < j; i++) {\n if (this[i] === obj) { return i; }\n }\n return -1;\n }\n}\n//@ sourceURL=indefinido-observable/vendor/shims/array.indexOf.js" +"if (!Array.prototype.indexOf) { \n\ + Array.prototype.indexOf = function(obj, start) {\n\ + for (var i = (start || 0), j = this.length; i < j; i++) {\n\ + if (this[i] === obj) { return i; }\n\ + }\n\ + return -1;\n\ + }\n\ +}\n\ +//@ sourceURL=indefinido-observable/vendor/shims/array.indexOf.js" )); require.register("indefinido-observable/vendor/shims/object.create.js", Function("exports, require, module", -"// ES5 15.2.3.5\n// http://es5.github.com/#x15.2.3.5\nif (!Object.create) {\n\n // Contributed by Brandon Benvie, October, 2012\n var createEmpty;\n var supportsProto = Object.prototype.__proto__ === null;\n if (supportsProto || typeof document == 'undefined') {\n createEmpty = function () {\n return { \"__proto__\": null };\n };\n } else {\n // In old IE __proto__ can't be used to manually set `null`, nor does\n // any other method exist to make an object that inherits from nothing,\n // aside from Object.prototype itself. Instead, create a new global\n // object and *steal* its Object.prototype and strip it bare. This is\n // used as the prototype to create nullary objects.\n createEmpty = function () {\n var iframe = document.createElement('iframe');\n var parent = document.body || document.documentElement;\n iframe.style.display = 'none';\n parent.appendChild(iframe);\n iframe.src = 'javascript:';\n var empty = iframe.contentWindow.Object.prototype;\n parent.removeChild(iframe);\n iframe = null;\n delete empty.constructor;\n delete empty.hasOwnProperty;\n delete empty.propertyIsEnumerable;\n delete empty.isPrototypeOf;\n delete empty.toLocaleString;\n delete empty.toString;\n delete empty.valueOf;\n empty.__proto__ = null;\n\n function Empty() {}\n Empty.prototype = empty;\n // short-circuit future calls\n createEmpty = function () {\n return new Empty();\n };\n return new Empty();\n };\n }\n\n Object.create = function create(prototype, properties) {\n\n var object;\n function Type() {} // An empty constructor.\n\n if (prototype === null) {\n object = createEmpty();\n } else {\n if (typeof prototype !== \"object\" && typeof prototype !== \"function\") {\n // In the native implementation `parent` can be `null`\n // OR *any* `instanceof Object` (Object|Function|Array|RegExp|etc)\n // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object`\n // like they are in modern browsers. Using `Object.create` on DOM elements\n // is...err...probably inappropriate, but the native version allows for it.\n throw new TypeError(\"Object prototype may only be an Object or null\"); // same msg as Chrome\n }\n Type.prototype = prototype;\n object = new Type();\n // IE has no built-in implementation of `Object.getPrototypeOf`\n // neither `__proto__`, but this manually setting `__proto__` will\n // guarantee that `Object.getPrototypeOf` will work as expected with\n // objects created using `Object.create`\n object.__proto__ = prototype;\n }\n\n if (properties !== void 0) {\n Object.defineProperties(object, properties);\n }\n\n return object;\n };\n}\n//@ sourceURL=indefinido-observable/vendor/shims/object.create.js" +"// ES5 15.2.3.5\n\ +// http://es5.github.com/#x15.2.3.5\n\ +if (!Object.create) {\n\ +\n\ + // Contributed by Brandon Benvie, October, 2012\n\ + var createEmpty;\n\ + var supportsProto = Object.prototype.__proto__ === null;\n\ + if (supportsProto || typeof document == 'undefined') {\n\ + createEmpty = function () {\n\ + return { \"__proto__\": null };\n\ + };\n\ + } else {\n\ + // In old IE __proto__ can't be used to manually set `null`, nor does\n\ + // any other method exist to make an object that inherits from nothing,\n\ + // aside from Object.prototype itself. Instead, create a new global\n\ + // object and *steal* its Object.prototype and strip it bare. This is\n\ + // used as the prototype to create nullary objects.\n\ + createEmpty = function () {\n\ + var iframe = document.createElement('iframe');\n\ + var parent = document.body || document.documentElement;\n\ + iframe.style.display = 'none';\n\ + parent.appendChild(iframe);\n\ + iframe.src = 'javascript:';\n\ + var empty = iframe.contentWindow.Object.prototype;\n\ + parent.removeChild(iframe);\n\ + iframe = null;\n\ + delete empty.constructor;\n\ + delete empty.hasOwnProperty;\n\ + delete empty.propertyIsEnumerable;\n\ + delete empty.isPrototypeOf;\n\ + delete empty.toLocaleString;\n\ + delete empty.toString;\n\ + delete empty.valueOf;\n\ + empty.__proto__ = null;\n\ +\n\ + function Empty() {}\n\ + Empty.prototype = empty;\n\ + // short-circuit future calls\n\ + createEmpty = function () {\n\ + return new Empty();\n\ + };\n\ + return new Empty();\n\ + };\n\ + }\n\ +\n\ + Object.create = function create(prototype, properties) {\n\ +\n\ + var object;\n\ + function Type() {} // An empty constructor.\n\ +\n\ + if (prototype === null) {\n\ + object = createEmpty();\n\ + } else {\n\ + if (typeof prototype !== \"object\" && typeof prototype !== \"function\") {\n\ + // In the native implementation `parent` can be `null`\n\ + // OR *any* `instanceof Object` (Object|Function|Array|RegExp|etc)\n\ + // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object`\n\ + // like they are in modern browsers. Using `Object.create` on DOM elements\n\ + // is...err...probably inappropriate, but the native version allows for it.\n\ + throw new TypeError(\"Object prototype may only be an Object or null\"); // same msg as Chrome\n\ + }\n\ + Type.prototype = prototype;\n\ + object = new Type();\n\ + // IE has no built-in implementation of `Object.getPrototypeOf`\n\ + // neither `__proto__`, but this manually setting `__proto__` will\n\ + // guarantee that `Object.getPrototypeOf` will work as expected with\n\ + // objects created using `Object.create`\n\ + object.__proto__ = prototype;\n\ + }\n\ +\n\ + if (properties !== void 0) {\n\ + Object.defineProperties(object, properties);\n\ + }\n\ +\n\ + return object;\n\ + };\n\ +}\n\ +//@ sourceURL=indefinido-observable/vendor/shims/object.create.js" )); require.register("indefinido-advisable/index.js", Function("exports, require, module", -"module.exports = require('./lib/advisable');\n//@ sourceURL=indefinido-advisable/index.js" +"module.exports = require('./lib/advisable');\n\ +//@ sourceURL=indefinido-advisable/index.js" )); require.register("indefinido-advisable/lib/advisable.js", Function("exports, require, module", -"var $, advice, mixin;\n\n$ = require('jquery');\n\nadvice = {\n around: function(base, wrapped) {\n return function() {\n var args;\n\n args = $.makeArray(arguments);\n return wrapped.apply(this, [$.proxy(base, this)].concat(args));\n };\n },\n before: function(base, before) {\n return this.around(base, function() {\n var args, orig;\n\n args = $.makeArray(arguments);\n orig = args.shift();\n before.apply(this, args);\n return orig.apply(this, args);\n });\n },\n after: function(base, after) {\n return this.around(base, function() {\n var args, orig, res;\n\n args = $.makeArray(arguments);\n orig = args.shift();\n res = orig.apply(this, args);\n after.apply(this, args);\n return res;\n });\n }\n};\n\nmixin = {\n before: function(method, advicer) {\n if (typeof this[method] === 'function') {\n return this[method] = advice.before(this[method], advicer);\n }\n throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n },\n after: function(method, advicer) {\n if (typeof this[method] === 'function') {\n return this[method] = advice.after(this[method], advicer);\n }\n throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n },\n around: function(method, advicer) {\n if (typeof this[method] === 'function') {\n return this[method] = advice.around(this[method], advicer);\n }\n throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n }\n};\n\nexports.mixin = function(object) {\n return $.extend(object, mixin);\n};\n//@ sourceURL=indefinido-advisable/lib/advisable.js" +"var $, advice, mixin;\n\ +\n\ +$ = require('jquery');\n\ +\n\ +advice = {\n\ + around: function(base, wrapped) {\n\ + return function() {\n\ + var args;\n\ +\n\ + args = $.makeArray(arguments);\n\ + return wrapped.apply(this, [$.proxy(base, this)].concat(args));\n\ + };\n\ + },\n\ + before: function(base, before) {\n\ + return this.around(base, function() {\n\ + var args, orig;\n\ +\n\ + args = $.makeArray(arguments);\n\ + orig = args.shift();\n\ + before.apply(this, args);\n\ + return orig.apply(this, args);\n\ + });\n\ + },\n\ + after: function(base, after) {\n\ + return this.around(base, function() {\n\ + var args, orig, res;\n\ +\n\ + args = $.makeArray(arguments);\n\ + orig = args.shift();\n\ + res = orig.apply(this, args);\n\ + after.apply(this, args);\n\ + return res;\n\ + });\n\ + }\n\ +};\n\ +\n\ +mixin = {\n\ + before: function(method, advicer) {\n\ + if (typeof this[method] === 'function') {\n\ + return this[method] = advice.before(this[method], advicer);\n\ + }\n\ + throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n\ + },\n\ + after: function(method, advicer) {\n\ + if (typeof this[method] === 'function') {\n\ + return this[method] = advice.after(this[method], advicer);\n\ + }\n\ + throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n\ + },\n\ + around: function(method, advicer) {\n\ + if (typeof this[method] === 'function') {\n\ + return this[method] = advice.around(this[method], advicer);\n\ + }\n\ + throw new TypeError(\"Can only advice functions, attribute \" + method + \" of \" + this + \" is of type \" + (typeof this[method]));\n\ + }\n\ +};\n\ +\n\ +exports.mixin = function(object) {\n\ + return $.extend(object, mixin);\n\ +};\n\ +//@ sourceURL=indefinido-advisable/lib/advisable.js" )); require.register("indemma/index.js", Function("exports, require, module", -"module.exports = require('./lib/record');\n//@ sourceURL=indemma/index.js" +"module.exports = require('./lib/record');\n\ +//@ sourceURL=indemma/index.js" )); require.register("indemma/vendor/stampit.js", Function("exports, require, module", -"(function(e){if(\"function\"==typeof bootstrap)bootstrap(\"stampit\",e);else if(\"object\"==typeof exports)module.exports=e();else if(\"function\"==typeof define&&define.amd)define(e);else if(\"undefined\"!=typeof ses){if(!ses.ok())return;ses.makeStampit=e}else\"undefined\"!=typeof window?window.stampit=e():global.stampit=e()})(function(){var define,ses,bootstrap,module,exports;\nreturn (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require==\"function\"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require==\"function\"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){\n\n\n /**\n * Array forEach\n */\n function forEach(arr, callback, thisObj) {\n if (arr == null) {\n return;\n }\n var i = -1,\n len = arr.length;\n while (++i < len) {\n // we iterate over sparse items since there is no way to make it\n // work properly on IE 7-8. see #64\n if ( callback.call(thisObj, arr[i], i, arr) === false ) {\n break;\n }\n }\n }\n\n module.exports = forEach;\n\n\n\n},{}],2:[function(require,module,exports){\n\n\n function slice(arr, offset){\n return Array.prototype.slice.call(arr, offset || 0);\n }\n\n /**\n * Return a function that will execute in the given context, optionally adding any additional supplied parameters to the beginning of the arguments collection.\n * @param {Function} fn Function.\n * @param {object} context Execution context.\n * @param {rest} args Arguments (0...n arguments).\n * @return {Function} Wrapped Function.\n */\n function bind(fn, context, args){\n var argsArr = slice(arguments, 2); //curried args\n return function(){\n return fn.apply(context, argsArr.concat(slice(arguments)));\n };\n }\n\n module.exports = bind;\n\n\n\n},{}],3:[function(require,module,exports){\nvar shimIndexOf = function shimIndexOf() {\n\n if (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\n \"use strict\";\n if (this == null) {\n throw new TypeError();\n }\n var t = Object(this);\n var len = t.length >>> 0;\n if (len === 0) {\n return -1;\n }\n var n = 0;\n if (arguments.length > 1) {\n n = Number(arguments[1]);\n if (n != n) { // shortcut for verifying if it's NaN\n n = 0;\n } else if (n != 0 && n != Infinity && n != -Infinity) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n }\n if (n >= len) {\n return -1;\n }\n var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n for (; k < len; k++) {\n if (k in t && t[k] === searchElement) {\n return k;\n }\n }\n return -1;\n }\n }\n\n}\n\nmodule.exports = shimIndexOf;\n\n},{}],4:[function(require,module,exports){\n/**\n * Stampit\n **\n * Create objects from reusable, composable behaviors.\n **\n * Copyright (c) 2013 Eric Elliott\n * http://opensource.org/licenses/MIT\n **/\n\n'use strict';\nvar forEach = require('mout/array/forEach');\nvar bind = require('mout/function/bind');\nvar mixIn = require('mout/object/mixIn');\nvar stringify = require('json-stringify-safe');\nvar indexOf = require('./indexof'); // shim indexOf for stringify\n\nvar create = function (o) {\n if (arguments.length > 1) {\n throw new Error('Object.create implementation only accepts the first parameter.');\n }\n function F() {}\n F.prototype = o;\n return new F();\n};\n\n/**\n * Return a factory function that will produce new objects using the\n * prototypes that are passed in or composed.\n *\n * @param {Object} [methods] A map of method names and bodies for delegation.\n * @param {Object} [state] A map of property names and values to clone for each new object.\n * @param {Function} [enclose] A closure (function) used to create private data and privileged methods.\n * @return {Function} factory A factory to produce objects using the given prototypes.\n * @return {Function} factory.create Just like calling the factory function.\n * @return {Object} factory.fixed An object map containing the fixed prototypes.\n * @return {Function} factory.methods Add methods to the methods prototype. Chainable.\n * @return {Function} factory.state Add properties to the state prototype. Chainable.\n * @return {Function} factory.enclose Add or replace the closure prototype. Not chainable.\n */\nvar stampit = function stampit(methods, state, enclose) {\n var fixed = {\n methods: methods || {},\n state: state ?\n JSON.parse(stringify(state)) :\n {},\n enclose: enclose\n },\n\n factory = function factory(properties, enclose) {\n var instance = mixIn(create(fixed.methods || {}),\n fixed.state, properties),\n alt;\n\n if (typeof fixed.enclose === 'function') {\n alt = fixed.enclose.call(instance);\n }\n\n if (typeof enclose === 'function') {\n alt = enclose.call(alt || instance);\n }\n\n return alt || instance;\n };\n\n return mixIn(factory, {\n create: factory,\n fixed: fixed,\n methods: function () {\n var obj = fixed.methods || {},\n args = [obj].concat([].slice.call(arguments));\n fixed.methods = mixIn.apply(this, args);\n return this;\n },\n state: function (state) {\n var obj = fixed.state || {},\n args = [obj].concat([].slice.call(arguments));\n fixed.state = mixIn.apply(this, args);\n return this;\n },\n enclose: function (enclose) {\n fixed.enclose = enclose;\n return this;\n }\n });\n};\n\n/**\n * Take two or more factories produced from stampit() and\n * combine them to produce a new factory. Combining overrides\n * properties with last-in priority.\n *\n * @param {...Function} factory A factory produced by stampit().\n * @return {Function} A new stampit factory composed from arguments.\n */\nvar compose = function compose() {\n var args = [].slice.call(arguments),\n initFunctions = [],\n obj = stampit(),\n props = ['methods', 'state'];\n\n forEach(args, function (source) {\n if (source) {\n forEach(props, function (prop) {\n if (source.fixed[prop]) {\n obj.fixed[prop] = mixIn(obj.fixed[prop],\n source.fixed[prop]);\n }\n });\n\n if (typeof source.fixed.enclose === 'function') {\n initFunctions.push(source.fixed.enclose);\n }\n }\n });\n\n return stampit(obj.fixed.methods, obj.fixed.state, function () {\n forEach(initFunctions, bind(function (fn) {\n fn.call(this);\n }, this));\n });\n};\n\nindexOf();\n\nmodule.exports = mixIn(stampit, {\n compose: compose,\n /**\n * Alias for mixIn\n */\n extend: mixIn,\n /**\n * Take a destination object followed by one or more source objects,\n * and copy the source object properties to the destination object,\n * with last in priority overrides.\n * @param {Object} destination An object to copy properties to.\n * @param {...Object} source An object to copy properties from.\n * @returns {Object}\n */\n mixIn: mixIn\n});\n\n},{\"mout/array/forEach\":1,\"mout/function/bind\":2,\"mout/object/mixIn\":5,\"./indexof\":3,\"json-stringify-safe\":6}],6:[function(require,module,exports){\nmodule.exports = stringify;\n\nfunction getSerialize (fn, decycle) {\n var seen = [];\n decycle = decycle || function(key, value) {\n return '[Circular]';\n };\n return function(key, value) {\n var ret = value;\n if (typeof value === 'object' && value) {\n if (seen.indexOf(value) !== -1)\n ret = decycle(key, value);\n else\n seen.push(value);\n }\n if (fn) ret = fn(key, ret);\n return ret;\n }\n}\n\nfunction stringify(obj, fn, spaces, decycle) {\n return JSON.stringify(obj, getSerialize(fn, decycle), spaces);\n}\n\nstringify.getSerialize = getSerialize;\n\n},{}],5:[function(require,module,exports){\nvar forOwn = require('./forOwn');\n\n /**\n * Combine properties from all the objects into first one.\n * - This method affects target object in place, if you want to create a new Object pass an empty object as first param.\n * @param {object} target Target Object\n * @param {...object} objects Objects to be combined (0...n objects).\n * @return {object} Target Object.\n */\n function mixIn(target, objects){\n var i = 0,\n n = arguments.length,\n obj;\n while(++i < n){\n obj = arguments[i];\n if (obj != null) {\n forOwn(obj, copyProp, target);\n }\n }\n return target;\n }\n\n function copyProp(val, key){\n this[key] = val;\n }\n\n module.exports = mixIn;\n\n\n},{\"./forOwn\":7}],7:[function(require,module,exports){\nvar hasOwn = require('./hasOwn');\nvar forIn = require('./forIn');\n\n /**\n * Similar to Array/forEach but works over object properties and fixes Don't\n * Enum bug on IE.\n * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n */\n function forOwn(obj, fn, thisObj){\n forIn(obj, function(val, key){\n if (hasOwn(obj, key)) {\n return fn.call(thisObj, obj[key], key, obj);\n }\n });\n }\n\n module.exports = forOwn;\n\n\n\n},{\"./hasOwn\":8,\"./forIn\":9}],8:[function(require,module,exports){\n\n\n /**\n * Safer Object.hasOwnProperty\n */\n function hasOwn(obj, prop){\n return Object.prototype.hasOwnProperty.call(obj, prop);\n }\n\n module.exports = hasOwn;\n\n\n\n},{}],9:[function(require,module,exports){\n\n\n var _hasDontEnumBug,\n _dontEnums;\n\n function checkDontEnum(){\n _dontEnums = [\n 'toString',\n 'toLocaleString',\n 'valueOf',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'constructor'\n ];\n\n _hasDontEnumBug = true;\n\n for (var key in {'toString': null}) {\n _hasDontEnumBug = false;\n }\n }\n\n /**\n * Similar to Array/forEach but works over object properties and fixes Don't\n * Enum bug on IE.\n * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n */\n function forIn(obj, fn, thisObj){\n var key, i = 0;\n // no need to check if argument is a real object that way we can use\n // it for arrays, functions, date, etc.\n\n //post-pone check till needed\n if (_hasDontEnumBug == null) checkDontEnum();\n\n for (key in obj) {\n if (exec(fn, obj, key, thisObj) === false) {\n break;\n }\n }\n\n if (_hasDontEnumBug) {\n while (key = _dontEnums[i++]) {\n // since we aren't using hasOwn check we need to make sure the\n // property was overwritten\n if (obj[key] !== Object.prototype[key]) {\n if (exec(fn, obj, key, thisObj) === false) {\n break;\n }\n }\n }\n }\n }\n\n function exec(fn, obj, key, thisObj){\n return fn.call(thisObj, obj[key], key, obj);\n }\n\n module.exports = forIn;\n\n\n\n},{}]},{},[4])(4)\n});\n;\n//@ sourceURL=indemma/vendor/stampit.js" +"(function(e){if(\"function\"==typeof bootstrap)bootstrap(\"stampit\",e);else if(\"object\"==typeof exports)module.exports=e();else if(\"function\"==typeof define&&define.amd)define(e);else if(\"undefined\"!=typeof ses){if(!ses.ok())return;ses.makeStampit=e}else\"undefined\"!=typeof window?window.stampit=e():global.stampit=e()})(function(){var define,ses,bootstrap,module,exports;\n\ +return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require==\"function\"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require==\"function\"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){\n\ +\n\ +\n\ + /**\n\ + * Array forEach\n\ + */\n\ + function forEach(arr, callback, thisObj) {\n\ + if (arr == null) {\n\ + return;\n\ + }\n\ + var i = -1,\n\ + len = arr.length;\n\ + while (++i < len) {\n\ + // we iterate over sparse items since there is no way to make it\n\ + // work properly on IE 7-8. see #64\n\ + if ( callback.call(thisObj, arr[i], i, arr) === false ) {\n\ + break;\n\ + }\n\ + }\n\ + }\n\ +\n\ + module.exports = forEach;\n\ +\n\ +\n\ +\n\ +},{}],2:[function(require,module,exports){\n\ +\n\ +\n\ + function slice(arr, offset){\n\ + return Array.prototype.slice.call(arr, offset || 0);\n\ + }\n\ +\n\ + /**\n\ + * Return a function that will execute in the given context, optionally adding any additional supplied parameters to the beginning of the arguments collection.\n\ + * @param {Function} fn Function.\n\ + * @param {object} context Execution context.\n\ + * @param {rest} args Arguments (0...n arguments).\n\ + * @return {Function} Wrapped Function.\n\ + */\n\ + function bind(fn, context, args){\n\ + var argsArr = slice(arguments, 2); //curried args\n\ + return function(){\n\ + return fn.apply(context, argsArr.concat(slice(arguments)));\n\ + };\n\ + }\n\ +\n\ + module.exports = bind;\n\ +\n\ +\n\ +\n\ +},{}],3:[function(require,module,exports){\n\ +var shimIndexOf = function shimIndexOf() {\n\ +\n\ + if (!Array.prototype.indexOf) {\n\ + Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\n\ + \"use strict\";\n\ + if (this == null) {\n\ + throw new TypeError();\n\ + }\n\ + var t = Object(this);\n\ + var len = t.length >>> 0;\n\ + if (len === 0) {\n\ + return -1;\n\ + }\n\ + var n = 0;\n\ + if (arguments.length > 1) {\n\ + n = Number(arguments[1]);\n\ + if (n != n) { // shortcut for verifying if it's NaN\n\ + n = 0;\n\ + } else if (n != 0 && n != Infinity && n != -Infinity) {\n\ + n = (n > 0 || -1) * Math.floor(Math.abs(n));\n\ + }\n\ + }\n\ + if (n >= len) {\n\ + return -1;\n\ + }\n\ + var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n\ + for (; k < len; k++) {\n\ + if (k in t && t[k] === searchElement) {\n\ + return k;\n\ + }\n\ + }\n\ + return -1;\n\ + }\n\ + }\n\ +\n\ +}\n\ +\n\ +module.exports = shimIndexOf;\n\ +\n\ +},{}],4:[function(require,module,exports){\n\ +/**\n\ + * Stampit\n\ + **\n\ + * Create objects from reusable, composable behaviors.\n\ + **\n\ + * Copyright (c) 2013 Eric Elliott\n\ + * http://opensource.org/licenses/MIT\n\ + **/\n\ +\n\ +'use strict';\n\ +var forEach = require('mout/array/forEach');\n\ +var bind = require('mout/function/bind');\n\ +var mixIn = require('mout/object/mixIn');\n\ +var stringify = require('json-stringify-safe');\n\ +var indexOf = require('./indexof'); // shim indexOf for stringify\n\ +\n\ +var create = function (o) {\n\ + if (arguments.length > 1) {\n\ + throw new Error('Object.create implementation only accepts the first parameter.');\n\ + }\n\ + function F() {}\n\ + F.prototype = o;\n\ + return new F();\n\ +};\n\ +\n\ +/**\n\ + * Return a factory function that will produce new objects using the\n\ + * prototypes that are passed in or composed.\n\ + *\n\ + * @param {Object} [methods] A map of method names and bodies for delegation.\n\ + * @param {Object} [state] A map of property names and values to clone for each new object.\n\ + * @param {Function} [enclose] A closure (function) used to create private data and privileged methods.\n\ + * @return {Function} factory A factory to produce objects using the given prototypes.\n\ + * @return {Function} factory.create Just like calling the factory function.\n\ + * @return {Object} factory.fixed An object map containing the fixed prototypes.\n\ + * @return {Function} factory.methods Add methods to the methods prototype. Chainable.\n\ + * @return {Function} factory.state Add properties to the state prototype. Chainable.\n\ + * @return {Function} factory.enclose Add or replace the closure prototype. Not chainable.\n\ + */\n\ +var stampit = function stampit(methods, state, enclose) {\n\ + var fixed = {\n\ + methods: methods || {},\n\ + state: state ?\n\ + JSON.parse(stringify(state)) :\n\ + {},\n\ + enclose: enclose\n\ + },\n\ +\n\ + factory = function factory(properties, enclose) {\n\ + var instance = mixIn(create(fixed.methods || {}),\n\ + fixed.state, properties),\n\ + alt;\n\ +\n\ + if (typeof fixed.enclose === 'function') {\n\ + alt = fixed.enclose.call(instance);\n\ + }\n\ +\n\ + if (typeof enclose === 'function') {\n\ + alt = enclose.call(alt || instance);\n\ + }\n\ +\n\ + return alt || instance;\n\ + };\n\ +\n\ + return mixIn(factory, {\n\ + create: factory,\n\ + fixed: fixed,\n\ + methods: function () {\n\ + var obj = fixed.methods || {},\n\ + args = [obj].concat([].slice.call(arguments));\n\ + fixed.methods = mixIn.apply(this, args);\n\ + return this;\n\ + },\n\ + state: function (state) {\n\ + var obj = fixed.state || {},\n\ + args = [obj].concat([].slice.call(arguments));\n\ + fixed.state = mixIn.apply(this, args);\n\ + return this;\n\ + },\n\ + enclose: function (enclose) {\n\ + fixed.enclose = enclose;\n\ + return this;\n\ + }\n\ + });\n\ +};\n\ +\n\ +/**\n\ + * Take two or more factories produced from stampit() and\n\ + * combine them to produce a new factory. Combining overrides\n\ + * properties with last-in priority.\n\ + *\n\ + * @param {...Function} factory A factory produced by stampit().\n\ + * @return {Function} A new stampit factory composed from arguments.\n\ + */\n\ +var compose = function compose() {\n\ + var args = [].slice.call(arguments),\n\ + initFunctions = [],\n\ + obj = stampit(),\n\ + props = ['methods', 'state'];\n\ +\n\ + forEach(args, function (source) {\n\ + if (source) {\n\ + forEach(props, function (prop) {\n\ + if (source.fixed[prop]) {\n\ + obj.fixed[prop] = mixIn(obj.fixed[prop],\n\ + source.fixed[prop]);\n\ + }\n\ + });\n\ +\n\ + if (typeof source.fixed.enclose === 'function') {\n\ + initFunctions.push(source.fixed.enclose);\n\ + }\n\ + }\n\ + });\n\ +\n\ + return stampit(obj.fixed.methods, obj.fixed.state, function () {\n\ + forEach(initFunctions, bind(function (fn) {\n\ + fn.call(this);\n\ + }, this));\n\ + });\n\ +};\n\ +\n\ +indexOf();\n\ +\n\ +module.exports = mixIn(stampit, {\n\ + compose: compose,\n\ + /**\n\ + * Alias for mixIn\n\ + */\n\ + extend: mixIn,\n\ + /**\n\ + * Take a destination object followed by one or more source objects,\n\ + * and copy the source object properties to the destination object,\n\ + * with last in priority overrides.\n\ + * @param {Object} destination An object to copy properties to.\n\ + * @param {...Object} source An object to copy properties from.\n\ + * @returns {Object}\n\ + */\n\ + mixIn: mixIn\n\ +});\n\ +\n\ +},{\"mout/array/forEach\":1,\"mout/function/bind\":2,\"mout/object/mixIn\":5,\"./indexof\":3,\"json-stringify-safe\":6}],6:[function(require,module,exports){\n\ +module.exports = stringify;\n\ +\n\ +function getSerialize (fn, decycle) {\n\ + var seen = [];\n\ + decycle = decycle || function(key, value) {\n\ + return '[Circular]';\n\ + };\n\ + return function(key, value) {\n\ + var ret = value;\n\ + if (typeof value === 'object' && value) {\n\ + if (seen.indexOf(value) !== -1)\n\ + ret = decycle(key, value);\n\ + else\n\ + seen.push(value);\n\ + }\n\ + if (fn) ret = fn(key, ret);\n\ + return ret;\n\ + }\n\ +}\n\ +\n\ +function stringify(obj, fn, spaces, decycle) {\n\ + return JSON.stringify(obj, getSerialize(fn, decycle), spaces);\n\ +}\n\ +\n\ +stringify.getSerialize = getSerialize;\n\ +\n\ +},{}],5:[function(require,module,exports){\n\ +var forOwn = require('./forOwn');\n\ +\n\ + /**\n\ + * Combine properties from all the objects into first one.\n\ + * - This method affects target object in place, if you want to create a new Object pass an empty object as first param.\n\ + * @param {object} target Target Object\n\ + * @param {...object} objects Objects to be combined (0...n objects).\n\ + * @return {object} Target Object.\n\ + */\n\ + function mixIn(target, objects){\n\ + var i = 0,\n\ + n = arguments.length,\n\ + obj;\n\ + while(++i < n){\n\ + obj = arguments[i];\n\ + if (obj != null) {\n\ + forOwn(obj, copyProp, target);\n\ + }\n\ + }\n\ + return target;\n\ + }\n\ +\n\ + function copyProp(val, key){\n\ + this[key] = val;\n\ + }\n\ +\n\ + module.exports = mixIn;\n\ +\n\ +\n\ +},{\"./forOwn\":7}],7:[function(require,module,exports){\n\ +var hasOwn = require('./hasOwn');\n\ +var forIn = require('./forIn');\n\ +\n\ + /**\n\ + * Similar to Array/forEach but works over object properties and fixes Don't\n\ + * Enum bug on IE.\n\ + * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\ + */\n\ + function forOwn(obj, fn, thisObj){\n\ + forIn(obj, function(val, key){\n\ + if (hasOwn(obj, key)) {\n\ + return fn.call(thisObj, obj[key], key, obj);\n\ + }\n\ + });\n\ + }\n\ +\n\ + module.exports = forOwn;\n\ +\n\ +\n\ +\n\ +},{\"./hasOwn\":8,\"./forIn\":9}],8:[function(require,module,exports){\n\ +\n\ +\n\ + /**\n\ + * Safer Object.hasOwnProperty\n\ + */\n\ + function hasOwn(obj, prop){\n\ + return Object.prototype.hasOwnProperty.call(obj, prop);\n\ + }\n\ +\n\ + module.exports = hasOwn;\n\ +\n\ +\n\ +\n\ +},{}],9:[function(require,module,exports){\n\ +\n\ +\n\ + var _hasDontEnumBug,\n\ + _dontEnums;\n\ +\n\ + function checkDontEnum(){\n\ + _dontEnums = [\n\ + 'toString',\n\ + 'toLocaleString',\n\ + 'valueOf',\n\ + 'hasOwnProperty',\n\ + 'isPrototypeOf',\n\ + 'propertyIsEnumerable',\n\ + 'constructor'\n\ + ];\n\ +\n\ + _hasDontEnumBug = true;\n\ +\n\ + for (var key in {'toString': null}) {\n\ + _hasDontEnumBug = false;\n\ + }\n\ + }\n\ +\n\ + /**\n\ + * Similar to Array/forEach but works over object properties and fixes Don't\n\ + * Enum bug on IE.\n\ + * based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n\ + */\n\ + function forIn(obj, fn, thisObj){\n\ + var key, i = 0;\n\ + // no need to check if argument is a real object that way we can use\n\ + // it for arrays, functions, date, etc.\n\ +\n\ + //post-pone check till needed\n\ + if (_hasDontEnumBug == null) checkDontEnum();\n\ +\n\ + for (key in obj) {\n\ + if (exec(fn, obj, key, thisObj) === false) {\n\ + break;\n\ + }\n\ + }\n\ +\n\ + if (_hasDontEnumBug) {\n\ + while (key = _dontEnums[i++]) {\n\ + // since we aren't using hasOwn check we need to make sure the\n\ + // property was overwritten\n\ + if (obj[key] !== Object.prototype[key]) {\n\ + if (exec(fn, obj, key, thisObj) === false) {\n\ + break;\n\ + }\n\ + }\n\ + }\n\ + }\n\ + }\n\ +\n\ + function exec(fn, obj, key, thisObj){\n\ + return fn.call(thisObj, obj[key], key, obj);\n\ + }\n\ +\n\ + module.exports = forIn;\n\ +\n\ +\n\ +\n\ +},{}]},{},[4])(4)\n\ +});\n\ +;\n\ +//@ sourceURL=indemma/vendor/stampit.js" )); require.register("indemma/vendor/sinon.js", Function("exports, require, module", -"/**\n * Sinon.JS 1.7.3, 2013/06/20\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n *\n * (The BSD License)\n * \n * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n * * Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * * Neither the name of Christian Johansen nor the names of his contributors\n * may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nthis.sinon = (function () {\nvar buster = (function (setTimeout, B) {\n var isNode = typeof require == \"function\" && typeof module == \"object\";\n var div = typeof document != \"undefined\" && document.createElement(\"div\");\n var F = function () {};\n\n var buster = {\n bind: function bind(obj, methOrProp) {\n var method = typeof methOrProp == \"string\" ? obj[methOrProp] : methOrProp;\n var args = Array.prototype.slice.call(arguments, 2);\n return function () {\n var allArgs = args.concat(Array.prototype.slice.call(arguments));\n return method.apply(obj, allArgs);\n };\n },\n\n partial: function partial(fn) {\n var args = [].slice.call(arguments, 1);\n return function () {\n return fn.apply(this, args.concat([].slice.call(arguments)));\n };\n },\n\n create: function create(object) {\n F.prototype = object;\n return new F();\n },\n\n extend: function extend(target) {\n if (!target) { return; }\n for (var i = 1, l = arguments.length, prop; i < l; ++i) {\n for (prop in arguments[i]) {\n target[prop] = arguments[i][prop];\n }\n }\n return target;\n },\n\n nextTick: function nextTick(callback) {\n if (typeof process != \"undefined\" && process.nextTick) {\n return process.nextTick(callback);\n }\n setTimeout(callback, 0);\n },\n\n functionName: function functionName(func) {\n if (!func) return \"\";\n if (func.displayName) return func.displayName;\n if (func.name) return func.name;\n var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n return matches && matches[1] || \"\";\n },\n\n isNode: function isNode(obj) {\n if (!div) return false;\n try {\n obj.appendChild(div);\n obj.removeChild(div);\n } catch (e) {\n return false;\n }\n return true;\n },\n\n isElement: function isElement(obj) {\n return obj && obj.nodeType === 1 && buster.isNode(obj);\n },\n\n isArray: function isArray(arr) {\n return Object.prototype.toString.call(arr) == \"[object Array]\";\n },\n\n flatten: function flatten(arr) {\n var result = [], arr = arr || [];\n for (var i = 0, l = arr.length; i < l; ++i) {\n result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);\n }\n return result;\n },\n\n each: function each(arr, callback) {\n for (var i = 0, l = arr.length; i < l; ++i) {\n callback(arr[i]);\n }\n },\n\n map: function map(arr, callback) {\n var results = [];\n for (var i = 0, l = arr.length; i < l; ++i) {\n results.push(callback(arr[i]));\n }\n return results;\n },\n\n parallel: function parallel(fns, callback) {\n function cb(err, res) {\n if (typeof callback == \"function\") {\n callback(err, res);\n callback = null;\n }\n }\n if (fns.length == 0) { return cb(null, []); }\n var remaining = fns.length, results = [];\n function makeDone(num) {\n return function done(err, result) {\n if (err) { return cb(err); }\n results[num] = result;\n if (--remaining == 0) { cb(null, results); }\n };\n }\n for (var i = 0, l = fns.length; i < l; ++i) {\n fns[i](makeDone(i));\n }\n },\n\n series: function series(fns, callback) {\n function cb(err, res) {\n if (typeof callback == \"function\") {\n callback(err, res);\n }\n }\n var remaining = fns.slice();\n var results = [];\n function callNext() {\n if (remaining.length == 0) return cb(null, results);\n var promise = remaining.shift()(next);\n if (promise && typeof promise.then == \"function\") {\n promise.then(buster.partial(next, null), next);\n }\n }\n function next(err, result) {\n if (err) return cb(err);\n results.push(result);\n callNext();\n }\n callNext();\n },\n\n countdown: function countdown(num, done) {\n return function () {\n if (--num == 0) done();\n };\n }\n };\n\n if (typeof process === \"object\" &&\n typeof require === \"function\" && typeof module === \"object\") {\n var crypto = require(\"crypto\");\n var path = require(\"path\");\n\n buster.tmpFile = function (fileName) {\n var hashed = crypto.createHash(\"sha1\");\n hashed.update(fileName);\n var tmpfileName = hashed.digest(\"hex\");\n\n if (process.platform == \"win32\") {\n return path.join(process.env[\"TEMP\"], tmpfileName);\n } else {\n return path.join(\"/tmp\", tmpfileName);\n }\n };\n }\n\n if (Array.prototype.some) {\n buster.some = function (arr, fn, thisp) {\n return arr.some(fn, thisp);\n };\n } else {\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n buster.some = function (arr, fun, thisp) {\n if (arr == null) { throw new TypeError(); }\n arr = Object(arr);\n var len = arr.length >>> 0;\n if (typeof fun !== \"function\") { throw new TypeError(); }\n\n for (var i = 0; i < len; i++) {\n if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n if (Array.prototype.filter) {\n buster.filter = function (arr, fn, thisp) {\n return arr.filter(fn, thisp);\n };\n } else {\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter\n buster.filter = function (fn, thisp) {\n if (this == null) { throw new TypeError(); }\n\n var t = Object(this);\n var len = t.length >>> 0;\n if (typeof fn != \"function\") { throw new TypeError(); }\n\n var res = [];\n for (var i = 0; i < len; i++) {\n if (i in t) {\n var val = t[i]; // in case fun mutates this\n if (fn.call(thisp, val, i, t)) { res.push(val); }\n }\n }\n\n return res;\n };\n }\n\n if (isNode) {\n module.exports = buster;\n buster.eventEmitter = require(\"./buster-event-emitter\");\n Object.defineProperty(buster, \"defineVersionGetter\", {\n get: function () {\n return require(\"./define-version-getter\");\n }\n });\n }\n\n return buster.extend(B || {}, buster);\n}(setTimeout, buster));\nif (typeof buster === \"undefined\") {\n var buster = {};\n}\n\nif (typeof module === \"object\" && typeof require === \"function\") {\n buster = require(\"buster-core\");\n}\n\nbuster.format = buster.format || {};\nbuster.format.excludeConstructors = [\"Object\", /^.$/];\nbuster.format.quoteStrings = true;\n\nbuster.format.ascii = (function () {\n \n var hasOwn = Object.prototype.hasOwnProperty;\n\n var specialObjects = [];\n if (typeof global != \"undefined\") {\n specialObjects.push({ obj: global, value: \"[object global]\" });\n }\n if (typeof document != \"undefined\") {\n specialObjects.push({ obj: document, value: \"[object HTMLDocument]\" });\n }\n if (typeof window != \"undefined\") {\n specialObjects.push({ obj: window, value: \"[object Window]\" });\n }\n\n function keys(object) {\n var k = Object.keys && Object.keys(object) || [];\n\n if (k.length == 0) {\n for (var prop in object) {\n if (hasOwn.call(object, prop)) {\n k.push(prop);\n }\n }\n }\n\n return k.sort();\n }\n\n function isCircular(object, objects) {\n if (typeof object != \"object\") {\n return false;\n }\n\n for (var i = 0, l = objects.length; i < l; ++i) {\n if (objects[i] === object) {\n return true;\n }\n }\n\n return false;\n }\n\n function ascii(object, processed, indent) {\n if (typeof object == \"string\") {\n var quote = typeof this.quoteStrings != \"boolean\" || this.quoteStrings;\n return processed || quote ? '\"' + object + '\"' : object;\n }\n\n if (typeof object == \"function\" && !(object instanceof RegExp)) {\n return ascii.func(object);\n }\n\n processed = processed || [];\n\n if (isCircular(object, processed)) {\n return \"[Circular]\";\n }\n\n if (Object.prototype.toString.call(object) == \"[object Array]\") {\n return ascii.array.call(this, object, processed);\n }\n\n if (!object) {\n return \"\" + object;\n }\n\n if (buster.isElement(object)) {\n return ascii.element(object);\n }\n\n if (typeof object.toString == \"function\" &&\n object.toString !== Object.prototype.toString) {\n return object.toString();\n }\n\n for (var i = 0, l = specialObjects.length; i < l; i++) {\n if (object === specialObjects[i].obj) {\n return specialObjects[i].value;\n }\n }\n\n return ascii.object.call(this, object, processed, indent);\n }\n\n ascii.func = function (func) {\n return \"function \" + buster.functionName(func) + \"() {}\";\n };\n\n ascii.array = function (array, processed) {\n processed = processed || [];\n processed.push(array);\n var pieces = [];\n\n for (var i = 0, l = array.length; i < l; ++i) {\n pieces.push(ascii.call(this, array[i], processed));\n }\n\n return \"[\" + pieces.join(\", \") + \"]\";\n };\n\n ascii.object = function (object, processed, indent) {\n processed = processed || [];\n processed.push(object);\n indent = indent || 0;\n var pieces = [], properties = keys(object), prop, str, obj;\n var is = \"\";\n var length = 3;\n\n for (var i = 0, l = indent; i < l; ++i) {\n is += \" \";\n }\n\n for (i = 0, l = properties.length; i < l; ++i) {\n prop = properties[i];\n obj = object[prop];\n\n if (isCircular(obj, processed)) {\n str = \"[Circular]\";\n } else {\n str = ascii.call(this, obj, processed, indent + 2);\n }\n\n str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n length += str.length;\n pieces.push(str);\n }\n\n var cons = ascii.constructorName.call(this, object);\n var prefix = cons ? \"[\" + cons + \"] \" : \"\"\n\n return (length + indent) > 80 ?\n prefix + \"{\\n \" + is + pieces.join(\",\\n \" + is) + \"\\n\" + is + \"}\" :\n prefix + \"{ \" + pieces.join(\", \") + \" }\";\n };\n\n ascii.element = function (element) {\n var tagName = element.tagName.toLowerCase();\n var attrs = element.attributes, attribute, pairs = [], attrName;\n\n for (var i = 0, l = attrs.length; i < l; ++i) {\n attribute = attrs.item(i);\n attrName = attribute.nodeName.toLowerCase().replace(\"html:\", \"\");\n\n if (attrName == \"contenteditable\" && attribute.nodeValue == \"inherit\") {\n continue;\n }\n\n if (!!attribute.nodeValue) {\n pairs.push(attrName + \"=\\\"\" + attribute.nodeValue + \"\\\"\");\n }\n }\n\n var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n var content = element.innerHTML;\n\n if (content.length > 20) {\n content = content.substr(0, 20) + \"[...]\";\n }\n\n var res = formatted + pairs.join(\" \") + \">\" + content + \"</\" + tagName + \">\";\n\n return res.replace(/ contentEditable=\"inherit\"/, \"\");\n };\n\n ascii.constructorName = function (object) {\n var name = buster.functionName(object && object.constructor);\n var excludes = this.excludeConstructors || buster.format.excludeConstructors || [];\n\n for (var i = 0, l = excludes.length; i < l; ++i) {\n if (typeof excludes[i] == \"string\" && excludes[i] == name) {\n return \"\";\n } else if (excludes[i].test && excludes[i].test(name)) {\n return \"\";\n }\n }\n\n return name;\n };\n\n return ascii;\n}());\n\nif (typeof module != \"undefined\") {\n module.exports = buster.format;\n}\n/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/\n/*global module, require, __dirname, document*/\n/**\n * Sinon core utilities. For internal use only.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nvar sinon = (function (buster) {\n var div = typeof document != \"undefined\" && document.createElement(\"div\");\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function isDOMNode(obj) {\n var success = false;\n\n try {\n obj.appendChild(div);\n success = div.parentNode == obj;\n } catch (e) {\n return false;\n } finally {\n try {\n obj.removeChild(div);\n } catch (e) {\n // Remove failed, not much we can do about that\n }\n }\n\n return success;\n }\n\n function isElement(obj) {\n return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n }\n\n function isFunction(obj) {\n return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n }\n\n function mirrorProperties(target, source) {\n for (var prop in source) {\n if (!hasOwn.call(target, prop)) {\n target[prop] = source[prop];\n }\n }\n }\n\n function isRestorable (obj) {\n return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n }\n\n var sinon = {\n wrapMethod: function wrapMethod(object, property, method) {\n if (!object) {\n throw new TypeError(\"Should wrap property of object\");\n }\n\n if (typeof method != \"function\") {\n throw new TypeError(\"Method wrapper should be function\");\n }\n\n var wrappedMethod = object[property];\n\n if (!isFunction(wrappedMethod)) {\n throw new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n property + \" as function\");\n }\n\n if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n throw new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n }\n\n if (wrappedMethod.calledBefore) {\n var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n throw new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n }\n\n // IE 8 does not support hasOwnProperty on the window object.\n var owned = hasOwn.call(object, property);\n object[property] = method;\n method.displayName = property;\n\n method.restore = function () {\n // For prototype properties try to reset by delete first.\n // If this fails (ex: localStorage on mobile safari) then force a reset\n // via direct assignment.\n if (!owned) {\n delete object[property];\n }\n if (object[property] === method) {\n object[property] = wrappedMethod;\n }\n };\n\n method.restore.sinon = true;\n mirrorProperties(method, wrappedMethod);\n\n return method;\n },\n\n extend: function extend(target) {\n for (var i = 1, l = arguments.length; i < l; i += 1) {\n for (var prop in arguments[i]) {\n if (arguments[i].hasOwnProperty(prop)) {\n target[prop] = arguments[i][prop];\n }\n\n // DONT ENUM bug, only care about toString\n if (arguments[i].hasOwnProperty(\"toString\") &&\n arguments[i].toString != target.toString) {\n target.toString = arguments[i].toString;\n }\n }\n }\n\n return target;\n },\n\n create: function create(proto) {\n var F = function () {};\n F.prototype = proto;\n return new F();\n },\n\n deepEqual: function deepEqual(a, b) {\n if (sinon.match && sinon.match.isMatcher(a)) {\n return a.test(b);\n }\n if (typeof a != \"object\" || typeof b != \"object\") {\n return a === b;\n }\n\n if (isElement(a) || isElement(b)) {\n return a === b;\n }\n\n if (a === b) {\n return true;\n }\n\n if ((a === null && b !== null) || (a !== null && b === null)) {\n return false;\n }\n\n var aString = Object.prototype.toString.call(a);\n if (aString != Object.prototype.toString.call(b)) {\n return false;\n }\n\n if (aString == \"[object Array]\") {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0, l = a.length; i < l; i += 1) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n if (aString == \"[object Date]\") {\n return a.valueOf() === b.valueOf();\n }\n\n var prop, aLength = 0, bLength = 0;\n\n for (prop in a) {\n aLength += 1;\n\n if (!deepEqual(a[prop], b[prop])) {\n return false;\n }\n }\n\n for (prop in b) {\n bLength += 1;\n }\n\n return aLength == bLength;\n },\n\n functionName: function functionName(func) {\n var name = func.displayName || func.name;\n\n // Use function decomposition as a last resort to get function\n // name. Does not rely on function decomposition to work - if it\n // doesn't debugging will be slightly less informative\n // (i.e. toString will say 'spy' rather than 'myFunc').\n if (!name) {\n var matches = func.toString().match(/function ([^\\s\\(]+)/);\n name = matches && matches[1];\n }\n\n return name;\n },\n\n functionToString: function toString() {\n if (this.getCall && this.callCount) {\n var thisValue, prop, i = this.callCount;\n\n while (i--) {\n thisValue = this.getCall(i).thisValue;\n\n for (prop in thisValue) {\n if (thisValue[prop] === this) {\n return prop;\n }\n }\n }\n }\n\n return this.displayName || \"sinon fake\";\n },\n\n getConfig: function (custom) {\n var config = {};\n custom = custom || {};\n var defaults = sinon.defaultConfig;\n\n for (var prop in defaults) {\n if (defaults.hasOwnProperty(prop)) {\n config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n }\n }\n\n return config;\n },\n\n format: function (val) {\n return \"\" + val;\n },\n\n defaultConfig: {\n injectIntoThis: true,\n injectInto: null,\n properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n useFakeTimers: true,\n useFakeServer: true\n },\n\n timesInWords: function timesInWords(count) {\n return count == 1 && \"once\" ||\n count == 2 && \"twice\" ||\n count == 3 && \"thrice\" ||\n (count || 0) + \" times\";\n },\n\n calledInOrder: function (spies) {\n for (var i = 1, l = spies.length; i < l; i++) {\n if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n return false;\n }\n }\n\n return true;\n },\n\n orderByFirstCall: function (spies) {\n return spies.sort(function (a, b) {\n // uuid, won't ever be equal\n var aCall = a.getCall(0);\n var bCall = b.getCall(0);\n var aId = aCall && aCall.callId || -1;\n var bId = bCall && bCall.callId || -1;\n\n return aId < bId ? -1 : 1;\n });\n },\n\n log: function () {},\n\n logError: function (label, err) {\n var msg = label + \" threw exception: \"\n sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n if (err.stack) { sinon.log(err.stack); }\n\n setTimeout(function () {\n err.message = msg + err.message;\n throw err;\n }, 0);\n },\n\n typeOf: function (value) {\n if (value === null) {\n return \"null\";\n }\n else if (value === undefined) {\n return \"undefined\";\n }\n var string = Object.prototype.toString.call(value);\n return string.substring(8, string.length - 1).toLowerCase();\n },\n\n createStubInstance: function (constructor) {\n if (typeof constructor !== \"function\") {\n throw new TypeError(\"The constructor should be a function.\");\n }\n return sinon.stub(sinon.create(constructor.prototype));\n },\n\n restore: function (object) {\n if (object !== null && typeof object === \"object\") {\n for (var prop in object) {\n if (isRestorable(object[prop])) {\n object[prop].restore();\n }\n }\n }\n else if (isRestorable(object)) {\n object.restore();\n }\n }\n };\n\n var isNode = typeof module == \"object\" && typeof require == \"function\";\n\n if (isNode) {\n try {\n buster = { format: require(\"buster-format\") };\n } catch (e) {}\n module.exports = sinon;\n module.exports.spy = require(\"./sinon/spy\");\n module.exports.stub = require(\"./sinon/stub\");\n module.exports.mock = require(\"./sinon/mock\");\n module.exports.collection = require(\"./sinon/collection\");\n module.exports.assert = require(\"./sinon/assert\");\n module.exports.sandbox = require(\"./sinon/sandbox\");\n module.exports.test = require(\"./sinon/test\");\n module.exports.testCase = require(\"./sinon/test_case\");\n module.exports.assert = require(\"./sinon/assert\");\n module.exports.match = require(\"./sinon/match\");\n }\n\n if (buster) {\n var formatter = sinon.create(buster.format);\n formatter.quoteStrings = false;\n sinon.format = function () {\n return formatter.ascii.apply(formatter, arguments);\n };\n } else if (isNode) {\n try {\n var util = require(\"util\");\n sinon.format = function (value) {\n return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n };\n } catch (e) {\n /* Node, but no util module - would be very old, but better safe than\n sorry */\n }\n }\n\n return sinon;\n}(typeof buster == \"object\" && buster));\n\n/* @depend ../sinon.js */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Match functions\n *\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2012 Maximilian Antoni\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function assertType(value, type, name) {\n var actual = sinon.typeOf(value);\n if (actual !== type) {\n throw new TypeError(\"Expected type of \" + name + \" to be \" +\n type + \", but was \" + actual);\n }\n }\n\n var matcher = {\n toString: function () {\n return this.message;\n }\n };\n\n function isMatcher(object) {\n return matcher.isPrototypeOf(object);\n }\n\n function matchObject(expectation, actual) {\n if (actual === null || actual === undefined) {\n return false;\n }\n for (var key in expectation) {\n if (expectation.hasOwnProperty(key)) {\n var exp = expectation[key];\n var act = actual[key];\n if (match.isMatcher(exp)) {\n if (!exp.test(act)) {\n return false;\n }\n } else if (sinon.typeOf(exp) === \"object\") {\n if (!matchObject(exp, act)) {\n return false;\n }\n } else if (!sinon.deepEqual(exp, act)) {\n return false;\n }\n }\n }\n return true;\n }\n\n matcher.or = function (m2) {\n if (!isMatcher(m2)) {\n throw new TypeError(\"Matcher expected\");\n }\n var m1 = this;\n var or = sinon.create(matcher);\n or.test = function (actual) {\n return m1.test(actual) || m2.test(actual);\n };\n or.message = m1.message + \".or(\" + m2.message + \")\";\n return or;\n };\n\n matcher.and = function (m2) {\n if (!isMatcher(m2)) {\n throw new TypeError(\"Matcher expected\");\n }\n var m1 = this;\n var and = sinon.create(matcher);\n and.test = function (actual) {\n return m1.test(actual) && m2.test(actual);\n };\n and.message = m1.message + \".and(\" + m2.message + \")\";\n return and;\n };\n\n var match = function (expectation, message) {\n var m = sinon.create(matcher);\n var type = sinon.typeOf(expectation);\n switch (type) {\n case \"object\":\n if (typeof expectation.test === \"function\") {\n m.test = function (actual) {\n return expectation.test(actual) === true;\n };\n m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n return m;\n }\n var str = [];\n for (var key in expectation) {\n if (expectation.hasOwnProperty(key)) {\n str.push(key + \": \" + expectation[key]);\n }\n }\n m.test = function (actual) {\n return matchObject(expectation, actual);\n };\n m.message = \"match(\" + str.join(\", \") + \")\";\n break;\n case \"number\":\n m.test = function (actual) {\n return expectation == actual;\n };\n break;\n case \"string\":\n m.test = function (actual) {\n if (typeof actual !== \"string\") {\n return false;\n }\n return actual.indexOf(expectation) !== -1;\n };\n m.message = \"match(\\\"\" + expectation + \"\\\")\";\n break;\n case \"regexp\":\n m.test = function (actual) {\n if (typeof actual !== \"string\") {\n return false;\n }\n return expectation.test(actual);\n };\n break;\n case \"function\":\n m.test = expectation;\n if (message) {\n m.message = message;\n } else {\n m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n }\n break;\n default:\n m.test = function (actual) {\n return sinon.deepEqual(expectation, actual);\n };\n }\n if (!m.message) {\n m.message = \"match(\" + expectation + \")\";\n }\n return m;\n };\n\n match.isMatcher = isMatcher;\n\n match.any = match(function () {\n return true;\n }, \"any\");\n\n match.defined = match(function (actual) {\n return actual !== null && actual !== undefined;\n }, \"defined\");\n\n match.truthy = match(function (actual) {\n return !!actual;\n }, \"truthy\");\n\n match.falsy = match(function (actual) {\n return !actual;\n }, \"falsy\");\n\n match.same = function (expectation) {\n return match(function (actual) {\n return expectation === actual;\n }, \"same(\" + expectation + \")\");\n };\n\n match.typeOf = function (type) {\n assertType(type, \"string\", \"type\");\n return match(function (actual) {\n return sinon.typeOf(actual) === type;\n }, \"typeOf(\\\"\" + type + \"\\\")\");\n };\n\n match.instanceOf = function (type) {\n assertType(type, \"function\", \"type\");\n return match(function (actual) {\n return actual instanceof type;\n }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n };\n\n function createPropertyMatcher(propertyTest, messagePrefix) {\n return function (property, value) {\n assertType(property, \"string\", \"property\");\n var onlyProperty = arguments.length === 1;\n var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n if (!onlyProperty) {\n message += \", \" + value;\n }\n message += \")\";\n return match(function (actual) {\n if (actual === undefined || actual === null ||\n !propertyTest(actual, property)) {\n return false;\n }\n return onlyProperty || sinon.deepEqual(value, actual[property]);\n }, message);\n };\n }\n\n match.has = createPropertyMatcher(function (actual, property) {\n if (typeof actual === \"object\") {\n return property in actual;\n }\n return actual[property] !== undefined;\n }, \"has\");\n\n match.hasOwn = createPropertyMatcher(function (actual, property) {\n return actual.hasOwnProperty(property);\n }, \"hasOwn\");\n\n match.bool = match.typeOf(\"boolean\");\n match.number = match.typeOf(\"number\");\n match.string = match.typeOf(\"string\");\n match.object = match.typeOf(\"object\");\n match.func = match.typeOf(\"function\");\n match.array = match.typeOf(\"array\");\n match.regexp = match.typeOf(\"regexp\");\n match.date = match.typeOf(\"date\");\n\n if (commonJSModule) {\n module.exports = match;\n } else {\n sinon.match = match;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend match.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Spy calls\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n * Copyright (c) 2013 Maximilian Antoni\n */\n\nvar commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\nif (!this.sinon && commonJSModule) {\n var sinon = require(\"../sinon\");\n}\n\n(function (sinon) {\n function throwYieldError(proxy, text, args) {\n var msg = sinon.functionName(proxy) + text;\n if (args.length) {\n msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n }\n throw new Error(msg);\n }\n\n var slice = Array.prototype.slice;\n\n var callProto = {\n calledOn: function calledOn(thisValue) {\n if (sinon.match && sinon.match.isMatcher(thisValue)) {\n return thisValue.test(this.thisValue);\n }\n return this.thisValue === thisValue;\n },\n\n calledWith: function calledWith() {\n for (var i = 0, l = arguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(arguments[i], this.args[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n calledWithMatch: function calledWithMatch() {\n for (var i = 0, l = arguments.length; i < l; i += 1) {\n var actual = this.args[i];\n var expectation = arguments[i];\n if (!sinon.match || !sinon.match(expectation).test(actual)) {\n return false;\n }\n }\n return true;\n },\n\n calledWithExactly: function calledWithExactly() {\n return arguments.length == this.args.length &&\n this.calledWith.apply(this, arguments);\n },\n\n notCalledWith: function notCalledWith() {\n return !this.calledWith.apply(this, arguments);\n },\n\n notCalledWithMatch: function notCalledWithMatch() {\n return !this.calledWithMatch.apply(this, arguments);\n },\n\n returned: function returned(value) {\n return sinon.deepEqual(value, this.returnValue);\n },\n\n threw: function threw(error) {\n if (typeof error === \"undefined\" || !this.exception) {\n return !!this.exception;\n }\n\n return this.exception === error || this.exception.name === error;\n },\n\n calledWithNew: function calledWithNew(thisValue) {\n return this.thisValue instanceof this.proxy;\n },\n\n calledBefore: function (other) {\n return this.callId < other.callId;\n },\n\n calledAfter: function (other) {\n return this.callId > other.callId;\n },\n\n callArg: function (pos) {\n this.args[pos]();\n },\n\n callArgOn: function (pos, thisValue) {\n this.args[pos].apply(thisValue);\n },\n\n callArgWith: function (pos) {\n this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n },\n\n callArgOnWith: function (pos, thisValue) {\n var args = slice.call(arguments, 2);\n this.args[pos].apply(thisValue, args);\n },\n\n \"yield\": function () {\n this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n },\n\n yieldOn: function (thisValue) {\n var args = this.args;\n for (var i = 0, l = args.length; i < l; ++i) {\n if (typeof args[i] === \"function\") {\n args[i].apply(thisValue, slice.call(arguments, 1));\n return;\n }\n }\n throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n },\n\n yieldTo: function (prop) {\n this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n },\n\n yieldToOn: function (prop, thisValue) {\n var args = this.args;\n for (var i = 0, l = args.length; i < l; ++i) {\n if (args[i] && typeof args[i][prop] === \"function\") {\n args[i][prop].apply(thisValue, slice.call(arguments, 2));\n return;\n }\n }\n throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n \"' since no callback was passed.\", args);\n },\n\n toString: function () {\n var callStr = this.proxy.toString() + \"(\";\n var args = [];\n\n for (var i = 0, l = this.args.length; i < l; ++i) {\n args.push(sinon.format(this.args[i]));\n }\n\n callStr = callStr + args.join(\", \") + \")\";\n\n if (typeof this.returnValue != \"undefined\") {\n callStr += \" => \" + sinon.format(this.returnValue);\n }\n\n if (this.exception) {\n callStr += \" !\" + this.exception.name;\n\n if (this.exception.message) {\n callStr += \"(\" + this.exception.message + \")\";\n }\n }\n\n return callStr;\n }\n };\n\n callProto.invokeCallback = callProto.yield;\n\n function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n if (typeof id !== \"number\") {\n throw new TypeError(\"Call id is not a number\");\n }\n var proxyCall = sinon.create(callProto);\n proxyCall.proxy = spy;\n proxyCall.thisValue = thisValue;\n proxyCall.args = args;\n proxyCall.returnValue = returnValue;\n proxyCall.exception = exception;\n proxyCall.callId = id;\n\n return proxyCall;\n };\n createSpyCall.toString = callProto.toString; // used by mocks\n\n sinon.spyCall = createSpyCall;\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Spy functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = Array.prototype.push;\n var slice = Array.prototype.slice;\n var callId = 0;\n\n function spy(object, property) {\n if (!property && typeof object == \"function\") {\n return spy.create(object);\n }\n\n if (!object && !property) {\n return spy.create(function () { });\n }\n\n var method = object[property];\n return sinon.wrapMethod(object, property, spy.create(method));\n }\n\n function matchingFake(fakes, args, strict) {\n if (!fakes) {\n return;\n }\n\n var alen = args.length;\n\n for (var i = 0, l = fakes.length; i < l; i++) {\n if (fakes[i].matches(args, strict)) {\n return fakes[i];\n }\n }\n }\n\n function incrementCallCount() {\n this.called = true;\n this.callCount += 1;\n this.notCalled = false;\n this.calledOnce = this.callCount == 1;\n this.calledTwice = this.callCount == 2;\n this.calledThrice = this.callCount == 3;\n }\n\n function createCallProperties() {\n this.firstCall = this.getCall(0);\n this.secondCall = this.getCall(1);\n this.thirdCall = this.getCall(2);\n this.lastCall = this.getCall(this.callCount - 1);\n }\n\n var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n function createProxy(func) {\n // Retain the function length:\n var p;\n if (func.length) {\n eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n \") { return p.invoke(func, this, slice.call(arguments)); });\");\n }\n else {\n p = function proxy() {\n return p.invoke(func, this, slice.call(arguments));\n };\n }\n return p;\n }\n\n var uuid = 0;\n\n // Public API\n var spyApi = {\n reset: function () {\n this.called = false;\n this.notCalled = true;\n this.calledOnce = false;\n this.calledTwice = false;\n this.calledThrice = false;\n this.callCount = 0;\n this.firstCall = null;\n this.secondCall = null;\n this.thirdCall = null;\n this.lastCall = null;\n this.args = [];\n this.returnValues = [];\n this.thisValues = [];\n this.exceptions = [];\n this.callIds = [];\n if (this.fakes) {\n for (var i = 0; i < this.fakes.length; i++) {\n this.fakes[i].reset();\n }\n }\n },\n\n create: function create(func) {\n var name;\n\n if (typeof func != \"function\") {\n func = function () { };\n } else {\n name = sinon.functionName(func);\n }\n\n var proxy = createProxy(func);\n\n sinon.extend(proxy, spy);\n delete proxy.create;\n sinon.extend(proxy, func);\n\n proxy.reset();\n proxy.prototype = func.prototype;\n proxy.displayName = name || \"spy\";\n proxy.toString = sinon.functionToString;\n proxy._create = sinon.spy.create;\n proxy.id = \"spy#\" + uuid++;\n\n return proxy;\n },\n\n invoke: function invoke(func, thisValue, args) {\n var matching = matchingFake(this.fakes, args);\n var exception, returnValue;\n\n incrementCallCount.call(this);\n push.call(this.thisValues, thisValue);\n push.call(this.args, args);\n push.call(this.callIds, callId++);\n\n try {\n if (matching) {\n returnValue = matching.invoke(func, thisValue, args);\n } else {\n returnValue = (this.func || func).apply(thisValue, args);\n }\n } catch (e) {\n push.call(this.returnValues, undefined);\n exception = e;\n throw e;\n } finally {\n push.call(this.exceptions, exception);\n }\n\n push.call(this.returnValues, returnValue);\n\n createCallProperties.call(this);\n\n return returnValue;\n },\n\n getCall: function getCall(i) {\n if (i < 0 || i >= this.callCount) {\n return null;\n }\n\n return sinon.spyCall(this, this.thisValues[i], this.args[i],\n this.returnValues[i], this.exceptions[i],\n this.callIds[i]);\n },\n\n calledBefore: function calledBefore(spyFn) {\n if (!this.called) {\n return false;\n }\n\n if (!spyFn.called) {\n return true;\n }\n\n return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n },\n\n calledAfter: function calledAfter(spyFn) {\n if (!this.called || !spyFn.called) {\n return false;\n }\n\n return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n },\n\n withArgs: function () {\n var args = slice.call(arguments);\n\n if (this.fakes) {\n var match = matchingFake(this.fakes, args, true);\n\n if (match) {\n return match;\n }\n } else {\n this.fakes = [];\n }\n\n var original = this;\n var fake = this._create();\n fake.matchingAguments = args;\n push.call(this.fakes, fake);\n\n fake.withArgs = function () {\n return original.withArgs.apply(original, arguments);\n };\n\n for (var i = 0; i < this.args.length; i++) {\n if (fake.matches(this.args[i])) {\n incrementCallCount.call(fake);\n push.call(fake.thisValues, this.thisValues[i]);\n push.call(fake.args, this.args[i]);\n push.call(fake.returnValues, this.returnValues[i]);\n push.call(fake.exceptions, this.exceptions[i]);\n push.call(fake.callIds, this.callIds[i]);\n }\n }\n createCallProperties.call(fake);\n\n return fake;\n },\n\n matches: function (args, strict) {\n var margs = this.matchingAguments;\n\n if (margs.length <= args.length &&\n sinon.deepEqual(margs, args.slice(0, margs.length))) {\n return !strict || margs.length == args.length;\n }\n },\n\n printf: function (format) {\n var spy = this;\n var args = slice.call(arguments, 1);\n var formatter;\n\n return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n formatter = spyApi.formatters[specifyer];\n\n if (typeof formatter == \"function\") {\n return formatter.call(null, spy, args);\n } else if (!isNaN(parseInt(specifyer), 10)) {\n return sinon.format(args[specifyer - 1]);\n }\n\n return \"%\" + specifyer;\n });\n }\n };\n\n function delegateToCalls(method, matchAny, actual, notCalled) {\n spyApi[method] = function () {\n if (!this.called) {\n if (notCalled) {\n return notCalled.apply(this, arguments);\n }\n return false;\n }\n\n var currentCall;\n var matches = 0;\n\n for (var i = 0, l = this.callCount; i < l; i += 1) {\n currentCall = this.getCall(i);\n\n if (currentCall[actual || method].apply(currentCall, arguments)) {\n matches += 1;\n\n if (matchAny) {\n return true;\n }\n }\n }\n\n return matches === this.callCount;\n };\n }\n\n delegateToCalls(\"calledOn\", true);\n delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n delegateToCalls(\"calledWith\", true);\n delegateToCalls(\"calledWithMatch\", true);\n delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n delegateToCalls(\"calledWithExactly\", true);\n delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n function () { return true; });\n delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n function () { return true; });\n delegateToCalls(\"threw\", true);\n delegateToCalls(\"alwaysThrew\", false, \"threw\");\n delegateToCalls(\"returned\", true);\n delegateToCalls(\"alwaysReturned\", false, \"returned\");\n delegateToCalls(\"calledWithNew\", true);\n delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n });\n spyApi.callArgWith = spyApi.callArg;\n delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n });\n spyApi.callArgOnWith = spyApi.callArgOn;\n delegateToCalls(\"yield\", false, \"yield\", function () {\n throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n });\n // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n spyApi.invokeCallback = spyApi.yield;\n delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n });\n delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n throw new Error(this.toString() + \" cannot yield to '\" + property +\n \"' since it was not yet invoked.\");\n });\n delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n throw new Error(this.toString() + \" cannot yield to '\" + property +\n \"' since it was not yet invoked.\");\n });\n\n spyApi.formatters = {\n \"c\": function (spy) {\n return sinon.timesInWords(spy.callCount);\n },\n\n \"n\": function (spy) {\n return spy.toString();\n },\n\n \"C\": function (spy) {\n var calls = [];\n\n for (var i = 0, l = spy.callCount; i < l; ++i) {\n var stringifiedCall = \" \" + spy.getCall(i).toString();\n if (/\\n/.test(calls[i - 1])) {\n stringifiedCall = \"\\n\" + stringifiedCall;\n }\n push.call(calls, stringifiedCall);\n }\n\n return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n },\n\n \"t\": function (spy) {\n var objects = [];\n\n for (var i = 0, l = spy.callCount; i < l; ++i) {\n push.call(objects, sinon.format(spy.thisValues[i]));\n }\n\n return objects.join(\", \");\n },\n\n \"*\": function (spy, args) {\n var formatted = [];\n\n for (var i = 0, l = args.length; i < l; ++i) {\n push.call(formatted, sinon.format(args[i]));\n }\n\n return formatted.join(\", \");\n }\n };\n\n sinon.extend(spy, spyApi);\n\n spy.spyCall = sinon.spyCall;\n\n if (commonJSModule) {\n module.exports = spy;\n } else {\n sinon.spy = spy;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend spy.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global module, require, sinon*/\n/**\n * Stub functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function stub(object, property, func) {\n if (!!func && typeof func != \"function\") {\n throw new TypeError(\"Custom stub should be function\");\n }\n\n var wrapper;\n\n if (func) {\n wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n } else {\n wrapper = stub.create();\n }\n\n if (!object && !property) {\n return sinon.stub.create();\n }\n\n if (!property && !!object && typeof object == \"object\") {\n for (var prop in object) {\n if (typeof object[prop] === \"function\") {\n stub(object, prop);\n }\n }\n\n return object;\n }\n\n return sinon.wrapMethod(object, property, wrapper);\n }\n\n function getChangingValue(stub, property) {\n var index = stub.callCount - 1;\n var values = stub[property];\n var prop = index in values ? values[index] : values[values.length - 1];\n stub[property + \"Last\"] = prop;\n\n return prop;\n }\n\n function getCallback(stub, args) {\n var callArgAt = getChangingValue(stub, \"callArgAts\");\n\n if (callArgAt < 0) {\n var callArgProp = getChangingValue(stub, \"callArgProps\");\n\n for (var i = 0, l = args.length; i < l; ++i) {\n if (!callArgProp && typeof args[i] == \"function\") {\n return args[i];\n }\n\n if (callArgProp && args[i] &&\n typeof args[i][callArgProp] == \"function\") {\n return args[i][callArgProp];\n }\n }\n\n return null;\n }\n\n return args[callArgAt];\n }\n\n var join = Array.prototype.join;\n\n function getCallbackError(stub, func, args) {\n if (stub.callArgAtsLast < 0) {\n var msg;\n\n if (stub.callArgPropsLast) {\n msg = sinon.functionName(stub) +\n \" expected to yield to '\" + stub.callArgPropsLast +\n \"', but no object with such a property was passed.\"\n } else {\n msg = sinon.functionName(stub) +\n \" expected to yield, but no callback was passed.\"\n }\n\n if (args.length > 0) {\n msg += \" Received [\" + join.call(args, \", \") + \"]\";\n }\n\n return msg;\n }\n\n return \"argument at index \" + stub.callArgAtsLast + \" is not a function: \" + func;\n }\n\n var nextTick = (function () {\n if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n return process.nextTick;\n } else if (typeof setImmediate === \"function\") {\n return setImmediate;\n } else {\n return function (callback) {\n setTimeout(callback, 0);\n };\n }\n })();\n\n function callCallback(stub, args) {\n if (stub.callArgAts.length > 0) {\n var func = getCallback(stub, args);\n\n if (typeof func != \"function\") {\n throw new TypeError(getCallbackError(stub, func, args));\n }\n\n var callbackArguments = getChangingValue(stub, \"callbackArguments\");\n var callbackContext = getChangingValue(stub, \"callbackContexts\");\n\n if (stub.callbackAsync) {\n nextTick(function() {\n func.apply(callbackContext, callbackArguments);\n });\n } else {\n func.apply(callbackContext, callbackArguments);\n }\n }\n }\n\n var uuid = 0;\n\n sinon.extend(stub, (function () {\n var slice = Array.prototype.slice, proto;\n\n function throwsException(error, message) {\n if (typeof error == \"string\") {\n this.exception = new Error(message || \"\");\n this.exception.name = error;\n } else if (!error) {\n this.exception = new Error(\"Error\");\n } else {\n this.exception = error;\n }\n\n return this;\n }\n\n proto = {\n create: function create() {\n var functionStub = function () {\n\n callCallback(functionStub, arguments);\n\n if (functionStub.exception) {\n throw functionStub.exception;\n } else if (typeof functionStub.returnArgAt == 'number') {\n return arguments[functionStub.returnArgAt];\n } else if (functionStub.returnThis) {\n return this;\n }\n return functionStub.returnValue;\n };\n\n functionStub.id = \"stub#\" + uuid++;\n var orig = functionStub;\n functionStub = sinon.spy.create(functionStub);\n functionStub.func = orig;\n\n functionStub.callArgAts = [];\n functionStub.callbackArguments = [];\n functionStub.callbackContexts = [];\n functionStub.callArgProps = [];\n\n sinon.extend(functionStub, stub);\n functionStub._create = sinon.stub.create;\n functionStub.displayName = \"stub\";\n functionStub.toString = sinon.functionToString;\n\n return functionStub;\n },\n\n resetBehavior: function () {\n var i;\n\n this.callArgAts = [];\n this.callbackArguments = [];\n this.callbackContexts = [];\n this.callArgProps = [];\n\n delete this.returnValue;\n delete this.returnArgAt;\n this.returnThis = false;\n\n if (this.fakes) {\n for (i = 0; i < this.fakes.length; i++) {\n this.fakes[i].resetBehavior();\n }\n }\n },\n\n returns: function returns(value) {\n this.returnValue = value;\n\n return this;\n },\n\n returnsArg: function returnsArg(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.returnArgAt = pos;\n\n return this;\n },\n\n returnsThis: function returnsThis() {\n this.returnThis = true;\n\n return this;\n },\n\n \"throws\": throwsException,\n throwsException: throwsException,\n\n callsArg: function callsArg(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push([]);\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgOn: function callsArgOn(pos, context) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push([]);\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgWith: function callsArgWith(pos) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n callsArgOnWith: function callsArgWith(pos, context) {\n if (typeof pos != \"number\") {\n throw new TypeError(\"argument index is not number\");\n }\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(pos);\n this.callbackArguments.push(slice.call(arguments, 2));\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yields: function () {\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 0));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yieldsOn: function (context) {\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(context);\n this.callArgProps.push(undefined);\n\n return this;\n },\n\n yieldsTo: function (prop) {\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 1));\n this.callbackContexts.push(undefined);\n this.callArgProps.push(prop);\n\n return this;\n },\n\n yieldsToOn: function (prop, context) {\n if (typeof context != \"object\") {\n throw new TypeError(\"argument context is not an object\");\n }\n\n this.callArgAts.push(-1);\n this.callbackArguments.push(slice.call(arguments, 2));\n this.callbackContexts.push(context);\n this.callArgProps.push(prop);\n\n return this;\n }\n };\n\n // create asynchronous versions of callsArg* and yields* methods\n for (var method in proto) {\n // need to avoid creating anotherasync versions of the newly added async methods\n if (proto.hasOwnProperty(method) &&\n method.match(/^(callsArg|yields|thenYields$)/) &&\n !method.match(/Async/)) {\n proto[method + 'Async'] = (function (syncFnName) {\n return function () {\n this.callbackAsync = true;\n return this[syncFnName].apply(this, arguments);\n };\n })(method);\n }\n }\n\n return proto;\n\n }()));\n\n if (commonJSModule) {\n module.exports = stub;\n } else {\n sinon.stub = stub;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false*/\n/*global module, require, sinon*/\n/**\n * Mock functions.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = [].push;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function mock(object) {\n if (!object) {\n return sinon.expectation.create(\"Anonymous mock\");\n }\n\n return mock.create(object);\n }\n\n sinon.mock = mock;\n\n sinon.extend(mock, (function () {\n function each(collection, callback) {\n if (!collection) {\n return;\n }\n\n for (var i = 0, l = collection.length; i < l; i += 1) {\n callback(collection[i]);\n }\n }\n\n return {\n create: function create(object) {\n if (!object) {\n throw new TypeError(\"object is null\");\n }\n\n var mockObject = sinon.extend({}, mock);\n mockObject.object = object;\n delete mockObject.create;\n\n return mockObject;\n },\n\n expects: function expects(method) {\n if (!method) {\n throw new TypeError(\"method is falsy\");\n }\n\n if (!this.expectations) {\n this.expectations = {};\n this.proxies = [];\n }\n\n if (!this.expectations[method]) {\n this.expectations[method] = [];\n var mockObject = this;\n\n sinon.wrapMethod(this.object, method, function () {\n return mockObject.invokeMethod(method, this, arguments);\n });\n\n push.call(this.proxies, method);\n }\n\n var expectation = sinon.expectation.create(method);\n push.call(this.expectations[method], expectation);\n\n return expectation;\n },\n\n restore: function restore() {\n var object = this.object;\n\n each(this.proxies, function (proxy) {\n if (typeof object[proxy].restore == \"function\") {\n object[proxy].restore();\n }\n });\n },\n\n verify: function verify() {\n var expectations = this.expectations || {};\n var messages = [], met = [];\n\n each(this.proxies, function (proxy) {\n each(expectations[proxy], function (expectation) {\n if (!expectation.met()) {\n push.call(messages, expectation.toString());\n } else {\n push.call(met, expectation.toString());\n }\n });\n });\n\n this.restore();\n\n if (messages.length > 0) {\n sinon.expectation.fail(messages.concat(met).join(\"\\n\"));\n } else {\n sinon.expectation.pass(messages.concat(met).join(\"\\n\"));\n }\n\n return true;\n },\n\n invokeMethod: function invokeMethod(method, thisValue, args) {\n var expectations = this.expectations && this.expectations[method];\n var length = expectations && expectations.length || 0, i;\n\n for (i = 0; i < length; i += 1) {\n if (!expectations[i].met() &&\n expectations[i].allowsCall(thisValue, args)) {\n return expectations[i].apply(thisValue, args);\n }\n }\n\n var messages = [], available, exhausted = 0;\n\n for (i = 0; i < length; i += 1) {\n if (expectations[i].allowsCall(thisValue, args)) {\n available = available || expectations[i];\n } else {\n exhausted += 1;\n }\n push.call(messages, \" \" + expectations[i].toString());\n }\n\n if (exhausted === 0) {\n return available.apply(thisValue, args);\n }\n\n messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n proxy: method,\n args: args\n }));\n\n sinon.expectation.fail(messages.join(\"\\n\"));\n }\n };\n }()));\n\n var times = sinon.timesInWords;\n\n sinon.expectation = (function () {\n var slice = Array.prototype.slice;\n var _invoke = sinon.spy.invoke;\n\n function callCountInWords(callCount) {\n if (callCount == 0) {\n return \"never called\";\n } else {\n return \"called \" + times(callCount);\n }\n }\n\n function expectedCallCountInWords(expectation) {\n var min = expectation.minCalls;\n var max = expectation.maxCalls;\n\n if (typeof min == \"number\" && typeof max == \"number\") {\n var str = times(min);\n\n if (min != max) {\n str = \"at least \" + str + \" and at most \" + times(max);\n }\n\n return str;\n }\n\n if (typeof min == \"number\") {\n return \"at least \" + times(min);\n }\n\n return \"at most \" + times(max);\n }\n\n function receivedMinCalls(expectation) {\n var hasMinLimit = typeof expectation.minCalls == \"number\";\n return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n }\n\n function receivedMaxCalls(expectation) {\n if (typeof expectation.maxCalls != \"number\") {\n return false;\n }\n\n return expectation.callCount == expectation.maxCalls;\n }\n\n return {\n minCalls: 1,\n maxCalls: 1,\n\n create: function create(methodName) {\n var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n delete expectation.create;\n expectation.method = methodName;\n\n return expectation;\n },\n\n invoke: function invoke(func, thisValue, args) {\n this.verifyCallAllowed(thisValue, args);\n\n return _invoke.apply(this, arguments);\n },\n\n atLeast: function atLeast(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not number\");\n }\n\n if (!this.limitsSet) {\n this.maxCalls = null;\n this.limitsSet = true;\n }\n\n this.minCalls = num;\n\n return this;\n },\n\n atMost: function atMost(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not number\");\n }\n\n if (!this.limitsSet) {\n this.minCalls = null;\n this.limitsSet = true;\n }\n\n this.maxCalls = num;\n\n return this;\n },\n\n never: function never() {\n return this.exactly(0);\n },\n\n once: function once() {\n return this.exactly(1);\n },\n\n twice: function twice() {\n return this.exactly(2);\n },\n\n thrice: function thrice() {\n return this.exactly(3);\n },\n\n exactly: function exactly(num) {\n if (typeof num != \"number\") {\n throw new TypeError(\"'\" + num + \"' is not a number\");\n }\n\n this.atLeast(num);\n return this.atMost(num);\n },\n\n met: function met() {\n return !this.failed && receivedMinCalls(this);\n },\n\n verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n if (receivedMaxCalls(this)) {\n this.failed = true;\n sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n }\n\n if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n this.expectedThis);\n }\n\n if (!(\"expectedArguments\" in this)) {\n return;\n }\n\n if (!args) {\n sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n sinon.format(this.expectedArguments));\n }\n\n if (args.length < this.expectedArguments.length) {\n sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n \"), expected \" + sinon.format(this.expectedArguments));\n }\n\n if (this.expectsExactArgCount &&\n args.length != this.expectedArguments.length) {\n sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n \"), expected \" + sinon.format(this.expectedArguments));\n }\n\n for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n \", expected \" + sinon.format(this.expectedArguments));\n }\n }\n },\n\n allowsCall: function allowsCall(thisValue, args) {\n if (this.met() && receivedMaxCalls(this)) {\n return false;\n }\n\n if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n return false;\n }\n\n if (!(\"expectedArguments\" in this)) {\n return true;\n }\n\n args = args || [];\n\n if (args.length < this.expectedArguments.length) {\n return false;\n }\n\n if (this.expectsExactArgCount &&\n args.length != this.expectedArguments.length) {\n return false;\n }\n\n for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n return false;\n }\n }\n\n return true;\n },\n\n withArgs: function withArgs() {\n this.expectedArguments = slice.call(arguments);\n return this;\n },\n\n withExactArgs: function withExactArgs() {\n this.withArgs.apply(this, arguments);\n this.expectsExactArgCount = true;\n return this;\n },\n\n on: function on(thisValue) {\n this.expectedThis = thisValue;\n return this;\n },\n\n toString: function () {\n var args = (this.expectedArguments || []).slice();\n\n if (!this.expectsExactArgCount) {\n push.call(args, \"[...]\");\n }\n\n var callStr = sinon.spyCall.toString.call({\n proxy: this.method || \"anonymous mock expectation\",\n args: args\n });\n\n var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n expectedCallCountInWords(this);\n\n if (this.met()) {\n return \"Expectation met: \" + message;\n }\n\n return \"Expected \" + message + \" (\" +\n callCountInWords(this.callCount) + \")\";\n },\n\n verify: function verify() {\n if (!this.met()) {\n sinon.expectation.fail(this.toString());\n } else {\n sinon.expectation.pass(this.toString());\n }\n\n return true;\n },\n\n pass: function(message) {\n sinon.assert.pass(message);\n },\n fail: function (message) {\n var exception = new Error(message);\n exception.name = \"ExpectationError\";\n\n throw exception;\n }\n };\n }());\n\n if (commonJSModule) {\n module.exports = mock;\n } else {\n sinon.mock = mock;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true*/\n/*global module, require, sinon*/\n/**\n * Collections of stubs, spies and mocks.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var push = [].push;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function getFakes(fakeCollection) {\n if (!fakeCollection.fakes) {\n fakeCollection.fakes = [];\n }\n\n return fakeCollection.fakes;\n }\n\n function each(fakeCollection, method) {\n var fakes = getFakes(fakeCollection);\n\n for (var i = 0, l = fakes.length; i < l; i += 1) {\n if (typeof fakes[i][method] == \"function\") {\n fakes[i][method]();\n }\n }\n }\n\n function compact(fakeCollection) {\n var fakes = getFakes(fakeCollection);\n var i = 0;\n while (i < fakes.length) {\n fakes.splice(i, 1);\n }\n }\n\n var collection = {\n verify: function resolve() {\n each(this, \"verify\");\n },\n\n restore: function restore() {\n each(this, \"restore\");\n compact(this);\n },\n\n verifyAndRestore: function verifyAndRestore() {\n var exception;\n\n try {\n this.verify();\n } catch (e) {\n exception = e;\n }\n\n this.restore();\n\n if (exception) {\n throw exception;\n }\n },\n\n add: function add(fake) {\n push.call(getFakes(this), fake);\n return fake;\n },\n\n spy: function spy() {\n return this.add(sinon.spy.apply(sinon, arguments));\n },\n\n stub: function stub(object, property, value) {\n if (property) {\n var original = object[property];\n\n if (typeof original != \"function\") {\n if (!hasOwnProperty.call(object, property)) {\n throw new TypeError(\"Cannot stub non-existent own property \" + property);\n }\n\n object[property] = value;\n\n return this.add({\n restore: function () {\n object[property] = original;\n }\n });\n }\n }\n if (!property && !!object && typeof object == \"object\") {\n var stubbedObj = sinon.stub.apply(sinon, arguments);\n\n for (var prop in stubbedObj) {\n if (typeof stubbedObj[prop] === \"function\") {\n this.add(stubbedObj[prop]);\n }\n }\n\n return stubbedObj;\n }\n\n return this.add(sinon.stub.apply(sinon, arguments));\n },\n\n mock: function mock() {\n return this.add(sinon.mock.apply(sinon, arguments));\n },\n\n inject: function inject(obj) {\n var col = this;\n\n obj.spy = function () {\n return col.spy.apply(col, arguments);\n };\n\n obj.stub = function () {\n return col.stub.apply(col, arguments);\n };\n\n obj.mock = function () {\n return col.mock.apply(col, arguments);\n };\n\n return obj;\n }\n };\n\n if (commonJSModule) {\n module.exports = collection;\n } else {\n sinon.collection = collection;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n/*global module, require, window*/\n/**\n * Fake timer API\n * setTimeout\n * setInterval\n * clearTimeout\n * clearInterval\n * tick\n * reset\n * Date\n *\n * Inspired by jsUnitMockTimeOut from JsUnit\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n var sinon = {};\n}\n\n(function (global) {\n var id = 1;\n\n function addTimer(args, recurring) {\n if (args.length === 0) {\n throw new Error(\"Function requires at least 1 parameter\");\n }\n\n var toId = id++;\n var delay = args[1] || 0;\n\n if (!this.timeouts) {\n this.timeouts = {};\n }\n\n this.timeouts[toId] = {\n id: toId,\n func: args[0],\n callAt: this.now + delay,\n invokeArgs: Array.prototype.slice.call(args, 2)\n };\n\n if (recurring === true) {\n this.timeouts[toId].interval = delay;\n }\n\n return toId;\n }\n\n function parseTime(str) {\n if (!str) {\n return 0;\n }\n\n var strings = str.split(\":\");\n var l = strings.length, i = l;\n var ms = 0, parsed;\n\n if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n throw new Error(\"tick only understands numbers and 'h:m:s'\");\n }\n\n while (i--) {\n parsed = parseInt(strings[i], 10);\n\n if (parsed >= 60) {\n throw new Error(\"Invalid time \" + str);\n }\n\n ms += parsed * Math.pow(60, (l - i - 1));\n }\n\n return ms * 1000;\n }\n\n function createObject(object) {\n var newObject;\n\n if (Object.create) {\n newObject = Object.create(object);\n } else {\n var F = function () {};\n F.prototype = object;\n newObject = new F();\n }\n\n newObject.Date.clock = newObject;\n return newObject;\n }\n\n sinon.clock = {\n now: 0,\n\n create: function create(now) {\n var clock = createObject(this);\n\n if (typeof now == \"number\") {\n clock.now = now;\n }\n\n if (!!now && typeof now == \"object\") {\n throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n }\n\n return clock;\n },\n\n setTimeout: function setTimeout(callback, timeout) {\n return addTimer.call(this, arguments, false);\n },\n\n clearTimeout: function clearTimeout(timerId) {\n if (!this.timeouts) {\n this.timeouts = [];\n }\n\n if (timerId in this.timeouts) {\n delete this.timeouts[timerId];\n }\n },\n\n setInterval: function setInterval(callback, timeout) {\n return addTimer.call(this, arguments, true);\n },\n\n clearInterval: function clearInterval(timerId) {\n this.clearTimeout(timerId);\n },\n\n tick: function tick(ms) {\n ms = typeof ms == \"number\" ? ms : parseTime(ms);\n var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;\n var timer = this.firstTimerInRange(tickFrom, tickTo);\n\n var firstException;\n while (timer && tickFrom <= tickTo) {\n if (this.timeouts[timer.id]) {\n tickFrom = this.now = timer.callAt;\n try {\n this.callTimer(timer);\n } catch (e) {\n firstException = firstException || e;\n }\n }\n\n timer = this.firstTimerInRange(previous, tickTo);\n previous = tickFrom;\n }\n\n this.now = tickTo;\n\n if (firstException) {\n throw firstException;\n }\n\n return this.now;\n },\n\n firstTimerInRange: function (from, to) {\n var timer, smallest, originalTimer;\n\n for (var id in this.timeouts) {\n if (this.timeouts.hasOwnProperty(id)) {\n if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {\n continue;\n }\n\n if (!smallest || this.timeouts[id].callAt < smallest) {\n originalTimer = this.timeouts[id];\n smallest = this.timeouts[id].callAt;\n\n timer = {\n func: this.timeouts[id].func,\n callAt: this.timeouts[id].callAt,\n interval: this.timeouts[id].interval,\n id: this.timeouts[id].id,\n invokeArgs: this.timeouts[id].invokeArgs\n };\n }\n }\n }\n\n return timer || null;\n },\n\n callTimer: function (timer) {\n if (typeof timer.interval == \"number\") {\n this.timeouts[timer.id].callAt += timer.interval;\n } else {\n delete this.timeouts[timer.id];\n }\n\n try {\n if (typeof timer.func == \"function\") {\n timer.func.apply(null, timer.invokeArgs);\n } else {\n eval(timer.func);\n }\n } catch (e) {\n var exception = e;\n }\n\n if (!this.timeouts[timer.id]) {\n if (exception) {\n throw exception;\n }\n return;\n }\n\n if (exception) {\n throw exception;\n }\n },\n\n reset: function reset() {\n this.timeouts = {};\n },\n\n Date: (function () {\n var NativeDate = Date;\n\n function ClockDate(year, month, date, hour, minute, second, ms) {\n // Defensive and verbose to avoid potential harm in passing\n // explicit undefined when user does not pass argument\n switch (arguments.length) {\n case 0:\n return new NativeDate(ClockDate.clock.now);\n case 1:\n return new NativeDate(year);\n case 2:\n return new NativeDate(year, month);\n case 3:\n return new NativeDate(year, month, date);\n case 4:\n return new NativeDate(year, month, date, hour);\n case 5:\n return new NativeDate(year, month, date, hour, minute);\n case 6:\n return new NativeDate(year, month, date, hour, minute, second);\n default:\n return new NativeDate(year, month, date, hour, minute, second, ms);\n }\n }\n\n return mirrorDateProperties(ClockDate, NativeDate);\n }())\n };\n\n function mirrorDateProperties(target, source) {\n if (source.now) {\n target.now = function now() {\n return target.clock.now;\n };\n } else {\n delete target.now;\n }\n\n if (source.toSource) {\n target.toSource = function toSource() {\n return source.toSource();\n };\n } else {\n delete target.toSource;\n }\n\n target.toString = function toString() {\n return source.toString();\n };\n\n target.prototype = source.prototype;\n target.parse = source.parse;\n target.UTC = source.UTC;\n target.prototype.toUTCString = source.prototype.toUTCString;\n return target;\n }\n\n var methods = [\"Date\", \"setTimeout\", \"setInterval\",\n \"clearTimeout\", \"clearInterval\"];\n\n function restore() {\n var method;\n\n for (var i = 0, l = this.methods.length; i < l; i++) {\n method = this.methods[i];\n if (global[method].hadOwnProperty) {\n global[method] = this[\"_\" + method];\n } else {\n delete global[method];\n }\n }\n\n // Prevent multiple executions which will completely remove these props\n this.methods = [];\n }\n\n function stubGlobal(method, clock) {\n clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);\n clock[\"_\" + method] = global[method];\n\n if (method == \"Date\") {\n var date = mirrorDateProperties(clock[method], global[method]);\n global[method] = date;\n } else {\n global[method] = function () {\n return clock[method].apply(clock, arguments);\n };\n\n for (var prop in clock[method]) {\n if (clock[method].hasOwnProperty(prop)) {\n global[method][prop] = clock[method][prop];\n }\n }\n }\n\n global[method].clock = clock;\n }\n\n sinon.useFakeTimers = function useFakeTimers(now) {\n var clock = sinon.clock.create(now);\n clock.restore = restore;\n clock.methods = Array.prototype.slice.call(arguments,\n typeof now == \"number\" ? 1 : 0);\n\n if (clock.methods.length === 0) {\n clock.methods = methods;\n }\n\n for (var i = 0, l = clock.methods.length; i < l; i++) {\n stubGlobal(clock.methods[i], clock);\n }\n\n return clock;\n };\n}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\nsinon.timers = {\n setTimeout: setTimeout,\n clearTimeout: clearTimeout,\n setInterval: setInterval,\n clearInterval: clearInterval,\n Date: Date\n};\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Minimal Event interface implementation\n *\n * Original implementation by Sven Fuchs: https://gist.github.com/995028\n * Modifications and tests by Christian Johansen.\n *\n * @author Sven Fuchs (svenfuchs@artweb-design.de)\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n this.sinon = {};\n}\n\n(function () {\n var push = [].push;\n\n sinon.Event = function Event(type, bubbles, cancelable, target) {\n this.initEvent(type, bubbles, cancelable, target);\n };\n\n sinon.Event.prototype = {\n initEvent: function(type, bubbles, cancelable, target) {\n this.type = type;\n this.bubbles = bubbles;\n this.cancelable = cancelable;\n this.target = target;\n },\n\n stopPropagation: function () {},\n\n preventDefault: function () {\n this.defaultPrevented = true;\n }\n };\n\n sinon.EventTarget = {\n addEventListener: function addEventListener(event, listener, useCapture) {\n this.eventListeners = this.eventListeners || {};\n this.eventListeners[event] = this.eventListeners[event] || [];\n push.call(this.eventListeners[event], listener);\n },\n\n removeEventListener: function removeEventListener(event, listener, useCapture) {\n var listeners = this.eventListeners && this.eventListeners[event] || [];\n\n for (var i = 0, l = listeners.length; i < l; ++i) {\n if (listeners[i] == listener) {\n return listeners.splice(i, 1);\n }\n }\n },\n\n dispatchEvent: function dispatchEvent(event) {\n var type = event.type;\n var listeners = this.eventListeners && this.eventListeners[type] || [];\n\n for (var i = 0; i < listeners.length; i++) {\n if (typeof listeners[i] == \"function\") {\n listeners[i].call(this, event);\n } else {\n listeners[i].handleEvent(event);\n }\n }\n\n return !!event.defaultPrevented;\n }\n };\n}());\n\n/**\n * @depend ../../sinon.js\n * @depend event.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Fake XMLHttpRequest object\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n this.sinon = {};\n}\nsinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };\n\n// wrapper for global\n(function(global) {\n var xhr = sinon.xhr;\n xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n xhr.GlobalActiveXObject = global.ActiveXObject;\n xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != \"undefined\";\n xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != \"undefined\";\n xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX\n ? function() { return new xhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n\n /*jsl:ignore*/\n var unsafeHeaders = {\n \"Accept-Charset\": true,\n \"Accept-Encoding\": true,\n \"Connection\": true,\n \"Content-Length\": true,\n \"Cookie\": true,\n \"Cookie2\": true,\n \"Content-Transfer-Encoding\": true,\n \"Date\": true,\n \"Expect\": true,\n \"Host\": true,\n \"Keep-Alive\": true,\n \"Referer\": true,\n \"TE\": true,\n \"Trailer\": true,\n \"Transfer-Encoding\": true,\n \"Upgrade\": true,\n \"User-Agent\": true,\n \"Via\": true\n };\n /*jsl:end*/\n\n function FakeXMLHttpRequest() {\n this.readyState = FakeXMLHttpRequest.UNSENT;\n this.requestHeaders = {};\n this.requestBody = null;\n this.status = 0;\n this.statusText = \"\";\n\n var xhr = this;\n var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\n function addEventListener(eventName) {\n xhr.addEventListener(eventName, function (event) {\n var listener = xhr[\"on\" + eventName];\n\n if (listener && typeof listener == \"function\") {\n listener(event);\n }\n });\n }\n\n for (var i = events.length - 1; i >= 0; i--) {\n addEventListener(events[i]);\n }\n\n if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n FakeXMLHttpRequest.onCreate(this);\n }\n }\n\n function verifyState(xhr) {\n if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n throw new Error(\"INVALID_STATE_ERR\");\n }\n\n if (xhr.sendFlag) {\n throw new Error(\"INVALID_STATE_ERR\");\n }\n }\n\n // filtering to enable a white-list version of Sinon FakeXhr,\n // where whitelisted requests are passed through to real XHR\n function each(collection, callback) {\n if (!collection) return;\n for (var i = 0, l = collection.length; i < l; i += 1) {\n callback(collection[i]);\n }\n }\n function some(collection, callback) {\n for (var index = 0; index < collection.length; index++) {\n if(callback(collection[index]) === true) return true;\n };\n return false;\n }\n // largest arity in XHR is 5 - XHR#open\n var apply = function(obj,method,args) {\n switch(args.length) {\n case 0: return obj[method]();\n case 1: return obj[method](args[0]);\n case 2: return obj[method](args[0],args[1]);\n case 3: return obj[method](args[0],args[1],args[2]);\n case 4: return obj[method](args[0],args[1],args[2],args[3]);\n case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);\n };\n };\n\n FakeXMLHttpRequest.filters = [];\n FakeXMLHttpRequest.addFilter = function(fn) {\n this.filters.push(fn)\n };\n var IE6Re = /MSIE 6/;\n FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {\n var xhr = new sinon.xhr.workingXHR();\n each([\"open\",\"setRequestHeader\",\"send\",\"abort\",\"getResponseHeader\",\n \"getAllResponseHeaders\",\"addEventListener\",\"overrideMimeType\",\"removeEventListener\"],\n function(method) {\n fakeXhr[method] = function() {\n return apply(xhr,method,arguments);\n };\n });\n\n var copyAttrs = function(args) {\n each(args, function(attr) {\n try {\n fakeXhr[attr] = xhr[attr]\n } catch(e) {\n if(!IE6Re.test(navigator.userAgent)) throw e;\n }\n });\n };\n\n var stateChange = function() {\n fakeXhr.readyState = xhr.readyState;\n if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n copyAttrs([\"status\",\"statusText\"]);\n }\n if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n copyAttrs([\"responseText\"]);\n }\n if(xhr.readyState === FakeXMLHttpRequest.DONE) {\n copyAttrs([\"responseXML\"]);\n }\n if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);\n };\n if(xhr.addEventListener) {\n for(var event in fakeXhr.eventListeners) {\n if(fakeXhr.eventListeners.hasOwnProperty(event)) {\n each(fakeXhr.eventListeners[event],function(handler) {\n xhr.addEventListener(event, handler);\n });\n }\n }\n xhr.addEventListener(\"readystatechange\",stateChange);\n } else {\n xhr.onreadystatechange = stateChange;\n }\n apply(xhr,\"open\",xhrArgs);\n };\n FakeXMLHttpRequest.useFilters = false;\n\n function verifyRequestSent(xhr) {\n if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n throw new Error(\"Request done\");\n }\n }\n\n function verifyHeadersReceived(xhr) {\n if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n throw new Error(\"No headers received\");\n }\n }\n\n function verifyResponseBodyType(body) {\n if (typeof body != \"string\") {\n var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n body + \", which is not a string.\");\n error.name = \"InvalidBodyException\";\n throw error;\n }\n }\n\n sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n async: true,\n\n open: function open(method, url, async, username, password) {\n this.method = method;\n this.url = url;\n this.async = typeof async == \"boolean\" ? async : true;\n this.username = username;\n this.password = password;\n this.responseText = null;\n this.responseXML = null;\n this.requestHeaders = {};\n this.sendFlag = false;\n if(sinon.FakeXMLHttpRequest.useFilters === true) {\n var xhrArgs = arguments;\n var defake = some(FakeXMLHttpRequest.filters,function(filter) {\n return filter.apply(this,xhrArgs)\n });\n if (defake) {\n return sinon.FakeXMLHttpRequest.defake(this,arguments);\n }\n }\n this.readyStateChange(FakeXMLHttpRequest.OPENED);\n },\n\n readyStateChange: function readyStateChange(state) {\n this.readyState = state;\n\n if (typeof this.onreadystatechange == \"function\") {\n try {\n this.onreadystatechange();\n } catch (e) {\n sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n }\n }\n\n this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\n switch (this.readyState) {\n case FakeXMLHttpRequest.DONE:\n this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n break;\n }\n },\n\n setRequestHeader: function setRequestHeader(header, value) {\n verifyState(this);\n\n if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n }\n\n if (this.requestHeaders[header]) {\n this.requestHeaders[header] += \",\" + value;\n } else {\n this.requestHeaders[header] = value;\n }\n },\n\n // Helps testing\n setResponseHeaders: function setResponseHeaders(headers) {\n this.responseHeaders = {};\n\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n this.responseHeaders[header] = headers[header];\n }\n }\n\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n } else {\n this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n }\n },\n\n // Currently treats ALL data as a DOMString (i.e. no Document)\n send: function send(data) {\n verifyState(this);\n\n if (!/^(get|head)$/i.test(this.method)) {\n if (this.requestHeaders[\"Content-Type\"]) {\n var value = this.requestHeaders[\"Content-Type\"].split(\";\");\n this.requestHeaders[\"Content-Type\"] = value[0] + \";charset=utf-8\";\n } else {\n this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n }\n\n this.requestBody = data;\n }\n\n this.errorFlag = false;\n this.sendFlag = this.async;\n this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n if (typeof this.onSend == \"function\") {\n this.onSend(this);\n }\n\n this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n },\n\n abort: function abort() {\n this.aborted = true;\n this.responseText = null;\n this.errorFlag = true;\n this.requestHeaders = {};\n\n if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);\n this.sendFlag = false;\n }\n\n this.readyState = sinon.FakeXMLHttpRequest.UNSENT;\n\n this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n if (typeof this.onerror === \"function\") {\n this.onerror();\n }\n },\n\n getResponseHeader: function getResponseHeader(header) {\n if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n return null;\n }\n\n if (/^Set-Cookie2?$/i.test(header)) {\n return null;\n }\n\n header = header.toLowerCase();\n\n for (var h in this.responseHeaders) {\n if (h.toLowerCase() == header) {\n return this.responseHeaders[h];\n }\n }\n\n return null;\n },\n\n getAllResponseHeaders: function getAllResponseHeaders() {\n if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n return \"\";\n }\n\n var headers = \"\";\n\n for (var header in this.responseHeaders) {\n if (this.responseHeaders.hasOwnProperty(header) &&\n !/^Set-Cookie2?$/i.test(header)) {\n headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n }\n }\n\n return headers;\n },\n\n setResponseBody: function setResponseBody(body) {\n verifyRequestSent(this);\n verifyHeadersReceived(this);\n verifyResponseBodyType(body);\n\n var chunkSize = this.chunkSize || 10;\n var index = 0;\n this.responseText = \"\";\n\n do {\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.LOADING);\n }\n\n this.responseText += body.substring(index, index + chunkSize);\n index += chunkSize;\n } while (index < body.length);\n\n var type = this.getResponseHeader(\"Content-Type\");\n\n if (this.responseText &&\n (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n try {\n this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n } catch (e) {\n // Unable to parse XML - no biggie\n }\n }\n\n if (this.async) {\n this.readyStateChange(FakeXMLHttpRequest.DONE);\n } else {\n this.readyState = FakeXMLHttpRequest.DONE;\n }\n },\n\n respond: function respond(status, headers, body) {\n this.setResponseHeaders(headers || {});\n this.status = typeof status == \"number\" ? status : 200;\n this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n this.setResponseBody(body || \"\");\n if (typeof this.onload === \"function\"){\n this.onload();\n }\n\n }\n });\n\n sinon.extend(FakeXMLHttpRequest, {\n UNSENT: 0,\n OPENED: 1,\n HEADERS_RECEIVED: 2,\n LOADING: 3,\n DONE: 4\n });\n\n // Borrowed from JSpec\n FakeXMLHttpRequest.parseXML = function parseXML(text) {\n var xmlDoc;\n\n if (typeof DOMParser != \"undefined\") {\n var parser = new DOMParser();\n xmlDoc = parser.parseFromString(text, \"text/xml\");\n } else {\n xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async = \"false\";\n xmlDoc.loadXML(text);\n }\n\n return xmlDoc;\n };\n\n FakeXMLHttpRequest.statusCodes = {\n 100: \"Continue\",\n 101: \"Switching Protocols\",\n 200: \"OK\",\n 201: \"Created\",\n 202: \"Accepted\",\n 203: \"Non-Authoritative Information\",\n 204: \"No Content\",\n 205: \"Reset Content\",\n 206: \"Partial Content\",\n 300: \"Multiple Choice\",\n 301: \"Moved Permanently\",\n 302: \"Found\",\n 303: \"See Other\",\n 304: \"Not Modified\",\n 305: \"Use Proxy\",\n 307: \"Temporary Redirect\",\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 407: \"Proxy Authentication Required\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Request Entity Too Large\",\n 414: \"Request-URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Requested Range Not Satisfiable\",\n 417: \"Expectation Failed\",\n 422: \"Unprocessable Entity\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\"\n };\n\n sinon.useFakeXMLHttpRequest = function () {\n sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n if (xhr.supportsXHR) {\n global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;\n }\n\n if (xhr.supportsActiveX) {\n global.ActiveXObject = xhr.GlobalActiveXObject;\n }\n\n delete sinon.FakeXMLHttpRequest.restore;\n\n if (keepOnCreate !== true) {\n delete sinon.FakeXMLHttpRequest.onCreate;\n }\n };\n if (xhr.supportsXHR) {\n global.XMLHttpRequest = sinon.FakeXMLHttpRequest;\n }\n\n if (xhr.supportsActiveX) {\n global.ActiveXObject = function ActiveXObject(objId) {\n if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n return new sinon.FakeXMLHttpRequest();\n }\n\n return new xhr.GlobalActiveXObject(objId);\n };\n }\n\n return sinon.FakeXMLHttpRequest;\n };\n\n sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n})(this);\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/**\n * @depend fake_xml_http_request.js\n */\n/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/\n/*global module, require, window*/\n/**\n * The Sinon \"server\" mimics a web server that receives requests from\n * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n * both synchronously and asynchronously. To respond synchronuously, canned\n * answers have to be provided upfront.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n var sinon = {};\n}\n\nsinon.fakeServer = (function () {\n var push = [].push;\n function F() {}\n\n function create(proto) {\n F.prototype = proto;\n return new F();\n }\n\n function responseArray(handler) {\n var response = handler;\n\n if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n response = [200, {}, handler];\n }\n\n if (typeof response[2] != \"string\") {\n throw new TypeError(\"Fake server response body should be string, but was \" +\n typeof response[2]);\n }\n\n return response;\n }\n\n var wloc = typeof window !== \"undefined\" ? window.location : {};\n var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n function matchOne(response, reqMethod, reqUrl) {\n var rmeth = response.method;\n var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n var url = response.url;\n var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\n return matchMethod && matchUrl;\n }\n\n function match(response, request) {\n var requestMethod = this.getHTTPMethod(request);\n var requestUrl = request.url;\n\n if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n requestUrl = requestUrl.replace(rCurrLoc, \"\");\n }\n\n if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n if (typeof response.response == \"function\") {\n var ru = response.url;\n var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1));\n return response.response.apply(response, args);\n }\n\n return true;\n }\n\n return false;\n }\n\n function log(response, request) {\n var str;\n\n str = \"Request:\\n\" + sinon.format(request) + \"\\n\\n\";\n str += \"Response:\\n\" + sinon.format(response) + \"\\n\\n\";\n\n sinon.log(str);\n }\n\n return {\n create: function () {\n var server = create(this);\n this.xhr = sinon.useFakeXMLHttpRequest();\n server.requests = [];\n\n this.xhr.onCreate = function (xhrObj) {\n server.addRequest(xhrObj);\n };\n\n return server;\n },\n\n addRequest: function addRequest(xhrObj) {\n var server = this;\n push.call(this.requests, xhrObj);\n\n xhrObj.onSend = function () {\n server.handleRequest(this);\n };\n\n if (this.autoRespond && !this.responding) {\n setTimeout(function () {\n server.responding = false;\n server.respond();\n }, this.autoRespondAfter || 10);\n\n this.responding = true;\n }\n },\n\n getHTTPMethod: function getHTTPMethod(request) {\n if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n return !!matches ? matches[1] : request.method;\n }\n\n return request.method;\n },\n\n handleRequest: function handleRequest(xhr) {\n if (xhr.async) {\n if (!this.queue) {\n this.queue = [];\n }\n\n push.call(this.queue, xhr);\n } else {\n this.processRequest(xhr);\n }\n },\n\n respondWith: function respondWith(method, url, body) {\n if (arguments.length == 1 && typeof method != \"function\") {\n this.response = responseArray(method);\n return;\n }\n\n if (!this.responses) { this.responses = []; }\n\n if (arguments.length == 1) {\n body = method;\n url = method = null;\n }\n\n if (arguments.length == 2) {\n body = url;\n url = method;\n method = null;\n }\n\n push.call(this.responses, {\n method: method,\n url: url,\n response: typeof body == \"function\" ? body : responseArray(body)\n });\n },\n\n respond: function respond() {\n if (arguments.length > 0) this.respondWith.apply(this, arguments);\n var queue = this.queue || [];\n var request;\n\n while(request = queue.shift()) {\n this.processRequest(request);\n }\n },\n\n processRequest: function processRequest(request) {\n try {\n if (request.aborted) {\n return;\n }\n\n var response = this.response || [404, {}, \"\"];\n\n if (this.responses) {\n for (var i = 0, l = this.responses.length; i < l; i++) {\n if (match.call(this, this.responses[i], request)) {\n response = this.responses[i].response;\n break;\n }\n }\n }\n\n if (request.readyState != 4) {\n log(response, request);\n\n request.respond(response[0], response[1], response[2]);\n }\n } catch (e) {\n sinon.logError(\"Fake server request processing\", e);\n }\n },\n\n restore: function restore() {\n return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n }\n };\n}());\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon;\n}\n\n/**\n * @depend fake_server.js\n * @depend fake_timers.js\n */\n/*jslint browser: true, eqeqeq: false, onevar: false*/\n/*global sinon*/\n/**\n * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n * it polls the object for completion with setInterval. Dispite the direct\n * motivation, there is nothing jQuery-specific in this file, so it can be used\n * in any environment where the ajax implementation depends on setInterval or\n * setTimeout.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function () {\n function Server() {}\n Server.prototype = sinon.fakeServer;\n\n sinon.fakeServerWithClock = new Server();\n\n sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n if (xhr.async) {\n if (typeof setTimeout.clock == \"object\") {\n this.clock = setTimeout.clock;\n } else {\n this.clock = sinon.useFakeTimers();\n this.resetClock = true;\n }\n\n if (!this.longestTimeout) {\n var clockSetTimeout = this.clock.setTimeout;\n var clockSetInterval = this.clock.setInterval;\n var server = this;\n\n this.clock.setTimeout = function (fn, timeout) {\n server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n return clockSetTimeout.apply(this, arguments);\n };\n\n this.clock.setInterval = function (fn, timeout) {\n server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n return clockSetInterval.apply(this, arguments);\n };\n }\n }\n\n return sinon.fakeServer.addRequest.call(this, xhr);\n };\n\n sinon.fakeServerWithClock.respond = function respond() {\n var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\n if (this.clock) {\n this.clock.tick(this.longestTimeout || 0);\n this.longestTimeout = 0;\n\n if (this.resetClock) {\n this.clock.restore();\n this.resetClock = false;\n }\n }\n\n return returnVal;\n };\n\n sinon.fakeServerWithClock.restore = function restore() {\n if (this.clock) {\n this.clock.restore();\n }\n\n return sinon.fakeServer.restore.apply(this, arguments);\n };\n}());\n\n/**\n * @depend ../sinon.js\n * @depend collection.js\n * @depend util/fake_timers.js\n * @depend util/fake_server_with_clock.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global require, module*/\n/**\n * Manages fake collections as well as fake utilities such as Sinon's\n * timers and fake XHR implementation in one convenient object.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n var sinon = require(\"../sinon\");\n sinon.extend(sinon, require(\"./util/fake_timers\"));\n}\n\n(function () {\n var push = [].push;\n\n function exposeValue(sandbox, config, key, value) {\n if (!value) {\n return;\n }\n\n if (config.injectInto) {\n config.injectInto[key] = value;\n } else {\n push.call(sandbox.args, value);\n }\n }\n\n function prepareSandboxFromConfig(config) {\n var sandbox = sinon.create(sinon.sandbox);\n\n if (config.useFakeServer) {\n if (typeof config.useFakeServer == \"object\") {\n sandbox.serverPrototype = config.useFakeServer;\n }\n\n sandbox.useFakeServer();\n }\n\n if (config.useFakeTimers) {\n if (typeof config.useFakeTimers == \"object\") {\n sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n } else {\n sandbox.useFakeTimers();\n }\n }\n\n return sandbox;\n }\n\n sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n useFakeTimers: function useFakeTimers() {\n this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\n return this.add(this.clock);\n },\n\n serverPrototype: sinon.fakeServer,\n\n useFakeServer: function useFakeServer() {\n var proto = this.serverPrototype || sinon.fakeServer;\n\n if (!proto || !proto.create) {\n return null;\n }\n\n this.server = proto.create();\n return this.add(this.server);\n },\n\n inject: function (obj) {\n sinon.collection.inject.call(this, obj);\n\n if (this.clock) {\n obj.clock = this.clock;\n }\n\n if (this.server) {\n obj.server = this.server;\n obj.requests = this.server.requests;\n }\n\n return obj;\n },\n\n create: function (config) {\n if (!config) {\n return sinon.create(sinon.sandbox);\n }\n\n var sandbox = prepareSandboxFromConfig(config);\n sandbox.args = sandbox.args || [];\n var prop, value, exposed = sandbox.inject({});\n\n if (config.properties) {\n for (var i = 0, l = config.properties.length; i < l; i++) {\n prop = config.properties[i];\n value = exposed[prop] || prop == \"sandbox\" && sandbox;\n exposeValue(sandbox, config, prop, value);\n }\n } else {\n exposeValue(sandbox, config, \"sandbox\", value);\n }\n\n return sandbox;\n }\n });\n\n sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\n if (typeof module == \"object\" && typeof require == \"function\") {\n module.exports = sinon.sandbox;\n }\n}());\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n * @depend sandbox.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Test function, sandboxes fakes\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function test(callback) {\n var type = typeof callback;\n\n if (type != \"function\") {\n throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n }\n\n return function () {\n var config = sinon.getConfig(sinon.config);\n config.injectInto = config.injectIntoThis && this || config.injectInto;\n var sandbox = sinon.sandbox.create(config);\n var exception, result;\n var args = Array.prototype.slice.call(arguments).concat(sandbox.args);\n\n try {\n result = callback.apply(this, args);\n } catch (e) {\n exception = e;\n }\n\n if (typeof exception !== \"undefined\") {\n sandbox.restore();\n throw exception;\n }\n else {\n sandbox.verifyAndRestore();\n }\n\n return result;\n };\n }\n\n test.config = {\n injectIntoThis: true,\n injectInto: null,\n properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n useFakeTimers: true,\n useFakeServer: true\n };\n\n if (commonJSModule) {\n module.exports = test;\n } else {\n sinon.test = test;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend test.js\n */\n/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/\n/*global module, require, sinon*/\n/**\n * Test case, sandboxes all test functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon || !Object.prototype.hasOwnProperty) {\n return;\n }\n\n function createTest(property, setUp, tearDown) {\n return function () {\n if (setUp) {\n setUp.apply(this, arguments);\n }\n\n var exception, result;\n\n try {\n result = property.apply(this, arguments);\n } catch (e) {\n exception = e;\n }\n\n if (tearDown) {\n tearDown.apply(this, arguments);\n }\n\n if (exception) {\n throw exception;\n }\n\n return result;\n };\n }\n\n function testCase(tests, prefix) {\n /*jsl:ignore*/\n if (!tests || typeof tests != \"object\") {\n throw new TypeError(\"sinon.testCase needs an object with test functions\");\n }\n /*jsl:end*/\n\n prefix = prefix || \"test\";\n var rPrefix = new RegExp(\"^\" + prefix);\n var methods = {}, testName, property, method;\n var setUp = tests.setUp;\n var tearDown = tests.tearDown;\n\n for (testName in tests) {\n if (tests.hasOwnProperty(testName)) {\n property = tests[testName];\n\n if (/^(setUp|tearDown)$/.test(testName)) {\n continue;\n }\n\n if (typeof property == \"function\" && rPrefix.test(testName)) {\n method = property;\n\n if (setUp || tearDown) {\n method = createTest(property, setUp, tearDown);\n }\n\n methods[testName] = sinon.test(method);\n } else {\n methods[testName] = tests[testName];\n }\n }\n }\n\n return methods;\n }\n\n if (commonJSModule) {\n module.exports = testCase;\n } else {\n sinon.testCase = testCase;\n }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Assertions matching the test spy retrieval interface.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon, global) {\n var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n var slice = Array.prototype.slice;\n var assert;\n\n if (!sinon && commonJSModule) {\n sinon = require(\"../sinon\");\n }\n\n if (!sinon) {\n return;\n }\n\n function verifyIsStub() {\n var method;\n\n for (var i = 0, l = arguments.length; i < l; ++i) {\n method = arguments[i];\n\n if (!method) {\n assert.fail(\"fake is not a spy\");\n }\n\n if (typeof method != \"function\") {\n assert.fail(method + \" is not a function\");\n }\n\n if (typeof method.getCall != \"function\") {\n assert.fail(method + \" is not stubbed\");\n }\n }\n }\n\n function failAssertion(object, msg) {\n object = object || global;\n var failMethod = object.fail || assert.fail;\n failMethod.call(object, msg);\n }\n\n function mirrorPropAsAssertion(name, method, message) {\n if (arguments.length == 2) {\n message = method;\n method = name;\n }\n\n assert[name] = function (fake) {\n verifyIsStub(fake);\n\n var args = slice.call(arguments, 1);\n var failed = false;\n\n if (typeof method == \"function\") {\n failed = !method(fake);\n } else {\n failed = typeof fake[method] == \"function\" ?\n !fake[method].apply(fake, args) : !fake[method];\n }\n\n if (failed) {\n failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n } else {\n assert.pass(name);\n }\n };\n }\n\n function exposedName(prefix, prop) {\n return !prefix || /^fail/.test(prop) ? prop :\n prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n };\n\n assert = {\n failException: \"AssertError\",\n\n fail: function fail(message) {\n var error = new Error(message);\n error.name = this.failException || assert.failException;\n\n throw error;\n },\n\n pass: function pass(assertion) {},\n\n callOrder: function assertCallOrder() {\n verifyIsStub.apply(null, arguments);\n var expected = \"\", actual = \"\";\n\n if (!sinon.calledInOrder(arguments)) {\n try {\n expected = [].join.call(arguments, \", \");\n var calls = slice.call(arguments);\n var i = calls.length;\n while (i) {\n if (!calls[--i].called) {\n calls.splice(i, 1);\n }\n }\n actual = sinon.orderByFirstCall(calls).join(\", \");\n } catch (e) {\n // If this fails, we'll just fall back to the blank string\n }\n\n failAssertion(this, \"expected \" + expected + \" to be \" +\n \"called in order but were called as \" + actual);\n } else {\n assert.pass(\"callOrder\");\n }\n },\n\n callCount: function assertCallCount(method, count) {\n verifyIsStub(method);\n\n if (method.callCount != count) {\n var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n \" but was called %c%C\";\n failAssertion(this, method.printf(msg));\n } else {\n assert.pass(\"callCount\");\n }\n },\n\n expose: function expose(target, options) {\n if (!target) {\n throw new TypeError(\"target is null or undefined\");\n }\n\n var o = options || {};\n var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\n for (var method in this) {\n if (method != \"export\" && (includeFail || !/^(fail)/.test(method))) {\n target[exposedName(prefix, method)] = this[method];\n }\n }\n\n return target;\n }\n };\n\n mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n \"expected %n to not have been called but was called %c%C\");\n mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\n if (commonJSModule) {\n module.exports = assert;\n } else {\n sinon.assert = assert;\n }\n}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\nreturn sinon;}.call(typeof window != 'undefined' && window || {}));\n//@ sourceURL=indemma/vendor/sinon.js" +"/**\n\ + * Sinon.JS 1.7.3, 2013/06/20\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n\ + *\n\ + * (The BSD License)\n\ + * \n\ + * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no\n\ + * All rights reserved.\n\ + * \n\ + * Redistribution and use in source and binary forms, with or without modification,\n\ + * are permitted provided that the following conditions are met:\n\ + * \n\ + * * Redistributions of source code must retain the above copyright notice,\n\ + * this list of conditions and the following disclaimer.\n\ + * * Redistributions in binary form must reproduce the above copyright notice,\n\ + * this list of conditions and the following disclaimer in the documentation\n\ + * and/or other materials provided with the distribution.\n\ + * * Neither the name of Christian Johansen nor the names of his contributors\n\ + * may be used to endorse or promote products derived from this software\n\ + * without specific prior written permission.\n\ + * \n\ + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\ + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\ + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\ + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n\ + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n\ + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n\ + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n\ + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n\ + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n\ + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ + */\n\ +\n\ +this.sinon = (function () {\n\ +var buster = (function (setTimeout, B) {\n\ + var isNode = typeof require == \"function\" && typeof module == \"object\";\n\ + var div = typeof document != \"undefined\" && document.createElement(\"div\");\n\ + var F = function () {};\n\ +\n\ + var buster = {\n\ + bind: function bind(obj, methOrProp) {\n\ + var method = typeof methOrProp == \"string\" ? obj[methOrProp] : methOrProp;\n\ + var args = Array.prototype.slice.call(arguments, 2);\n\ + return function () {\n\ + var allArgs = args.concat(Array.prototype.slice.call(arguments));\n\ + return method.apply(obj, allArgs);\n\ + };\n\ + },\n\ +\n\ + partial: function partial(fn) {\n\ + var args = [].slice.call(arguments, 1);\n\ + return function () {\n\ + return fn.apply(this, args.concat([].slice.call(arguments)));\n\ + };\n\ + },\n\ +\n\ + create: function create(object) {\n\ + F.prototype = object;\n\ + return new F();\n\ + },\n\ +\n\ + extend: function extend(target) {\n\ + if (!target) { return; }\n\ + for (var i = 1, l = arguments.length, prop; i < l; ++i) {\n\ + for (prop in arguments[i]) {\n\ + target[prop] = arguments[i][prop];\n\ + }\n\ + }\n\ + return target;\n\ + },\n\ +\n\ + nextTick: function nextTick(callback) {\n\ + if (typeof process != \"undefined\" && process.nextTick) {\n\ + return process.nextTick(callback);\n\ + }\n\ + setTimeout(callback, 0);\n\ + },\n\ +\n\ + functionName: function functionName(func) {\n\ + if (!func) return \"\";\n\ + if (func.displayName) return func.displayName;\n\ + if (func.name) return func.name;\n\ + var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n\ + return matches && matches[1] || \"\";\n\ + },\n\ +\n\ + isNode: function isNode(obj) {\n\ + if (!div) return false;\n\ + try {\n\ + obj.appendChild(div);\n\ + obj.removeChild(div);\n\ + } catch (e) {\n\ + return false;\n\ + }\n\ + return true;\n\ + },\n\ +\n\ + isElement: function isElement(obj) {\n\ + return obj && obj.nodeType === 1 && buster.isNode(obj);\n\ + },\n\ +\n\ + isArray: function isArray(arr) {\n\ + return Object.prototype.toString.call(arr) == \"[object Array]\";\n\ + },\n\ +\n\ + flatten: function flatten(arr) {\n\ + var result = [], arr = arr || [];\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);\n\ + }\n\ + return result;\n\ + },\n\ +\n\ + each: function each(arr, callback) {\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + callback(arr[i]);\n\ + }\n\ + },\n\ +\n\ + map: function map(arr, callback) {\n\ + var results = [];\n\ + for (var i = 0, l = arr.length; i < l; ++i) {\n\ + results.push(callback(arr[i]));\n\ + }\n\ + return results;\n\ + },\n\ +\n\ + parallel: function parallel(fns, callback) {\n\ + function cb(err, res) {\n\ + if (typeof callback == \"function\") {\n\ + callback(err, res);\n\ + callback = null;\n\ + }\n\ + }\n\ + if (fns.length == 0) { return cb(null, []); }\n\ + var remaining = fns.length, results = [];\n\ + function makeDone(num) {\n\ + return function done(err, result) {\n\ + if (err) { return cb(err); }\n\ + results[num] = result;\n\ + if (--remaining == 0) { cb(null, results); }\n\ + };\n\ + }\n\ + for (var i = 0, l = fns.length; i < l; ++i) {\n\ + fns[i](makeDone(i));\n\ + }\n\ + },\n\ +\n\ + series: function series(fns, callback) {\n\ + function cb(err, res) {\n\ + if (typeof callback == \"function\") {\n\ + callback(err, res);\n\ + }\n\ + }\n\ + var remaining = fns.slice();\n\ + var results = [];\n\ + function callNext() {\n\ + if (remaining.length == 0) return cb(null, results);\n\ + var promise = remaining.shift()(next);\n\ + if (promise && typeof promise.then == \"function\") {\n\ + promise.then(buster.partial(next, null), next);\n\ + }\n\ + }\n\ + function next(err, result) {\n\ + if (err) return cb(err);\n\ + results.push(result);\n\ + callNext();\n\ + }\n\ + callNext();\n\ + },\n\ +\n\ + countdown: function countdown(num, done) {\n\ + return function () {\n\ + if (--num == 0) done();\n\ + };\n\ + }\n\ + };\n\ +\n\ + if (typeof process === \"object\" &&\n\ + typeof require === \"function\" && typeof module === \"object\") {\n\ + var crypto = require(\"crypto\");\n\ + var path = require(\"path\");\n\ +\n\ + buster.tmpFile = function (fileName) {\n\ + var hashed = crypto.createHash(\"sha1\");\n\ + hashed.update(fileName);\n\ + var tmpfileName = hashed.digest(\"hex\");\n\ +\n\ + if (process.platform == \"win32\") {\n\ + return path.join(process.env[\"TEMP\"], tmpfileName);\n\ + } else {\n\ + return path.join(\"/tmp\", tmpfileName);\n\ + }\n\ + };\n\ + }\n\ +\n\ + if (Array.prototype.some) {\n\ + buster.some = function (arr, fn, thisp) {\n\ + return arr.some(fn, thisp);\n\ + };\n\ + } else {\n\ + // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n\ + buster.some = function (arr, fun, thisp) {\n\ + if (arr == null) { throw new TypeError(); }\n\ + arr = Object(arr);\n\ + var len = arr.length >>> 0;\n\ + if (typeof fun !== \"function\") { throw new TypeError(); }\n\ +\n\ + for (var i = 0; i < len; i++) {\n\ + if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {\n\ + return true;\n\ + }\n\ + }\n\ +\n\ + return false;\n\ + };\n\ + }\n\ +\n\ + if (Array.prototype.filter) {\n\ + buster.filter = function (arr, fn, thisp) {\n\ + return arr.filter(fn, thisp);\n\ + };\n\ + } else {\n\ + // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter\n\ + buster.filter = function (fn, thisp) {\n\ + if (this == null) { throw new TypeError(); }\n\ +\n\ + var t = Object(this);\n\ + var len = t.length >>> 0;\n\ + if (typeof fn != \"function\") { throw new TypeError(); }\n\ +\n\ + var res = [];\n\ + for (var i = 0; i < len; i++) {\n\ + if (i in t) {\n\ + var val = t[i]; // in case fun mutates this\n\ + if (fn.call(thisp, val, i, t)) { res.push(val); }\n\ + }\n\ + }\n\ +\n\ + return res;\n\ + };\n\ + }\n\ +\n\ + if (isNode) {\n\ + module.exports = buster;\n\ + buster.eventEmitter = require(\"./buster-event-emitter\");\n\ + Object.defineProperty(buster, \"defineVersionGetter\", {\n\ + get: function () {\n\ + return require(\"./define-version-getter\");\n\ + }\n\ + });\n\ + }\n\ +\n\ + return buster.extend(B || {}, buster);\n\ +}(setTimeout, buster));\n\ +if (typeof buster === \"undefined\") {\n\ + var buster = {};\n\ +}\n\ +\n\ +if (typeof module === \"object\" && typeof require === \"function\") {\n\ + buster = require(\"buster-core\");\n\ +}\n\ +\n\ +buster.format = buster.format || {};\n\ +buster.format.excludeConstructors = [\"Object\", /^.$/];\n\ +buster.format.quoteStrings = true;\n\ +\n\ +buster.format.ascii = (function () {\n\ + \n\ + var hasOwn = Object.prototype.hasOwnProperty;\n\ +\n\ + var specialObjects = [];\n\ + if (typeof global != \"undefined\") {\n\ + specialObjects.push({ obj: global, value: \"[object global]\" });\n\ + }\n\ + if (typeof document != \"undefined\") {\n\ + specialObjects.push({ obj: document, value: \"[object HTMLDocument]\" });\n\ + }\n\ + if (typeof window != \"undefined\") {\n\ + specialObjects.push({ obj: window, value: \"[object Window]\" });\n\ + }\n\ +\n\ + function keys(object) {\n\ + var k = Object.keys && Object.keys(object) || [];\n\ +\n\ + if (k.length == 0) {\n\ + for (var prop in object) {\n\ + if (hasOwn.call(object, prop)) {\n\ + k.push(prop);\n\ + }\n\ + }\n\ + }\n\ +\n\ + return k.sort();\n\ + }\n\ +\n\ + function isCircular(object, objects) {\n\ + if (typeof object != \"object\") {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = objects.length; i < l; ++i) {\n\ + if (objects[i] === object) {\n\ + return true;\n\ + }\n\ + }\n\ +\n\ + return false;\n\ + }\n\ +\n\ + function ascii(object, processed, indent) {\n\ + if (typeof object == \"string\") {\n\ + var quote = typeof this.quoteStrings != \"boolean\" || this.quoteStrings;\n\ + return processed || quote ? '\"' + object + '\"' : object;\n\ + }\n\ +\n\ + if (typeof object == \"function\" && !(object instanceof RegExp)) {\n\ + return ascii.func(object);\n\ + }\n\ +\n\ + processed = processed || [];\n\ +\n\ + if (isCircular(object, processed)) {\n\ + return \"[Circular]\";\n\ + }\n\ +\n\ + if (Object.prototype.toString.call(object) == \"[object Array]\") {\n\ + return ascii.array.call(this, object, processed);\n\ + }\n\ +\n\ + if (!object) {\n\ + return \"\" + object;\n\ + }\n\ +\n\ + if (buster.isElement(object)) {\n\ + return ascii.element(object);\n\ + }\n\ +\n\ + if (typeof object.toString == \"function\" &&\n\ + object.toString !== Object.prototype.toString) {\n\ + return object.toString();\n\ + }\n\ +\n\ + for (var i = 0, l = specialObjects.length; i < l; i++) {\n\ + if (object === specialObjects[i].obj) {\n\ + return specialObjects[i].value;\n\ + }\n\ + }\n\ +\n\ + return ascii.object.call(this, object, processed, indent);\n\ + }\n\ +\n\ + ascii.func = function (func) {\n\ + return \"function \" + buster.functionName(func) + \"() {}\";\n\ + };\n\ +\n\ + ascii.array = function (array, processed) {\n\ + processed = processed || [];\n\ + processed.push(array);\n\ + var pieces = [];\n\ +\n\ + for (var i = 0, l = array.length; i < l; ++i) {\n\ + pieces.push(ascii.call(this, array[i], processed));\n\ + }\n\ +\n\ + return \"[\" + pieces.join(\", \") + \"]\";\n\ + };\n\ +\n\ + ascii.object = function (object, processed, indent) {\n\ + processed = processed || [];\n\ + processed.push(object);\n\ + indent = indent || 0;\n\ + var pieces = [], properties = keys(object), prop, str, obj;\n\ + var is = \"\";\n\ + var length = 3;\n\ +\n\ + for (var i = 0, l = indent; i < l; ++i) {\n\ + is += \" \";\n\ + }\n\ +\n\ + for (i = 0, l = properties.length; i < l; ++i) {\n\ + prop = properties[i];\n\ + obj = object[prop];\n\ +\n\ + if (isCircular(obj, processed)) {\n\ + str = \"[Circular]\";\n\ + } else {\n\ + str = ascii.call(this, obj, processed, indent + 2);\n\ + }\n\ +\n\ + str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n\ + length += str.length;\n\ + pieces.push(str);\n\ + }\n\ +\n\ + var cons = ascii.constructorName.call(this, object);\n\ + var prefix = cons ? \"[\" + cons + \"] \" : \"\"\n\ +\n\ + return (length + indent) > 80 ?\n\ + prefix + \"{\\n\ + \" + is + pieces.join(\",\\n\ + \" + is) + \"\\n\ +\" + is + \"}\" :\n\ + prefix + \"{ \" + pieces.join(\", \") + \" }\";\n\ + };\n\ +\n\ + ascii.element = function (element) {\n\ + var tagName = element.tagName.toLowerCase();\n\ + var attrs = element.attributes, attribute, pairs = [], attrName;\n\ +\n\ + for (var i = 0, l = attrs.length; i < l; ++i) {\n\ + attribute = attrs.item(i);\n\ + attrName = attribute.nodeName.toLowerCase().replace(\"html:\", \"\");\n\ +\n\ + if (attrName == \"contenteditable\" && attribute.nodeValue == \"inherit\") {\n\ + continue;\n\ + }\n\ +\n\ + if (!!attribute.nodeValue) {\n\ + pairs.push(attrName + \"=\\\"\" + attribute.nodeValue + \"\\\"\");\n\ + }\n\ + }\n\ +\n\ + var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n\ + var content = element.innerHTML;\n\ +\n\ + if (content.length > 20) {\n\ + content = content.substr(0, 20) + \"[...]\";\n\ + }\n\ +\n\ + var res = formatted + pairs.join(\" \") + \">\" + content + \"</\" + tagName + \">\";\n\ +\n\ + return res.replace(/ contentEditable=\"inherit\"/, \"\");\n\ + };\n\ +\n\ + ascii.constructorName = function (object) {\n\ + var name = buster.functionName(object && object.constructor);\n\ + var excludes = this.excludeConstructors || buster.format.excludeConstructors || [];\n\ +\n\ + for (var i = 0, l = excludes.length; i < l; ++i) {\n\ + if (typeof excludes[i] == \"string\" && excludes[i] == name) {\n\ + return \"\";\n\ + } else if (excludes[i].test && excludes[i].test(name)) {\n\ + return \"\";\n\ + }\n\ + }\n\ +\n\ + return name;\n\ + };\n\ +\n\ + return ascii;\n\ +}());\n\ +\n\ +if (typeof module != \"undefined\") {\n\ + module.exports = buster.format;\n\ +}\n\ +/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/\n\ +/*global module, require, __dirname, document*/\n\ +/**\n\ + * Sinon core utilities. For internal use only.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +var sinon = (function (buster) {\n\ + var div = typeof document != \"undefined\" && document.createElement(\"div\");\n\ + var hasOwn = Object.prototype.hasOwnProperty;\n\ +\n\ + function isDOMNode(obj) {\n\ + var success = false;\n\ +\n\ + try {\n\ + obj.appendChild(div);\n\ + success = div.parentNode == obj;\n\ + } catch (e) {\n\ + return false;\n\ + } finally {\n\ + try {\n\ + obj.removeChild(div);\n\ + } catch (e) {\n\ + // Remove failed, not much we can do about that\n\ + }\n\ + }\n\ +\n\ + return success;\n\ + }\n\ +\n\ + function isElement(obj) {\n\ + return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n\ + }\n\ +\n\ + function isFunction(obj) {\n\ + return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n\ + }\n\ +\n\ + function mirrorProperties(target, source) {\n\ + for (var prop in source) {\n\ + if (!hasOwn.call(target, prop)) {\n\ + target[prop] = source[prop];\n\ + }\n\ + }\n\ + }\n\ +\n\ + function isRestorable (obj) {\n\ + return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n\ + }\n\ +\n\ + var sinon = {\n\ + wrapMethod: function wrapMethod(object, property, method) {\n\ + if (!object) {\n\ + throw new TypeError(\"Should wrap property of object\");\n\ + }\n\ +\n\ + if (typeof method != \"function\") {\n\ + throw new TypeError(\"Method wrapper should be function\");\n\ + }\n\ +\n\ + var wrappedMethod = object[property];\n\ +\n\ + if (!isFunction(wrappedMethod)) {\n\ + throw new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n\ + property + \" as function\");\n\ + }\n\ +\n\ + if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n\ + throw new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n\ + }\n\ +\n\ + if (wrappedMethod.calledBefore) {\n\ + var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n\ + throw new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n\ + }\n\ +\n\ + // IE 8 does not support hasOwnProperty on the window object.\n\ + var owned = hasOwn.call(object, property);\n\ + object[property] = method;\n\ + method.displayName = property;\n\ +\n\ + method.restore = function () {\n\ + // For prototype properties try to reset by delete first.\n\ + // If this fails (ex: localStorage on mobile safari) then force a reset\n\ + // via direct assignment.\n\ + if (!owned) {\n\ + delete object[property];\n\ + }\n\ + if (object[property] === method) {\n\ + object[property] = wrappedMethod;\n\ + }\n\ + };\n\ +\n\ + method.restore.sinon = true;\n\ + mirrorProperties(method, wrappedMethod);\n\ +\n\ + return method;\n\ + },\n\ +\n\ + extend: function extend(target) {\n\ + for (var i = 1, l = arguments.length; i < l; i += 1) {\n\ + for (var prop in arguments[i]) {\n\ + if (arguments[i].hasOwnProperty(prop)) {\n\ + target[prop] = arguments[i][prop];\n\ + }\n\ +\n\ + // DONT ENUM bug, only care about toString\n\ + if (arguments[i].hasOwnProperty(\"toString\") &&\n\ + arguments[i].toString != target.toString) {\n\ + target.toString = arguments[i].toString;\n\ + }\n\ + }\n\ + }\n\ +\n\ + return target;\n\ + },\n\ +\n\ + create: function create(proto) {\n\ + var F = function () {};\n\ + F.prototype = proto;\n\ + return new F();\n\ + },\n\ +\n\ + deepEqual: function deepEqual(a, b) {\n\ + if (sinon.match && sinon.match.isMatcher(a)) {\n\ + return a.test(b);\n\ + }\n\ + if (typeof a != \"object\" || typeof b != \"object\") {\n\ + return a === b;\n\ + }\n\ +\n\ + if (isElement(a) || isElement(b)) {\n\ + return a === b;\n\ + }\n\ +\n\ + if (a === b) {\n\ + return true;\n\ + }\n\ +\n\ + if ((a === null && b !== null) || (a !== null && b === null)) {\n\ + return false;\n\ + }\n\ +\n\ + var aString = Object.prototype.toString.call(a);\n\ + if (aString != Object.prototype.toString.call(b)) {\n\ + return false;\n\ + }\n\ +\n\ + if (aString == \"[object Array]\") {\n\ + if (a.length !== b.length) {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = a.length; i < l; i += 1) {\n\ + if (!deepEqual(a[i], b[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + }\n\ +\n\ + if (aString == \"[object Date]\") {\n\ + return a.valueOf() === b.valueOf();\n\ + }\n\ +\n\ + var prop, aLength = 0, bLength = 0;\n\ +\n\ + for (prop in a) {\n\ + aLength += 1;\n\ +\n\ + if (!deepEqual(a[prop], b[prop])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + for (prop in b) {\n\ + bLength += 1;\n\ + }\n\ +\n\ + return aLength == bLength;\n\ + },\n\ +\n\ + functionName: function functionName(func) {\n\ + var name = func.displayName || func.name;\n\ +\n\ + // Use function decomposition as a last resort to get function\n\ + // name. Does not rely on function decomposition to work - if it\n\ + // doesn't debugging will be slightly less informative\n\ + // (i.e. toString will say 'spy' rather than 'myFunc').\n\ + if (!name) {\n\ + var matches = func.toString().match(/function ([^\\s\\(]+)/);\n\ + name = matches && matches[1];\n\ + }\n\ +\n\ + return name;\n\ + },\n\ +\n\ + functionToString: function toString() {\n\ + if (this.getCall && this.callCount) {\n\ + var thisValue, prop, i = this.callCount;\n\ +\n\ + while (i--) {\n\ + thisValue = this.getCall(i).thisValue;\n\ +\n\ + for (prop in thisValue) {\n\ + if (thisValue[prop] === this) {\n\ + return prop;\n\ + }\n\ + }\n\ + }\n\ + }\n\ +\n\ + return this.displayName || \"sinon fake\";\n\ + },\n\ +\n\ + getConfig: function (custom) {\n\ + var config = {};\n\ + custom = custom || {};\n\ + var defaults = sinon.defaultConfig;\n\ +\n\ + for (var prop in defaults) {\n\ + if (defaults.hasOwnProperty(prop)) {\n\ + config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n\ + }\n\ + }\n\ +\n\ + return config;\n\ + },\n\ +\n\ + format: function (val) {\n\ + return \"\" + val;\n\ + },\n\ +\n\ + defaultConfig: {\n\ + injectIntoThis: true,\n\ + injectInto: null,\n\ + properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n\ + useFakeTimers: true,\n\ + useFakeServer: true\n\ + },\n\ +\n\ + timesInWords: function timesInWords(count) {\n\ + return count == 1 && \"once\" ||\n\ + count == 2 && \"twice\" ||\n\ + count == 3 && \"thrice\" ||\n\ + (count || 0) + \" times\";\n\ + },\n\ +\n\ + calledInOrder: function (spies) {\n\ + for (var i = 1, l = spies.length; i < l; i++) {\n\ + if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + orderByFirstCall: function (spies) {\n\ + return spies.sort(function (a, b) {\n\ + // uuid, won't ever be equal\n\ + var aCall = a.getCall(0);\n\ + var bCall = b.getCall(0);\n\ + var aId = aCall && aCall.callId || -1;\n\ + var bId = bCall && bCall.callId || -1;\n\ +\n\ + return aId < bId ? -1 : 1;\n\ + });\n\ + },\n\ +\n\ + log: function () {},\n\ +\n\ + logError: function (label, err) {\n\ + var msg = label + \" threw exception: \"\n\ + sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n\ + if (err.stack) { sinon.log(err.stack); }\n\ +\n\ + setTimeout(function () {\n\ + err.message = msg + err.message;\n\ + throw err;\n\ + }, 0);\n\ + },\n\ +\n\ + typeOf: function (value) {\n\ + if (value === null) {\n\ + return \"null\";\n\ + }\n\ + else if (value === undefined) {\n\ + return \"undefined\";\n\ + }\n\ + var string = Object.prototype.toString.call(value);\n\ + return string.substring(8, string.length - 1).toLowerCase();\n\ + },\n\ +\n\ + createStubInstance: function (constructor) {\n\ + if (typeof constructor !== \"function\") {\n\ + throw new TypeError(\"The constructor should be a function.\");\n\ + }\n\ + return sinon.stub(sinon.create(constructor.prototype));\n\ + },\n\ +\n\ + restore: function (object) {\n\ + if (object !== null && typeof object === \"object\") {\n\ + for (var prop in object) {\n\ + if (isRestorable(object[prop])) {\n\ + object[prop].restore();\n\ + }\n\ + }\n\ + }\n\ + else if (isRestorable(object)) {\n\ + object.restore();\n\ + }\n\ + }\n\ + };\n\ +\n\ + var isNode = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (isNode) {\n\ + try {\n\ + buster = { format: require(\"buster-format\") };\n\ + } catch (e) {}\n\ + module.exports = sinon;\n\ + module.exports.spy = require(\"./sinon/spy\");\n\ + module.exports.stub = require(\"./sinon/stub\");\n\ + module.exports.mock = require(\"./sinon/mock\");\n\ + module.exports.collection = require(\"./sinon/collection\");\n\ + module.exports.assert = require(\"./sinon/assert\");\n\ + module.exports.sandbox = require(\"./sinon/sandbox\");\n\ + module.exports.test = require(\"./sinon/test\");\n\ + module.exports.testCase = require(\"./sinon/test_case\");\n\ + module.exports.assert = require(\"./sinon/assert\");\n\ + module.exports.match = require(\"./sinon/match\");\n\ + }\n\ +\n\ + if (buster) {\n\ + var formatter = sinon.create(buster.format);\n\ + formatter.quoteStrings = false;\n\ + sinon.format = function () {\n\ + return formatter.ascii.apply(formatter, arguments);\n\ + };\n\ + } else if (isNode) {\n\ + try {\n\ + var util = require(\"util\");\n\ + sinon.format = function (value) {\n\ + return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n\ + };\n\ + } catch (e) {\n\ + /* Node, but no util module - would be very old, but better safe than\n\ + sorry */\n\ + }\n\ + }\n\ +\n\ + return sinon;\n\ +}(typeof buster == \"object\" && buster));\n\ +\n\ +/* @depend ../sinon.js */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Match functions\n\ + *\n\ + * @author Maximilian Antoni (mail@maxantoni.de)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2012 Maximilian Antoni\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function assertType(value, type, name) {\n\ + var actual = sinon.typeOf(value);\n\ + if (actual !== type) {\n\ + throw new TypeError(\"Expected type of \" + name + \" to be \" +\n\ + type + \", but was \" + actual);\n\ + }\n\ + }\n\ +\n\ + var matcher = {\n\ + toString: function () {\n\ + return this.message;\n\ + }\n\ + };\n\ +\n\ + function isMatcher(object) {\n\ + return matcher.isPrototypeOf(object);\n\ + }\n\ +\n\ + function matchObject(expectation, actual) {\n\ + if (actual === null || actual === undefined) {\n\ + return false;\n\ + }\n\ + for (var key in expectation) {\n\ + if (expectation.hasOwnProperty(key)) {\n\ + var exp = expectation[key];\n\ + var act = actual[key];\n\ + if (match.isMatcher(exp)) {\n\ + if (!exp.test(act)) {\n\ + return false;\n\ + }\n\ + } else if (sinon.typeOf(exp) === \"object\") {\n\ + if (!matchObject(exp, act)) {\n\ + return false;\n\ + }\n\ + } else if (!sinon.deepEqual(exp, act)) {\n\ + return false;\n\ + }\n\ + }\n\ + }\n\ + return true;\n\ + }\n\ +\n\ + matcher.or = function (m2) {\n\ + if (!isMatcher(m2)) {\n\ + throw new TypeError(\"Matcher expected\");\n\ + }\n\ + var m1 = this;\n\ + var or = sinon.create(matcher);\n\ + or.test = function (actual) {\n\ + return m1.test(actual) || m2.test(actual);\n\ + };\n\ + or.message = m1.message + \".or(\" + m2.message + \")\";\n\ + return or;\n\ + };\n\ +\n\ + matcher.and = function (m2) {\n\ + if (!isMatcher(m2)) {\n\ + throw new TypeError(\"Matcher expected\");\n\ + }\n\ + var m1 = this;\n\ + var and = sinon.create(matcher);\n\ + and.test = function (actual) {\n\ + return m1.test(actual) && m2.test(actual);\n\ + };\n\ + and.message = m1.message + \".and(\" + m2.message + \")\";\n\ + return and;\n\ + };\n\ +\n\ + var match = function (expectation, message) {\n\ + var m = sinon.create(matcher);\n\ + var type = sinon.typeOf(expectation);\n\ + switch (type) {\n\ + case \"object\":\n\ + if (typeof expectation.test === \"function\") {\n\ + m.test = function (actual) {\n\ + return expectation.test(actual) === true;\n\ + };\n\ + m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n\ + return m;\n\ + }\n\ + var str = [];\n\ + for (var key in expectation) {\n\ + if (expectation.hasOwnProperty(key)) {\n\ + str.push(key + \": \" + expectation[key]);\n\ + }\n\ + }\n\ + m.test = function (actual) {\n\ + return matchObject(expectation, actual);\n\ + };\n\ + m.message = \"match(\" + str.join(\", \") + \")\";\n\ + break;\n\ + case \"number\":\n\ + m.test = function (actual) {\n\ + return expectation == actual;\n\ + };\n\ + break;\n\ + case \"string\":\n\ + m.test = function (actual) {\n\ + if (typeof actual !== \"string\") {\n\ + return false;\n\ + }\n\ + return actual.indexOf(expectation) !== -1;\n\ + };\n\ + m.message = \"match(\\\"\" + expectation + \"\\\")\";\n\ + break;\n\ + case \"regexp\":\n\ + m.test = function (actual) {\n\ + if (typeof actual !== \"string\") {\n\ + return false;\n\ + }\n\ + return expectation.test(actual);\n\ + };\n\ + break;\n\ + case \"function\":\n\ + m.test = expectation;\n\ + if (message) {\n\ + m.message = message;\n\ + } else {\n\ + m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n\ + }\n\ + break;\n\ + default:\n\ + m.test = function (actual) {\n\ + return sinon.deepEqual(expectation, actual);\n\ + };\n\ + }\n\ + if (!m.message) {\n\ + m.message = \"match(\" + expectation + \")\";\n\ + }\n\ + return m;\n\ + };\n\ +\n\ + match.isMatcher = isMatcher;\n\ +\n\ + match.any = match(function () {\n\ + return true;\n\ + }, \"any\");\n\ +\n\ + match.defined = match(function (actual) {\n\ + return actual !== null && actual !== undefined;\n\ + }, \"defined\");\n\ +\n\ + match.truthy = match(function (actual) {\n\ + return !!actual;\n\ + }, \"truthy\");\n\ +\n\ + match.falsy = match(function (actual) {\n\ + return !actual;\n\ + }, \"falsy\");\n\ +\n\ + match.same = function (expectation) {\n\ + return match(function (actual) {\n\ + return expectation === actual;\n\ + }, \"same(\" + expectation + \")\");\n\ + };\n\ +\n\ + match.typeOf = function (type) {\n\ + assertType(type, \"string\", \"type\");\n\ + return match(function (actual) {\n\ + return sinon.typeOf(actual) === type;\n\ + }, \"typeOf(\\\"\" + type + \"\\\")\");\n\ + };\n\ +\n\ + match.instanceOf = function (type) {\n\ + assertType(type, \"function\", \"type\");\n\ + return match(function (actual) {\n\ + return actual instanceof type;\n\ + }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n\ + };\n\ +\n\ + function createPropertyMatcher(propertyTest, messagePrefix) {\n\ + return function (property, value) {\n\ + assertType(property, \"string\", \"property\");\n\ + var onlyProperty = arguments.length === 1;\n\ + var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n\ + if (!onlyProperty) {\n\ + message += \", \" + value;\n\ + }\n\ + message += \")\";\n\ + return match(function (actual) {\n\ + if (actual === undefined || actual === null ||\n\ + !propertyTest(actual, property)) {\n\ + return false;\n\ + }\n\ + return onlyProperty || sinon.deepEqual(value, actual[property]);\n\ + }, message);\n\ + };\n\ + }\n\ +\n\ + match.has = createPropertyMatcher(function (actual, property) {\n\ + if (typeof actual === \"object\") {\n\ + return property in actual;\n\ + }\n\ + return actual[property] !== undefined;\n\ + }, \"has\");\n\ +\n\ + match.hasOwn = createPropertyMatcher(function (actual, property) {\n\ + return actual.hasOwnProperty(property);\n\ + }, \"hasOwn\");\n\ +\n\ + match.bool = match.typeOf(\"boolean\");\n\ + match.number = match.typeOf(\"number\");\n\ + match.string = match.typeOf(\"string\");\n\ + match.object = match.typeOf(\"object\");\n\ + match.func = match.typeOf(\"function\");\n\ + match.array = match.typeOf(\"array\");\n\ + match.regexp = match.typeOf(\"regexp\");\n\ + match.date = match.typeOf(\"date\");\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = match;\n\ + } else {\n\ + sinon.match = match;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend match.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Spy calls\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @author Maximilian Antoni (mail@maxantoni.de)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + * Copyright (c) 2013 Maximilian Antoni\n\ + */\n\ +\n\ +var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ +if (!this.sinon && commonJSModule) {\n\ + var sinon = require(\"../sinon\");\n\ +}\n\ +\n\ +(function (sinon) {\n\ + function throwYieldError(proxy, text, args) {\n\ + var msg = sinon.functionName(proxy) + text;\n\ + if (args.length) {\n\ + msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n\ + }\n\ + throw new Error(msg);\n\ + }\n\ +\n\ + var slice = Array.prototype.slice;\n\ +\n\ + var callProto = {\n\ + calledOn: function calledOn(thisValue) {\n\ + if (sinon.match && sinon.match.isMatcher(thisValue)) {\n\ + return thisValue.test(this.thisValue);\n\ + }\n\ + return this.thisValue === thisValue;\n\ + },\n\ +\n\ + calledWith: function calledWith() {\n\ + for (var i = 0, l = arguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(arguments[i], this.args[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + calledWithMatch: function calledWithMatch() {\n\ + for (var i = 0, l = arguments.length; i < l; i += 1) {\n\ + var actual = this.args[i];\n\ + var expectation = arguments[i];\n\ + if (!sinon.match || !sinon.match(expectation).test(actual)) {\n\ + return false;\n\ + }\n\ + }\n\ + return true;\n\ + },\n\ +\n\ + calledWithExactly: function calledWithExactly() {\n\ + return arguments.length == this.args.length &&\n\ + this.calledWith.apply(this, arguments);\n\ + },\n\ +\n\ + notCalledWith: function notCalledWith() {\n\ + return !this.calledWith.apply(this, arguments);\n\ + },\n\ +\n\ + notCalledWithMatch: function notCalledWithMatch() {\n\ + return !this.calledWithMatch.apply(this, arguments);\n\ + },\n\ +\n\ + returned: function returned(value) {\n\ + return sinon.deepEqual(value, this.returnValue);\n\ + },\n\ +\n\ + threw: function threw(error) {\n\ + if (typeof error === \"undefined\" || !this.exception) {\n\ + return !!this.exception;\n\ + }\n\ +\n\ + return this.exception === error || this.exception.name === error;\n\ + },\n\ +\n\ + calledWithNew: function calledWithNew(thisValue) {\n\ + return this.thisValue instanceof this.proxy;\n\ + },\n\ +\n\ + calledBefore: function (other) {\n\ + return this.callId < other.callId;\n\ + },\n\ +\n\ + calledAfter: function (other) {\n\ + return this.callId > other.callId;\n\ + },\n\ +\n\ + callArg: function (pos) {\n\ + this.args[pos]();\n\ + },\n\ +\n\ + callArgOn: function (pos, thisValue) {\n\ + this.args[pos].apply(thisValue);\n\ + },\n\ +\n\ + callArgWith: function (pos) {\n\ + this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n\ + },\n\ +\n\ + callArgOnWith: function (pos, thisValue) {\n\ + var args = slice.call(arguments, 2);\n\ + this.args[pos].apply(thisValue, args);\n\ + },\n\ +\n\ + \"yield\": function () {\n\ + this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n\ + },\n\ +\n\ + yieldOn: function (thisValue) {\n\ + var args = this.args;\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (typeof args[i] === \"function\") {\n\ + args[i].apply(thisValue, slice.call(arguments, 1));\n\ + return;\n\ + }\n\ + }\n\ + throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n\ + },\n\ +\n\ + yieldTo: function (prop) {\n\ + this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n\ + },\n\ +\n\ + yieldToOn: function (prop, thisValue) {\n\ + var args = this.args;\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (args[i] && typeof args[i][prop] === \"function\") {\n\ + args[i][prop].apply(thisValue, slice.call(arguments, 2));\n\ + return;\n\ + }\n\ + }\n\ + throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n\ + \"' since no callback was passed.\", args);\n\ + },\n\ +\n\ + toString: function () {\n\ + var callStr = this.proxy.toString() + \"(\";\n\ + var args = [];\n\ +\n\ + for (var i = 0, l = this.args.length; i < l; ++i) {\n\ + args.push(sinon.format(this.args[i]));\n\ + }\n\ +\n\ + callStr = callStr + args.join(\", \") + \")\";\n\ +\n\ + if (typeof this.returnValue != \"undefined\") {\n\ + callStr += \" => \" + sinon.format(this.returnValue);\n\ + }\n\ +\n\ + if (this.exception) {\n\ + callStr += \" !\" + this.exception.name;\n\ +\n\ + if (this.exception.message) {\n\ + callStr += \"(\" + this.exception.message + \")\";\n\ + }\n\ + }\n\ +\n\ + return callStr;\n\ + }\n\ + };\n\ +\n\ + callProto.invokeCallback = callProto.yield;\n\ +\n\ + function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n\ + if (typeof id !== \"number\") {\n\ + throw new TypeError(\"Call id is not a number\");\n\ + }\n\ + var proxyCall = sinon.create(callProto);\n\ + proxyCall.proxy = spy;\n\ + proxyCall.thisValue = thisValue;\n\ + proxyCall.args = args;\n\ + proxyCall.returnValue = returnValue;\n\ + proxyCall.exception = exception;\n\ + proxyCall.callId = id;\n\ +\n\ + return proxyCall;\n\ + };\n\ + createSpyCall.toString = callProto.toString; // used by mocks\n\ +\n\ + sinon.spyCall = createSpyCall;\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Spy functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = Array.prototype.push;\n\ + var slice = Array.prototype.slice;\n\ + var callId = 0;\n\ +\n\ + function spy(object, property) {\n\ + if (!property && typeof object == \"function\") {\n\ + return spy.create(object);\n\ + }\n\ +\n\ + if (!object && !property) {\n\ + return spy.create(function () { });\n\ + }\n\ +\n\ + var method = object[property];\n\ + return sinon.wrapMethod(object, property, spy.create(method));\n\ + }\n\ +\n\ + function matchingFake(fakes, args, strict) {\n\ + if (!fakes) {\n\ + return;\n\ + }\n\ +\n\ + var alen = args.length;\n\ +\n\ + for (var i = 0, l = fakes.length; i < l; i++) {\n\ + if (fakes[i].matches(args, strict)) {\n\ + return fakes[i];\n\ + }\n\ + }\n\ + }\n\ +\n\ + function incrementCallCount() {\n\ + this.called = true;\n\ + this.callCount += 1;\n\ + this.notCalled = false;\n\ + this.calledOnce = this.callCount == 1;\n\ + this.calledTwice = this.callCount == 2;\n\ + this.calledThrice = this.callCount == 3;\n\ + }\n\ +\n\ + function createCallProperties() {\n\ + this.firstCall = this.getCall(0);\n\ + this.secondCall = this.getCall(1);\n\ + this.thirdCall = this.getCall(2);\n\ + this.lastCall = this.getCall(this.callCount - 1);\n\ + }\n\ +\n\ + var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n\ + function createProxy(func) {\n\ + // Retain the function length:\n\ + var p;\n\ + if (func.length) {\n\ + eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n\ + \") { return p.invoke(func, this, slice.call(arguments)); });\");\n\ + }\n\ + else {\n\ + p = function proxy() {\n\ + return p.invoke(func, this, slice.call(arguments));\n\ + };\n\ + }\n\ + return p;\n\ + }\n\ +\n\ + var uuid = 0;\n\ +\n\ + // Public API\n\ + var spyApi = {\n\ + reset: function () {\n\ + this.called = false;\n\ + this.notCalled = true;\n\ + this.calledOnce = false;\n\ + this.calledTwice = false;\n\ + this.calledThrice = false;\n\ + this.callCount = 0;\n\ + this.firstCall = null;\n\ + this.secondCall = null;\n\ + this.thirdCall = null;\n\ + this.lastCall = null;\n\ + this.args = [];\n\ + this.returnValues = [];\n\ + this.thisValues = [];\n\ + this.exceptions = [];\n\ + this.callIds = [];\n\ + if (this.fakes) {\n\ + for (var i = 0; i < this.fakes.length; i++) {\n\ + this.fakes[i].reset();\n\ + }\n\ + }\n\ + },\n\ +\n\ + create: function create(func) {\n\ + var name;\n\ +\n\ + if (typeof func != \"function\") {\n\ + func = function () { };\n\ + } else {\n\ + name = sinon.functionName(func);\n\ + }\n\ +\n\ + var proxy = createProxy(func);\n\ +\n\ + sinon.extend(proxy, spy);\n\ + delete proxy.create;\n\ + sinon.extend(proxy, func);\n\ +\n\ + proxy.reset();\n\ + proxy.prototype = func.prototype;\n\ + proxy.displayName = name || \"spy\";\n\ + proxy.toString = sinon.functionToString;\n\ + proxy._create = sinon.spy.create;\n\ + proxy.id = \"spy#\" + uuid++;\n\ +\n\ + return proxy;\n\ + },\n\ +\n\ + invoke: function invoke(func, thisValue, args) {\n\ + var matching = matchingFake(this.fakes, args);\n\ + var exception, returnValue;\n\ +\n\ + incrementCallCount.call(this);\n\ + push.call(this.thisValues, thisValue);\n\ + push.call(this.args, args);\n\ + push.call(this.callIds, callId++);\n\ +\n\ + try {\n\ + if (matching) {\n\ + returnValue = matching.invoke(func, thisValue, args);\n\ + } else {\n\ + returnValue = (this.func || func).apply(thisValue, args);\n\ + }\n\ + } catch (e) {\n\ + push.call(this.returnValues, undefined);\n\ + exception = e;\n\ + throw e;\n\ + } finally {\n\ + push.call(this.exceptions, exception);\n\ + }\n\ +\n\ + push.call(this.returnValues, returnValue);\n\ +\n\ + createCallProperties.call(this);\n\ +\n\ + return returnValue;\n\ + },\n\ +\n\ + getCall: function getCall(i) {\n\ + if (i < 0 || i >= this.callCount) {\n\ + return null;\n\ + }\n\ +\n\ + return sinon.spyCall(this, this.thisValues[i], this.args[i],\n\ + this.returnValues[i], this.exceptions[i],\n\ + this.callIds[i]);\n\ + },\n\ +\n\ + calledBefore: function calledBefore(spyFn) {\n\ + if (!this.called) {\n\ + return false;\n\ + }\n\ +\n\ + if (!spyFn.called) {\n\ + return true;\n\ + }\n\ +\n\ + return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n\ + },\n\ +\n\ + calledAfter: function calledAfter(spyFn) {\n\ + if (!this.called || !spyFn.called) {\n\ + return false;\n\ + }\n\ +\n\ + return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n\ + },\n\ +\n\ + withArgs: function () {\n\ + var args = slice.call(arguments);\n\ +\n\ + if (this.fakes) {\n\ + var match = matchingFake(this.fakes, args, true);\n\ +\n\ + if (match) {\n\ + return match;\n\ + }\n\ + } else {\n\ + this.fakes = [];\n\ + }\n\ +\n\ + var original = this;\n\ + var fake = this._create();\n\ + fake.matchingAguments = args;\n\ + push.call(this.fakes, fake);\n\ +\n\ + fake.withArgs = function () {\n\ + return original.withArgs.apply(original, arguments);\n\ + };\n\ +\n\ + for (var i = 0; i < this.args.length; i++) {\n\ + if (fake.matches(this.args[i])) {\n\ + incrementCallCount.call(fake);\n\ + push.call(fake.thisValues, this.thisValues[i]);\n\ + push.call(fake.args, this.args[i]);\n\ + push.call(fake.returnValues, this.returnValues[i]);\n\ + push.call(fake.exceptions, this.exceptions[i]);\n\ + push.call(fake.callIds, this.callIds[i]);\n\ + }\n\ + }\n\ + createCallProperties.call(fake);\n\ +\n\ + return fake;\n\ + },\n\ +\n\ + matches: function (args, strict) {\n\ + var margs = this.matchingAguments;\n\ +\n\ + if (margs.length <= args.length &&\n\ + sinon.deepEqual(margs, args.slice(0, margs.length))) {\n\ + return !strict || margs.length == args.length;\n\ + }\n\ + },\n\ +\n\ + printf: function (format) {\n\ + var spy = this;\n\ + var args = slice.call(arguments, 1);\n\ + var formatter;\n\ +\n\ + return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n\ + formatter = spyApi.formatters[specifyer];\n\ +\n\ + if (typeof formatter == \"function\") {\n\ + return formatter.call(null, spy, args);\n\ + } else if (!isNaN(parseInt(specifyer), 10)) {\n\ + return sinon.format(args[specifyer - 1]);\n\ + }\n\ +\n\ + return \"%\" + specifyer;\n\ + });\n\ + }\n\ + };\n\ +\n\ + function delegateToCalls(method, matchAny, actual, notCalled) {\n\ + spyApi[method] = function () {\n\ + if (!this.called) {\n\ + if (notCalled) {\n\ + return notCalled.apply(this, arguments);\n\ + }\n\ + return false;\n\ + }\n\ +\n\ + var currentCall;\n\ + var matches = 0;\n\ +\n\ + for (var i = 0, l = this.callCount; i < l; i += 1) {\n\ + currentCall = this.getCall(i);\n\ +\n\ + if (currentCall[actual || method].apply(currentCall, arguments)) {\n\ + matches += 1;\n\ +\n\ + if (matchAny) {\n\ + return true;\n\ + }\n\ + }\n\ + }\n\ +\n\ + return matches === this.callCount;\n\ + };\n\ + }\n\ +\n\ + delegateToCalls(\"calledOn\", true);\n\ + delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n\ + delegateToCalls(\"calledWith\", true);\n\ + delegateToCalls(\"calledWithMatch\", true);\n\ + delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n\ + delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n\ + delegateToCalls(\"calledWithExactly\", true);\n\ + delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n\ + delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n\ + function () { return true; });\n\ + delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n\ + function () { return true; });\n\ + delegateToCalls(\"threw\", true);\n\ + delegateToCalls(\"alwaysThrew\", false, \"threw\");\n\ + delegateToCalls(\"returned\", true);\n\ + delegateToCalls(\"alwaysReturned\", false, \"returned\");\n\ + delegateToCalls(\"calledWithNew\", true);\n\ + delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n\ + delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n\ + throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n\ + });\n\ + spyApi.callArgWith = spyApi.callArg;\n\ + delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n\ + throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n\ + });\n\ + spyApi.callArgOnWith = spyApi.callArgOn;\n\ + delegateToCalls(\"yield\", false, \"yield\", function () {\n\ + throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n\ + });\n\ + // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n\ + spyApi.invokeCallback = spyApi.yield;\n\ + delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n\ + throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n\ + });\n\ + delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n\ + throw new Error(this.toString() + \" cannot yield to '\" + property +\n\ + \"' since it was not yet invoked.\");\n\ + });\n\ + delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n\ + throw new Error(this.toString() + \" cannot yield to '\" + property +\n\ + \"' since it was not yet invoked.\");\n\ + });\n\ +\n\ + spyApi.formatters = {\n\ + \"c\": function (spy) {\n\ + return sinon.timesInWords(spy.callCount);\n\ + },\n\ +\n\ + \"n\": function (spy) {\n\ + return spy.toString();\n\ + },\n\ +\n\ + \"C\": function (spy) {\n\ + var calls = [];\n\ +\n\ + for (var i = 0, l = spy.callCount; i < l; ++i) {\n\ + var stringifiedCall = \" \" + spy.getCall(i).toString();\n\ + if (/\\n\ +/.test(calls[i - 1])) {\n\ + stringifiedCall = \"\\n\ +\" + stringifiedCall;\n\ + }\n\ + push.call(calls, stringifiedCall);\n\ + }\n\ +\n\ + return calls.length > 0 ? \"\\n\ +\" + calls.join(\"\\n\ +\") : \"\";\n\ + },\n\ +\n\ + \"t\": function (spy) {\n\ + var objects = [];\n\ +\n\ + for (var i = 0, l = spy.callCount; i < l; ++i) {\n\ + push.call(objects, sinon.format(spy.thisValues[i]));\n\ + }\n\ +\n\ + return objects.join(\", \");\n\ + },\n\ +\n\ + \"*\": function (spy, args) {\n\ + var formatted = [];\n\ +\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + push.call(formatted, sinon.format(args[i]));\n\ + }\n\ +\n\ + return formatted.join(\", \");\n\ + }\n\ + };\n\ +\n\ + sinon.extend(spy, spyApi);\n\ +\n\ + spy.spyCall = sinon.spyCall;\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = spy;\n\ + } else {\n\ + sinon.spy = spy;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend spy.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Stub functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function stub(object, property, func) {\n\ + if (!!func && typeof func != \"function\") {\n\ + throw new TypeError(\"Custom stub should be function\");\n\ + }\n\ +\n\ + var wrapper;\n\ +\n\ + if (func) {\n\ + wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n\ + } else {\n\ + wrapper = stub.create();\n\ + }\n\ +\n\ + if (!object && !property) {\n\ + return sinon.stub.create();\n\ + }\n\ +\n\ + if (!property && !!object && typeof object == \"object\") {\n\ + for (var prop in object) {\n\ + if (typeof object[prop] === \"function\") {\n\ + stub(object, prop);\n\ + }\n\ + }\n\ +\n\ + return object;\n\ + }\n\ +\n\ + return sinon.wrapMethod(object, property, wrapper);\n\ + }\n\ +\n\ + function getChangingValue(stub, property) {\n\ + var index = stub.callCount - 1;\n\ + var values = stub[property];\n\ + var prop = index in values ? values[index] : values[values.length - 1];\n\ + stub[property + \"Last\"] = prop;\n\ +\n\ + return prop;\n\ + }\n\ +\n\ + function getCallback(stub, args) {\n\ + var callArgAt = getChangingValue(stub, \"callArgAts\");\n\ +\n\ + if (callArgAt < 0) {\n\ + var callArgProp = getChangingValue(stub, \"callArgProps\");\n\ +\n\ + for (var i = 0, l = args.length; i < l; ++i) {\n\ + if (!callArgProp && typeof args[i] == \"function\") {\n\ + return args[i];\n\ + }\n\ +\n\ + if (callArgProp && args[i] &&\n\ + typeof args[i][callArgProp] == \"function\") {\n\ + return args[i][callArgProp];\n\ + }\n\ + }\n\ +\n\ + return null;\n\ + }\n\ +\n\ + return args[callArgAt];\n\ + }\n\ +\n\ + var join = Array.prototype.join;\n\ +\n\ + function getCallbackError(stub, func, args) {\n\ + if (stub.callArgAtsLast < 0) {\n\ + var msg;\n\ +\n\ + if (stub.callArgPropsLast) {\n\ + msg = sinon.functionName(stub) +\n\ + \" expected to yield to '\" + stub.callArgPropsLast +\n\ + \"', but no object with such a property was passed.\"\n\ + } else {\n\ + msg = sinon.functionName(stub) +\n\ + \" expected to yield, but no callback was passed.\"\n\ + }\n\ +\n\ + if (args.length > 0) {\n\ + msg += \" Received [\" + join.call(args, \", \") + \"]\";\n\ + }\n\ +\n\ + return msg;\n\ + }\n\ +\n\ + return \"argument at index \" + stub.callArgAtsLast + \" is not a function: \" + func;\n\ + }\n\ +\n\ + var nextTick = (function () {\n\ + if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n\ + return process.nextTick;\n\ + } else if (typeof setImmediate === \"function\") {\n\ + return setImmediate;\n\ + } else {\n\ + return function (callback) {\n\ + setTimeout(callback, 0);\n\ + };\n\ + }\n\ + })();\n\ +\n\ + function callCallback(stub, args) {\n\ + if (stub.callArgAts.length > 0) {\n\ + var func = getCallback(stub, args);\n\ +\n\ + if (typeof func != \"function\") {\n\ + throw new TypeError(getCallbackError(stub, func, args));\n\ + }\n\ +\n\ + var callbackArguments = getChangingValue(stub, \"callbackArguments\");\n\ + var callbackContext = getChangingValue(stub, \"callbackContexts\");\n\ +\n\ + if (stub.callbackAsync) {\n\ + nextTick(function() {\n\ + func.apply(callbackContext, callbackArguments);\n\ + });\n\ + } else {\n\ + func.apply(callbackContext, callbackArguments);\n\ + }\n\ + }\n\ + }\n\ +\n\ + var uuid = 0;\n\ +\n\ + sinon.extend(stub, (function () {\n\ + var slice = Array.prototype.slice, proto;\n\ +\n\ + function throwsException(error, message) {\n\ + if (typeof error == \"string\") {\n\ + this.exception = new Error(message || \"\");\n\ + this.exception.name = error;\n\ + } else if (!error) {\n\ + this.exception = new Error(\"Error\");\n\ + } else {\n\ + this.exception = error;\n\ + }\n\ +\n\ + return this;\n\ + }\n\ +\n\ + proto = {\n\ + create: function create() {\n\ + var functionStub = function () {\n\ +\n\ + callCallback(functionStub, arguments);\n\ +\n\ + if (functionStub.exception) {\n\ + throw functionStub.exception;\n\ + } else if (typeof functionStub.returnArgAt == 'number') {\n\ + return arguments[functionStub.returnArgAt];\n\ + } else if (functionStub.returnThis) {\n\ + return this;\n\ + }\n\ + return functionStub.returnValue;\n\ + };\n\ +\n\ + functionStub.id = \"stub#\" + uuid++;\n\ + var orig = functionStub;\n\ + functionStub = sinon.spy.create(functionStub);\n\ + functionStub.func = orig;\n\ +\n\ + functionStub.callArgAts = [];\n\ + functionStub.callbackArguments = [];\n\ + functionStub.callbackContexts = [];\n\ + functionStub.callArgProps = [];\n\ +\n\ + sinon.extend(functionStub, stub);\n\ + functionStub._create = sinon.stub.create;\n\ + functionStub.displayName = \"stub\";\n\ + functionStub.toString = sinon.functionToString;\n\ +\n\ + return functionStub;\n\ + },\n\ +\n\ + resetBehavior: function () {\n\ + var i;\n\ +\n\ + this.callArgAts = [];\n\ + this.callbackArguments = [];\n\ + this.callbackContexts = [];\n\ + this.callArgProps = [];\n\ +\n\ + delete this.returnValue;\n\ + delete this.returnArgAt;\n\ + this.returnThis = false;\n\ +\n\ + if (this.fakes) {\n\ + for (i = 0; i < this.fakes.length; i++) {\n\ + this.fakes[i].resetBehavior();\n\ + }\n\ + }\n\ + },\n\ +\n\ + returns: function returns(value) {\n\ + this.returnValue = value;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + returnsArg: function returnsArg(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.returnArgAt = pos;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + returnsThis: function returnsThis() {\n\ + this.returnThis = true;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + \"throws\": throwsException,\n\ + throwsException: throwsException,\n\ +\n\ + callsArg: function callsArg(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push([]);\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgOn: function callsArgOn(pos, context) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push([]);\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgWith: function callsArgWith(pos) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + callsArgOnWith: function callsArgWith(pos, context) {\n\ + if (typeof pos != \"number\") {\n\ + throw new TypeError(\"argument index is not number\");\n\ + }\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(pos);\n\ + this.callbackArguments.push(slice.call(arguments, 2));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yields: function () {\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 0));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsOn: function (context) {\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(undefined);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsTo: function (prop) {\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 1));\n\ + this.callbackContexts.push(undefined);\n\ + this.callArgProps.push(prop);\n\ +\n\ + return this;\n\ + },\n\ +\n\ + yieldsToOn: function (prop, context) {\n\ + if (typeof context != \"object\") {\n\ + throw new TypeError(\"argument context is not an object\");\n\ + }\n\ +\n\ + this.callArgAts.push(-1);\n\ + this.callbackArguments.push(slice.call(arguments, 2));\n\ + this.callbackContexts.push(context);\n\ + this.callArgProps.push(prop);\n\ +\n\ + return this;\n\ + }\n\ + };\n\ +\n\ + // create asynchronous versions of callsArg* and yields* methods\n\ + for (var method in proto) {\n\ + // need to avoid creating anotherasync versions of the newly added async methods\n\ + if (proto.hasOwnProperty(method) &&\n\ + method.match(/^(callsArg|yields|thenYields$)/) &&\n\ + !method.match(/Async/)) {\n\ + proto[method + 'Async'] = (function (syncFnName) {\n\ + return function () {\n\ + this.callbackAsync = true;\n\ + return this[syncFnName].apply(this, arguments);\n\ + };\n\ + })(method);\n\ + }\n\ + }\n\ +\n\ + return proto;\n\ +\n\ + }()));\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = stub;\n\ + } else {\n\ + sinon.stub = stub;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, nomen: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Mock functions.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = [].push;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function mock(object) {\n\ + if (!object) {\n\ + return sinon.expectation.create(\"Anonymous mock\");\n\ + }\n\ +\n\ + return mock.create(object);\n\ + }\n\ +\n\ + sinon.mock = mock;\n\ +\n\ + sinon.extend(mock, (function () {\n\ + function each(collection, callback) {\n\ + if (!collection) {\n\ + return;\n\ + }\n\ +\n\ + for (var i = 0, l = collection.length; i < l; i += 1) {\n\ + callback(collection[i]);\n\ + }\n\ + }\n\ +\n\ + return {\n\ + create: function create(object) {\n\ + if (!object) {\n\ + throw new TypeError(\"object is null\");\n\ + }\n\ +\n\ + var mockObject = sinon.extend({}, mock);\n\ + mockObject.object = object;\n\ + delete mockObject.create;\n\ +\n\ + return mockObject;\n\ + },\n\ +\n\ + expects: function expects(method) {\n\ + if (!method) {\n\ + throw new TypeError(\"method is falsy\");\n\ + }\n\ +\n\ + if (!this.expectations) {\n\ + this.expectations = {};\n\ + this.proxies = [];\n\ + }\n\ +\n\ + if (!this.expectations[method]) {\n\ + this.expectations[method] = [];\n\ + var mockObject = this;\n\ +\n\ + sinon.wrapMethod(this.object, method, function () {\n\ + return mockObject.invokeMethod(method, this, arguments);\n\ + });\n\ +\n\ + push.call(this.proxies, method);\n\ + }\n\ +\n\ + var expectation = sinon.expectation.create(method);\n\ + push.call(this.expectations[method], expectation);\n\ +\n\ + return expectation;\n\ + },\n\ +\n\ + restore: function restore() {\n\ + var object = this.object;\n\ +\n\ + each(this.proxies, function (proxy) {\n\ + if (typeof object[proxy].restore == \"function\") {\n\ + object[proxy].restore();\n\ + }\n\ + });\n\ + },\n\ +\n\ + verify: function verify() {\n\ + var expectations = this.expectations || {};\n\ + var messages = [], met = [];\n\ +\n\ + each(this.proxies, function (proxy) {\n\ + each(expectations[proxy], function (expectation) {\n\ + if (!expectation.met()) {\n\ + push.call(messages, expectation.toString());\n\ + } else {\n\ + push.call(met, expectation.toString());\n\ + }\n\ + });\n\ + });\n\ +\n\ + this.restore();\n\ +\n\ + if (messages.length > 0) {\n\ + sinon.expectation.fail(messages.concat(met).join(\"\\n\ +\"));\n\ + } else {\n\ + sinon.expectation.pass(messages.concat(met).join(\"\\n\ +\"));\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + invokeMethod: function invokeMethod(method, thisValue, args) {\n\ + var expectations = this.expectations && this.expectations[method];\n\ + var length = expectations && expectations.length || 0, i;\n\ +\n\ + for (i = 0; i < length; i += 1) {\n\ + if (!expectations[i].met() &&\n\ + expectations[i].allowsCall(thisValue, args)) {\n\ + return expectations[i].apply(thisValue, args);\n\ + }\n\ + }\n\ +\n\ + var messages = [], available, exhausted = 0;\n\ +\n\ + for (i = 0; i < length; i += 1) {\n\ + if (expectations[i].allowsCall(thisValue, args)) {\n\ + available = available || expectations[i];\n\ + } else {\n\ + exhausted += 1;\n\ + }\n\ + push.call(messages, \" \" + expectations[i].toString());\n\ + }\n\ +\n\ + if (exhausted === 0) {\n\ + return available.apply(thisValue, args);\n\ + }\n\ +\n\ + messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n\ + proxy: method,\n\ + args: args\n\ + }));\n\ +\n\ + sinon.expectation.fail(messages.join(\"\\n\ +\"));\n\ + }\n\ + };\n\ + }()));\n\ +\n\ + var times = sinon.timesInWords;\n\ +\n\ + sinon.expectation = (function () {\n\ + var slice = Array.prototype.slice;\n\ + var _invoke = sinon.spy.invoke;\n\ +\n\ + function callCountInWords(callCount) {\n\ + if (callCount == 0) {\n\ + return \"never called\";\n\ + } else {\n\ + return \"called \" + times(callCount);\n\ + }\n\ + }\n\ +\n\ + function expectedCallCountInWords(expectation) {\n\ + var min = expectation.minCalls;\n\ + var max = expectation.maxCalls;\n\ +\n\ + if (typeof min == \"number\" && typeof max == \"number\") {\n\ + var str = times(min);\n\ +\n\ + if (min != max) {\n\ + str = \"at least \" + str + \" and at most \" + times(max);\n\ + }\n\ +\n\ + return str;\n\ + }\n\ +\n\ + if (typeof min == \"number\") {\n\ + return \"at least \" + times(min);\n\ + }\n\ +\n\ + return \"at most \" + times(max);\n\ + }\n\ +\n\ + function receivedMinCalls(expectation) {\n\ + var hasMinLimit = typeof expectation.minCalls == \"number\";\n\ + return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n\ + }\n\ +\n\ + function receivedMaxCalls(expectation) {\n\ + if (typeof expectation.maxCalls != \"number\") {\n\ + return false;\n\ + }\n\ +\n\ + return expectation.callCount == expectation.maxCalls;\n\ + }\n\ +\n\ + return {\n\ + minCalls: 1,\n\ + maxCalls: 1,\n\ +\n\ + create: function create(methodName) {\n\ + var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n\ + delete expectation.create;\n\ + expectation.method = methodName;\n\ +\n\ + return expectation;\n\ + },\n\ +\n\ + invoke: function invoke(func, thisValue, args) {\n\ + this.verifyCallAllowed(thisValue, args);\n\ +\n\ + return _invoke.apply(this, arguments);\n\ + },\n\ +\n\ + atLeast: function atLeast(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not number\");\n\ + }\n\ +\n\ + if (!this.limitsSet) {\n\ + this.maxCalls = null;\n\ + this.limitsSet = true;\n\ + }\n\ +\n\ + this.minCalls = num;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + atMost: function atMost(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not number\");\n\ + }\n\ +\n\ + if (!this.limitsSet) {\n\ + this.minCalls = null;\n\ + this.limitsSet = true;\n\ + }\n\ +\n\ + this.maxCalls = num;\n\ +\n\ + return this;\n\ + },\n\ +\n\ + never: function never() {\n\ + return this.exactly(0);\n\ + },\n\ +\n\ + once: function once() {\n\ + return this.exactly(1);\n\ + },\n\ +\n\ + twice: function twice() {\n\ + return this.exactly(2);\n\ + },\n\ +\n\ + thrice: function thrice() {\n\ + return this.exactly(3);\n\ + },\n\ +\n\ + exactly: function exactly(num) {\n\ + if (typeof num != \"number\") {\n\ + throw new TypeError(\"'\" + num + \"' is not a number\");\n\ + }\n\ +\n\ + this.atLeast(num);\n\ + return this.atMost(num);\n\ + },\n\ +\n\ + met: function met() {\n\ + return !this.failed && receivedMinCalls(this);\n\ + },\n\ +\n\ + verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n\ + if (receivedMaxCalls(this)) {\n\ + this.failed = true;\n\ + sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n\ + }\n\ +\n\ + if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n\ + sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n\ + this.expectedThis);\n\ + }\n\ +\n\ + if (!(\"expectedArguments\" in this)) {\n\ + return;\n\ + }\n\ +\n\ + if (!args) {\n\ + sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n\ + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + if (args.length < this.expectedArguments.length) {\n\ + sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n\ + \"), expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + if (this.expectsExactArgCount &&\n\ + args.length != this.expectedArguments.length) {\n\ + sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n\ + \"), expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ +\n\ + for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n\ + sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n\ + \", expected \" + sinon.format(this.expectedArguments));\n\ + }\n\ + }\n\ + },\n\ +\n\ + allowsCall: function allowsCall(thisValue, args) {\n\ + if (this.met() && receivedMaxCalls(this)) {\n\ + return false;\n\ + }\n\ +\n\ + if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n\ + return false;\n\ + }\n\ +\n\ + if (!(\"expectedArguments\" in this)) {\n\ + return true;\n\ + }\n\ +\n\ + args = args || [];\n\ +\n\ + if (args.length < this.expectedArguments.length) {\n\ + return false;\n\ + }\n\ +\n\ + if (this.expectsExactArgCount &&\n\ + args.length != this.expectedArguments.length) {\n\ + return false;\n\ + }\n\ +\n\ + for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n\ + if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n\ + return false;\n\ + }\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + withArgs: function withArgs() {\n\ + this.expectedArguments = slice.call(arguments);\n\ + return this;\n\ + },\n\ +\n\ + withExactArgs: function withExactArgs() {\n\ + this.withArgs.apply(this, arguments);\n\ + this.expectsExactArgCount = true;\n\ + return this;\n\ + },\n\ +\n\ + on: function on(thisValue) {\n\ + this.expectedThis = thisValue;\n\ + return this;\n\ + },\n\ +\n\ + toString: function () {\n\ + var args = (this.expectedArguments || []).slice();\n\ +\n\ + if (!this.expectsExactArgCount) {\n\ + push.call(args, \"[...]\");\n\ + }\n\ +\n\ + var callStr = sinon.spyCall.toString.call({\n\ + proxy: this.method || \"anonymous mock expectation\",\n\ + args: args\n\ + });\n\ +\n\ + var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n\ + expectedCallCountInWords(this);\n\ +\n\ + if (this.met()) {\n\ + return \"Expectation met: \" + message;\n\ + }\n\ +\n\ + return \"Expected \" + message + \" (\" +\n\ + callCountInWords(this.callCount) + \")\";\n\ + },\n\ +\n\ + verify: function verify() {\n\ + if (!this.met()) {\n\ + sinon.expectation.fail(this.toString());\n\ + } else {\n\ + sinon.expectation.pass(this.toString());\n\ + }\n\ +\n\ + return true;\n\ + },\n\ +\n\ + pass: function(message) {\n\ + sinon.assert.pass(message);\n\ + },\n\ + fail: function (message) {\n\ + var exception = new Error(message);\n\ + exception.name = \"ExpectationError\";\n\ +\n\ + throw exception;\n\ + }\n\ + };\n\ + }());\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = mock;\n\ + } else {\n\ + sinon.mock = mock;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + * @depend mock.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, forin: true*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Collections of stubs, spies and mocks.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var push = [].push;\n\ + var hasOwnProperty = Object.prototype.hasOwnProperty;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function getFakes(fakeCollection) {\n\ + if (!fakeCollection.fakes) {\n\ + fakeCollection.fakes = [];\n\ + }\n\ +\n\ + return fakeCollection.fakes;\n\ + }\n\ +\n\ + function each(fakeCollection, method) {\n\ + var fakes = getFakes(fakeCollection);\n\ +\n\ + for (var i = 0, l = fakes.length; i < l; i += 1) {\n\ + if (typeof fakes[i][method] == \"function\") {\n\ + fakes[i][method]();\n\ + }\n\ + }\n\ + }\n\ +\n\ + function compact(fakeCollection) {\n\ + var fakes = getFakes(fakeCollection);\n\ + var i = 0;\n\ + while (i < fakes.length) {\n\ + fakes.splice(i, 1);\n\ + }\n\ + }\n\ +\n\ + var collection = {\n\ + verify: function resolve() {\n\ + each(this, \"verify\");\n\ + },\n\ +\n\ + restore: function restore() {\n\ + each(this, \"restore\");\n\ + compact(this);\n\ + },\n\ +\n\ + verifyAndRestore: function verifyAndRestore() {\n\ + var exception;\n\ +\n\ + try {\n\ + this.verify();\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + this.restore();\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + },\n\ +\n\ + add: function add(fake) {\n\ + push.call(getFakes(this), fake);\n\ + return fake;\n\ + },\n\ +\n\ + spy: function spy() {\n\ + return this.add(sinon.spy.apply(sinon, arguments));\n\ + },\n\ +\n\ + stub: function stub(object, property, value) {\n\ + if (property) {\n\ + var original = object[property];\n\ +\n\ + if (typeof original != \"function\") {\n\ + if (!hasOwnProperty.call(object, property)) {\n\ + throw new TypeError(\"Cannot stub non-existent own property \" + property);\n\ + }\n\ +\n\ + object[property] = value;\n\ +\n\ + return this.add({\n\ + restore: function () {\n\ + object[property] = original;\n\ + }\n\ + });\n\ + }\n\ + }\n\ + if (!property && !!object && typeof object == \"object\") {\n\ + var stubbedObj = sinon.stub.apply(sinon, arguments);\n\ +\n\ + for (var prop in stubbedObj) {\n\ + if (typeof stubbedObj[prop] === \"function\") {\n\ + this.add(stubbedObj[prop]);\n\ + }\n\ + }\n\ +\n\ + return stubbedObj;\n\ + }\n\ +\n\ + return this.add(sinon.stub.apply(sinon, arguments));\n\ + },\n\ +\n\ + mock: function mock() {\n\ + return this.add(sinon.mock.apply(sinon, arguments));\n\ + },\n\ +\n\ + inject: function inject(obj) {\n\ + var col = this;\n\ +\n\ + obj.spy = function () {\n\ + return col.spy.apply(col, arguments);\n\ + };\n\ +\n\ + obj.stub = function () {\n\ + return col.stub.apply(col, arguments);\n\ + };\n\ +\n\ + obj.mock = function () {\n\ + return col.mock.apply(col, arguments);\n\ + };\n\ +\n\ + return obj;\n\ + }\n\ + };\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = collection;\n\ + } else {\n\ + sinon.collection = collection;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n\ +/*global module, require, window*/\n\ +/**\n\ + * Fake timer API\n\ + * setTimeout\n\ + * setInterval\n\ + * clearTimeout\n\ + * clearInterval\n\ + * tick\n\ + * reset\n\ + * Date\n\ + *\n\ + * Inspired by jsUnitMockTimeOut from JsUnit\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + var sinon = {};\n\ +}\n\ +\n\ +(function (global) {\n\ + var id = 1;\n\ +\n\ + function addTimer(args, recurring) {\n\ + if (args.length === 0) {\n\ + throw new Error(\"Function requires at least 1 parameter\");\n\ + }\n\ +\n\ + var toId = id++;\n\ + var delay = args[1] || 0;\n\ +\n\ + if (!this.timeouts) {\n\ + this.timeouts = {};\n\ + }\n\ +\n\ + this.timeouts[toId] = {\n\ + id: toId,\n\ + func: args[0],\n\ + callAt: this.now + delay,\n\ + invokeArgs: Array.prototype.slice.call(args, 2)\n\ + };\n\ +\n\ + if (recurring === true) {\n\ + this.timeouts[toId].interval = delay;\n\ + }\n\ +\n\ + return toId;\n\ + }\n\ +\n\ + function parseTime(str) {\n\ + if (!str) {\n\ + return 0;\n\ + }\n\ +\n\ + var strings = str.split(\":\");\n\ + var l = strings.length, i = l;\n\ + var ms = 0, parsed;\n\ +\n\ + if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n\ + throw new Error(\"tick only understands numbers and 'h:m:s'\");\n\ + }\n\ +\n\ + while (i--) {\n\ + parsed = parseInt(strings[i], 10);\n\ +\n\ + if (parsed >= 60) {\n\ + throw new Error(\"Invalid time \" + str);\n\ + }\n\ +\n\ + ms += parsed * Math.pow(60, (l - i - 1));\n\ + }\n\ +\n\ + return ms * 1000;\n\ + }\n\ +\n\ + function createObject(object) {\n\ + var newObject;\n\ +\n\ + if (Object.create) {\n\ + newObject = Object.create(object);\n\ + } else {\n\ + var F = function () {};\n\ + F.prototype = object;\n\ + newObject = new F();\n\ + }\n\ +\n\ + newObject.Date.clock = newObject;\n\ + return newObject;\n\ + }\n\ +\n\ + sinon.clock = {\n\ + now: 0,\n\ +\n\ + create: function create(now) {\n\ + var clock = createObject(this);\n\ +\n\ + if (typeof now == \"number\") {\n\ + clock.now = now;\n\ + }\n\ +\n\ + if (!!now && typeof now == \"object\") {\n\ + throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n\ + }\n\ +\n\ + return clock;\n\ + },\n\ +\n\ + setTimeout: function setTimeout(callback, timeout) {\n\ + return addTimer.call(this, arguments, false);\n\ + },\n\ +\n\ + clearTimeout: function clearTimeout(timerId) {\n\ + if (!this.timeouts) {\n\ + this.timeouts = [];\n\ + }\n\ +\n\ + if (timerId in this.timeouts) {\n\ + delete this.timeouts[timerId];\n\ + }\n\ + },\n\ +\n\ + setInterval: function setInterval(callback, timeout) {\n\ + return addTimer.call(this, arguments, true);\n\ + },\n\ +\n\ + clearInterval: function clearInterval(timerId) {\n\ + this.clearTimeout(timerId);\n\ + },\n\ +\n\ + tick: function tick(ms) {\n\ + ms = typeof ms == \"number\" ? ms : parseTime(ms);\n\ + var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;\n\ + var timer = this.firstTimerInRange(tickFrom, tickTo);\n\ +\n\ + var firstException;\n\ + while (timer && tickFrom <= tickTo) {\n\ + if (this.timeouts[timer.id]) {\n\ + tickFrom = this.now = timer.callAt;\n\ + try {\n\ + this.callTimer(timer);\n\ + } catch (e) {\n\ + firstException = firstException || e;\n\ + }\n\ + }\n\ +\n\ + timer = this.firstTimerInRange(previous, tickTo);\n\ + previous = tickFrom;\n\ + }\n\ +\n\ + this.now = tickTo;\n\ +\n\ + if (firstException) {\n\ + throw firstException;\n\ + }\n\ +\n\ + return this.now;\n\ + },\n\ +\n\ + firstTimerInRange: function (from, to) {\n\ + var timer, smallest, originalTimer;\n\ +\n\ + for (var id in this.timeouts) {\n\ + if (this.timeouts.hasOwnProperty(id)) {\n\ + if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {\n\ + continue;\n\ + }\n\ +\n\ + if (!smallest || this.timeouts[id].callAt < smallest) {\n\ + originalTimer = this.timeouts[id];\n\ + smallest = this.timeouts[id].callAt;\n\ +\n\ + timer = {\n\ + func: this.timeouts[id].func,\n\ + callAt: this.timeouts[id].callAt,\n\ + interval: this.timeouts[id].interval,\n\ + id: this.timeouts[id].id,\n\ + invokeArgs: this.timeouts[id].invokeArgs\n\ + };\n\ + }\n\ + }\n\ + }\n\ +\n\ + return timer || null;\n\ + },\n\ +\n\ + callTimer: function (timer) {\n\ + if (typeof timer.interval == \"number\") {\n\ + this.timeouts[timer.id].callAt += timer.interval;\n\ + } else {\n\ + delete this.timeouts[timer.id];\n\ + }\n\ +\n\ + try {\n\ + if (typeof timer.func == \"function\") {\n\ + timer.func.apply(null, timer.invokeArgs);\n\ + } else {\n\ + eval(timer.func);\n\ + }\n\ + } catch (e) {\n\ + var exception = e;\n\ + }\n\ +\n\ + if (!this.timeouts[timer.id]) {\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + return;\n\ + }\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ + },\n\ +\n\ + reset: function reset() {\n\ + this.timeouts = {};\n\ + },\n\ +\n\ + Date: (function () {\n\ + var NativeDate = Date;\n\ +\n\ + function ClockDate(year, month, date, hour, minute, second, ms) {\n\ + // Defensive and verbose to avoid potential harm in passing\n\ + // explicit undefined when user does not pass argument\n\ + switch (arguments.length) {\n\ + case 0:\n\ + return new NativeDate(ClockDate.clock.now);\n\ + case 1:\n\ + return new NativeDate(year);\n\ + case 2:\n\ + return new NativeDate(year, month);\n\ + case 3:\n\ + return new NativeDate(year, month, date);\n\ + case 4:\n\ + return new NativeDate(year, month, date, hour);\n\ + case 5:\n\ + return new NativeDate(year, month, date, hour, minute);\n\ + case 6:\n\ + return new NativeDate(year, month, date, hour, minute, second);\n\ + default:\n\ + return new NativeDate(year, month, date, hour, minute, second, ms);\n\ + }\n\ + }\n\ +\n\ + return mirrorDateProperties(ClockDate, NativeDate);\n\ + }())\n\ + };\n\ +\n\ + function mirrorDateProperties(target, source) {\n\ + if (source.now) {\n\ + target.now = function now() {\n\ + return target.clock.now;\n\ + };\n\ + } else {\n\ + delete target.now;\n\ + }\n\ +\n\ + if (source.toSource) {\n\ + target.toSource = function toSource() {\n\ + return source.toSource();\n\ + };\n\ + } else {\n\ + delete target.toSource;\n\ + }\n\ +\n\ + target.toString = function toString() {\n\ + return source.toString();\n\ + };\n\ +\n\ + target.prototype = source.prototype;\n\ + target.parse = source.parse;\n\ + target.UTC = source.UTC;\n\ + target.prototype.toUTCString = source.prototype.toUTCString;\n\ + return target;\n\ + }\n\ +\n\ + var methods = [\"Date\", \"setTimeout\", \"setInterval\",\n\ + \"clearTimeout\", \"clearInterval\"];\n\ +\n\ + function restore() {\n\ + var method;\n\ +\n\ + for (var i = 0, l = this.methods.length; i < l; i++) {\n\ + method = this.methods[i];\n\ + if (global[method].hadOwnProperty) {\n\ + global[method] = this[\"_\" + method];\n\ + } else {\n\ + delete global[method];\n\ + }\n\ + }\n\ +\n\ + // Prevent multiple executions which will completely remove these props\n\ + this.methods = [];\n\ + }\n\ +\n\ + function stubGlobal(method, clock) {\n\ + clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);\n\ + clock[\"_\" + method] = global[method];\n\ +\n\ + if (method == \"Date\") {\n\ + var date = mirrorDateProperties(clock[method], global[method]);\n\ + global[method] = date;\n\ + } else {\n\ + global[method] = function () {\n\ + return clock[method].apply(clock, arguments);\n\ + };\n\ +\n\ + for (var prop in clock[method]) {\n\ + if (clock[method].hasOwnProperty(prop)) {\n\ + global[method][prop] = clock[method][prop];\n\ + }\n\ + }\n\ + }\n\ +\n\ + global[method].clock = clock;\n\ + }\n\ +\n\ + sinon.useFakeTimers = function useFakeTimers(now) {\n\ + var clock = sinon.clock.create(now);\n\ + clock.restore = restore;\n\ + clock.methods = Array.prototype.slice.call(arguments,\n\ + typeof now == \"number\" ? 1 : 0);\n\ +\n\ + if (clock.methods.length === 0) {\n\ + clock.methods = methods;\n\ + }\n\ +\n\ + for (var i = 0, l = clock.methods.length; i < l; i++) {\n\ + stubGlobal(clock.methods[i], clock);\n\ + }\n\ +\n\ + return clock;\n\ + };\n\ +}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\ +\n\ +sinon.timers = {\n\ + setTimeout: setTimeout,\n\ + clearTimeout: clearTimeout,\n\ + setInterval: setInterval,\n\ + clearInterval: clearInterval,\n\ + Date: Date\n\ +};\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n\ +/**\n\ + * Minimal Event interface implementation\n\ + *\n\ + * Original implementation by Sven Fuchs: https://gist.github.com/995028\n\ + * Modifications and tests by Christian Johansen.\n\ + *\n\ + * @author Sven Fuchs (svenfuchs@artweb-design.de)\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + this.sinon = {};\n\ +}\n\ +\n\ +(function () {\n\ + var push = [].push;\n\ +\n\ + sinon.Event = function Event(type, bubbles, cancelable, target) {\n\ + this.initEvent(type, bubbles, cancelable, target);\n\ + };\n\ +\n\ + sinon.Event.prototype = {\n\ + initEvent: function(type, bubbles, cancelable, target) {\n\ + this.type = type;\n\ + this.bubbles = bubbles;\n\ + this.cancelable = cancelable;\n\ + this.target = target;\n\ + },\n\ +\n\ + stopPropagation: function () {},\n\ +\n\ + preventDefault: function () {\n\ + this.defaultPrevented = true;\n\ + }\n\ + };\n\ +\n\ + sinon.EventTarget = {\n\ + addEventListener: function addEventListener(event, listener, useCapture) {\n\ + this.eventListeners = this.eventListeners || {};\n\ + this.eventListeners[event] = this.eventListeners[event] || [];\n\ + push.call(this.eventListeners[event], listener);\n\ + },\n\ +\n\ + removeEventListener: function removeEventListener(event, listener, useCapture) {\n\ + var listeners = this.eventListeners && this.eventListeners[event] || [];\n\ +\n\ + for (var i = 0, l = listeners.length; i < l; ++i) {\n\ + if (listeners[i] == listener) {\n\ + return listeners.splice(i, 1);\n\ + }\n\ + }\n\ + },\n\ +\n\ + dispatchEvent: function dispatchEvent(event) {\n\ + var type = event.type;\n\ + var listeners = this.eventListeners && this.eventListeners[type] || [];\n\ +\n\ + for (var i = 0; i < listeners.length; i++) {\n\ + if (typeof listeners[i] == \"function\") {\n\ + listeners[i].call(this, event);\n\ + } else {\n\ + listeners[i].handleEvent(event);\n\ + }\n\ + }\n\ +\n\ + return !!event.defaultPrevented;\n\ + }\n\ + };\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../../sinon.js\n\ + * @depend event.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false*/\n\ +/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n\ +/**\n\ + * Fake XMLHttpRequest object\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + this.sinon = {};\n\ +}\n\ +sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };\n\ +\n\ +// wrapper for global\n\ +(function(global) {\n\ + var xhr = sinon.xhr;\n\ + xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n\ + xhr.GlobalActiveXObject = global.ActiveXObject;\n\ + xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != \"undefined\";\n\ + xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != \"undefined\";\n\ + xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX\n\ + ? function() { return new xhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n\ +\n\ + /*jsl:ignore*/\n\ + var unsafeHeaders = {\n\ + \"Accept-Charset\": true,\n\ + \"Accept-Encoding\": true,\n\ + \"Connection\": true,\n\ + \"Content-Length\": true,\n\ + \"Cookie\": true,\n\ + \"Cookie2\": true,\n\ + \"Content-Transfer-Encoding\": true,\n\ + \"Date\": true,\n\ + \"Expect\": true,\n\ + \"Host\": true,\n\ + \"Keep-Alive\": true,\n\ + \"Referer\": true,\n\ + \"TE\": true,\n\ + \"Trailer\": true,\n\ + \"Transfer-Encoding\": true,\n\ + \"Upgrade\": true,\n\ + \"User-Agent\": true,\n\ + \"Via\": true\n\ + };\n\ + /*jsl:end*/\n\ +\n\ + function FakeXMLHttpRequest() {\n\ + this.readyState = FakeXMLHttpRequest.UNSENT;\n\ + this.requestHeaders = {};\n\ + this.requestBody = null;\n\ + this.status = 0;\n\ + this.statusText = \"\";\n\ +\n\ + var xhr = this;\n\ + var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\ +\n\ + function addEventListener(eventName) {\n\ + xhr.addEventListener(eventName, function (event) {\n\ + var listener = xhr[\"on\" + eventName];\n\ +\n\ + if (listener && typeof listener == \"function\") {\n\ + listener(event);\n\ + }\n\ + });\n\ + }\n\ +\n\ + for (var i = events.length - 1; i >= 0; i--) {\n\ + addEventListener(events[i]);\n\ + }\n\ +\n\ + if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n\ + FakeXMLHttpRequest.onCreate(this);\n\ + }\n\ + }\n\ +\n\ + function verifyState(xhr) {\n\ + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n\ + throw new Error(\"INVALID_STATE_ERR\");\n\ + }\n\ +\n\ + if (xhr.sendFlag) {\n\ + throw new Error(\"INVALID_STATE_ERR\");\n\ + }\n\ + }\n\ +\n\ + // filtering to enable a white-list version of Sinon FakeXhr,\n\ + // where whitelisted requests are passed through to real XHR\n\ + function each(collection, callback) {\n\ + if (!collection) return;\n\ + for (var i = 0, l = collection.length; i < l; i += 1) {\n\ + callback(collection[i]);\n\ + }\n\ + }\n\ + function some(collection, callback) {\n\ + for (var index = 0; index < collection.length; index++) {\n\ + if(callback(collection[index]) === true) return true;\n\ + };\n\ + return false;\n\ + }\n\ + // largest arity in XHR is 5 - XHR#open\n\ + var apply = function(obj,method,args) {\n\ + switch(args.length) {\n\ + case 0: return obj[method]();\n\ + case 1: return obj[method](args[0]);\n\ + case 2: return obj[method](args[0],args[1]);\n\ + case 3: return obj[method](args[0],args[1],args[2]);\n\ + case 4: return obj[method](args[0],args[1],args[2],args[3]);\n\ + case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);\n\ + };\n\ + };\n\ +\n\ + FakeXMLHttpRequest.filters = [];\n\ + FakeXMLHttpRequest.addFilter = function(fn) {\n\ + this.filters.push(fn)\n\ + };\n\ + var IE6Re = /MSIE 6/;\n\ + FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {\n\ + var xhr = new sinon.xhr.workingXHR();\n\ + each([\"open\",\"setRequestHeader\",\"send\",\"abort\",\"getResponseHeader\",\n\ + \"getAllResponseHeaders\",\"addEventListener\",\"overrideMimeType\",\"removeEventListener\"],\n\ + function(method) {\n\ + fakeXhr[method] = function() {\n\ + return apply(xhr,method,arguments);\n\ + };\n\ + });\n\ +\n\ + var copyAttrs = function(args) {\n\ + each(args, function(attr) {\n\ + try {\n\ + fakeXhr[attr] = xhr[attr]\n\ + } catch(e) {\n\ + if(!IE6Re.test(navigator.userAgent)) throw e;\n\ + }\n\ + });\n\ + };\n\ +\n\ + var stateChange = function() {\n\ + fakeXhr.readyState = xhr.readyState;\n\ + if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + copyAttrs([\"status\",\"statusText\"]);\n\ + }\n\ + if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n\ + copyAttrs([\"responseText\"]);\n\ + }\n\ + if(xhr.readyState === FakeXMLHttpRequest.DONE) {\n\ + copyAttrs([\"responseXML\"]);\n\ + }\n\ + if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);\n\ + };\n\ + if(xhr.addEventListener) {\n\ + for(var event in fakeXhr.eventListeners) {\n\ + if(fakeXhr.eventListeners.hasOwnProperty(event)) {\n\ + each(fakeXhr.eventListeners[event],function(handler) {\n\ + xhr.addEventListener(event, handler);\n\ + });\n\ + }\n\ + }\n\ + xhr.addEventListener(\"readystatechange\",stateChange);\n\ + } else {\n\ + xhr.onreadystatechange = stateChange;\n\ + }\n\ + apply(xhr,\"open\",xhrArgs);\n\ + };\n\ + FakeXMLHttpRequest.useFilters = false;\n\ +\n\ + function verifyRequestSent(xhr) {\n\ + if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n\ + throw new Error(\"Request done\");\n\ + }\n\ + }\n\ +\n\ + function verifyHeadersReceived(xhr) {\n\ + if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + throw new Error(\"No headers received\");\n\ + }\n\ + }\n\ +\n\ + function verifyResponseBodyType(body) {\n\ + if (typeof body != \"string\") {\n\ + var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n\ + body + \", which is not a string.\");\n\ + error.name = \"InvalidBodyException\";\n\ + throw error;\n\ + }\n\ + }\n\ +\n\ + sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n\ + async: true,\n\ +\n\ + open: function open(method, url, async, username, password) {\n\ + this.method = method;\n\ + this.url = url;\n\ + this.async = typeof async == \"boolean\" ? async : true;\n\ + this.username = username;\n\ + this.password = password;\n\ + this.responseText = null;\n\ + this.responseXML = null;\n\ + this.requestHeaders = {};\n\ + this.sendFlag = false;\n\ + if(sinon.FakeXMLHttpRequest.useFilters === true) {\n\ + var xhrArgs = arguments;\n\ + var defake = some(FakeXMLHttpRequest.filters,function(filter) {\n\ + return filter.apply(this,xhrArgs)\n\ + });\n\ + if (defake) {\n\ + return sinon.FakeXMLHttpRequest.defake(this,arguments);\n\ + }\n\ + }\n\ + this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\ + },\n\ +\n\ + readyStateChange: function readyStateChange(state) {\n\ + this.readyState = state;\n\ +\n\ + if (typeof this.onreadystatechange == \"function\") {\n\ + try {\n\ + this.onreadystatechange();\n\ + } catch (e) {\n\ + sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n\ + }\n\ + }\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\ +\n\ + switch (this.readyState) {\n\ + case FakeXMLHttpRequest.DONE:\n\ + this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n\ + this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n\ + break;\n\ + }\n\ + },\n\ +\n\ + setRequestHeader: function setRequestHeader(header, value) {\n\ + verifyState(this);\n\ +\n\ + if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n\ + throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n\ + }\n\ +\n\ + if (this.requestHeaders[header]) {\n\ + this.requestHeaders[header] += \",\" + value;\n\ + } else {\n\ + this.requestHeaders[header] = value;\n\ + }\n\ + },\n\ +\n\ + // Helps testing\n\ + setResponseHeaders: function setResponseHeaders(headers) {\n\ + this.responseHeaders = {};\n\ +\n\ + for (var header in headers) {\n\ + if (headers.hasOwnProperty(header)) {\n\ + this.responseHeaders[header] = headers[header];\n\ + }\n\ + }\n\ +\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n\ + } else {\n\ + this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n\ + }\n\ + },\n\ +\n\ + // Currently treats ALL data as a DOMString (i.e. no Document)\n\ + send: function send(data) {\n\ + verifyState(this);\n\ +\n\ + if (!/^(get|head)$/i.test(this.method)) {\n\ + if (this.requestHeaders[\"Content-Type\"]) {\n\ + var value = this.requestHeaders[\"Content-Type\"].split(\";\");\n\ + this.requestHeaders[\"Content-Type\"] = value[0] + \";charset=utf-8\";\n\ + } else {\n\ + this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n\ + }\n\ +\n\ + this.requestBody = data;\n\ + }\n\ +\n\ + this.errorFlag = false;\n\ + this.sendFlag = this.async;\n\ + this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\ +\n\ + if (typeof this.onSend == \"function\") {\n\ + this.onSend(this);\n\ + }\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n\ + },\n\ +\n\ + abort: function abort() {\n\ + this.aborted = true;\n\ + this.responseText = null;\n\ + this.errorFlag = true;\n\ + this.requestHeaders = {};\n\ +\n\ + if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n\ + this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);\n\ + this.sendFlag = false;\n\ + }\n\ +\n\ + this.readyState = sinon.FakeXMLHttpRequest.UNSENT;\n\ +\n\ + this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n\ + if (typeof this.onerror === \"function\") {\n\ + this.onerror();\n\ + }\n\ + },\n\ +\n\ + getResponseHeader: function getResponseHeader(header) {\n\ + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + return null;\n\ + }\n\ +\n\ + if (/^Set-Cookie2?$/i.test(header)) {\n\ + return null;\n\ + }\n\ +\n\ + header = header.toLowerCase();\n\ +\n\ + for (var h in this.responseHeaders) {\n\ + if (h.toLowerCase() == header) {\n\ + return this.responseHeaders[h];\n\ + }\n\ + }\n\ +\n\ + return null;\n\ + },\n\ +\n\ + getAllResponseHeaders: function getAllResponseHeaders() {\n\ + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n\ + return \"\";\n\ + }\n\ +\n\ + var headers = \"\";\n\ +\n\ + for (var header in this.responseHeaders) {\n\ + if (this.responseHeaders.hasOwnProperty(header) &&\n\ + !/^Set-Cookie2?$/i.test(header)) {\n\ + headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\ +\";\n\ + }\n\ + }\n\ +\n\ + return headers;\n\ + },\n\ +\n\ + setResponseBody: function setResponseBody(body) {\n\ + verifyRequestSent(this);\n\ + verifyHeadersReceived(this);\n\ + verifyResponseBodyType(body);\n\ +\n\ + var chunkSize = this.chunkSize || 10;\n\ + var index = 0;\n\ + this.responseText = \"\";\n\ +\n\ + do {\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.LOADING);\n\ + }\n\ +\n\ + this.responseText += body.substring(index, index + chunkSize);\n\ + index += chunkSize;\n\ + } while (index < body.length);\n\ +\n\ + var type = this.getResponseHeader(\"Content-Type\");\n\ +\n\ + if (this.responseText &&\n\ + (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n\ + try {\n\ + this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n\ + } catch (e) {\n\ + // Unable to parse XML - no biggie\n\ + }\n\ + }\n\ +\n\ + if (this.async) {\n\ + this.readyStateChange(FakeXMLHttpRequest.DONE);\n\ + } else {\n\ + this.readyState = FakeXMLHttpRequest.DONE;\n\ + }\n\ + },\n\ +\n\ + respond: function respond(status, headers, body) {\n\ + this.setResponseHeaders(headers || {});\n\ + this.status = typeof status == \"number\" ? status : 200;\n\ + this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n\ + this.setResponseBody(body || \"\");\n\ + if (typeof this.onload === \"function\"){\n\ + this.onload();\n\ + }\n\ +\n\ + }\n\ + });\n\ +\n\ + sinon.extend(FakeXMLHttpRequest, {\n\ + UNSENT: 0,\n\ + OPENED: 1,\n\ + HEADERS_RECEIVED: 2,\n\ + LOADING: 3,\n\ + DONE: 4\n\ + });\n\ +\n\ + // Borrowed from JSpec\n\ + FakeXMLHttpRequest.parseXML = function parseXML(text) {\n\ + var xmlDoc;\n\ +\n\ + if (typeof DOMParser != \"undefined\") {\n\ + var parser = new DOMParser();\n\ + xmlDoc = parser.parseFromString(text, \"text/xml\");\n\ + } else {\n\ + xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n\ + xmlDoc.async = \"false\";\n\ + xmlDoc.loadXML(text);\n\ + }\n\ +\n\ + return xmlDoc;\n\ + };\n\ +\n\ + FakeXMLHttpRequest.statusCodes = {\n\ + 100: \"Continue\",\n\ + 101: \"Switching Protocols\",\n\ + 200: \"OK\",\n\ + 201: \"Created\",\n\ + 202: \"Accepted\",\n\ + 203: \"Non-Authoritative Information\",\n\ + 204: \"No Content\",\n\ + 205: \"Reset Content\",\n\ + 206: \"Partial Content\",\n\ + 300: \"Multiple Choice\",\n\ + 301: \"Moved Permanently\",\n\ + 302: \"Found\",\n\ + 303: \"See Other\",\n\ + 304: \"Not Modified\",\n\ + 305: \"Use Proxy\",\n\ + 307: \"Temporary Redirect\",\n\ + 400: \"Bad Request\",\n\ + 401: \"Unauthorized\",\n\ + 402: \"Payment Required\",\n\ + 403: \"Forbidden\",\n\ + 404: \"Not Found\",\n\ + 405: \"Method Not Allowed\",\n\ + 406: \"Not Acceptable\",\n\ + 407: \"Proxy Authentication Required\",\n\ + 408: \"Request Timeout\",\n\ + 409: \"Conflict\",\n\ + 410: \"Gone\",\n\ + 411: \"Length Required\",\n\ + 412: \"Precondition Failed\",\n\ + 413: \"Request Entity Too Large\",\n\ + 414: \"Request-URI Too Long\",\n\ + 415: \"Unsupported Media Type\",\n\ + 416: \"Requested Range Not Satisfiable\",\n\ + 417: \"Expectation Failed\",\n\ + 422: \"Unprocessable Entity\",\n\ + 500: \"Internal Server Error\",\n\ + 501: \"Not Implemented\",\n\ + 502: \"Bad Gateway\",\n\ + 503: \"Service Unavailable\",\n\ + 504: \"Gateway Timeout\",\n\ + 505: \"HTTP Version Not Supported\"\n\ + };\n\ +\n\ + sinon.useFakeXMLHttpRequest = function () {\n\ + sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n\ + if (xhr.supportsXHR) {\n\ + global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;\n\ + }\n\ +\n\ + if (xhr.supportsActiveX) {\n\ + global.ActiveXObject = xhr.GlobalActiveXObject;\n\ + }\n\ +\n\ + delete sinon.FakeXMLHttpRequest.restore;\n\ +\n\ + if (keepOnCreate !== true) {\n\ + delete sinon.FakeXMLHttpRequest.onCreate;\n\ + }\n\ + };\n\ + if (xhr.supportsXHR) {\n\ + global.XMLHttpRequest = sinon.FakeXMLHttpRequest;\n\ + }\n\ +\n\ + if (xhr.supportsActiveX) {\n\ + global.ActiveXObject = function ActiveXObject(objId) {\n\ + if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\ +\n\ + return new sinon.FakeXMLHttpRequest();\n\ + }\n\ +\n\ + return new xhr.GlobalActiveXObject(objId);\n\ + };\n\ + }\n\ +\n\ + return sinon.FakeXMLHttpRequest;\n\ + };\n\ +\n\ + sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n\ +})(this);\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/**\n\ + * @depend fake_xml_http_request.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/\n\ +/*global module, require, window*/\n\ +/**\n\ + * The Sinon \"server\" mimics a web server that receives requests from\n\ + * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n\ + * both synchronously and asynchronously. To respond synchronuously, canned\n\ + * answers have to be provided upfront.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof sinon == \"undefined\") {\n\ + var sinon = {};\n\ +}\n\ +\n\ +sinon.fakeServer = (function () {\n\ + var push = [].push;\n\ + function F() {}\n\ +\n\ + function create(proto) {\n\ + F.prototype = proto;\n\ + return new F();\n\ + }\n\ +\n\ + function responseArray(handler) {\n\ + var response = handler;\n\ +\n\ + if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n\ + response = [200, {}, handler];\n\ + }\n\ +\n\ + if (typeof response[2] != \"string\") {\n\ + throw new TypeError(\"Fake server response body should be string, but was \" +\n\ + typeof response[2]);\n\ + }\n\ +\n\ + return response;\n\ + }\n\ +\n\ + var wloc = typeof window !== \"undefined\" ? window.location : {};\n\ + var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\ +\n\ + function matchOne(response, reqMethod, reqUrl) {\n\ + var rmeth = response.method;\n\ + var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n\ + var url = response.url;\n\ + var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\ +\n\ + return matchMethod && matchUrl;\n\ + }\n\ +\n\ + function match(response, request) {\n\ + var requestMethod = this.getHTTPMethod(request);\n\ + var requestUrl = request.url;\n\ +\n\ + if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n\ + requestUrl = requestUrl.replace(rCurrLoc, \"\");\n\ + }\n\ +\n\ + if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n\ + if (typeof response.response == \"function\") {\n\ + var ru = response.url;\n\ + var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1));\n\ + return response.response.apply(response, args);\n\ + }\n\ +\n\ + return true;\n\ + }\n\ +\n\ + return false;\n\ + }\n\ +\n\ + function log(response, request) {\n\ + var str;\n\ +\n\ + str = \"Request:\\n\ +\" + sinon.format(request) + \"\\n\ +\\n\ +\";\n\ + str += \"Response:\\n\ +\" + sinon.format(response) + \"\\n\ +\\n\ +\";\n\ +\n\ + sinon.log(str);\n\ + }\n\ +\n\ + return {\n\ + create: function () {\n\ + var server = create(this);\n\ + this.xhr = sinon.useFakeXMLHttpRequest();\n\ + server.requests = [];\n\ +\n\ + this.xhr.onCreate = function (xhrObj) {\n\ + server.addRequest(xhrObj);\n\ + };\n\ +\n\ + return server;\n\ + },\n\ +\n\ + addRequest: function addRequest(xhrObj) {\n\ + var server = this;\n\ + push.call(this.requests, xhrObj);\n\ +\n\ + xhrObj.onSend = function () {\n\ + server.handleRequest(this);\n\ + };\n\ +\n\ + if (this.autoRespond && !this.responding) {\n\ + setTimeout(function () {\n\ + server.responding = false;\n\ + server.respond();\n\ + }, this.autoRespondAfter || 10);\n\ +\n\ + this.responding = true;\n\ + }\n\ + },\n\ +\n\ + getHTTPMethod: function getHTTPMethod(request) {\n\ + if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n\ + var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n\ + return !!matches ? matches[1] : request.method;\n\ + }\n\ +\n\ + return request.method;\n\ + },\n\ +\n\ + handleRequest: function handleRequest(xhr) {\n\ + if (xhr.async) {\n\ + if (!this.queue) {\n\ + this.queue = [];\n\ + }\n\ +\n\ + push.call(this.queue, xhr);\n\ + } else {\n\ + this.processRequest(xhr);\n\ + }\n\ + },\n\ +\n\ + respondWith: function respondWith(method, url, body) {\n\ + if (arguments.length == 1 && typeof method != \"function\") {\n\ + this.response = responseArray(method);\n\ + return;\n\ + }\n\ +\n\ + if (!this.responses) { this.responses = []; }\n\ +\n\ + if (arguments.length == 1) {\n\ + body = method;\n\ + url = method = null;\n\ + }\n\ +\n\ + if (arguments.length == 2) {\n\ + body = url;\n\ + url = method;\n\ + method = null;\n\ + }\n\ +\n\ + push.call(this.responses, {\n\ + method: method,\n\ + url: url,\n\ + response: typeof body == \"function\" ? body : responseArray(body)\n\ + });\n\ + },\n\ +\n\ + respond: function respond() {\n\ + if (arguments.length > 0) this.respondWith.apply(this, arguments);\n\ + var queue = this.queue || [];\n\ + var request;\n\ +\n\ + while(request = queue.shift()) {\n\ + this.processRequest(request);\n\ + }\n\ + },\n\ +\n\ + processRequest: function processRequest(request) {\n\ + try {\n\ + if (request.aborted) {\n\ + return;\n\ + }\n\ +\n\ + var response = this.response || [404, {}, \"\"];\n\ +\n\ + if (this.responses) {\n\ + for (var i = 0, l = this.responses.length; i < l; i++) {\n\ + if (match.call(this, this.responses[i], request)) {\n\ + response = this.responses[i].response;\n\ + break;\n\ + }\n\ + }\n\ + }\n\ +\n\ + if (request.readyState != 4) {\n\ + log(response, request);\n\ +\n\ + request.respond(response[0], response[1], response[2]);\n\ + }\n\ + } catch (e) {\n\ + sinon.logError(\"Fake server request processing\", e);\n\ + }\n\ + },\n\ +\n\ + restore: function restore() {\n\ + return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n\ + }\n\ + };\n\ +}());\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon;\n\ +}\n\ +\n\ +/**\n\ + * @depend fake_server.js\n\ + * @depend fake_timers.js\n\ + */\n\ +/*jslint browser: true, eqeqeq: false, onevar: false*/\n\ +/*global sinon*/\n\ +/**\n\ + * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n\ + * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n\ + * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n\ + * it polls the object for completion with setInterval. Dispite the direct\n\ + * motivation, there is nothing jQuery-specific in this file, so it can be used\n\ + * in any environment where the ajax implementation depends on setInterval or\n\ + * setTimeout.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function () {\n\ + function Server() {}\n\ + Server.prototype = sinon.fakeServer;\n\ +\n\ + sinon.fakeServerWithClock = new Server();\n\ +\n\ + sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n\ + if (xhr.async) {\n\ + if (typeof setTimeout.clock == \"object\") {\n\ + this.clock = setTimeout.clock;\n\ + } else {\n\ + this.clock = sinon.useFakeTimers();\n\ + this.resetClock = true;\n\ + }\n\ +\n\ + if (!this.longestTimeout) {\n\ + var clockSetTimeout = this.clock.setTimeout;\n\ + var clockSetInterval = this.clock.setInterval;\n\ + var server = this;\n\ +\n\ + this.clock.setTimeout = function (fn, timeout) {\n\ + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\ +\n\ + return clockSetTimeout.apply(this, arguments);\n\ + };\n\ +\n\ + this.clock.setInterval = function (fn, timeout) {\n\ + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\ +\n\ + return clockSetInterval.apply(this, arguments);\n\ + };\n\ + }\n\ + }\n\ +\n\ + return sinon.fakeServer.addRequest.call(this, xhr);\n\ + };\n\ +\n\ + sinon.fakeServerWithClock.respond = function respond() {\n\ + var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\ +\n\ + if (this.clock) {\n\ + this.clock.tick(this.longestTimeout || 0);\n\ + this.longestTimeout = 0;\n\ +\n\ + if (this.resetClock) {\n\ + this.clock.restore();\n\ + this.resetClock = false;\n\ + }\n\ + }\n\ +\n\ + return returnVal;\n\ + };\n\ +\n\ + sinon.fakeServerWithClock.restore = function restore() {\n\ + if (this.clock) {\n\ + this.clock.restore();\n\ + }\n\ +\n\ + return sinon.fakeServer.restore.apply(this, arguments);\n\ + };\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend collection.js\n\ + * @depend util/fake_timers.js\n\ + * @depend util/fake_server_with_clock.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n\ +/*global require, module*/\n\ +/**\n\ + * Manages fake collections as well as fake utilities such as Sinon's\n\ + * timers and fake XHR implementation in one convenient object.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +if (typeof module == \"object\" && typeof require == \"function\") {\n\ + var sinon = require(\"../sinon\");\n\ + sinon.extend(sinon, require(\"./util/fake_timers\"));\n\ +}\n\ +\n\ +(function () {\n\ + var push = [].push;\n\ +\n\ + function exposeValue(sandbox, config, key, value) {\n\ + if (!value) {\n\ + return;\n\ + }\n\ +\n\ + if (config.injectInto) {\n\ + config.injectInto[key] = value;\n\ + } else {\n\ + push.call(sandbox.args, value);\n\ + }\n\ + }\n\ +\n\ + function prepareSandboxFromConfig(config) {\n\ + var sandbox = sinon.create(sinon.sandbox);\n\ +\n\ + if (config.useFakeServer) {\n\ + if (typeof config.useFakeServer == \"object\") {\n\ + sandbox.serverPrototype = config.useFakeServer;\n\ + }\n\ +\n\ + sandbox.useFakeServer();\n\ + }\n\ +\n\ + if (config.useFakeTimers) {\n\ + if (typeof config.useFakeTimers == \"object\") {\n\ + sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n\ + } else {\n\ + sandbox.useFakeTimers();\n\ + }\n\ + }\n\ +\n\ + return sandbox;\n\ + }\n\ +\n\ + sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n\ + useFakeTimers: function useFakeTimers() {\n\ + this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\ +\n\ + return this.add(this.clock);\n\ + },\n\ +\n\ + serverPrototype: sinon.fakeServer,\n\ +\n\ + useFakeServer: function useFakeServer() {\n\ + var proto = this.serverPrototype || sinon.fakeServer;\n\ +\n\ + if (!proto || !proto.create) {\n\ + return null;\n\ + }\n\ +\n\ + this.server = proto.create();\n\ + return this.add(this.server);\n\ + },\n\ +\n\ + inject: function (obj) {\n\ + sinon.collection.inject.call(this, obj);\n\ +\n\ + if (this.clock) {\n\ + obj.clock = this.clock;\n\ + }\n\ +\n\ + if (this.server) {\n\ + obj.server = this.server;\n\ + obj.requests = this.server.requests;\n\ + }\n\ +\n\ + return obj;\n\ + },\n\ +\n\ + create: function (config) {\n\ + if (!config) {\n\ + return sinon.create(sinon.sandbox);\n\ + }\n\ +\n\ + var sandbox = prepareSandboxFromConfig(config);\n\ + sandbox.args = sandbox.args || [];\n\ + var prop, value, exposed = sandbox.inject({});\n\ +\n\ + if (config.properties) {\n\ + for (var i = 0, l = config.properties.length; i < l; i++) {\n\ + prop = config.properties[i];\n\ + value = exposed[prop] || prop == \"sandbox\" && sandbox;\n\ + exposeValue(sandbox, config, prop, value);\n\ + }\n\ + } else {\n\ + exposeValue(sandbox, config, \"sandbox\", value);\n\ + }\n\ +\n\ + return sandbox;\n\ + }\n\ + });\n\ +\n\ + sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\ +\n\ + if (typeof module == \"object\" && typeof require == \"function\") {\n\ + module.exports = sinon.sandbox;\n\ + }\n\ +}());\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + * @depend mock.js\n\ + * @depend sandbox.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Test function, sandboxes fakes\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function test(callback) {\n\ + var type = typeof callback;\n\ +\n\ + if (type != \"function\") {\n\ + throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n\ + }\n\ +\n\ + return function () {\n\ + var config = sinon.getConfig(sinon.config);\n\ + config.injectInto = config.injectIntoThis && this || config.injectInto;\n\ + var sandbox = sinon.sandbox.create(config);\n\ + var exception, result;\n\ + var args = Array.prototype.slice.call(arguments).concat(sandbox.args);\n\ +\n\ + try {\n\ + result = callback.apply(this, args);\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + if (typeof exception !== \"undefined\") {\n\ + sandbox.restore();\n\ + throw exception;\n\ + }\n\ + else {\n\ + sandbox.verifyAndRestore();\n\ + }\n\ +\n\ + return result;\n\ + };\n\ + }\n\ +\n\ + test.config = {\n\ + injectIntoThis: true,\n\ + injectInto: null,\n\ + properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n\ + useFakeTimers: true,\n\ + useFakeServer: true\n\ + };\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = test;\n\ + } else {\n\ + sinon.test = test;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend test.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Test case, sandboxes all test functions\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon || !Object.prototype.hasOwnProperty) {\n\ + return;\n\ + }\n\ +\n\ + function createTest(property, setUp, tearDown) {\n\ + return function () {\n\ + if (setUp) {\n\ + setUp.apply(this, arguments);\n\ + }\n\ +\n\ + var exception, result;\n\ +\n\ + try {\n\ + result = property.apply(this, arguments);\n\ + } catch (e) {\n\ + exception = e;\n\ + }\n\ +\n\ + if (tearDown) {\n\ + tearDown.apply(this, arguments);\n\ + }\n\ +\n\ + if (exception) {\n\ + throw exception;\n\ + }\n\ +\n\ + return result;\n\ + };\n\ + }\n\ +\n\ + function testCase(tests, prefix) {\n\ + /*jsl:ignore*/\n\ + if (!tests || typeof tests != \"object\") {\n\ + throw new TypeError(\"sinon.testCase needs an object with test functions\");\n\ + }\n\ + /*jsl:end*/\n\ +\n\ + prefix = prefix || \"test\";\n\ + var rPrefix = new RegExp(\"^\" + prefix);\n\ + var methods = {}, testName, property, method;\n\ + var setUp = tests.setUp;\n\ + var tearDown = tests.tearDown;\n\ +\n\ + for (testName in tests) {\n\ + if (tests.hasOwnProperty(testName)) {\n\ + property = tests[testName];\n\ +\n\ + if (/^(setUp|tearDown)$/.test(testName)) {\n\ + continue;\n\ + }\n\ +\n\ + if (typeof property == \"function\" && rPrefix.test(testName)) {\n\ + method = property;\n\ +\n\ + if (setUp || tearDown) {\n\ + method = createTest(property, setUp, tearDown);\n\ + }\n\ +\n\ + methods[testName] = sinon.test(method);\n\ + } else {\n\ + methods[testName] = tests[testName];\n\ + }\n\ + }\n\ + }\n\ +\n\ + return methods;\n\ + }\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = testCase;\n\ + } else {\n\ + sinon.testCase = testCase;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null));\n\ +\n\ +/**\n\ + * @depend ../sinon.js\n\ + * @depend stub.js\n\ + */\n\ +/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/\n\ +/*global module, require, sinon*/\n\ +/**\n\ + * Assertions matching the test spy retrieval interface.\n\ + *\n\ + * @author Christian Johansen (christian@cjohansen.no)\n\ + * @license BSD\n\ + *\n\ + * Copyright (c) 2010-2013 Christian Johansen\n\ + */\n\ +\n\ +(function (sinon, global) {\n\ + var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\ + var slice = Array.prototype.slice;\n\ + var assert;\n\ +\n\ + if (!sinon && commonJSModule) {\n\ + sinon = require(\"../sinon\");\n\ + }\n\ +\n\ + if (!sinon) {\n\ + return;\n\ + }\n\ +\n\ + function verifyIsStub() {\n\ + var method;\n\ +\n\ + for (var i = 0, l = arguments.length; i < l; ++i) {\n\ + method = arguments[i];\n\ +\n\ + if (!method) {\n\ + assert.fail(\"fake is not a spy\");\n\ + }\n\ +\n\ + if (typeof method != \"function\") {\n\ + assert.fail(method + \" is not a function\");\n\ + }\n\ +\n\ + if (typeof method.getCall != \"function\") {\n\ + assert.fail(method + \" is not stubbed\");\n\ + }\n\ + }\n\ + }\n\ +\n\ + function failAssertion(object, msg) {\n\ + object = object || global;\n\ + var failMethod = object.fail || assert.fail;\n\ + failMethod.call(object, msg);\n\ + }\n\ +\n\ + function mirrorPropAsAssertion(name, method, message) {\n\ + if (arguments.length == 2) {\n\ + message = method;\n\ + method = name;\n\ + }\n\ +\n\ + assert[name] = function (fake) {\n\ + verifyIsStub(fake);\n\ +\n\ + var args = slice.call(arguments, 1);\n\ + var failed = false;\n\ +\n\ + if (typeof method == \"function\") {\n\ + failed = !method(fake);\n\ + } else {\n\ + failed = typeof fake[method] == \"function\" ?\n\ + !fake[method].apply(fake, args) : !fake[method];\n\ + }\n\ +\n\ + if (failed) {\n\ + failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n\ + } else {\n\ + assert.pass(name);\n\ + }\n\ + };\n\ + }\n\ +\n\ + function exposedName(prefix, prop) {\n\ + return !prefix || /^fail/.test(prop) ? prop :\n\ + prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n\ + };\n\ +\n\ + assert = {\n\ + failException: \"AssertError\",\n\ +\n\ + fail: function fail(message) {\n\ + var error = new Error(message);\n\ + error.name = this.failException || assert.failException;\n\ +\n\ + throw error;\n\ + },\n\ +\n\ + pass: function pass(assertion) {},\n\ +\n\ + callOrder: function assertCallOrder() {\n\ + verifyIsStub.apply(null, arguments);\n\ + var expected = \"\", actual = \"\";\n\ +\n\ + if (!sinon.calledInOrder(arguments)) {\n\ + try {\n\ + expected = [].join.call(arguments, \", \");\n\ + var calls = slice.call(arguments);\n\ + var i = calls.length;\n\ + while (i) {\n\ + if (!calls[--i].called) {\n\ + calls.splice(i, 1);\n\ + }\n\ + }\n\ + actual = sinon.orderByFirstCall(calls).join(\", \");\n\ + } catch (e) {\n\ + // If this fails, we'll just fall back to the blank string\n\ + }\n\ +\n\ + failAssertion(this, \"expected \" + expected + \" to be \" +\n\ + \"called in order but were called as \" + actual);\n\ + } else {\n\ + assert.pass(\"callOrder\");\n\ + }\n\ + },\n\ +\n\ + callCount: function assertCallCount(method, count) {\n\ + verifyIsStub(method);\n\ +\n\ + if (method.callCount != count) {\n\ + var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n\ + \" but was called %c%C\";\n\ + failAssertion(this, method.printf(msg));\n\ + } else {\n\ + assert.pass(\"callCount\");\n\ + }\n\ + },\n\ +\n\ + expose: function expose(target, options) {\n\ + if (!target) {\n\ + throw new TypeError(\"target is null or undefined\");\n\ + }\n\ +\n\ + var o = options || {};\n\ + var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n\ + var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\ +\n\ + for (var method in this) {\n\ + if (method != \"export\" && (includeFail || !/^(fail)/.test(method))) {\n\ + target[exposedName(prefix, method)] = this[method];\n\ + }\n\ + }\n\ +\n\ + return target;\n\ + }\n\ + };\n\ +\n\ + mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n\ + mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n\ + \"expected %n to not have been called but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n\ + mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n\ + mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n\ + mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n\ + mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n\ + mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n\ + mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n\ + mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n\ + mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n\ + mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\ +\n\ + if (commonJSModule) {\n\ + module.exports = assert;\n\ + } else {\n\ + sinon.assert = assert;\n\ + }\n\ +}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\ +\n\ +return sinon;}.call(typeof window != 'undefined' && window || {}));\n\ +//@ sourceURL=indemma/vendor/sinon.js" )); require.register("indemma/vendor/owl/pluralize.js", Function("exports, require, module", -"/* This file is part of OWL Pluralization.\r\n\r\nOWL Pluralization is free software: you can redistribute it and/or \r\nmodify it under the terms of the GNU Lesser General Public License\r\nas published by the Free Software Foundation, either version 3 of\r\nthe License, or (at your option) any later version.\r\n\r\nOWL Pluralization is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\nGNU Lesser General Public License for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public \r\nLicense along with OWL Pluralization. If not, see \r\n<http://www.gnu.org/licenses/>.\r\n*/\r\n\r\n// prepare the owl namespace.\r\nif ( typeof owl === 'undefined' ) owl = {};\r\n\r\nowl.pluralize = (function() {\r\n\tvar userDefined = {};\r\n\r\n\tfunction capitalizeSame(word, sampleWord) {\r\n\t\tif ( sampleWord.match(/^[A-Z]/) ) {\r\n\t\t\treturn word.charAt(0).toUpperCase() + word.slice(1);\r\n\t\t} else {\r\n\t\t\treturn word;\r\n\t\t}\r\n\t}\r\n\r\n\t// returns a plain Object having the given keys,\r\n\t// all with value 1, which can be used for fast lookups.\r\n\tfunction toKeys(keys) {\r\n\t\tkeys = keys.split(',');\r\n\t\tvar keysLength = keys.length;\r\n\t\tvar table = {};\r\n\t\tfor ( var i=0; i < keysLength; i++ ) {\r\n\t\t\ttable[ keys[i] ] = 1;\r\n\t\t}\r\n\t\treturn table;\r\n\t}\r\n\r\n\t// words that are always singular, always plural, or the same in both forms.\r\n\tvar uninflected = toKeys(\"aircraft,advice,blues,corn,molasses,equipment,gold,information,cotton,jewelry,kin,legislation,luck,luggage,moose,music,offspring,rice,silver,trousers,wheat,bison,bream,breeches,britches,carp,chassis,clippers,cod,contretemps,corps,debris,diabetes,djinn,eland,elk,flounder,gallows,graffiti,headquarters,herpes,high,homework,innings,jackanapes,mackerel,measles,mews,mumps,news,pincers,pliers,proceedings,rabies,salmon,scissors,sea,series,shears,species,swine,trout,tuna,whiting,wildebeest,pike,oats,tongs,dregs,snuffers,victuals,tweezers,vespers,pinchers,bellows,cattle\");\r\n\r\n\tvar irregular = {\r\n\t\t// pronouns\r\n\t\tI: 'we',\r\n\t\tyou: 'you',\r\n\t\the: 'they',\r\n\t\tit: 'they', // or them\r\n\t\tme: 'us',\r\n\t\tyou: 'you',\r\n\t\thim: 'them',\r\n\t\tthem: 'them',\r\n\t\tmyself: 'ourselves',\r\n\t\tyourself: 'yourselves',\r\n\t\thimself: 'themselves',\r\n\t\therself: 'themselves',\r\n\t\titself: 'themselves',\r\n\t\tthemself: 'themselves',\r\n\t\toneself: 'oneselves',\r\n\r\n\t\tchild: 'children',\r\n\t\tdwarf: 'dwarfs', // dwarfs are real; dwarves are fantasy.\r\n\t\tmongoose: 'mongooses',\r\n\t\tmythos: 'mythoi',\r\n\t\tox: 'oxen',\r\n\t\tsoliloquy: 'soliloquies',\r\n\t\ttrilby: 'trilbys',\r\n\t\tperson: 'people',\r\n\t\tforum: 'forums', // fora is ok but uncommon.\r\n\r\n\t\t// latin plural in popular usage.\r\n\t\tsyllabus: 'syllabi',\r\n\t\talumnus: 'alumni', \r\n\t\tgenus: 'genera',\r\n\t\tviscus: 'viscera',\r\n\t\tstigma: 'stigmata'\r\n\t};\r\n\r\n\tvar suffixRules = [\r\n\t\t// common suffixes\r\n\t\t[ /man$/i, 'men' ],\r\n\t\t[ /([lm])ouse$/i, '$1ice' ],\r\n\t\t[ /tooth$/i, 'teeth' ],\r\n\t\t[ /goose$/i, 'geese' ],\r\n\t\t[ /foot$/i, 'feet' ],\r\n\t\t[ /zoon$/i, 'zoa' ],\r\n\t\t[ /([tcsx])is$/i, '$1es' ],\r\n\r\n\t\t// fully assimilated suffixes\r\n\t\t[ /ix$/i, 'ices' ],\r\n\t\t[ /^(cod|mur|sil|vert)ex$/i, '$1ices' ],\r\n\t\t[ /^(agend|addend|memorand|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi)um$/i, '$1a' ],\r\n\t\t[ /^(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|\\w+hedr)on$/i, '$1a' ],\r\n\t\t[ /^(alumn|alg|vertebr)a$/i, '$1ae' ],\r\n\t\t\r\n\t\t// churches, classes, boxes, etc.\r\n\t\t[ /([cs]h|ss|x)$/i, '$1es' ],\r\n\r\n\t\t// words with -ves plural form\r\n\t\t[ /([aeo]l|[^d]ea|ar)f$/i, '$1ves' ],\r\n\t\t[ /([nlw]i)fe$/i, '$1ves' ],\r\n\r\n\t\t// -y\r\n\t\t[ /([aeiou])y$/i, '$1ys' ],\r\n\t\t[ /(^[A-Z][a-z]*)y$/, '$1ys' ], // case sensitive!\r\n\t\t[ /y$/i, 'ies' ],\r\n\r\n\t\t// -o\r\n\t\t[ /([aeiou])o$/i, '$1os' ],\r\n\t\t[ /^(pian|portic|albin|generalissim|manifest|archipelag|ghett|medic|armadill|guan|octav|command|infern|phot|ditt|jumb|pr|dynam|ling|quart|embry|lumbag|rhin|fiasc|magnet|styl|alt|contralt|sopran|bass|crescend|temp|cant|sol|kimon)o$/i, '$1os' ],\r\n\t\t[ /o$/i, 'oes' ],\r\n\r\n\t\t// words ending in s...\r\n\t\t[ /s$/i, 'ses' ]\r\n\t];\r\n\r\n\t// pluralizes the given singular noun. There are three ways to call it:\r\n\t// pluralize(noun) -> pluralNoun\r\n\t// Returns the plural of the given noun.\r\n\t// Example: \r\n\t// pluralize(\"person\") -> \"people\"\r\n\t// pluralize(\"me\") -> \"us\"\r\n\t//\r\n\t// pluralize(noun, count) -> plural or singular noun\r\n\t// Inflect the noun according to the count, returning the singular noun\r\n\t// if the count is 1.\r\n\t// Examples:\r\n\t// pluralize(\"person\", 3) -> \"people\"\r\n\t// pluralize(\"person\", 1) -> \"person\"\r\n\t// pluralize(\"person\", 0) -> \"people\"\r\n\t//\r\n\t// pluralize(noun, count, plural) -> plural or singular noun\r\n\t// you can provide an irregular plural yourself as the 3rd argument.\r\n\t// Example:\r\n\t// pluralize(\"château\", 2 \"châteaux\") -> \"châteaux\"\r\n\tfunction pluralize(word, count, plural) {\r\n\t\t// handle the empty string reasonably.\r\n\t\tif ( word === '' ) return '';\r\n\r\n\t\t// singular case.\r\n\t\tif ( count === 1 ) return word;\r\n\r\n\t\t// life is very easy if an explicit plural was provided.\r\n\t\tif ( typeof plural === 'string' ) return plural;\r\n\r\n\t\tvar lowerWord = word.toLowerCase();\r\n\r\n\t\t// user defined rules have the highest priority.\r\n\t\tif ( lowerWord in userDefined ) {\r\n\t\t\treturn capitalizeSame(userDefined[lowerWord], word);\r\n\t\t}\r\n\r\n\t\t// single letters are pluralized with 's, \"I got five A's on\r\n\t\t// my report card.\"\r\n\t\tif ( word.match(/^[A-Z]$/) ) return word + \"'s\";\r\n\r\n\t\t// some word don't change form when plural.\r\n\t\tif ( word.match(/fish$|ois$|sheep$|deer$|pox$|itis$/i) ) return word;\r\n\t\tif ( word.match(/^[A-Z][a-z]*ese$/) ) return word; // Nationalities.\r\n\t\tif ( lowerWord in uninflected ) return word;\r\n\r\n\t\t// there's a known set of words with irregular plural forms.\r\n\t\tif ( lowerWord in irregular ) {\r\n\t\t\treturn capitalizeSame(irregular[lowerWord], word);\r\n\t\t}\r\n\t\t\r\n\t\t// try to pluralize the word depending on its suffix.\r\n\t\tvar suffixRulesLength = suffixRules.length;\r\n\t\tfor ( var i=0; i < suffixRulesLength; i++ ) {\r\n\t\t\tvar rule = suffixRules[i];\r\n\t\t\tif ( word.match(rule[0]) ) {\r\n\t\t\t\treturn word.replace(rule[0], rule[1]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if all else fails, just add s.\r\n\t\treturn word + 's';\r\n\t}\r\n\r\n\tpluralize.define = function(word, plural) {\r\n\t\tuserDefined[word.toLowerCase()] = plural;\r\n\t}\r\n\r\n\treturn pluralize;\r\n\r\n})();\r\n//@ sourceURL=indemma/vendor/owl/pluralize.js" +"/* This file is part of OWL Pluralization.\r\n\ +\r\n\ +OWL Pluralization is free software: you can redistribute it and/or \r\n\ +modify it under the terms of the GNU Lesser General Public License\r\n\ +as published by the Free Software Foundation, either version 3 of\r\n\ +the License, or (at your option) any later version.\r\n\ +\r\n\ +OWL Pluralization is distributed in the hope that it will be useful,\r\n\ +but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n\ +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n\ +GNU Lesser General Public License for more details.\r\n\ +\r\n\ +You should have received a copy of the GNU Lesser General Public \r\n\ +License along with OWL Pluralization. If not, see \r\n\ +<http://www.gnu.org/licenses/>.\r\n\ +*/\r\n\ +\r\n\ +// prepare the owl namespace.\r\n\ +if ( typeof owl === 'undefined' ) owl = {};\r\n\ +\r\n\ +owl.pluralize = (function() {\r\n\ +\tvar userDefined = {};\r\n\ +\r\n\ +\tfunction capitalizeSame(word, sampleWord) {\r\n\ +\t\tif ( sampleWord.match(/^[A-Z]/) ) {\r\n\ +\t\t\treturn word.charAt(0).toUpperCase() + word.slice(1);\r\n\ +\t\t} else {\r\n\ +\t\t\treturn word;\r\n\ +\t\t}\r\n\ +\t}\r\n\ +\r\n\ +\t// returns a plain Object having the given keys,\r\n\ +\t// all with value 1, which can be used for fast lookups.\r\n\ +\tfunction toKeys(keys) {\r\n\ +\t\tkeys = keys.split(',');\r\n\ +\t\tvar keysLength = keys.length;\r\n\ +\t\tvar table = {};\r\n\ +\t\tfor ( var i=0; i < keysLength; i++ ) {\r\n\ +\t\t\ttable[ keys[i] ] = 1;\r\n\ +\t\t}\r\n\ +\t\treturn table;\r\n\ +\t}\r\n\ +\r\n\ +\t// words that are always singular, always plural, or the same in both forms.\r\n\ +\tvar uninflected = toKeys(\"aircraft,advice,blues,corn,molasses,equipment,gold,information,cotton,jewelry,kin,legislation,luck,luggage,moose,music,offspring,rice,silver,trousers,wheat,bison,bream,breeches,britches,carp,chassis,clippers,cod,contretemps,corps,debris,diabetes,djinn,eland,elk,flounder,gallows,graffiti,headquarters,herpes,high,homework,innings,jackanapes,mackerel,measles,mews,mumps,news,pincers,pliers,proceedings,rabies,salmon,scissors,sea,series,shears,species,swine,trout,tuna,whiting,wildebeest,pike,oats,tongs,dregs,snuffers,victuals,tweezers,vespers,pinchers,bellows,cattle\");\r\n\ +\r\n\ +\tvar irregular = {\r\n\ +\t\t// pronouns\r\n\ +\t\tI: 'we',\r\n\ +\t\tyou: 'you',\r\n\ +\t\the: 'they',\r\n\ +\t\tit: 'they', // or them\r\n\ +\t\tme: 'us',\r\n\ +\t\tyou: 'you',\r\n\ +\t\thim: 'them',\r\n\ +\t\tthem: 'them',\r\n\ +\t\tmyself: 'ourselves',\r\n\ +\t\tyourself: 'yourselves',\r\n\ +\t\thimself: 'themselves',\r\n\ +\t\therself: 'themselves',\r\n\ +\t\titself: 'themselves',\r\n\ +\t\tthemself: 'themselves',\r\n\ +\t\toneself: 'oneselves',\r\n\ +\r\n\ +\t\tchild: 'children',\r\n\ +\t\tdwarf: 'dwarfs', // dwarfs are real; dwarves are fantasy.\r\n\ +\t\tmongoose: 'mongooses',\r\n\ +\t\tmythos: 'mythoi',\r\n\ +\t\tox: 'oxen',\r\n\ +\t\tsoliloquy: 'soliloquies',\r\n\ +\t\ttrilby: 'trilbys',\r\n\ +\t\tperson: 'people',\r\n\ +\t\tforum: 'forums', // fora is ok but uncommon.\r\n\ +\r\n\ +\t\t// latin plural in popular usage.\r\n\ +\t\tsyllabus: 'syllabi',\r\n\ +\t\talumnus: 'alumni', \r\n\ +\t\tgenus: 'genera',\r\n\ +\t\tviscus: 'viscera',\r\n\ +\t\tstigma: 'stigmata'\r\n\ +\t};\r\n\ +\r\n\ +\tvar suffixRules = [\r\n\ +\t\t// common suffixes\r\n\ +\t\t[ /man$/i, 'men' ],\r\n\ +\t\t[ /([lm])ouse$/i, '$1ice' ],\r\n\ +\t\t[ /tooth$/i, 'teeth' ],\r\n\ +\t\t[ /goose$/i, 'geese' ],\r\n\ +\t\t[ /foot$/i, 'feet' ],\r\n\ +\t\t[ /zoon$/i, 'zoa' ],\r\n\ +\t\t[ /([tcsx])is$/i, '$1es' ],\r\n\ +\r\n\ +\t\t// fully assimilated suffixes\r\n\ +\t\t[ /ix$/i, 'ices' ],\r\n\ +\t\t[ /^(cod|mur|sil|vert)ex$/i, '$1ices' ],\r\n\ +\t\t[ /^(agend|addend|memorand|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi)um$/i, '$1a' ],\r\n\ +\t\t[ /^(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|\\w+hedr)on$/i, '$1a' ],\r\n\ +\t\t[ /^(alumn|alg|vertebr)a$/i, '$1ae' ],\r\n\ +\t\t\r\n\ +\t\t// churches, classes, boxes, etc.\r\n\ +\t\t[ /([cs]h|ss|x)$/i, '$1es' ],\r\n\ +\r\n\ +\t\t// words with -ves plural form\r\n\ +\t\t[ /([aeo]l|[^d]ea|ar)f$/i, '$1ves' ],\r\n\ +\t\t[ /([nlw]i)fe$/i, '$1ves' ],\r\n\ +\r\n\ +\t\t// -y\r\n\ +\t\t[ /([aeiou])y$/i, '$1ys' ],\r\n\ +\t\t[ /(^[A-Z][a-z]*)y$/, '$1ys' ], // case sensitive!\r\n\ +\t\t[ /y$/i, 'ies' ],\r\n\ +\r\n\ +\t\t// -o\r\n\ +\t\t[ /([aeiou])o$/i, '$1os' ],\r\n\ +\t\t[ /^(pian|portic|albin|generalissim|manifest|archipelag|ghett|medic|armadill|guan|octav|command|infern|phot|ditt|jumb|pr|dynam|ling|quart|embry|lumbag|rhin|fiasc|magnet|styl|alt|contralt|sopran|bass|crescend|temp|cant|sol|kimon)o$/i, '$1os' ],\r\n\ +\t\t[ /o$/i, 'oes' ],\r\n\ +\r\n\ +\t\t// words ending in s...\r\n\ +\t\t[ /s$/i, 'ses' ]\r\n\ +\t];\r\n\ +\r\n\ +\t// pluralizes the given singular noun. There are three ways to call it:\r\n\ +\t// pluralize(noun) -> pluralNoun\r\n\ +\t// Returns the plural of the given noun.\r\n\ +\t// Example: \r\n\ +\t// pluralize(\"person\") -> \"people\"\r\n\ +\t// pluralize(\"me\") -> \"us\"\r\n\ +\t//\r\n\ +\t// pluralize(noun, count) -> plural or singular noun\r\n\ +\t// Inflect the noun according to the count, returning the singular noun\r\n\ +\t// if the count is 1.\r\n\ +\t// Examples:\r\n\ +\t// pluralize(\"person\", 3) -> \"people\"\r\n\ +\t// pluralize(\"person\", 1) -> \"person\"\r\n\ +\t// pluralize(\"person\", 0) -> \"people\"\r\n\ +\t//\r\n\ +\t// pluralize(noun, count, plural) -> plural or singular noun\r\n\ +\t// you can provide an irregular plural yourself as the 3rd argument.\r\n\ +\t// Example:\r\n\ +\t// pluralize(\"château\", 2 \"châteaux\") -> \"châteaux\"\r\n\ +\tfunction pluralize(word, count, plural) {\r\n\ +\t\t// handle the empty string reasonably.\r\n\ +\t\tif ( word === '' ) return '';\r\n\ +\r\n\ +\t\t// singular case.\r\n\ +\t\tif ( count === 1 ) return word;\r\n\ +\r\n\ +\t\t// life is very easy if an explicit plural was provided.\r\n\ +\t\tif ( typeof plural === 'string' ) return plural;\r\n\ +\r\n\ +\t\tvar lowerWord = word.toLowerCase();\r\n\ +\r\n\ +\t\t// user defined rules have the highest priority.\r\n\ +\t\tif ( lowerWord in userDefined ) {\r\n\ +\t\t\treturn capitalizeSame(userDefined[lowerWord], word);\r\n\ +\t\t}\r\n\ +\r\n\ +\t\t// single letters are pluralized with 's, \"I got five A's on\r\n\ +\t\t// my report card.\"\r\n\ +\t\tif ( word.match(/^[A-Z]$/) ) return word + \"'s\";\r\n\ +\r\n\ +\t\t// some word don't change form when plural.\r\n\ +\t\tif ( word.match(/fish$|ois$|sheep$|deer$|pox$|itis$/i) ) return word;\r\n\ +\t\tif ( word.match(/^[A-Z][a-z]*ese$/) ) return word; // Nationalities.\r\n\ +\t\tif ( lowerWord in uninflected ) return word;\r\n\ +\r\n\ +\t\t// there's a known set of words with irregular plural forms.\r\n\ +\t\tif ( lowerWord in irregular ) {\r\n\ +\t\t\treturn capitalizeSame(irregular[lowerWord], word);\r\n\ +\t\t}\r\n\ +\t\t\r\n\ +\t\t// try to pluralize the word depending on its suffix.\r\n\ +\t\tvar suffixRulesLength = suffixRules.length;\r\n\ +\t\tfor ( var i=0; i < suffixRulesLength; i++ ) {\r\n\ +\t\t\tvar rule = suffixRules[i];\r\n\ +\t\t\tif ( word.match(rule[0]) ) {\r\n\ +\t\t\t\treturn word.replace(rule[0], rule[1]);\r\n\ +\t\t\t}\r\n\ +\t\t}\r\n\ +\r\n\ +\t\t// if all else fails, just add s.\r\n\ +\t\treturn word + 's';\r\n\ +\t}\r\n\ +\r\n\ +\tpluralize.define = function(word, plural) {\r\n\ +\t\tuserDefined[word.toLowerCase()] = plural;\r\n\ +\t}\r\n\ +\r\n\ +\treturn pluralize;\r\n\ +\r\n\ +})();\r\n\ +//@ sourceURL=indemma/vendor/owl/pluralize.js" )); require.register("indemma/lib/record.js", Function("exports, require, module", -"var $, advisable, bind, extend, merge, observable, type,\n __slice = [].slice;\n\n$ = require('jquery');\n\ntype = require('type');\n\nbind = require('bind');\n\nobservable = require('observable').mixin;\n\nadvisable = require('advisable').mixin;\n\nextend = require('assimilate');\n\nmerge = require('assimilate').withStrategy('deep');\n\nthis.model = (function() {\n var initialize_record, mixer, modelable;\n\n modelable = {\n after_mix: [],\n record: {\n after_initialize: [],\n before_initialize: []\n },\n every: function() {\n return this.cache;\n },\n create: function() {\n var params;\n\n params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n throw 'model.create not implemented yet, try using the restful.model.create method';\n },\n where: function(conditions, first) {\n var record, results, _i, _len, _ref;\n\n if (first == null) {\n first = false;\n }\n results = [];\n if (type(conditions.id) !== 'array') {\n conditions.id = [conditions.id];\n }\n _ref = this.cache;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n record = _ref[_i];\n if (conditions.id.indexOf(record._id) !== -1) {\n if (first) {\n return record;\n } else {\n results.push(record);\n }\n }\n }\n if (first) {\n return null;\n } else {\n return results;\n }\n }\n };\n initialize_record = function(data) {\n var after_initialize, callback, creation, index, instance, _i, _j, _len, _len1, _ref, _ref1;\n\n if (data == null) {\n data = {\n resource: this.resource,\n parent_resource: this.parent_resource\n };\n }\n data.resource || (data.resource = this.resource);\n data.parent_resource || (data.parent_resource = this.resource.parent || this.parent_resource);\n data.route || (data.route = this.route);\n data.nested_attributes = this.nested_attributes || [];\n after_initialize = (data.after_initialize || []).concat(this.record.after_initialize);\n creation = extend(Object.create(data, {\n _shim: {}\n }), this.record, creation, {\n after_initialize: after_initialize\n });\n _ref = this.record.before_initialize;\n for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {\n callback = _ref[index];\n callback.call(this, creation);\n }\n instance = record.call(creation);\n _ref1 = instance.after_initialize;\n for (index = _j = 0, _len1 = _ref1.length; _j < _len1; index = ++_j) {\n callback = _ref1[index];\n callback.call(instance, instance);\n }\n delete instance.after_initialize;\n return instance;\n };\n mixer = function(options) {\n var after_initialize, callback, instance, _i, _len, _ref;\n\n if (this === window) {\n throw 'Model mixin called incorrectly call with model.call {} instead of model({})';\n }\n if (!mixer.stale) {\n mixer.stale = true;\n }\n if (this.record && this.record.after_initialize) {\n after_initialize = this.record.after_initialize.splice(0);\n } else {\n after_initialize = [];\n }\n instance = bind(this, initialize_record);\n extend(instance, merge(this, modelable));\n this.record = instance.record = merge({}, instance.record, modelable.record);\n this.record.after_initialize = instance.record.after_initialize = instance.record.after_initialize.concat(after_initialize);\n this.record.before_initialize = instance.record.before_initialize.concat([]);\n _ref = modelable.after_mix;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n callback = _ref[_i];\n callback.call(instance, instance);\n }\n return mixer[this.resource.name || this.resource.toString()] = instance;\n };\n mixer.mix = function(blender) {\n if (this.stale) {\n throw \"Trying to change model mixin with \" + object + \" but model already used.\\nCheck your configuration order\";\n }\n return blender(modelable);\n };\n return mixer;\n})();\n\nthis.record = (function() {\n var callbacks, recordable, that;\n\n callbacks = {\n dirtify: function() {}\n };\n recordable = {\n dirty: false,\n after_initialize: [callbacks.dirtify]\n };\n that = function(data) {\n var after_initialize;\n\n if (this === window) {\n throw \"Mixin called incorrectly, call mixin with call method: record.call(object, data)\";\n }\n data || (data = {});\n after_initialize = (this.after_initialize || []).concat(data.after_initialize || []).concat(recordable.after_initialize);\n return advisable(observable(extend(this, recordable, data, {\n after_initialize: after_initialize\n })));\n };\n that.mix = function(blender) {\n return blender(recordable);\n };\n return that;\n})();\n\nexports.record = this.record;\n\nexports.model = this.model;\n//@ sourceURL=indemma/lib/record.js" +"var $, advisable, bind, extend, merge, observable, type,\n\ + __slice = [].slice;\n\ +\n\ +$ = require('jquery');\n\ +\n\ +type = require('type');\n\ +\n\ +bind = require('bind');\n\ +\n\ +observable = require('observable').mixin;\n\ +\n\ +advisable = require('advisable').mixin;\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +merge = require('assimilate').withStrategy('deep');\n\ +\n\ +this.model = (function() {\n\ + var initialize_record, mixer, modelable;\n\ +\n\ + modelable = {\n\ + after_mix: [],\n\ + record: {\n\ + after_initialize: [],\n\ + before_initialize: []\n\ + },\n\ + every: function() {\n\ + return this.cache;\n\ + },\n\ + create: function() {\n\ + var params;\n\ +\n\ + params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n\ + throw 'model.create not implemented yet, try using the restful.model.create method';\n\ + },\n\ + where: function(conditions, first) {\n\ + var record, results, _i, _len, _ref;\n\ +\n\ + if (first == null) {\n\ + first = false;\n\ + }\n\ + results = [];\n\ + if (type(conditions.id) !== 'array') {\n\ + conditions.id = [conditions.id];\n\ + }\n\ + _ref = this.cache;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + record = _ref[_i];\n\ + if (conditions.id.indexOf(record._id) !== -1) {\n\ + if (first) {\n\ + return record;\n\ + } else {\n\ + results.push(record);\n\ + }\n\ + }\n\ + }\n\ + if (first) {\n\ + return null;\n\ + } else {\n\ + return results;\n\ + }\n\ + }\n\ + };\n\ + initialize_record = function(data) {\n\ + var after_initialize, callback, creation, index, instance, _i, _j, _len, _len1, _ref, _ref1;\n\ +\n\ + if (data == null) {\n\ + data = {\n\ + resource: this.resource,\n\ + parent_resource: this.parent_resource\n\ + };\n\ + }\n\ + data.resource || (data.resource = this.resource);\n\ + data.parent_resource || (data.parent_resource = this.resource.parent || this.parent_resource);\n\ + data.route || (data.route = this.route);\n\ + data.nested_attributes = this.nested_attributes || [];\n\ + after_initialize = (data.after_initialize || []).concat(this.record.after_initialize);\n\ + creation = extend(Object.create(data, {\n\ + _shim: {}\n\ + }), this.record, creation, {\n\ + after_initialize: after_initialize\n\ + });\n\ + _ref = this.record.before_initialize;\n\ + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {\n\ + callback = _ref[index];\n\ + callback.call(this, creation);\n\ + }\n\ + instance = record.call(creation);\n\ + _ref1 = instance.after_initialize;\n\ + for (index = _j = 0, _len1 = _ref1.length; _j < _len1; index = ++_j) {\n\ + callback = _ref1[index];\n\ + callback.call(instance, instance);\n\ + }\n\ + delete instance.after_initialize;\n\ + return instance;\n\ + };\n\ + mixer = function(options) {\n\ + var after_initialize, callback, instance, _i, _len, _ref;\n\ +\n\ + if (this === window) {\n\ + throw 'Model mixin called incorrectly call with model.call {} instead of model({})';\n\ + }\n\ + if (!mixer.stale) {\n\ + mixer.stale = true;\n\ + }\n\ + if (this.record && this.record.after_initialize) {\n\ + after_initialize = this.record.after_initialize.splice(0);\n\ + } else {\n\ + after_initialize = [];\n\ + }\n\ + instance = bind(this, initialize_record);\n\ + extend(instance, merge(this, modelable));\n\ + this.record = instance.record = merge({}, instance.record, modelable.record);\n\ + this.record.after_initialize = instance.record.after_initialize = instance.record.after_initialize.concat(after_initialize);\n\ + this.record.before_initialize = instance.record.before_initialize.concat([]);\n\ + _ref = modelable.after_mix;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + callback = _ref[_i];\n\ + callback.call(instance, instance);\n\ + }\n\ + return mixer[this.resource.name || this.resource.toString()] = instance;\n\ + };\n\ + mixer.mix = function(blender) {\n\ + if (this.stale) {\n\ + throw \"Trying to change model mixin with \" + object + \" but model already used.\\n\ +Check your configuration order\";\n\ + }\n\ + return blender(modelable);\n\ + };\n\ + return mixer;\n\ +})();\n\ +\n\ +this.record = (function() {\n\ + var callbacks, recordable, that;\n\ +\n\ + callbacks = {\n\ + dirtify: function() {}\n\ + };\n\ + recordable = {\n\ + dirty: false,\n\ + after_initialize: [callbacks.dirtify]\n\ + };\n\ + that = function(data) {\n\ + var after_initialize;\n\ +\n\ + if (this === window) {\n\ + throw \"Mixin called incorrectly, call mixin with call method: record.call(object, data)\";\n\ + }\n\ + data || (data = {});\n\ + after_initialize = (this.after_initialize || []).concat(data.after_initialize || []).concat(recordable.after_initialize);\n\ + return advisable(observable(extend(this, recordable, data, {\n\ + after_initialize: after_initialize\n\ + })));\n\ + };\n\ + that.mix = function(blender) {\n\ + return blender(recordable);\n\ + };\n\ + return that;\n\ +})();\n\ +\n\ +exports.record = this.record;\n\ +\n\ +exports.model = this.model;\n\ +//@ sourceURL=indemma/lib/record.js" )); require.register("indemma/lib/record/associable.js", Function("exports, require, module", -"var $, associable, callbacks, extend, model, modifiers, plural, root, singular, subscribers,\n __slice = [].slice;\n\nroot = window;\n\n$ = require('jquery');\n\nextend = require('assimilate');\n\nrequire('./resource');\n\nplural = {\n add: function() {\n var attributes, params, _i, _len, _results;\n\n params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n _results = [];\n for (_i = 0, _len = params.length; _i < _len; _i++) {\n attributes = params[_i];\n _results.push(this.push(this.build(attributes)));\n }\n return _results;\n },\n create: function() {\n var attributes, params, record, _i, _len, _results;\n\n params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n _results = [];\n for (_i = 0, _len = params.length; _i < _len; _i++) {\n attributes = params[_i];\n record = this.build(attributes);\n this.push(record);\n _results.push(record.save());\n }\n return _results;\n },\n build: function(data) {\n var _name;\n\n if (data == null) {\n data = {};\n }\n data.parent_resource = this.parent_resource;\n if (this.parent != null) {\n data.route || (data.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.toString())));\n }\n if (this.route !== data.route && this.route) {\n throw \"associable.has_many: cannot redefine route of association \" + this.parent_resource + \".\" + this.resource + \" from \" + this.route + \" to \" + data.route;\n }\n data[_name = this.parent_resource] || (data[_name] = this.parent);\n return model[model.singularize(this.resource)](data);\n },\n push: function() {\n console.warn(\"\" + this.resource + \".push is deprecated and will be removed, please use add instead\");\n return Array.prototype.push.apply(this, arguments);\n },\n length: 0,\n json: function(methods, omissions) {\n var record, _i, _len, _results;\n\n _results = [];\n for (_i = 0, _len = this.length; _i < _len; _i++) {\n record = this[_i];\n _results.push(record.json(methods, omissions));\n }\n return _results;\n }\n};\n\nsingular = {\n create: function(data) {\n return model[this.resource].create(extend({}, this, data));\n },\n build: function(data) {\n return this.owner[this.resource.toString()] = model[this.resource.toString()](extend({}, this, data));\n }\n};\n\nsubscribers = {\n belongs_to: {\n foreign_key: function(resource_id) {\n var association_name, current_resource_id, resource, _ref;\n\n association_name = this.resource.toString();\n if (!resource_id) {\n this.dirty = true;\n this.owner[association_name] = resource_id;\n return resource_id;\n }\n current_resource_id = (_ref = this.owner.observed[association_name]) != null ? _ref._id : void 0;\n if (resource_id !== current_resource_id) {\n resource = model[association_name];\n if (!resource) {\n console.warn(\"subscribers.belongs_to.foreign_key: associated factory not found for model: \" + association_name);\n return resource_id;\n }\n this.owner.observed[association_name] = null;\n }\n return resource_id;\n },\n associated_changed: function(associated) {\n return this.owner.observed[\"\" + (this.resource.toString()) + \"_id\"] = associated ? associated._id : null;\n }\n }\n};\n\nmodifiers = {\n belongs_to: {\n associated_loader: function() {\n var association_name, definition, temporary_observed,\n _this = this;\n\n association_name = this.resource.toString();\n if (this.owner.observed == null) {\n this.owner.observed = {};\n temporary_observed = true;\n }\n definition = Object.defineProperty(this.owner, association_name, {\n set: function(associated) {\n return this.observed[association_name] = associated;\n },\n get: function() {\n var associated, associated_id, resource;\n\n associated = _this.owner.observed[association_name];\n associated_id = _this.owner.observed[association_name + '_id'];\n if (!(((associated != null ? associated._id : void 0) != null) || associated_id)) {\n return associated;\n }\n if (associated != null ? associated.sustained : void 0) {\n return associated;\n }\n resource = model[association_name];\n if (!resource) {\n console.warn(\"subscribers.belongs_to.foreign_key: associated factory not found for model: \" + association_name);\n return associated;\n }\n associated = resource.find(associated_id || associated._id);\n if (associated) {\n return _this.owner.observed[association_name] = associated;\n }\n associated || (associated = resource({\n _id: associated_id\n }));\n associated.reload();\n return _this.owner.observed[association_name] = associated;\n },\n configurable: true,\n enumerable: true\n });\n if (temporary_observed) {\n delete this.owner.observed;\n }\n return definition;\n }\n }\n};\n\ncallbacks = {\n has_many: {\n nest_attributes: function() {\n var association, association_name, association_names, associations_attributes, message, _i, _len, _results;\n\n association_names = model[this.resource].has_many;\n if (association_names) {\n _results = [];\n for (_i = 0, _len = association_names.length; _i < _len; _i++) {\n association_name = association_names[_i];\n associations_attributes = this[\"\" + association_name + \"_attributes\"];\n association = this[model.pluralize(association_name)];\n if (associations_attributes && associations_attributes.length) {\n if (!association) {\n message = \"has_many.nest_attributes: Association not found for \" + association_name + \". \\n\";\n message += \"did you set it on model declaration? \\n has_many: \" + association_name + \" \";\n throw message;\n }\n association.resource = model.singularize(association.resource);\n association.add.apply(association, associations_attributes);\n _results.push(association.resource = model.pluralize(association.resource));\n } else {\n _results.push(void 0);\n }\n }\n return _results;\n }\n },\n update_association: function(data) {\n var associated, association, association_name, id, pluralized_association, _i, _j, _len, _len1, _ref;\n\n id = this._id || data && (data._id || data.id);\n if (!id) {\n return;\n }\n _ref = model[this.resource.toString()].has_many;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n association_name = _ref[_i];\n pluralized_association = model.pluralize(association_name);\n association = this[pluralized_association];\n if (!association.route) {\n association.route = \"/\" + (model.pluralize(this.resource.toString())) + \"/\" + id + \"/\" + (model.pluralize(association.resource));\n for (_j = 0, _len1 = association.length; _j < _len1; _j++) {\n associated = association[_j];\n if (!associated.route && (associated.parent != null)) {\n associated.route = \"/\" + (model.pluralize(this.resource.toString())) + \"/\" + id + \"/\" + (model.pluralize(association.resource));\n }\n }\n }\n }\n return true;\n },\n autosave: function() {\n throw 'Not implemented yet';\n }\n },\n has_one: {\n nest_attributes: function() {\n var association_name, association_names, associations_attributes, _i, _len, _results;\n\n association_names = model[this.resource].has_one;\n if (association_names) {\n _results = [];\n for (_i = 0, _len = association_names.length; _i < _len; _i++) {\n association_name = association_names[_i];\n associations_attributes = this[\"\" + association_name + \"_attributes\"];\n if (associations_attributes) {\n this[association_name] = this[\"build_\" + association_name](associations_attributes);\n _results.push(delete this[\"\" + association_name + \"_attributes\"]);\n } else {\n _results.push(void 0);\n }\n }\n return _results;\n }\n }\n }\n};\n\nassociable = {\n model: {\n blender: function(definition) {\n var model;\n\n model = associable.model;\n this.create_after_hooks = model.create_after_hooks;\n this.create_before_hooks = model.create_before_hooks;\n if (this.has_many && $.type(this.has_many) !== 'array') {\n this.has_many = [this.has_many];\n }\n if (this.has_one && $.type(this.has_one) !== 'array') {\n this.has_one = [this.has_one];\n }\n if (this.belongs_to && $.type(this.belongs_to) !== 'array') {\n this.belongs_to = [this.belongs_to];\n }\n this.has_many || (this.has_many = []);\n this.has_one || (this.has_one = []);\n this.belongs_to || (this.belongs_to = []);\n return true;\n },\n create_after_hooks: function(definition) {\n var association_attributes, association_name, association_proxy, old_dirty, old_resource_id, options, resource, _i, _j, _k, _len, _len1, _len2, _name, _ref, _ref1, _ref2, _results;\n\n options = model[this.resource.name || this.resource.toString()];\n if (options.has_many) {\n _ref = options.has_many;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n resource = _ref[_i];\n association_proxy = {\n resource: resource,\n parent_resource: this.resource,\n parent: this\n };\n association_name = model.pluralize(resource);\n association_attributes = this[association_name] || [];\n this[_name = \"\" + association_name + \"_attributes\"] || (this[_name] = []);\n if (association_attributes.length) {\n this[\"\" + association_name + \"_attributes\"] = this[\"\" + association_name + \"_attributes\"].concat(association_attributes);\n }\n this[association_name] = $.extend(association_proxy, plural);\n }\n this.after('saved', callbacks.has_many.update_association);\n callbacks.has_many.nest_attributes.call(this);\n }\n if (options.has_one) {\n _ref1 = options.has_one;\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n resource = _ref1[_j];\n association_proxy = {\n resource: resource,\n parent_resource: this.resource,\n owner: this\n };\n association_proxy[this.resource.toString()] = this;\n this[\"build_\" + resource] = $.proxy(singular.build, association_proxy);\n this[\"create_\" + resource] = $.proxy(singular.create, association_proxy);\n }\n callbacks.has_one.nest_attributes.call(this);\n }\n if (options.belongs_to) {\n _ref2 = options.belongs_to;\n _results = [];\n for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n resource = _ref2[_k];\n association_proxy = {\n resource: resource,\n parent_resource: this.resource,\n parent: this,\n owner: this\n };\n association_proxy[this.resource.toString()] = this;\n this[\"build_\" + resource] = $.proxy(singular.build, association_proxy);\n this[\"create_\" + resource] = $.proxy(singular.create, association_proxy);\n old_resource_id = this[\"\" + resource + \"_id\"];\n old_dirty = this.dirty;\n this[\"\" + resource + \"_id\"] = null;\n this.subscribe(\"\" + resource + \"_id\", $.proxy(subscribers.belongs_to.foreign_key, association_proxy));\n this.subscribe(resource.toString(), $.proxy(subscribers.belongs_to.associated_changed, association_proxy));\n this[\"\" + resource + \"_id\"] = old_resource_id;\n _results.push(this.dirty = old_dirty);\n }\n return _results;\n }\n },\n create_before_hooks: function(record) {\n var association_proxy, definition, resource, _i, _len, _ref, _results;\n\n definition = this;\n if (definition.belongs_to) {\n _ref = definition.belongs_to;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n resource = _ref[_i];\n association_proxy = {\n resource: resource,\n parent_resource: this.resource,\n owner: record\n };\n _results.push(modifiers.belongs_to.associated_loader.call(association_proxy));\n }\n return _results;\n }\n }\n },\n record: {\n after_initialize: function(attributes) {\n if (this.resource == null) {\n throw new Error('resource must be defined in order to associate');\n }\n return model[this.resource.name || this.resource.toString()].create_after_hooks.call(this);\n },\n before_initialize: function(creation) {\n if (!this.resource) {\n throw new Error('resource must be defined in order to associate');\n }\n return model[this.resource.name || this.resource.toString()].create_before_hooks(creation);\n }\n }\n};\n\nmodel = root.model;\n\nmodel.mix(function(modelable) {\n modelable.after_mix.push(associable.model.blender);\n modelable.record.before_initialize.push(associable.record.before_initialize);\n return modelable.record.after_initialize.push(associable.record.after_initialize);\n});\n\nmodel.associable = {\n mix: function(blender) {\n return blender(singular, plural);\n }\n};\n//@ sourceURL=indemma/lib/record/associable.js" +"var $, associable, callbacks, extend, model, modifiers, plural, root, singular, subscribers,\n\ + __slice = [].slice;\n\ +\n\ +root = window;\n\ +\n\ +$ = require('jquery');\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +require('./resource');\n\ +\n\ +plural = {\n\ + add: function() {\n\ + var attributes, params, _i, _len, _results;\n\ +\n\ + params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n\ + _results = [];\n\ + for (_i = 0, _len = params.length; _i < _len; _i++) {\n\ + attributes = params[_i];\n\ + _results.push(this.push(this.build(attributes)));\n\ + }\n\ + return _results;\n\ + },\n\ + create: function() {\n\ + var attributes, params, record, _i, _len, _results;\n\ +\n\ + params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n\ + _results = [];\n\ + for (_i = 0, _len = params.length; _i < _len; _i++) {\n\ + attributes = params[_i];\n\ + record = this.build(attributes);\n\ + this.push(record);\n\ + _results.push(record.save());\n\ + }\n\ + return _results;\n\ + },\n\ + build: function(data) {\n\ + var _name;\n\ +\n\ + if (data == null) {\n\ + data = {};\n\ + }\n\ + data.parent_resource = this.parent_resource;\n\ + if (this.parent != null) {\n\ + data.route || (data.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.toString())));\n\ + }\n\ + if (this.route !== data.route && this.route) {\n\ + throw \"associable.has_many: cannot redefine route of association \" + this.parent_resource + \".\" + this.resource + \" from \" + this.route + \" to \" + data.route;\n\ + }\n\ + data[_name = this.parent_resource] || (data[_name] = this.parent);\n\ + return model[model.singularize(this.resource)](data);\n\ + },\n\ + push: function() {\n\ + console.warn(\"\" + this.resource + \".push is deprecated and will be removed, please use add instead\");\n\ + return Array.prototype.push.apply(this, arguments);\n\ + },\n\ + length: 0,\n\ + json: function(methods, omissions) {\n\ + var record, _i, _len, _results;\n\ +\n\ + _results = [];\n\ + for (_i = 0, _len = this.length; _i < _len; _i++) {\n\ + record = this[_i];\n\ + _results.push(record.json(methods, omissions));\n\ + }\n\ + return _results;\n\ + }\n\ +};\n\ +\n\ +singular = {\n\ + create: function(data) {\n\ + return model[this.resource].create(extend({}, this, data));\n\ + },\n\ + build: function(data) {\n\ + return this.owner[this.resource.toString()] = model[this.resource.toString()](extend({}, this, data));\n\ + }\n\ +};\n\ +\n\ +subscribers = {\n\ + belongs_to: {\n\ + foreign_key: function(resource_id) {\n\ + var association_name, current_resource_id, resource, _ref;\n\ +\n\ + association_name = this.resource.toString();\n\ + if (!resource_id) {\n\ + this.dirty = true;\n\ + this.owner[association_name] = resource_id;\n\ + return resource_id;\n\ + }\n\ + current_resource_id = (_ref = this.owner.observed[association_name]) != null ? _ref._id : void 0;\n\ + if (resource_id !== current_resource_id) {\n\ + resource = model[association_name];\n\ + if (!resource) {\n\ + console.warn(\"subscribers.belongs_to.foreign_key: associated factory not found for model: \" + association_name);\n\ + return resource_id;\n\ + }\n\ + this.owner.observed[association_name] = null;\n\ + }\n\ + return resource_id;\n\ + },\n\ + associated_changed: function(associated) {\n\ + return this.owner.observed[\"\" + (this.resource.toString()) + \"_id\"] = associated ? associated._id : null;\n\ + }\n\ + }\n\ +};\n\ +\n\ +modifiers = {\n\ + belongs_to: {\n\ + associated_loader: function() {\n\ + var association_name, definition, temporary_observed,\n\ + _this = this;\n\ +\n\ + association_name = this.resource.toString();\n\ + if (this.owner.observed == null) {\n\ + this.owner.observed = {};\n\ + temporary_observed = true;\n\ + }\n\ + definition = Object.defineProperty(this.owner, association_name, {\n\ + set: function(associated) {\n\ + return this.observed[association_name] = associated;\n\ + },\n\ + get: function() {\n\ + var associated, associated_id, resource;\n\ +\n\ + associated = _this.owner.observed[association_name];\n\ + associated_id = _this.owner.observed[association_name + '_id'];\n\ + if (!(((associated != null ? associated._id : void 0) != null) || associated_id)) {\n\ + return associated;\n\ + }\n\ + if (associated != null ? associated.sustained : void 0) {\n\ + return associated;\n\ + }\n\ + resource = model[association_name];\n\ + if (!resource) {\n\ + console.warn(\"subscribers.belongs_to.foreign_key: associated factory not found for model: \" + association_name);\n\ + return associated;\n\ + }\n\ + associated = resource.find(associated_id || associated._id);\n\ + if (associated) {\n\ + return _this.owner.observed[association_name] = associated;\n\ + }\n\ + associated || (associated = resource({\n\ + _id: associated_id\n\ + }));\n\ + associated.reload();\n\ + return _this.owner.observed[association_name] = associated;\n\ + },\n\ + configurable: true,\n\ + enumerable: true\n\ + });\n\ + if (temporary_observed) {\n\ + delete this.owner.observed;\n\ + }\n\ + return definition;\n\ + }\n\ + }\n\ +};\n\ +\n\ +callbacks = {\n\ + has_many: {\n\ + nest_attributes: function() {\n\ + var association, association_name, association_names, associations_attributes, message, _i, _len, _results;\n\ +\n\ + association_names = model[this.resource].has_many;\n\ + if (association_names) {\n\ + _results = [];\n\ + for (_i = 0, _len = association_names.length; _i < _len; _i++) {\n\ + association_name = association_names[_i];\n\ + associations_attributes = this[\"\" + association_name + \"_attributes\"];\n\ + association = this[model.pluralize(association_name)];\n\ + if (associations_attributes && associations_attributes.length) {\n\ + if (!association) {\n\ + message = \"has_many.nest_attributes: Association not found for \" + association_name + \". \\n\ +\";\n\ + message += \"did you set it on model declaration? \\n\ + has_many: \" + association_name + \" \";\n\ + throw message;\n\ + }\n\ + association.resource = model.singularize(association.resource);\n\ + association.add.apply(association, associations_attributes);\n\ + _results.push(association.resource = model.pluralize(association.resource));\n\ + } else {\n\ + _results.push(void 0);\n\ + }\n\ + }\n\ + return _results;\n\ + }\n\ + },\n\ + update_association: function(data) {\n\ + var associated, association, association_name, id, pluralized_association, _i, _j, _len, _len1, _ref;\n\ +\n\ + id = this._id || data && (data._id || data.id);\n\ + if (!id) {\n\ + return;\n\ + }\n\ + _ref = model[this.resource.toString()].has_many;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + association_name = _ref[_i];\n\ + pluralized_association = model.pluralize(association_name);\n\ + association = this[pluralized_association];\n\ + if (!association.route) {\n\ + association.route = \"/\" + (model.pluralize(this.resource.toString())) + \"/\" + id + \"/\" + (model.pluralize(association.resource));\n\ + for (_j = 0, _len1 = association.length; _j < _len1; _j++) {\n\ + associated = association[_j];\n\ + if (!associated.route && (associated.parent != null)) {\n\ + associated.route = \"/\" + (model.pluralize(this.resource.toString())) + \"/\" + id + \"/\" + (model.pluralize(association.resource));\n\ + }\n\ + }\n\ + }\n\ + }\n\ + return true;\n\ + },\n\ + autosave: function() {\n\ + throw 'Not implemented yet';\n\ + }\n\ + },\n\ + has_one: {\n\ + nest_attributes: function() {\n\ + var association_name, association_names, associations_attributes, _i, _len, _results;\n\ +\n\ + association_names = model[this.resource].has_one;\n\ + if (association_names) {\n\ + _results = [];\n\ + for (_i = 0, _len = association_names.length; _i < _len; _i++) {\n\ + association_name = association_names[_i];\n\ + associations_attributes = this[\"\" + association_name + \"_attributes\"];\n\ + if (associations_attributes) {\n\ + this[association_name] = this[\"build_\" + association_name](associations_attributes);\n\ + _results.push(delete this[\"\" + association_name + \"_attributes\"]);\n\ + } else {\n\ + _results.push(void 0);\n\ + }\n\ + }\n\ + return _results;\n\ + }\n\ + }\n\ + }\n\ +};\n\ +\n\ +associable = {\n\ + model: {\n\ + blender: function(definition) {\n\ + var model;\n\ +\n\ + model = associable.model;\n\ + this.create_after_hooks = model.create_after_hooks;\n\ + this.create_before_hooks = model.create_before_hooks;\n\ + if (this.has_many && $.type(this.has_many) !== 'array') {\n\ + this.has_many = [this.has_many];\n\ + }\n\ + if (this.has_one && $.type(this.has_one) !== 'array') {\n\ + this.has_one = [this.has_one];\n\ + }\n\ + if (this.belongs_to && $.type(this.belongs_to) !== 'array') {\n\ + this.belongs_to = [this.belongs_to];\n\ + }\n\ + this.has_many || (this.has_many = []);\n\ + this.has_one || (this.has_one = []);\n\ + this.belongs_to || (this.belongs_to = []);\n\ + return true;\n\ + },\n\ + create_after_hooks: function(definition) {\n\ + var association_attributes, association_name, association_proxy, old_dirty, old_resource_id, options, resource, _i, _j, _k, _len, _len1, _len2, _name, _ref, _ref1, _ref2, _results;\n\ +\n\ + options = model[this.resource.name || this.resource.toString()];\n\ + if (options.has_many) {\n\ + _ref = options.has_many;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + resource = _ref[_i];\n\ + association_proxy = {\n\ + resource: resource,\n\ + parent_resource: this.resource,\n\ + parent: this\n\ + };\n\ + association_name = model.pluralize(resource);\n\ + association_attributes = this[association_name] || [];\n\ + this[_name = \"\" + association_name + \"_attributes\"] || (this[_name] = []);\n\ + if (association_attributes.length) {\n\ + this[\"\" + association_name + \"_attributes\"] = this[\"\" + association_name + \"_attributes\"].concat(association_attributes);\n\ + }\n\ + this[association_name] = $.extend(association_proxy, plural);\n\ + }\n\ + this.after('saved', callbacks.has_many.update_association);\n\ + callbacks.has_many.nest_attributes.call(this);\n\ + }\n\ + if (options.has_one) {\n\ + _ref1 = options.has_one;\n\ + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n\ + resource = _ref1[_j];\n\ + association_proxy = {\n\ + resource: resource,\n\ + parent_resource: this.resource,\n\ + owner: this\n\ + };\n\ + association_proxy[this.resource.toString()] = this;\n\ + this[\"build_\" + resource] = $.proxy(singular.build, association_proxy);\n\ + this[\"create_\" + resource] = $.proxy(singular.create, association_proxy);\n\ + }\n\ + callbacks.has_one.nest_attributes.call(this);\n\ + }\n\ + if (options.belongs_to) {\n\ + _ref2 = options.belongs_to;\n\ + _results = [];\n\ + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n\ + resource = _ref2[_k];\n\ + association_proxy = {\n\ + resource: resource,\n\ + parent_resource: this.resource,\n\ + parent: this,\n\ + owner: this\n\ + };\n\ + association_proxy[this.resource.toString()] = this;\n\ + this[\"build_\" + resource] = $.proxy(singular.build, association_proxy);\n\ + this[\"create_\" + resource] = $.proxy(singular.create, association_proxy);\n\ + old_resource_id = this[\"\" + resource + \"_id\"];\n\ + old_dirty = this.dirty;\n\ + this[\"\" + resource + \"_id\"] = null;\n\ + this.subscribe(\"\" + resource + \"_id\", $.proxy(subscribers.belongs_to.foreign_key, association_proxy));\n\ + this.subscribe(resource.toString(), $.proxy(subscribers.belongs_to.associated_changed, association_proxy));\n\ + this[\"\" + resource + \"_id\"] = old_resource_id;\n\ + _results.push(this.dirty = old_dirty);\n\ + }\n\ + return _results;\n\ + }\n\ + },\n\ + create_before_hooks: function(record) {\n\ + var association_proxy, definition, resource, _i, _len, _ref, _results;\n\ +\n\ + definition = this;\n\ + if (definition.belongs_to) {\n\ + _ref = definition.belongs_to;\n\ + _results = [];\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + resource = _ref[_i];\n\ + association_proxy = {\n\ + resource: resource,\n\ + parent_resource: this.resource,\n\ + owner: record\n\ + };\n\ + _results.push(modifiers.belongs_to.associated_loader.call(association_proxy));\n\ + }\n\ + return _results;\n\ + }\n\ + }\n\ + },\n\ + record: {\n\ + after_initialize: function(attributes) {\n\ + if (this.resource == null) {\n\ + throw new Error('resource must be defined in order to associate');\n\ + }\n\ + return model[this.resource.name || this.resource.toString()].create_after_hooks.call(this);\n\ + },\n\ + before_initialize: function(creation) {\n\ + if (!this.resource) {\n\ + throw new Error('resource must be defined in order to associate');\n\ + }\n\ + return model[this.resource.name || this.resource.toString()].create_before_hooks(creation);\n\ + }\n\ + }\n\ +};\n\ +\n\ +model = root.model;\n\ +\n\ +model.mix(function(modelable) {\n\ + modelable.after_mix.push(associable.model.blender);\n\ + modelable.record.before_initialize.push(associable.record.before_initialize);\n\ + return modelable.record.after_initialize.push(associable.record.after_initialize);\n\ +});\n\ +\n\ +model.associable = {\n\ + mix: function(blender) {\n\ + return blender(singular, plural);\n\ + }\n\ +};\n\ +//@ sourceURL=indemma/lib/record/associable.js" )); require.register("indemma/lib/record/persistable.js", Function("exports, require, module", -"var handlers, model, persistable, record;\n\nrequire('./queryable');\n\nhandlers = {\n store_after_saved: function() {\n var storage;\n\n storage = model[this.resource.toString()].storage;\n if (this._id) {\n return storage.store(this._id, this);\n }\n }\n};\n\npersistable = {\n record: {\n after_initialize: function() {\n var storage;\n\n if (this._id) {\n storage = model[this.resource.toString()].storage;\n return storage.store(this._id, this);\n } else {\n return this.after('saved', handlers.store_after_saved);\n }\n }\n }\n};\n\nmodel = window.model;\n\nrecord = window.record;\n\nmodel.persistable = true;\n\nmodel.mix(function(modelable) {\n return modelable.record.after_initialize.push(persistable.record.after_initialize);\n});\n//@ sourceURL=indemma/lib/record/persistable.js" +"var handlers, model, persistable, record;\n\ +\n\ +require('./queryable');\n\ +\n\ +handlers = {\n\ + store_after_saved: function() {\n\ + var storage;\n\ +\n\ + storage = model[this.resource.toString()].storage;\n\ + if (this._id) {\n\ + return storage.store(this._id, this);\n\ + }\n\ + }\n\ +};\n\ +\n\ +persistable = {\n\ + record: {\n\ + after_initialize: function() {\n\ + var storage;\n\ +\n\ + if (this._id) {\n\ + storage = model[this.resource.toString()].storage;\n\ + return storage.store(this._id, this);\n\ + } else {\n\ + return this.after('saved', handlers.store_after_saved);\n\ + }\n\ + }\n\ + }\n\ +};\n\ +\n\ +model = window.model;\n\ +\n\ +record = window.record;\n\ +\n\ +model.persistable = true;\n\ +\n\ +model.mix(function(modelable) {\n\ + return modelable.record.after_initialize.push(persistable.record.after_initialize);\n\ +});\n\ +//@ sourceURL=indemma/lib/record/persistable.js" )); require.register("indemma/lib/record/storable.js", Function("exports, require, module", -"var extend, merge, model, record, stampit, storable;\n\nextend = require('assimilate');\n\nmerge = extend.withStrategy('deep');\n\nstampit = require('../../vendor/stampit');\n\nstorable = stampit({\n store: function(keypath, value, options) {\n var collection, entry, key, _i, _len;\n\n collection = this.database;\n keypath = keypath.toString().split('.');\n key = keypath.pop();\n for (_i = 0, _len = keypath.length; _i < _len; _i++) {\n entry = keypath[_i];\n collection[entry] || (collection[entry] = {});\n collection = collection[entry];\n }\n if (arguments.length === 1) {\n this.reads++;\n return collection[key];\n } else {\n this.writes++;\n value.sustained || (value.sustained = true);\n return collection[key] = value;\n }\n },\n values: function() {\n return Object.values(this.database);\n }\n}, {\n type: 'object',\n writes: 0,\n reads: 0\n}, function() {\n this.database || (this.database = {});\n return this;\n});\n\nmodel = window.model;\n\nrecord = window.record;\n\nmodel.storable = true;\n\nmodule.exports = storable;\n//@ sourceURL=indemma/lib/record/storable.js" +"var extend, merge, model, record, stampit, storable;\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +merge = extend.withStrategy('deep');\n\ +\n\ +stampit = require('../../vendor/stampit');\n\ +\n\ +storable = stampit({\n\ + store: function(keypath, value, options) {\n\ + var collection, entry, key, _i, _len;\n\ +\n\ + collection = this.database;\n\ + keypath = keypath.toString().split('.');\n\ + key = keypath.pop();\n\ + for (_i = 0, _len = keypath.length; _i < _len; _i++) {\n\ + entry = keypath[_i];\n\ + collection[entry] || (collection[entry] = {});\n\ + collection = collection[entry];\n\ + }\n\ + if (arguments.length === 1) {\n\ + this.reads++;\n\ + return collection[key];\n\ + } else {\n\ + this.writes++;\n\ + value.sustained || (value.sustained = true);\n\ + return collection[key] = value;\n\ + }\n\ + },\n\ + values: function() {\n\ + return Object.values(this.database);\n\ + }\n\ +}, {\n\ + type: 'object',\n\ + writes: 0,\n\ + reads: 0\n\ +}, function() {\n\ + this.database || (this.database = {});\n\ + return this;\n\ +});\n\ +\n\ +model = window.model;\n\ +\n\ +record = window.record;\n\ +\n\ +model.storable = true;\n\ +\n\ +module.exports = storable;\n\ +//@ sourceURL=indemma/lib/record/storable.js" )); require.register("indemma/lib/record/queryable.js", Function("exports, require, module", -"var extend, model, queryable, record, stampit, storable;\n\nextend = require('assimilate');\n\nstorable = require('./storable');\n\nstampit = require('../../vendor/stampit');\n\nqueryable = {\n storage: storable(),\n find: function(key) {\n if (!key) {\n throw new TypeError(\"InvalidFind: resource.find was called with a falsey value\");\n }\n return this.storage.store(key);\n },\n every: function() {\n return this.storage.values();\n },\n where: function() {\n throw new Error('queryable.where: Not implemented yet');\n }\n};\n\nmodel = window.model;\n\nrecord = window.record;\n\nmodel.queryable = true;\n\nmodule.exports = queryable;\n\nmodel.mix(function(modelable) {\n return extend(modelable, queryable);\n});\n//@ sourceURL=indemma/lib/record/queryable.js" +"var extend, model, queryable, record, stampit, storable;\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +storable = require('./storable');\n\ +\n\ +stampit = require('../../vendor/stampit');\n\ +\n\ +queryable = {\n\ + storage: storable(),\n\ + find: function(key) {\n\ + if (!key) {\n\ + throw new TypeError(\"InvalidFind: resource.find was called with a falsey value\");\n\ + }\n\ + return this.storage.store(key);\n\ + },\n\ + every: function() {\n\ + return this.storage.values();\n\ + },\n\ + where: function() {\n\ + throw new Error('queryable.where: Not implemented yet');\n\ + }\n\ +};\n\ +\n\ +model = window.model;\n\ +\n\ +record = window.record;\n\ +\n\ +model.queryable = true;\n\ +\n\ +module.exports = queryable;\n\ +\n\ +model.mix(function(modelable) {\n\ + return extend(modelable, queryable);\n\ +});\n\ +//@ sourceURL=indemma/lib/record/queryable.js" )); require.register("indemma/lib/record/resource.js", Function("exports, require, module", -"var descriptors, model, resource, resourceable, stampit;\n\nstampit = require('../../vendor/stampit');\n\nrequire('../../vendor/owl/pluralize');\n\nresource = stampit({\n toString: function() {\n return this.name;\n }\n}, {\n name: 'unknown',\n scope: null,\n singular: false\n}, function() {\n var _base;\n\n if (this.original_reference) {\n stampit.mixIn(this.original_reference, this);\n this.original_reference.toString = this.toString;\n (_base = this.original_reference).param_name || (_base.param_name = this.name);\n return this.original_reference;\n }\n this.param_name || (this.param_name = this.name);\n return this;\n});\n\ndescriptors = {\n route: {\n get: function() {\n var route;\n\n if (typeof this.resource === 'string') {\n this.resource = {\n name: this.resource\n };\n }\n route = '/';\n if (this.parent != null) {\n route += \"\" + this.parent.route + \"/\" + this.parent._id + \"/\";\n }\n if (this.resource.scope != null) {\n route += this.resource.scope + '/';\n }\n route += this.resource.singular ? this.resource.name : model.pluralize(this.resource.name);\n return this.route = route;\n },\n configurable: true\n }\n};\n\nresourceable = {\n pluralize: function(word, count, plural) {\n if (!(word && word.length)) {\n throw new TypeError(\"Invalid string passed to pluralize '\" + word + \"'\");\n }\n if (word.indexOf('s') !== word.length - 1) {\n return owl.pluralize(word, count, plural);\n } else {\n return word;\n }\n },\n singularize: function(word) {\n if (!(word && word.length)) {\n throw new TypeError(\"Invalid string passed to singularize '\" + word + \"'\");\n }\n if (word.lastIndexOf('s') === word.length - 1) {\n return word.substring(0, word.length - 1);\n } else {\n return word;\n }\n },\n initialize: function() {\n var resource_definition, _ref;\n\n resource_definition = {};\n if (typeof this.resource === 'string') {\n resource_definition = {\n name: this.resource\n };\n }\n if (typeof this.resource === 'object') {\n this.resource.original_reference = this.resource;\n resource_definition = this.resource;\n }\n resource_definition.parent = this.parent_resource;\n this.resource = resource(resource_definition);\n return (_ref = this.route) != null ? _ref : Object.defineProperty(this, 'route', descriptors.route);\n }\n};\n\nmodel = window.model;\n\nmodel.mix(function(modelable) {\n modelable.record.after_initialize.unshift(resourceable.initialize);\n return modelable.after_mix.unshift(resourceable.initialize);\n});\n\nmodel.singularize = resourceable.singularize;\n\nmodel.pluralize = resourceable.pluralize;\n//@ sourceURL=indemma/lib/record/resource.js" +"var descriptors, model, resource, resourceable, stampit;\n\ +\n\ +stampit = require('../../vendor/stampit');\n\ +\n\ +require('../../vendor/owl/pluralize');\n\ +\n\ +resource = stampit({\n\ + toString: function() {\n\ + return this.name;\n\ + }\n\ +}, {\n\ + name: 'unknown',\n\ + scope: null,\n\ + singular: false\n\ +}, function() {\n\ + var _base;\n\ +\n\ + if (this.original_reference) {\n\ + stampit.mixIn(this.original_reference, this);\n\ + this.original_reference.toString = this.toString;\n\ + (_base = this.original_reference).param_name || (_base.param_name = this.name);\n\ + return this.original_reference;\n\ + }\n\ + this.param_name || (this.param_name = this.name);\n\ + return this;\n\ +});\n\ +\n\ +descriptors = {\n\ + route: {\n\ + get: function() {\n\ + var route;\n\ +\n\ + if (typeof this.resource === 'string') {\n\ + this.resource = {\n\ + name: this.resource\n\ + };\n\ + }\n\ + route = '/';\n\ + if (this.parent != null) {\n\ + route += \"\" + this.parent.route + \"/\" + this.parent._id + \"/\";\n\ + }\n\ + if (this.resource.scope != null) {\n\ + route += this.resource.scope + '/';\n\ + }\n\ + route += this.resource.singular ? this.resource.name : model.pluralize(this.resource.name);\n\ + return this.route = route;\n\ + },\n\ + configurable: true\n\ + }\n\ +};\n\ +\n\ +resourceable = {\n\ + pluralize: function(word, count, plural) {\n\ + if (!(word && word.length)) {\n\ + throw new TypeError(\"Invalid string passed to pluralize '\" + word + \"'\");\n\ + }\n\ + if (word.indexOf('s') !== word.length - 1) {\n\ + return owl.pluralize(word, count, plural);\n\ + } else {\n\ + return word;\n\ + }\n\ + },\n\ + singularize: function(word) {\n\ + if (!(word && word.length)) {\n\ + throw new TypeError(\"Invalid string passed to singularize '\" + word + \"'\");\n\ + }\n\ + if (word.lastIndexOf('s') === word.length - 1) {\n\ + return word.substring(0, word.length - 1);\n\ + } else {\n\ + return word;\n\ + }\n\ + },\n\ + initialize: function() {\n\ + var resource_definition, _ref;\n\ +\n\ + resource_definition = {};\n\ + if (typeof this.resource === 'string') {\n\ + resource_definition = {\n\ + name: this.resource\n\ + };\n\ + }\n\ + if (typeof this.resource === 'object') {\n\ + this.resource.original_reference = this.resource;\n\ + resource_definition = this.resource;\n\ + }\n\ + resource_definition.parent = this.parent_resource;\n\ + this.resource = resource(resource_definition);\n\ + return (_ref = this.route) != null ? _ref : Object.defineProperty(this, 'route', descriptors.route);\n\ + }\n\ +};\n\ +\n\ +model = window.model;\n\ +\n\ +model.mix(function(modelable) {\n\ + modelable.record.after_initialize.unshift(resourceable.initialize);\n\ + return modelable.after_mix.unshift(resourceable.initialize);\n\ +});\n\ +\n\ +model.singularize = resourceable.singularize;\n\ +\n\ +model.pluralize = resourceable.pluralize;\n\ +//@ sourceURL=indemma/lib/record/resource.js" )); require.register("indemma/lib/record/rest.js", Function("exports, require, module", -"var $, data_for, request;\n\n$ = require('jquery');\n\nmodule.exports = {\n get: function(data) {\n return request.call(this, 'get', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n },\n put: function(data) {\n return request.call(this, 'put', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n },\n post: function(data) {\n return request.call(this, 'post', this.route, data);\n },\n \"delete\": function(data) {\n return request.call(this, 'delete', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n }\n};\n\ndata_for = function(data) {\n var param_name;\n\n param_name = this.resource.param_name || this.resource.toString();\n if (!data && this.json) {\n data = {};\n data[param_name] = this.json();\n }\n if (data && data[param_name]) {\n delete data[param_name]['id'];\n delete data[param_name]['_id'];\n }\n return data;\n};\n\nrequest = function(method, url, data) {\n data = data_for.call(this, data);\n return $.ajax({\n url: url,\n data: data,\n type: method,\n dataType: 'json',\n context: this\n });\n};\n//@ sourceURL=indemma/lib/record/rest.js" +"var $, request;\n\ +\n\ +$ = require('jquery');\n\ +\n\ +module.exports = {\n\ + get: function(data) {\n\ + return request.call(this, 'get', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n\ + },\n\ + put: function(data) {\n\ + return request.call(this, 'put', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n\ + },\n\ + post: function(data) {\n\ + return request.call(this, 'post', this.route, data);\n\ + },\n\ + \"delete\": function(data) {\n\ + return request.call(this, 'delete', (this._id ? \"\" + this.route + \"/\" + this._id : this.route), data);\n\ + }\n\ +};\n\ +\n\ +request = function(method, url, data) {\n\ + var param_name;\n\ +\n\ + param_name = this.resource.param_name || this.resource.toString();\n\ + if (!data && this.json) {\n\ + data = {};\n\ + data[param_name] = this.json();\n\ + }\n\ + if (data && data[param_name]) {\n\ + delete data[param_name]['id'];\n\ + delete data[param_name]['_id'];\n\ + }\n\ + return $.ajax({\n\ + url: url,\n\ + data: data,\n\ + type: method,\n\ + dataType: 'json',\n\ + context: this\n\ + });\n\ +};\n\ +//@ sourceURL=indemma/lib/record/rest.js" )); require.register("indemma/lib/record/restfulable.js", Function("exports, require, module", -"var $, merge, model, observable, record, rest, restful, root, type, util,\n __slice = [].slice;\n\nmerge = require('assimilate').withStrategy('deep');\n\ntype = require('type');\n\nobservable = require('observable').mixin;\n\n$ = require('jquery');\n\nrest = require('./rest.js');\n\nroot = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\nutil = {\n model: {\n map: function(records) {\n var record, _i, _len, _results;\n\n _results = [];\n for (_i = 0, _len = records.length; _i < _len; _i++) {\n record = records[_i];\n _results.push(this(record));\n }\n return _results;\n }\n }\n};\n\nrestful = {\n model: {\n create: function() {\n var attributes, callback, params, record, savings, _i, _j, _len;\n\n params = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), callback = arguments[_i++];\n if (!arguments.length) {\n throw new TypeError(\"No arguments provided for \" + this.resource + \".create\");\n }\n if (typeof callback !== 'function') {\n params.push(callback);\n callback = void 0;\n }\n if (!params.length) {\n params.unshift({});\n }\n savings = [];\n for (_j = 0, _len = params.length; _j < _len; _j++) {\n attributes = params[_j];\n record = this(attributes);\n record.dirty = true;\n savings.push(record.save(callback));\n }\n return $.when.apply($, savings);\n },\n every: function(conditions, doned, failed) {\n if (conditions == null) {\n conditions = {};\n }\n if (typeof conditions === 'function') {\n doned = conditions;\n conditions = {};\n }\n return $.when(rest.get.call(this, conditions)).then(util.model.map).done(doned).fail(failed);\n },\n first: function(conditions, callback) {\n var namespaced;\n\n if (conditions == null) {\n conditions = {};\n }\n if (typeof conditions === 'function') {\n callback = conditions;\n conditions = {};\n }\n namespaced = conditions[this.resource] || {};\n namespaced.limit = 1;\n namespaced.order = 'desc';\n return this.every(conditions, callback);\n },\n get: function(action, data) {\n var default_route, old_route, payload, promise, resource;\n\n if (data == null) {\n data = {};\n }\n old_route = this.route;\n default_route = \"/\" + (model.pluralize(this.resource.name));\n if (default_route !== this.route) {\n this.route = default_route;\n }\n if (action) {\n Object.defineProperty(this, 'route', {\n value: \"\" + default_route + \"/\" + action,\n configurable: true\n });\n }\n resource = data.resource;\n if (data && data.json) {\n data = data.json();\n }\n if (resource != null) {\n payload = data;\n data = {};\n data[resource] = payload;\n }\n promise = rest.get.call(this, data);\n Object.defineProperty(this, 'route', {\n value: old_route,\n configurable: true\n });\n return promise;\n },\n put: rest.put,\n \"delete\": rest[\"delete\"]\n },\n record: {\n ready: function(callback) {\n return callback.call(this);\n },\n reload: function() {\n var data, param, params, promise, _i, _len;\n\n params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n data = params.pop();\n if (type(data) !== 'object') {\n params.push(data);\n }\n promise = rest.get.call(this, data || {});\n promise.done(this.assign_attributes);\n promise.fail(this.failed);\n this.reloading = promise;\n this.ready = function() {\n console.warn(\"resource.ready was deprecated, please use resource.reloading.done\");\n return promise.done.apply(promise, arguments);\n };\n for (_i = 0, _len = params.length; _i < _len; _i++) {\n param = params[_i];\n promise.done(param);\n }\n return promise;\n },\n assign_attributes: function(attributes) {\n var association, association_attributes, association_name, associations_attributes, attribute, message, name, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results;\n\n _ref = model[this.resource.toString()].has_many;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n association_name = _ref[_i];\n associations_attributes = attributes[association_name];\n delete attributes[association_name];\n association = this[association_name];\n if (association == null) {\n message = \"Association '\" + association_name + \"' not found. \\n\";\n message += \"For record with resource \" + this.resource + \". \\n\";\n message += \"Probably defined on server side but not on client side.\\n\";\n message += \"Skipping association assignment!\";\n console.warn(message);\n continue;\n }\n if (association.length) {\n Array.prototype.splice.call(association, 0);\n }\n if (!((associations_attributes != null) && associations_attributes.length)) {\n continue;\n }\n singular_resource = model.singularize(association_name);\n for (_j = 0, _len1 = associations_attributes.length; _j < _len1; _j++) {\n association_attributes = associations_attributes[_j];\n _ref1 = model[singular_resource].has_many;\n for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {\n association_name = _ref1[_k];\n association_attributes[\"\" + association_name + \"_attributes\"] = association_attributes[association_name];\n delete association_attributes[association_name];\n }\n }\n association.add.apply(association, associations_attributes);\n }\n _ref2 = model[this.resource.toString()].has_one;\n for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) {\n association_name = _ref2[_l];\n association_attributes = attributes[association_name];\n delete attributes[association_name];\n delete attributes[association_name + \"_attributes\"];\n if (association_attributes) {\n this[association_name] = this[\"build_\" + association_name](association_attributes);\n }\n }\n _results = [];\n for (name in attributes) {\n attribute = attributes[name];\n if (attribute !== this[name]) {\n if (type(attribute) === 'object') {\n if (JSON.stringify(attribute) !== JSON.stringify(this[name])) {\n _results.push(this[name] = attributes[name]);\n } else {\n _results.push(void 0);\n }\n } else {\n _results.push(this[name] = attributes[name]);\n }\n }\n }\n return _results;\n },\n destroy: function(doned, failed, data) {\n var promise;\n\n if (!((this.id != null) || (this._id != null))) {\n throw new Error('Can\\'t delete record without id!');\n }\n promise = rest[\"delete\"].call(this, data);\n promise.done(this.destroyed);\n promise.fail(this.failed);\n promise.done(doned);\n promise.fail(failed);\n return promise;\n },\n saving: false,\n salvation: null,\n save: function(doned, failed, data) {\n var lock, salvation;\n\n lock = JSON.stringify(this.json());\n if (this.saving) {\n if (this.lock === lock) {\n return this.salvation;\n } else {\n this.salvation.abort();\n }\n }\n this.lock = lock;\n if (!this.dirty) {\n salvation = $.Deferred().resolveWith(this, null);\n }\n this.saving = true;\n salvation || (salvation = rest[this._id ? 'put' : 'post'].call(this, data));\n this.salvation = salvation;\n salvation.done(this.saved);\n salvation.fail(this.failed);\n salvation.always(function() {\n return this.saving = false;\n });\n salvation.done(doned);\n salvation.fail(failed);\n return salvation;\n },\n saved: function(data) {\n var callback, _i, _len, _ref, _results;\n\n if (this.lock === JSON.stringify(this.json())) {\n this.dirty = false;\n delete this.lock;\n }\n if (data != null) {\n this.assign_attributes(data);\n }\n if (this.after_save) {\n _ref = this.after_save;\n _results = [];\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n callback = _ref[_i];\n throw \"Not supported after_save callback: \" + callback;\n }\n return _results;\n }\n },\n failed: function(xhr, error, status) {\n var attribute_name, definition, e, message, messages, payload, _i, _len, _ref;\n\n payload = xhr.responseJSON;\n try {\n payload || (payload = JSON.parse(xhr.responseText));\n } catch (_error) {\n e = _error;\n }\n payload || (payload = xhr.responseText);\n switch (xhr.status) {\n case 0:\n message = status || xhr.statusText;\n switch (message) {\n case 'abort':\n console.info(\"salvation probably aborted\");\n break;\n case 'error':\n console.info(\"server probably unreachable\");\n break;\n default:\n throw new Error('Unhandled status code for xhr');\n }\n break;\n case 422:\n definition = model[this.resource.toString()];\n _ref = payload.errors;\n for (attribute_name in _ref) {\n messages = _ref[attribute_name];\n if (!definition.associations) {\n definition.associations = definition.has_one.concat(definition.has_many.concat(definition.belongs_to));\n }\n if (!(this.hasOwnProperty(attribute_name) || definition.hasOwnProperty(attribute_name) || definition.associations.indexOf(attribute_name) !== -1 || attribute_name === 'base')) {\n message = \"Server returned an validation error message for a attribute that is not defined in your model.\\n\";\n message += \"The attribute was '\" + attribute_name + \"', the model resource was '\" + this.resource + \"'.\\n\";\n message += \"The model definition keys were '\" + (JSON.stringify(Object.keys(definition))) + \"'.\\n\";\n message += \"Please remove server validation, or update your model definition.\";\n throw new TypeError(message);\n }\n for (_i = 0, _len = messages.length; _i < _len; _i++) {\n message = messages[_i];\n this.errors.add(attribute_name, 'server', {\n server_message: message\n });\n }\n }\n break;\n default:\n message = \"Fail in \" + this.resource + \".save:\\n\";\n message += \"Record: \" + this + \"\\n\";\n message += \"Status: \" + status + \" (\" + (payload || xhr).status + \")\\n\";\n message += \"Error : \" + (payload.error || payload.message || payload);\n console.log(message);\n }\n return this.saving = false;\n },\n toString: function() {\n var e, name, property, serialized;\n\n serialized = {};\n serialized[this.resource] = this.json();\n try {\n return JSON.stringify(serialized);\n } catch (_error) {\n e = _error;\n console.warn(\"restfulable.toString: Failed to stringify record: \" + e.message + \". retrying...\");\n for (name in serialized) {\n property = serialized[name];\n if (typeof property === 'object') {\n delete serialized[name];\n }\n }\n return JSON.stringify(serialized);\n }\n },\n json: function(methods) {\n var definition, json, name, nature, nested, value;\n\n if (methods == null) {\n methods = {};\n }\n json = {};\n definition = model[this.resource.toString()];\n for (name in this) {\n if (observable.ignores.indexOf(name) !== -1) {\n continue;\n }\n nested = this.nested_attributes.indexOf(name) !== -1;\n if (!nested && (definition.belongs_to.indexOf(name) !== -1 || definition.has_one.indexOf(name) !== -1 || definition.has_many.indexOf(name) !== -1)) {\n continue;\n }\n value = this[name];\n if (value == null) {\n continue;\n }\n nature = type(value);\n if (nature === 'function') {\n continue;\n }\n if (nature === 'object' || nature === 'element') {\n if (nested) {\n if (!value.json) {\n console.warn(\"json: Tryied to serialize nested attribute '\" + name + \"' without serialization method!\");\n continue;\n }\n json[\"\" + name + \"_attributes\"] = value.json(methods[name]);\n } else if ((value.toJSON != null) || (value.json != null)) {\n if (value.resource) {\n continue;\n }\n if (value.json != null) {\n json[name] = value.json(methods[name]);\n } else {\n json[name] = value.toJSON(methods[name]);\n }\n } else {\n continue;\n }\n } else {\n json[name] = value;\n }\n }\n json = observable.unobserve(json);\n delete json.dirty;\n delete json.resource;\n delete json.route;\n delete json.initial_route;\n delete json.after_initialize;\n delete json.before_initialize;\n delete json.parent_resource;\n delete json.nested_attributes;\n delete json.reloading;\n delete json.ready;\n delete json.saving;\n delete json.salvation;\n delete json.sustained;\n delete json.element;\n delete json[\"default\"];\n delete json.lock;\n delete json.validated;\n delete json.validation;\n delete json.errors;\n return json;\n }\n }\n};\n\nrestful.toJSON = restful.json;\n\nmodel = window.model;\n\nrecord = window.record;\n\nmodel.restfulable = true;\n\nrecord.mix(function(recordable) {\n return merge(recordable, restful.record);\n});\n\nmodel.mix(function(modelable) {\n return merge(modelable, restful.model);\n});\n\nmodel.associable && model.associable.mix(function(singular_association, plural_association) {\n plural_association.get = function() {\n if (this.parent != null) {\n this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.name)));\n }\n return rest.get.apply(this, arguments);\n };\n return plural_association.post = function() {\n if (this.parent != null) {\n this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.name)));\n }\n return rest.post.apply(this, arguments);\n };\n});\n//@ sourceURL=indemma/lib/record/restfulable.js" +"var $, merge, model, observable, record, rest, restful, root, type, util,\n\ + __slice = [].slice;\n\ +\n\ +merge = require('assimilate').withStrategy('deep');\n\ +\n\ +type = require('type');\n\ +\n\ +observable = require('observable').mixin;\n\ +\n\ +$ = require('jquery');\n\ +\n\ +rest = require('./rest.js');\n\ +\n\ +root = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\ +\n\ +util = {\n\ + model: {\n\ + map: function(records) {\n\ + var record, _i, _len, _results;\n\ +\n\ + _results = [];\n\ + for (_i = 0, _len = records.length; _i < _len; _i++) {\n\ + record = records[_i];\n\ + _results.push(this(record));\n\ + }\n\ + return _results;\n\ + }\n\ + }\n\ +};\n\ +\n\ +restful = {\n\ + model: {\n\ + create: function() {\n\ + var attributes, callback, params, record, savings, _i, _j, _len;\n\ +\n\ + params = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), callback = arguments[_i++];\n\ + if (!arguments.length) {\n\ + throw new TypeError(\"No arguments provided for \" + this.resource + \".create\");\n\ + }\n\ + if (typeof callback !== 'function') {\n\ + params.push(callback);\n\ + callback = void 0;\n\ + }\n\ + if (!params.length) {\n\ + params.unshift({});\n\ + }\n\ + savings = [];\n\ + for (_j = 0, _len = params.length; _j < _len; _j++) {\n\ + attributes = params[_j];\n\ + record = this(attributes);\n\ + record.dirty = true;\n\ + savings.push(record.save(callback));\n\ + }\n\ + return $.when.apply($, savings);\n\ + },\n\ + every: function(conditions, doned, failed) {\n\ + if (conditions == null) {\n\ + conditions = {};\n\ + }\n\ + if (typeof conditions === 'function') {\n\ + doned = conditions;\n\ + conditions = {};\n\ + }\n\ + return $.when(rest.get.call(this, conditions)).then(util.model.map).done(doned).fail(failed);\n\ + },\n\ + first: function(conditions, callback) {\n\ + var namespaced;\n\ +\n\ + if (conditions == null) {\n\ + conditions = {};\n\ + }\n\ + if (typeof conditions === 'function') {\n\ + callback = conditions;\n\ + conditions = {};\n\ + }\n\ + namespaced = conditions[this.resource] || {};\n\ + namespaced.limit = 1;\n\ + namespaced.order = 'desc';\n\ + return this.every(conditions, callback);\n\ + },\n\ + get: function(action, data) {\n\ + var default_route, old_route, payload, promise, resource;\n\ +\n\ + if (data == null) {\n\ + data = {};\n\ + }\n\ + old_route = this.route;\n\ + default_route = \"/\" + (model.pluralize(this.resource.name));\n\ + if (default_route !== this.route) {\n\ + this.route = default_route;\n\ + }\n\ + if (action) {\n\ + Object.defineProperty(this, 'route', {\n\ + value: \"\" + default_route + \"/\" + action,\n\ + configurable: true\n\ + });\n\ + }\n\ + resource = data.resource;\n\ + if (data && data.json) {\n\ + data = data.json();\n\ + }\n\ + if (resource != null) {\n\ + payload = data;\n\ + data = {};\n\ + data[resource] = payload;\n\ + }\n\ + promise = rest.get.call(this, data);\n\ + Object.defineProperty(this, 'route', {\n\ + value: old_route,\n\ + configurable: true\n\ + });\n\ + return promise;\n\ + },\n\ + put: rest.put,\n\ + \"delete\": rest[\"delete\"]\n\ + },\n\ + record: {\n\ + ready: function(callback) {\n\ + return callback.call(this);\n\ + },\n\ + reload: function() {\n\ + var data, param, params, promise, _i, _len;\n\ +\n\ + params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n\ + data = params.pop();\n\ + if (type(data) !== 'object') {\n\ + params.push(data);\n\ + }\n\ + promise = rest.get.call(this, data || {});\n\ + promise.done(this.assign_attributes);\n\ + promise.fail(this.failed);\n\ + this.reloading = promise;\n\ + this.ready = function() {\n\ + console.warn(\"resource.ready was deprecated, please use resource.reloading.done\");\n\ + return promise.done.apply(promise, arguments);\n\ + };\n\ + for (_i = 0, _len = params.length; _i < _len; _i++) {\n\ + param = params[_i];\n\ + promise.done(param);\n\ + }\n\ + return promise;\n\ + },\n\ + assign_attributes: function(attributes) {\n\ + var association, association_attributes, association_name, associations_attributes, attribute, message, name, singular_resource, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _results;\n\ +\n\ + _ref = model[this.resource.toString()].has_many;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + association_name = _ref[_i];\n\ + associations_attributes = attributes[association_name];\n\ + delete attributes[association_name];\n\ + association = this[association_name];\n\ + if (association == null) {\n\ + message = \"Association '\" + association_name + \"' not found. \\n\ +\";\n\ + message += \"For record with resource \" + this.resource + \". \\n\ +\";\n\ + message += \"Probably defined on server side but not on client side.\\n\ +\";\n\ + message += \"Skipping association assignment!\";\n\ + console.warn(message);\n\ + continue;\n\ + }\n\ + if (association.length) {\n\ + Array.prototype.splice.call(association, 0);\n\ + }\n\ + if (!((associations_attributes != null) && associations_attributes.length)) {\n\ + continue;\n\ + }\n\ + singular_resource = model.singularize(association_name);\n\ + for (_j = 0, _len1 = associations_attributes.length; _j < _len1; _j++) {\n\ + association_attributes = associations_attributes[_j];\n\ + _ref1 = model[singular_resource].has_many;\n\ + for (_k = 0, _len2 = _ref1.length; _k < _len2; _k++) {\n\ + association_name = _ref1[_k];\n\ + association_attributes[\"\" + association_name + \"_attributes\"] = association_attributes[association_name];\n\ + delete association_attributes[association_name];\n\ + }\n\ + }\n\ + association.add.apply(association, associations_attributes);\n\ + }\n\ + _ref2 = model[this.resource.toString()].has_one;\n\ + for (_l = 0, _len3 = _ref2.length; _l < _len3; _l++) {\n\ + association_name = _ref2[_l];\n\ + association_attributes = attributes[association_name];\n\ + delete attributes[association_name];\n\ + delete attributes[association_name + \"_attributes\"];\n\ + if (association_attributes) {\n\ + this[association_name] = this[\"build_\" + association_name](association_attributes);\n\ + }\n\ + }\n\ + _results = [];\n\ + for (name in attributes) {\n\ + attribute = attributes[name];\n\ + if (attribute !== this[name]) {\n\ + if (type(attribute) === 'object') {\n\ + if (JSON.stringify(attribute) !== JSON.stringify(this[name])) {\n\ + _results.push(this[name] = attributes[name]);\n\ + } else {\n\ + _results.push(void 0);\n\ + }\n\ + } else {\n\ + _results.push(this[name] = attributes[name]);\n\ + }\n\ + }\n\ + }\n\ + return _results;\n\ + },\n\ + destroy: function(doned, failed, data) {\n\ + var promise;\n\ +\n\ + if (!((this.id != null) || (this._id != null))) {\n\ + throw new Error('Can\\'t delete record without id!');\n\ + }\n\ + promise = rest[\"delete\"].call(this, data);\n\ + promise.done(this.destroyed);\n\ + promise.fail(this.failed);\n\ + promise.done(doned);\n\ + promise.fail(failed);\n\ + return promise;\n\ + },\n\ + saving: false,\n\ + salvation: null,\n\ + save: function(doned, failed, data) {\n\ + var lock, salvation;\n\ +\n\ + lock = JSON.stringify(this.json());\n\ + if (this.saving) {\n\ + if (this.lock === lock) {\n\ + return this.salvation;\n\ + } else {\n\ + this.salvation.abort();\n\ + }\n\ + }\n\ + this.lock = lock;\n\ + if (!this.dirty) {\n\ + salvation = $.Deferred().resolveWith(this, null);\n\ + }\n\ + this.saving = true;\n\ + salvation || (salvation = rest[this._id ? 'put' : 'post'].call(this, data));\n\ + this.salvation = salvation;\n\ + salvation.done(this.saved);\n\ + salvation.fail(this.failed);\n\ + salvation.always(function() {\n\ + return this.saving = false;\n\ + });\n\ + salvation.done(doned);\n\ + salvation.fail(failed);\n\ + return salvation;\n\ + },\n\ + saved: function(data) {\n\ + var callback, _i, _len, _ref, _results;\n\ +\n\ + if (this.lock === JSON.stringify(this.json())) {\n\ + this.dirty = false;\n\ + delete this.lock;\n\ + }\n\ + if (data != null) {\n\ + this.assign_attributes(data);\n\ + }\n\ + if (this.after_save) {\n\ + _ref = this.after_save;\n\ + _results = [];\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + callback = _ref[_i];\n\ + throw \"Not supported after_save callback: \" + callback;\n\ + }\n\ + return _results;\n\ + }\n\ + },\n\ + failed: function(xhr, error, status) {\n\ + var attribute_name, definition, e, message, messages, payload, _i, _len, _ref;\n\ +\n\ + payload = xhr.responseJSON;\n\ + try {\n\ + payload || (payload = JSON.parse(xhr.responseText));\n\ + } catch (_error) {\n\ + e = _error;\n\ + }\n\ + payload || (payload = xhr.responseText);\n\ + switch (xhr.status) {\n\ + case 0:\n\ + message = status || xhr.statusText;\n\ + switch (message) {\n\ + case 'abort':\n\ + console.info(\"salvation probably aborted\");\n\ + break;\n\ + case 'error':\n\ + console.info(\"server probably unreachable\");\n\ + break;\n\ + default:\n\ + throw new Error('Unhandled status code for xhr');\n\ + }\n\ + break;\n\ + case 422:\n\ + definition = model[this.resource.toString()];\n\ + _ref = payload.errors;\n\ + for (attribute_name in _ref) {\n\ + messages = _ref[attribute_name];\n\ + if (!definition.associations) {\n\ + definition.associations = definition.has_one.concat(definition.has_many.concat(definition.belongs_to));\n\ + }\n\ + if (!(this.hasOwnProperty(attribute_name) || definition.hasOwnProperty(attribute_name) || definition.associations.indexOf(attribute_name) !== -1 || attribute_name === 'base')) {\n\ + message = \"Server returned an validation error message for a attribute that is not defined in your model.\\n\ +\";\n\ + message += \"The attribute was '\" + attribute_name + \"', the model resource was '\" + this.resource + \"'.\\n\ +\";\n\ + message += \"The model definition keys were '\" + (JSON.stringify(Object.keys(definition))) + \"'.\\n\ +\";\n\ + message += \"Please remove server validation, or update your model definition.\";\n\ + throw new TypeError(message);\n\ + }\n\ + for (_i = 0, _len = messages.length; _i < _len; _i++) {\n\ + message = messages[_i];\n\ + this.errors.add(attribute_name, 'server', {\n\ + server_message: message\n\ + });\n\ + }\n\ + }\n\ + break;\n\ + default:\n\ + message = \"Fail in \" + this.resource + \".save:\\n\ +\";\n\ + message += \"Record: \" + this + \"\\n\ +\";\n\ + message += \"Status: \" + status + \" (\" + (payload || xhr).status + \")\\n\ +\";\n\ + message += \"Error : \" + (payload.error || payload.message || payload);\n\ + console.log(message);\n\ + }\n\ + return this.saving = false;\n\ + },\n\ + toString: function() {\n\ + var e, name, property, serialized;\n\ +\n\ + serialized = {};\n\ + serialized[this.resource] = this.json();\n\ + try {\n\ + return JSON.stringify(serialized);\n\ + } catch (_error) {\n\ + e = _error;\n\ + console.warn(\"restfulable.toString: Failed to stringify record: \" + e.message + \". retrying...\");\n\ + for (name in serialized) {\n\ + property = serialized[name];\n\ + if (typeof property === 'object') {\n\ + delete serialized[name];\n\ + }\n\ + }\n\ + return JSON.stringify(serialized);\n\ + }\n\ + },\n\ + json: function(methods) {\n\ + var definition, json, name, nature, nested, value;\n\ +\n\ + if (methods == null) {\n\ + methods = {};\n\ + }\n\ + json = {};\n\ + definition = model[this.resource.toString()];\n\ + for (name in this) {\n\ + if (observable.ignores.indexOf(name) !== -1) {\n\ + continue;\n\ + }\n\ + nested = this.nested_attributes.indexOf(name) !== -1;\n\ + if (!nested && (definition.belongs_to.indexOf(name) !== -1 || definition.has_one.indexOf(name) !== -1 || definition.has_many.indexOf(name) !== -1)) {\n\ + continue;\n\ + }\n\ + value = this[name];\n\ + if (value == null) {\n\ + continue;\n\ + }\n\ + nature = type(value);\n\ + if (nature === 'function') {\n\ + continue;\n\ + }\n\ + if (nature === 'object' || nature === 'element') {\n\ + if (nested) {\n\ + if (!value.json) {\n\ + console.warn(\"json: Tryied to serialize nested attribute '\" + name + \"' without serialization method!\");\n\ + continue;\n\ + }\n\ + json[\"\" + name + \"_attributes\"] = value.json(methods[name]);\n\ + } else if ((value.toJSON != null) || (value.json != null)) {\n\ + if (value.resource) {\n\ + continue;\n\ + }\n\ + if (value.json != null) {\n\ + json[name] = value.json(methods[name]);\n\ + } else {\n\ + json[name] = value.toJSON(methods[name]);\n\ + }\n\ + } else {\n\ + continue;\n\ + }\n\ + } else {\n\ + json[name] = value;\n\ + }\n\ + }\n\ + json = observable.unobserve(json);\n\ + delete json.dirty;\n\ + delete json.resource;\n\ + delete json.route;\n\ + delete json.initial_route;\n\ + delete json.after_initialize;\n\ + delete json.before_initialize;\n\ + delete json.parent_resource;\n\ + delete json.nested_attributes;\n\ + delete json.reloading;\n\ + delete json.ready;\n\ + delete json.saving;\n\ + delete json.salvation;\n\ + delete json.sustained;\n\ + delete json.element;\n\ + delete json[\"default\"];\n\ + delete json.lock;\n\ + delete json.validated;\n\ + delete json.validation;\n\ + delete json.errors;\n\ + return json;\n\ + }\n\ + }\n\ +};\n\ +\n\ +restful.toJSON = restful.json;\n\ +\n\ +model = window.model;\n\ +\n\ +record = window.record;\n\ +\n\ +model.restfulable = true;\n\ +\n\ +record.mix(function(recordable) {\n\ + return merge(recordable, restful.record);\n\ +});\n\ +\n\ +model.mix(function(modelable) {\n\ + return merge(modelable, restful.model);\n\ +});\n\ +\n\ +model.associable && model.associable.mix(function(singular_association, plural_association) {\n\ + plural_association.get = function() {\n\ + if (this.parent != null) {\n\ + this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.name)));\n\ + }\n\ + return rest.get.apply(this, arguments);\n\ + };\n\ + return plural_association.post = function() {\n\ + if (this.parent != null) {\n\ + this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource.name)));\n\ + }\n\ + return rest.post.apply(this, arguments);\n\ + };\n\ +});\n\ +//@ sourceURL=indemma/lib/record/restfulable.js" )); require.register("indemma/lib/record/scopable.js", Function("exports, require, module", -"var $, builders, defaults, extend, merge, model, observable, record, rest, scopable, stampit, util,\n __slice = [].slice;\n\nrequire('./restfulable');\n\nrequire('./resource');\n\nstampit = require('../../vendor/stampit');\n\nextend = require('assimilate');\n\nobservable = require('observable').mixin;\n\nmerge = extend.withStrategy('deep');\n\n$ = require('jquery');\n\nrest = require('./rest');\n\nutil = {\n model: {\n map: function(records) {\n var index, record, _i, _len, _results;\n\n _results = [];\n for (index = _i = 0, _len = records.length; _i < _len; index = ++_i) {\n record = records[index];\n _results.push((this.build || this).call(this, record));\n }\n return _results;\n }\n }\n};\n\nscopable = {\n builder: stampit().enclose(function() {\n return stampit.mixIn(function(name, type) {\n var builder;\n\n if ($.type(type) === 'function') {\n this[\"$\" + name] = type() || new type;\n type = $.type(this[\"$\" + name]);\n } else {\n this[\"$\" + name] = defaults[type] || type;\n }\n if ($.type(type) !== 'string') {\n type = $.type(type);\n }\n builder = builders[type];\n if (builder == null) {\n throw \"Unknown scope type: '\" + type + \"', For model with resource: '\" + this.resource + \"'\";\n }\n this.scope.declared.push(name);\n return this[name] = builder({\n name: name\n });\n }, {\n data: {},\n then: [],\n fail: [],\n declared: [],\n fetch: function(data, done, fail) {\n var deferred, scope;\n\n if (typeof data === 'function') {\n done = data;\n data = {};\n }\n scope = extend({}, this.scope.data);\n observable.unobserve(scope);\n if (scope.noned != null) {\n deferred = $.Deferred();\n deferred.resolveWith(this, [[]]);\n } else {\n deferred = rest.get.call(this, extend(scope, data));\n }\n deferred.then(util.model.map).done(this.scope.then.concat([done])).fail(this.scope.fail.concat([fail]));\n this.scope.clear();\n return deferred;\n },\n clear: function() {\n this.data = {};\n return this.callbacks = [];\n }\n });\n }),\n base: stampit().state({\n name: 'unamed_scope'\n }),\n record: {\n failed: function(xhr, error, status) {\n var e, message, payload;\n\n payload = xhr.responseJSON;\n try {\n payload || (payload = JSON.parse(xhr.responseText));\n } catch (_error) {\n e = _error;\n }\n payload || (payload = xhr.responseText);\n switch (xhr.status) {\n case 422:\n this.valid = false;\n return this.errors = payload.errors;\n default:\n message = \"Fail in \" + this.resource + \".save:\\n\";\n message += \"Record: \" + this + \"\\n\";\n message += \"Status: \" + status + \" (\" + (payload.status || xhr.status) + \")\\n\";\n message += \"Error : \" + (payload.error || payload.message || payload);\n }\n return console.error(message);\n }\n },\n model: {\n none: function() {\n this.scope.data.noned = true;\n return this;\n },\n fetch: function(data, done, fail) {\n if (typeof data === 'function') {\n done = data;\n data = null;\n }\n return this.scope.fetch.call(this, data, done, fail);\n },\n forward_scopes_to_associations: function() {\n var associated_factory, associated_resource, association, association_name, factory, forwarder, generate_forwarder, scope, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;\n\n factory = model[this.resource.name];\n _ref = factory.has_many;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n association_name = _ref[_i];\n associated_resource = model.singularize(association_name);\n associated_factory = model[associated_resource];\n if (!model[associated_resource]) {\n console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n continue;\n }\n association = this[association_name];\n association.scope = scopable.builder(association);\n _ref1 = associated_factory.scope.declared;\n for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n scope = _ref1[_j];\n association.scope(scope, associated_factory[\"$\" + scope]);\n }\n }\n _ref2 = factory.has_one;\n for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n associated_resource = _ref2[_k];\n if (!model[associated_resource]) {\n console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n continue;\n }\n _ref3 = model[associated_resource].scope.declared;\n for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {\n scope = _ref3[_l];\n this[associated_resource][scope] = factory[scope];\n }\n }\n if (factory.belongs_to.length) {\n generate_forwarder = function(associated_resource) {\n var declared_scopes;\n\n associated_factory = model[associated_resource];\n if (!associated_factory) {\n return console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n }\n declared_scopes = associated_factory.scope.declared;\n return function() {\n var _len4, _m, _results;\n\n _results = [];\n for (_m = 0, _len4 = declared_scopes.length; _m < _len4; _m++) {\n scope = declared_scopes[_m];\n _results.push(this[associated_resource][scope] = associated_factory[scope]);\n }\n return _results;\n };\n };\n _ref4 = factory.belongs_to;\n for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {\n associated_resource = _ref4[_m];\n forwarder = generate_forwarder(associated_resource);\n this.after(\"build_\" + associated_resource, forwarder);\n }\n }\n return true;\n }\n },\n after_mix: function() {\n var name, property, type, _results;\n\n this.scope = scopable.builder(this);\n _results = [];\n for (property in this) {\n type = this[property];\n if (property.charAt(0) === '$') {\n name = property.substring(1);\n _results.push(this.scope(name, type));\n } else {\n _results.push(void 0);\n }\n }\n return _results;\n }\n};\n\nbuilders = {\n string: stampit().enclose(function() {\n var base;\n\n base = scopable.base(this);\n return stampit.mixIn(function() {\n var callbacks, value, _base, _name;\n\n value = arguments[0], callbacks = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n callbacks.length && (this.scope.then = this.scope.then.concat(callbacks));\n (_base = this.scope.data)[_name = base.name] || (_base[_name] = value != null ? value : this[\"$\" + base.name]);\n return this;\n });\n }),\n boolean: stampit().enclose(function() {\n var base;\n\n base = scopable.base(this);\n return stampit.mixIn(function() {\n var callbacks, value, _base, _name;\n\n value = arguments[0], callbacks = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n callbacks.length && (this.scope.then = this.scope.then.concat(callbacks));\n (_base = this.scope.data)[_name = base.name] || (_base[_name] = value != null ? value : this[\"$\" + base.name]);\n return this;\n });\n }),\n array: stampit().enclose(function() {\n var base;\n\n base = scopable.base(this);\n return stampit.mixIn(function() {\n var values, _base, _name;\n\n values = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n (_base = this.scope.data)[_name = base.name] || (_base[_name] = values != null ? values : this[\"$\" + base.name]);\n return this;\n });\n })\n};\n\ndefaults = {\n boolean: true,\n array: []\n};\n\nmodel = window.model;\n\nrecord = window.record;\n\nmodel.scopable = true;\n\nmodel.mix(function(modelable) {\n merge(modelable, scopable.model);\n return modelable.after_mix.push(scopable.after_mix);\n});\n\nif (model.associable) {\n model.mix(function(modelable) {\n return modelable.record.after_initialize.push(function() {\n return scopable.model.forward_scopes_to_associations.call(this);\n });\n });\n model.associable.mix(function(singular_association, plural_association) {\n plural_association.every = plural_association.reload = function(data, done, fail) {\n var promises, reload;\n\n if (this.parent != null) {\n this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource)));\n }\n promises = [];\n if (typeof data === 'function') {\n done = data;\n data = void 0;\n }\n promises.push(this.scope.fetch.call(this, data, null, scopable.record.failed));\n reload = $.when.apply(jQuery, promises);\n reload.done(function(records, status) {\n var association_name, singular_resource, _i, _j, _len, _len1, _ref;\n\n Array.prototype.splice.call(this, 0);\n if (!records.length) {\n return;\n }\n singular_resource = model.singularize(this.resource);\n for (_i = 0, _len = records.length; _i < _len; _i++) {\n record = records[_i];\n _ref = model[singular_resource].has_many;\n for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n association_name = _ref[_j];\n record[\"\" + association_name + \"_attributes\"] = record[association_name];\n delete record[association_name];\n }\n }\n this.add.apply(this, records);\n records.splice(0);\n return records.push.apply(records, this);\n });\n reload.done(done);\n reload.fail(fail);\n return reload;\n };\n return plural_association.each = function(callback) {\n var _this = this;\n\n if (this.parent != null) {\n this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource)));\n }\n return this.get().done(function(records) {\n var _i, _len, _results;\n\n _results = [];\n for (_i = 0, _len = _this.length; _i < _len; _i++) {\n record = _this[_i];\n _results.push(callback(record));\n }\n return _results;\n });\n };\n });\n}\n//@ sourceURL=indemma/lib/record/scopable.js" +"var $, builders, defaults, extend, merge, model, observable, record, rest, scopable, stampit, util,\n\ + __slice = [].slice;\n\ +\n\ +require('./restfulable');\n\ +\n\ +require('./resource');\n\ +\n\ +stampit = require('../../vendor/stampit');\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +observable = require('observable').mixin;\n\ +\n\ +merge = extend.withStrategy('deep');\n\ +\n\ +$ = require('jquery');\n\ +\n\ +rest = require('./rest');\n\ +\n\ +util = {\n\ + model: {\n\ + map: function(records) {\n\ + var index, record, _i, _len, _results;\n\ +\n\ + _results = [];\n\ + for (index = _i = 0, _len = records.length; _i < _len; index = ++_i) {\n\ + record = records[index];\n\ + _results.push((this.build || this).call(this, record));\n\ + }\n\ + return _results;\n\ + }\n\ + }\n\ +};\n\ +\n\ +scopable = {\n\ + builder: stampit().enclose(function() {\n\ + return stampit.mixIn(function(name, type) {\n\ + var builder;\n\ +\n\ + if ($.type(type) === 'function') {\n\ + this[\"$\" + name] = type() || new type;\n\ + type = $.type(this[\"$\" + name]);\n\ + } else {\n\ + this[\"$\" + name] = defaults[type] || type;\n\ + }\n\ + if ($.type(type) !== 'string') {\n\ + type = $.type(type);\n\ + }\n\ + builder = builders[type];\n\ + if (builder == null) {\n\ + throw \"Unknown scope type: '\" + type + \"', For model with resource: '\" + this.resource + \"'\";\n\ + }\n\ + this.scope.declared.push(name);\n\ + return this[name] = builder({\n\ + name: name\n\ + });\n\ + }, {\n\ + data: {},\n\ + then: [],\n\ + fail: [],\n\ + declared: [],\n\ + fetch: function(data, done, fail) {\n\ + var deferred, scope;\n\ +\n\ + if (typeof data === 'function') {\n\ + done = data;\n\ + data = {};\n\ + }\n\ + scope = extend({}, this.scope.data);\n\ + observable.unobserve(scope);\n\ + if (scope.noned != null) {\n\ + deferred = $.Deferred();\n\ + deferred.resolveWith(this, [[]]);\n\ + } else {\n\ + deferred = rest.get.call(this, extend(scope, data));\n\ + }\n\ + deferred.then(util.model.map).done(this.scope.then.concat([done])).fail(this.scope.fail.concat([fail]));\n\ + this.scope.clear();\n\ + return deferred;\n\ + },\n\ + clear: function() {\n\ + this.data = {};\n\ + return this.callbacks = [];\n\ + }\n\ + });\n\ + }),\n\ + base: stampit().state({\n\ + name: 'unamed_scope'\n\ + }),\n\ + record: {\n\ + failed: function(xhr, error, status) {\n\ + var e, message, payload;\n\ +\n\ + payload = xhr.responseJSON;\n\ + try {\n\ + payload || (payload = JSON.parse(xhr.responseText));\n\ + } catch (_error) {\n\ + e = _error;\n\ + }\n\ + payload || (payload = xhr.responseText);\n\ + switch (xhr.status) {\n\ + case 422:\n\ + this.valid = false;\n\ + return this.errors = payload.errors;\n\ + default:\n\ + message = \"Fail in \" + this.resource + \".save:\\n\ +\";\n\ + message += \"Record: \" + this + \"\\n\ +\";\n\ + message += \"Status: \" + status + \" (\" + (payload.status || xhr.status) + \")\\n\ +\";\n\ + message += \"Error : \" + (payload.error || payload.message || payload);\n\ + }\n\ + return console.error(message);\n\ + }\n\ + },\n\ + model: {\n\ + none: function() {\n\ + this.scope.data.noned = true;\n\ + return this;\n\ + },\n\ + fetch: function(data, done, fail) {\n\ + if (typeof data === 'function') {\n\ + done = data;\n\ + data = null;\n\ + }\n\ + return this.scope.fetch.call(this, data, done, fail);\n\ + },\n\ + forward_scopes_to_associations: function() {\n\ + var associated_factory, associated_resource, association, association_name, factory, forwarder, generate_forwarder, scope, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;\n\ +\n\ + factory = model[this.resource.name];\n\ + _ref = factory.has_many;\n\ + for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ + association_name = _ref[_i];\n\ + associated_resource = model.singularize(association_name);\n\ + associated_factory = model[associated_resource];\n\ + if (!model[associated_resource]) {\n\ + console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n\ + continue;\n\ + }\n\ + association = this[association_name];\n\ + association.scope = scopable.builder(association);\n\ + _ref1 = associated_factory.scope.declared;\n\ + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n\ + scope = _ref1[_j];\n\ + association.scope(scope, associated_factory[\"$\" + scope]);\n\ + }\n\ + }\n\ + _ref2 = factory.has_one;\n\ + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n\ + associated_resource = _ref2[_k];\n\ + if (!model[associated_resource]) {\n\ + console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n\ + continue;\n\ + }\n\ + _ref3 = model[associated_resource].scope.declared;\n\ + for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {\n\ + scope = _ref3[_l];\n\ + this[associated_resource][scope] = factory[scope];\n\ + }\n\ + }\n\ + if (factory.belongs_to.length) {\n\ + generate_forwarder = function(associated_resource) {\n\ + var declared_scopes;\n\ +\n\ + associated_factory = model[associated_resource];\n\ + if (!associated_factory) {\n\ + return console.warn(\"Associated factory not found for associated resource: \" + associated_resource);\n\ + }\n\ + declared_scopes = associated_factory.scope.declared;\n\ + return function() {\n\ + var _len4, _m, _results;\n\ +\n\ + _results = [];\n\ + for (_m = 0, _len4 = declared_scopes.length; _m < _len4; _m++) {\n\ + scope = declared_scopes[_m];\n\ + _results.push(this[associated_resource][scope] = associated_factory[scope]);\n\ + }\n\ + return _results;\n\ + };\n\ + };\n\ + _ref4 = factory.belongs_to;\n\ + for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {\n\ + associated_resource = _ref4[_m];\n\ + forwarder = generate_forwarder(associated_resource);\n\ + this.after(\"build_\" + associated_resource, forwarder);\n\ + }\n\ + }\n\ + return true;\n\ + }\n\ + },\n\ + after_mix: function() {\n\ + var name, property, type, _results;\n\ +\n\ + this.scope = scopable.builder(this);\n\ + _results = [];\n\ + for (property in this) {\n\ + type = this[property];\n\ + if (property.charAt(0) === '$') {\n\ + name = property.substring(1);\n\ + _results.push(this.scope(name, type));\n\ + } else {\n\ + _results.push(void 0);\n\ + }\n\ + }\n\ + return _results;\n\ + }\n\ +};\n\ +\n\ +builders = {\n\ + string: stampit().enclose(function() {\n\ + var base;\n\ +\n\ + base = scopable.base(this);\n\ + return stampit.mixIn(function() {\n\ + var callbacks, value, _base, _name;\n\ +\n\ + value = arguments[0], callbacks = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n\ + callbacks.length && (this.scope.then = this.scope.then.concat(callbacks));\n\ + (_base = this.scope.data)[_name = base.name] || (_base[_name] = value != null ? value : this[\"$\" + base.name]);\n\ + return this;\n\ + });\n\ + }),\n\ + boolean: stampit().enclose(function() {\n\ + var base;\n\ +\n\ + base = scopable.base(this);\n\ + return stampit.mixIn(function() {\n\ + var callbacks, value, _base, _name;\n\ +\n\ + value = arguments[0], callbacks = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n\ + callbacks.length && (this.scope.then = this.scope.then.concat(callbacks));\n\ + (_base = this.scope.data)[_name = base.name] || (_base[_name] = value != null ? value : this[\"$\" + base.name]);\n\ + return this;\n\ + });\n\ + }),\n\ + array: stampit().enclose(function() {\n\ + var base;\n\ +\n\ + base = scopable.base(this);\n\ + return stampit.mixIn(function() {\n\ + var values, _base, _name;\n\ +\n\ + values = 1 <= arguments.length ? __slice.call(arguments, 0) : [];\n\ + (_base = this.scope.data)[_name = base.name] || (_base[_name] = values != null ? values : this[\"$\" + base.name]);\n\ + return this;\n\ + });\n\ + })\n\ +};\n\ +\n\ +defaults = {\n\ + boolean: true,\n\ + array: []\n\ +};\n\ +\n\ +model = window.model;\n\ +\n\ +record = window.record;\n\ +\n\ +model.scopable = true;\n\ +\n\ +model.mix(function(modelable) {\n\ + merge(modelable, scopable.model);\n\ + return modelable.after_mix.push(scopable.after_mix);\n\ +});\n\ +\n\ +if (model.associable) {\n\ + model.mix(function(modelable) {\n\ + return modelable.record.after_initialize.push(function() {\n\ + return scopable.model.forward_scopes_to_associations.call(this);\n\ + });\n\ + });\n\ + model.associable.mix(function(singular_association, plural_association) {\n\ + plural_association.every = plural_association.reload = function(data, done, fail) {\n\ + var promises, reload;\n\ +\n\ + if (this.parent != null) {\n\ + this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource)));\n\ + }\n\ + promises = [];\n\ + if (typeof data === 'function') {\n\ + done = data;\n\ + data = void 0;\n\ + }\n\ + promises.push(this.scope.fetch.call(this, data, null, scopable.record.failed));\n\ + reload = $.when.apply(jQuery, promises);\n\ + reload.done(function(records, status) {\n\ + var association_name, singular_resource, _i, _j, _len, _len1, _ref;\n\ +\n\ + Array.prototype.splice.call(this, 0);\n\ + if (!records.length) {\n\ + return;\n\ + }\n\ + singular_resource = model.singularize(this.resource);\n\ + for (_i = 0, _len = records.length; _i < _len; _i++) {\n\ + record = records[_i];\n\ + _ref = model[singular_resource].has_many;\n\ + for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n\ + association_name = _ref[_j];\n\ + record[\"\" + association_name + \"_attributes\"] = record[association_name];\n\ + delete record[association_name];\n\ + }\n\ + }\n\ + this.add.apply(this, records);\n\ + records.splice(0);\n\ + return records.push.apply(records, this);\n\ + });\n\ + reload.done(done);\n\ + reload.fail(fail);\n\ + return reload;\n\ + };\n\ + return plural_association.each = function(callback) {\n\ + var _this = this;\n\ +\n\ + if (this.parent != null) {\n\ + this.route || (this.route = \"\" + this.parent.route + \"/\" + this.parent._id + \"/\" + (model.pluralize(this.resource)));\n\ + }\n\ + return this.get().done(function(records) {\n\ + var _i, _len, _results;\n\ +\n\ + _results = [];\n\ + for (_i = 0, _len = _this.length; _i < _len; _i++) {\n\ + record = _this[_i];\n\ + _results.push(callback(record));\n\ + }\n\ + return _results;\n\ + });\n\ + };\n\ + });\n\ +}\n\ +//@ sourceURL=indemma/lib/record/scopable.js" )); require.register("indemma/lib/record/maid.js", Function("exports, require, module", -"var maid, model;\n\nmaid = {\n model: function() {\n if (this.washing != null) {\n return this.record.after_initialize.push(maid.record);\n }\n },\n record: function() {\n return this.subscribe('dirty', function(dirty) {\n var _this = this;\n\n return dirty && setTimeout(function() {\n return _this.save();\n }, 500);\n });\n }\n};\n\nmodel = window.model;\n\nmodel.mix(function(modelable) {\n return modelable.after_mix.unshift(maid.model);\n});\n//@ sourceURL=indemma/lib/record/maid.js" +"var maid, model;\n\ +\n\ +maid = {\n\ + model: function() {\n\ + if (this.washing != null) {\n\ + return this.record.after_initialize.push(maid.record);\n\ + }\n\ + },\n\ + record: function() {\n\ + return this.subscribe('dirty', function(dirty) {\n\ + var _this = this;\n\ +\n\ + return dirty && setTimeout(function() {\n\ + return _this.save();\n\ + }, 500);\n\ + });\n\ + }\n\ +};\n\ +\n\ +model = window.model;\n\ +\n\ +model.mix(function(modelable) {\n\ + return modelable.after_mix.unshift(maid.model);\n\ +});\n\ +//@ sourceURL=indemma/lib/record/maid.js" )); require.register("indemma/lib/record/translationable.js", Function("exports, require, module", -"var extend, extensions, root;\n\nroot = typeof exports !== \"undefined\" && exports !== null ? exports : window;\n\nextend = require('assimilate');\n\nextensions = {\n model: {\n human_attribute_name: function(attribute_name) {\n var _ref, _ref1;\n\n return ((_ref = this.translation) != null ? (_ref1 = _ref.attributes) != null ? _ref1[attribute_name] : void 0 : void 0) || attribute_name;\n }\n }\n};\n\nmodel.mix(function(modelable) {\n return extend(modelable, extensions.model);\n});\n//@ sourceURL=indemma/lib/record/translationable.js" +"var extend, extensions, root;\n\ +\n\ +root = typeof exports !== \"undefined\" && exports !== null ? exports : window;\n\ +\n\ +extend = require('assimilate');\n\ +\n\ +extensions = {\n\ + model: {\n\ + human_attribute_name: function(attribute_name) {\n\ + var _ref, _ref1;\n\ +\n\ + return ((_ref = this.translation) != null ? (_ref1 = _ref.attributes) != null ? _ref1[attribute_name] : void 0 : void 0) || attribute_name;\n\ + }\n\ + }\n\ +};\n\ +\n\ +model.mix(function(modelable) {\n\ + return extend(modelable, extensions.model);\n\ +});\n\ +//@ sourceURL=indemma/lib/record/translationable.js" )); require.register("indemma/lib/record/validations/validatorable.js", Function("exports, require, module", -"var stampit;\n\nstampit = require('../../../vendor/stampit');\n\nmodule.exports = stampit({\n validate: function() {\n throw new Error('Composed factory must override the validate method');\n },\n validate_each: function() {\n throw new Error('Composed factory must override the validate each method');\n }\n});\n//@ sourceURL=indemma/lib/record/validations/validatorable.js" +"var stampit;\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +module.exports = stampit({\n\ + validate: function() {\n\ + throw new Error('Composed factory must override the validate method');\n\ + },\n\ + validate_each: function() {\n\ + throw new Error('Composed factory must override the validate each method');\n\ + }\n\ +});\n\ +//@ sourceURL=indemma/lib/record/validations/validatorable.js" )); require.register("indemma/lib/record/validations/confirmation.js", Function("exports, require, module", -"var composed, confirmationable, stampit;\n\nstampit = require('../../../vendor/stampit');\n\nconfirmationable = stampit({\n validate_each: function(record, attribute, value) {\n if (record[attribute] !== record[\"\" + attribute + \"_confirmation\"]) {\n return record.errors.add(\"\" + attribute + \"_confirmation\", 'confirmation', this.options);\n }\n }\n});\n\ncomposed = stampit.compose(require('./validatorable'), confirmationable);\n\ncomposed.definition_key = 'validates_confirmation_of';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/confirmation.js" +"var composed, confirmationable, stampit;\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +confirmationable = stampit({\n\ + validate_each: function(record, attribute, value) {\n\ + if (record[attribute] !== record[\"\" + attribute + \"_confirmation\"]) {\n\ + return record.errors.add(\"\" + attribute + \"_confirmation\", 'confirmation', this.options);\n\ + }\n\ + }\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), confirmationable);\n\ +\n\ +composed.definition_key = 'validates_confirmation_of';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/confirmation.js" )); require.register("indemma/lib/record/validations/associated.js", Function("exports, require, module", -"var associationable, composed, stampit;\n\nstampit = require('../../../vendor/stampit');\n\nassociationable = stampit({\n validate_each: function(record, attribute, value) {\n var associated_validation;\n\n if (record[attribute]) {\n if (model[record.resource].has_one.indexOf(attribute) === -1) {\n throw new Error('Only has_one associations are supported to validates_associated');\n }\n associated_validation = record[attribute].validate();\n associated_validation.done(function() {\n if (record[attribute].errors.length) {\n return record.errors.add(attribute, 'associated', this.options);\n }\n });\n return associated_validation;\n }\n }\n});\n\ncomposed = stampit.compose(require('./validatorable'), associationable);\n\ncomposed.definition_key = 'validates_associated';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/associated.js" +"var associationable, composed, stampit;\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +associationable = stampit({\n\ + validate_each: function(record, attribute, value) {\n\ + var associated_validation;\n\ +\n\ + if (record[attribute]) {\n\ + if (model[record.resource].has_one.indexOf(attribute) === -1) {\n\ + throw new Error('Only has_one associations are supported to validates_associated');\n\ + }\n\ + associated_validation = record[attribute].validate();\n\ + associated_validation.done(function() {\n\ + if (record[attribute].errors.length) {\n\ + return record.errors.add(attribute, 'associated', this.options);\n\ + }\n\ + });\n\ + return associated_validation;\n\ + }\n\ + }\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), associationable);\n\ +\n\ +composed.definition_key = 'validates_associated';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/associated.js" )); require.register("indemma/lib/record/validations/presence.js", Function("exports, require, module", -"var composed, presenceable, stampit;\n\nstampit = require('../../../vendor/stampit');\n\npresenceable = stampit({\n validate_each: function(record, attribute, value) {\n if (value === null || value === '' || value === void 0) {\n return record.errors.add(attribute, 'blank', this.options);\n }\n }\n});\n\ncomposed = stampit.compose(require('./validatorable'), presenceable);\n\ncomposed.definition_key = 'validates_presence_of';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/presence.js" +"var composed, presenceable, stampit;\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +presenceable = stampit({\n\ + validate_each: function(record, attribute, value) {\n\ + if (value === null || value === '' || value === void 0) {\n\ + return record.errors.add(attribute, 'blank', this.options);\n\ + }\n\ + }\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), presenceable);\n\ +\n\ +composed.definition_key = 'validates_presence_of';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/presence.js" )); require.register("indemma/lib/record/validations/remote.js", Function("exports, require, module", -"var composed, remoteable, rest, stampit;\n\nrest = require('../rest');\n\nstampit = require('../../../vendor/stampit');\n\nremoteable = stampit({\n validate_each: function(record, attribute, value) {\n var data,\n _this = this;\n\n data = this.json(record);\n return this.post(data).done(function(json) {\n return _this.succeeded(json, record);\n });\n },\n json: function(record) {\n var data, param, _base;\n\n param = this.resource.param_name || this.resource.toString();\n data = {};\n data[param] = record.json();\n (_base = data[param]).id || (_base.id = data[param]._id);\n delete data[param]._id;\n return data;\n },\n post: function(data) {\n return jQuery.ajax({\n url: this.route,\n data: data,\n type: 'post',\n dataType: 'json',\n context: this\n });\n },\n succeeded: function(json, record) {\n var error_message, error_messages, _i, _len, _results;\n\n error_messages = json[this.attribute_name];\n if (!error_messages) {\n return;\n }\n _results = [];\n for (_i = 0, _len = error_messages.length; _i < _len; _i++) {\n error_message = error_messages[_i];\n _results.push(record.errors.add(this.attribute_name, 'server', {\n server_message: error_message\n }));\n }\n return _results;\n }\n}, {\n message: \"Remote validation failed\",\n route: null\n}, function() {\n var pluralized_resource;\n\n pluralized_resource = model.pluralize(this.model.resource.toString());\n this.resource = this.model.resource;\n this.route || (this.route = \"/\" + pluralized_resource + \"/validate\");\n return this;\n});\n\ncomposed = stampit.compose(require('./validatorable'), remoteable);\n\ncomposed.definition_key = 'validates_remotely';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/remote.js" +"var composed, remoteable, rest, stampit;\n\ +\n\ +rest = require('../rest');\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +remoteable = stampit({\n\ + validate_each: function(record, attribute, value) {\n\ + var data,\n\ + _this = this;\n\ +\n\ + data = this.json(record);\n\ + return this.post(data).done(function(json) {\n\ + return _this.succeeded(json, record);\n\ + });\n\ + },\n\ + json: function(record) {\n\ + var data, param, _base;\n\ +\n\ + param = this.resource.param_name || this.resource.toString();\n\ + data = {};\n\ + data[param] = record.json();\n\ + (_base = data[param]).id || (_base.id = data[param]._id);\n\ + delete data[param]._id;\n\ + return data;\n\ + },\n\ + post: function(data) {\n\ + return jQuery.ajax({\n\ + url: this.route,\n\ + data: data,\n\ + type: 'post',\n\ + dataType: 'json',\n\ + context: this\n\ + });\n\ + },\n\ + succeeded: function(json, record) {\n\ + var error_message, error_messages, _i, _len, _results;\n\ +\n\ + error_messages = json[this.attribute_name];\n\ + if (!error_messages) {\n\ + return;\n\ + }\n\ + _results = [];\n\ + for (_i = 0, _len = error_messages.length; _i < _len; _i++) {\n\ + error_message = error_messages[_i];\n\ + _results.push(record.errors.add(this.attribute_name, 'server', {\n\ + server_message: error_message\n\ + }));\n\ + }\n\ + return _results;\n\ + }\n\ +}, {\n\ + message: \"Remote validation failed\",\n\ + route: null\n\ +}, function() {\n\ + var pluralized_resource;\n\ +\n\ + pluralized_resource = model.pluralize(this.model.resource.toString());\n\ + this.resource = this.model.resource;\n\ + this.route || (this.route = \"/\" + pluralized_resource + \"/validate\");\n\ + return this;\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), remoteable);\n\ +\n\ +composed.definition_key = 'validates_remotely';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/remote.js" )); require.register("indemma/lib/record/validations/type.js", Function("exports, require, module", -"var composed, stampit, typeable, validations;\n\nvalidations = require('../validatable');\n\nstampit = require('../../../vendor/stampit');\n\ntypeable = stampit({\n validate_each: function(record, attribute, value) {\n this.type || (this.type = model[record.resource.toString()][attribute]);\n if (value) {\n if (value instanceof this.type) {\n this.type_name || (this.type_name = this.type.name);\n if (!value.valid) {\n return record.errors.add(attribute, 'type', {\n type_name: this.type_name != null\n });\n }\n } else {\n throw new Error(\"Invalid attribute value type! Found \" + (typeof value) + \" expected \" + this.type.name);\n }\n }\n }\n});\n\ncomposed = stampit.compose(require('./validatorable'), typeable);\n\ncomposed.definition_key = 'validates_type_of';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/type.js" +"var composed, stampit, typeable, validations;\n\ +\n\ +validations = require('../validatable');\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +typeable = stampit({\n\ + validate_each: function(record, attribute, value) {\n\ + this.type || (this.type = model[record.resource.toString()][attribute]);\n\ + if (value) {\n\ + if (value instanceof this.type) {\n\ + this.type_name || (this.type_name = this.type.name);\n\ + if (!value.valid) {\n\ + return record.errors.add(attribute, 'type', {\n\ + type_name: this.type_name != null\n\ + });\n\ + }\n\ + } else {\n\ + throw new Error(\"Invalid attribute value type! Found \" + (typeof value) + \" expected \" + this.type.name);\n\ + }\n\ + }\n\ + }\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), typeable);\n\ +\n\ +composed.definition_key = 'validates_type_of';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/type.js" )); require.register("indemma/lib/record/validations/cpf.js", Function("exports, require, module", -"var composed, cpfable, stampit;\n\nstampit = require('../../../vendor/stampit');\n\ncpfable = stampit({\n validate_format: function(value) {\n var c, d1, dv, i, v, _i, _j;\n\n value = value.replace(/[\\.\\-]/g, \"\");\n if (value.length < 11) {\n return false;\n }\n if (value.match(/^(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)$/)) {\n return false;\n }\n c = value.substr(0, 9);\n dv = value.substr(9, 2);\n d1 = 0;\n v = false;\n i = 0;\n for (i = _i = 0; _i <= 9; i = ++_i) {\n d1 += c.charAt(i) * (10 - i);\n }\n if (d1 === 0) {\n return false;\n }\n d1 = 11 - (d1 % 11);\n if (d1 > 9) {\n d1 = 0;\n }\n if (+dv.charAt(0) !== d1) {\n return false;\n }\n d1 *= 2;\n for (i = _j = 0; _j <= 9; i = ++_j) {\n d1 += c.charAt(i) * (11 - i);\n }\n d1 = 11 - (d1 % 11);\n if (d1 > 9) {\n d1 = 0;\n }\n if (+dv.charAt(1) !== d1) {\n return false;\n }\n return true;\n },\n validate_each: function(record, attribute, value) {\n if (value && !this.validate_format(value)) {\n return record.errors.add(attribute, 'cpf', this.options);\n }\n }\n});\n\ncomposed = stampit.compose(require('./validatorable'), cpfable);\n\ncomposed.definition_key = 'validates_cpf_format';\n\nmodule.exports = composed;\n//@ sourceURL=indemma/lib/record/validations/cpf.js" +"var composed, cpfable, stampit;\n\ +\n\ +stampit = require('../../../vendor/stampit');\n\ +\n\ +cpfable = stampit({\n\ + validate_format: function(value) {\n\ + var c, d1, dv, i, v, _i, _j;\n\ +\n\ + value = value.replace(/[\\.\\-]/g, \"\");\n\ + if (value.length < 11) {\n\ + return false;\n\ + }\n\ + if (value.match(/^(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)$/)) {\n\ + return false;\n\ + }\n\ + c = value.substr(0, 9);\n\ + dv = value.substr(9, 2);\n\ + d1 = 0;\n\ + v = false;\n\ + i = 0;\n\ + for (i = _i = 0; _i <= 9; i = ++_i) {\n\ + d1 += c.charAt(i) * (10 - i);\n\ + }\n\ + if (d1 === 0) {\n\ + return false;\n\ + }\n\ + d1 = 11 - (d1 % 11);\n\ + if (d1 > 9) {\n\ + d1 = 0;\n\ + }\n\ + if (+dv.charAt(0) !== d1) {\n\ + return false;\n\ + }\n\ + d1 *= 2;\n\ + for (i = _j = 0; _j <= 9; i = ++_j) {\n\ + d1 += c.charAt(i) * (11 - i);\n\ + }\n\ + d1 = 11 - (d1 % 11);\n\ + if (d1 > 9) {\n\ + d1 = 0;\n\ + }\n\ + if (+dv.charAt(1) !== d1) {\n\ + return false;\n\ + }\n\ + return true;\n\ + },\n\ + validate_each: function(record, attribute, value) {\n\ + if (value && !this.validate_format(value)) {\n\ + return record.errors.add(attribute, 'cpf', this.options);\n\ + }\n\ + }\n\ +});\n\ +\n\ +composed = stampit.compose(require('./validatorable'), cpfable);\n\ +\n\ +composed.definition_key = 'validates_cpf_format';\n\ +\n\ +module.exports = composed;\n\ +//@ sourceURL=indemma/lib/record/validations/cpf.js" )); require.register("indemma/lib/record/validatable.js", Function("exports, require, module", -"var errorsable, extensions, initializers, manager, messages, observable, root, stampit, type;\n\nrequire('./translationable');\n\nroot = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\nstampit = require('../../vendor/stampit');\n\nobservable = require('observable').mixin;\n\ntype = require('type');\n\nmessages = {\n blank: function(attribute_name) {\n attribute_name = this.human_attribute_name(attribute_name);\n return \"O campo \" + attribute_name + \" não pode ficar em branco.\";\n },\n cpf: function(attribute_name) {\n attribute_name = this.human_attribute_name(attribute_name);\n return \"O campo \" + attribute_name + \" não está válido.\";\n },\n confirmation: function(attribute_name) {\n var confirmation_attribute_name;\n\n confirmation_attribute_name = this.human_attribute_name(attribute_name);\n attribute_name = this.human_attribute_name(attribute_name.replace('_confirmation', ''));\n return \"O campo \" + attribute_name + \" não está de acordo com o campo \" + confirmation_attribute_name + \".\";\n },\n associated: function(attribute_name) {\n attribute_name = this.human_attribute_name(attribute_name);\n return \"O registro associado \" + attribute_name + \" não é válido.\";\n },\n server: function(attribute_name, options) {\n if (attribute_name === 'base') {\n return options.server_message;\n } else {\n attribute_name = this.human_attribute_name(attribute_name);\n return \"\" + attribute_name + \" \" + options.server_message + \".\";\n }\n },\n type: function(attribute_name, options) {\n attribute_name = this.human_attribute_name(attribute_name);\n return \"O campo \" + attribute_name + \" não está válido.\";\n }\n};\n\nerrorsable = stampit({\n add: function(attribute_name, message_key, options) {\n var translator;\n\n this.push([attribute_name, message_key, options]);\n this.messages[attribute_name] = '';\n translator = messages[message_key];\n if (translator != null) {\n return this.messages[attribute_name] += translator.call(this.model, attribute_name, options);\n } else {\n return this.messages[attribute_name] += message_key;\n }\n },\n clear: function() {\n var attribute_name, _results;\n\n if (this.length) {\n this.length = 0;\n _results = [];\n for (attribute_name in this.messages) {\n _results.push(this.messages[attribute_name] = null);\n }\n return _results;\n }\n },\n push: Array.prototype.push,\n splice: Array.prototype.splice,\n indexOf: Array.prototype.indexOf\n}, {\n model: null,\n messages: null,\n length: 0\n}, function() {\n this.messages = {};\n return this;\n});\n\ninitializers = {\n define_triggers: function() {\n this.errors = errorsable({\n model: model[this.resource]\n });\n this.before('save', function() {\n if (this.save) {\n return this.validate();\n }\n });\n this.validated = false;\n this.subscribe('dirty', function(value) {\n return value && (this.validated = false);\n });\n return Object.defineProperty(this, 'valid', {\n get: function() {\n this.validate();\n if (this.validation.state() === 'resolved') {\n return !this.errors.length;\n } else {\n return null;\n }\n },\n set: function() {\n throw new TypeError(\"You can't set the value for the valid property.\");\n },\n enumerable: false\n });\n },\n create_validators: function(definitions) {\n var definition, name, validator, validator_options, _ref, _results;\n\n this.validators = [];\n _ref = manager.validators;\n _results = [];\n for (name in _ref) {\n validator = _ref[name];\n definition = definitions[validator.definition_key];\n if (definition) {\n if (type(definition) !== 'array') {\n definition = [definition];\n }\n _results.push((function() {\n var _i, _len, _results1;\n\n _results1 = [];\n for (_i = 0, _len = definition.length; _i < _len; _i++) {\n validator_options = definition[_i];\n if (type(validator_options) !== 'object') {\n validator_options = {\n attribute_name: validator_options\n };\n }\n validator_options.model = this;\n this.validators.push(validator(validator_options));\n _results1.push(delete definitions[validator.definition_key]);\n }\n return _results1;\n }).call(this));\n } else {\n _results.push(void 0);\n }\n }\n return _results;\n }\n};\n\nextensions = {\n model: {\n validators: null\n },\n record: {\n validate_attribute: function(attribute, doned, failed) {\n var results, validation, validator, _i, _len, _ref;\n\n this.errors.messages[attribute] = null;\n results = [this, attribute];\n _ref = model[this.resource.toString()].validators;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n validator = _ref[_i];\n if (validator.attribute_name === attribute) {\n results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));\n }\n }\n validation = jQuery.when.apply(jQuery, results);\n validation.done(doned);\n validation.fail(failed);\n return validation;\n },\n validate: function(doned, failed) {\n var results, validator, _i, _len, _ref;\n\n if (this.validated && !this.dirty) {\n return this.validation;\n }\n this.errors.clear();\n results = [this];\n _ref = model[this.resource.toString()].validators;\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n validator = _ref[_i];\n results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));\n }\n this.validation = jQuery.when.apply(jQuery, results);\n this.validation.done(doned);\n this.validation.fail(failed);\n return this.validation.done(function(record) {\n var old_dirty;\n\n old_dirty = record.dirty;\n record.dirty = null;\n record.validated || (record.validated = true);\n record.dirty = old_dirty;\n return record;\n });\n }\n }\n};\n\nmanager = {\n validators: {}\n};\n\nmodel.mix(function(modelable) {\n jQuery.extend(modelable, extensions.model);\n jQuery.extend(modelable.record, extensions.record);\n modelable.after_mix.unshift(initializers.create_validators);\n modelable.record.after_initialize.push(initializers.define_triggers);\n return model.validators = manager.validators;\n});\n\nmanager.validators.confirmation = require('./validations/confirmation');\n\nmanager.validators.associated = require('./validations/associated');\n\nmanager.validators.presence = require('./validations/presence');\n\nmanager.validators.remote = require('./validations/remote');\n\nmanager.validators.type = require('./validations/type');\n\nmanager.validators.cpf = require('./validations/cpf');\n//@ sourceURL=indemma/lib/record/validatable.js" +"(function() {\n\ + var errorsable, extensions, initializers, manager, messages, observable, root, stampit, type;\n\ +\n\ + require('./translationable');\n\ +\n\ + root = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\ +\n\ + stampit = require('../../vendor/stampit');\n\ +\n\ + observable = require('observable').mixin;\n\ +\n\ + type = require('type');\n\ +\n\ + messages = {\n\ + blank: function(attribute_name) {\n\ + attribute_name = this.human_attribute_name(attribute_name);\n\ + return \"O campo \" + attribute_name + \" não pode ficar em branco.\";\n\ + },\n\ + cpf: function(attribute_name) {\n\ + attribute_name = this.human_attribute_name(attribute_name);\n\ + return \"O campo \" + attribute_name + \" não está válido.\";\n\ + },\n\ + confirmation: function(attribute_name) {\n\ + var confirmation_attribute_name;\n\ + confirmation_attribute_name = this.human_attribute_name(attribute_name);\n\ + attribute_name = this.human_attribute_name(attribute_name.replace('_confirmation', ''));\n\ + return \"O campo \" + attribute_name + \" não está de acordo com o campo \" + confirmation_attribute_name + \".\";\n\ + },\n\ + associated: function(attribute_name) {\n\ + attribute_name = this.human_attribute_name(attribute_name);\n\ + return \"O registro associado \" + attribute_name + \" não é válido.\";\n\ + },\n\ + server: function(attribute_name, options) {\n\ + if (attribute_name === 'base') {\n\ +return options.server_message;\n\ + } else {\n\ +\tattribute_name = this.human_attribute_name(attribute_name);\n\ +\treturn \"\" + attribute_name + \" \" + options.server_message + \".\";\n\ + }\n\ + },\n\ + type: function(attribute_name, options) {\n\ + attribute_name = this.human_attribute_name(attribute_name);\n\ + return \"O campo \" + attribute_name + \" não está válido.\";\n\ + }\n\ + };\n\ +\n\ + errorsable = stampit({\n\ + add: function(attribute_name, message_key, options) {\n\ + var translator;\n\ + this.push([attribute_name, message_key, options]);\n\ + this.messages[attribute_name] = '';\n\ + translator = messages[message_key];\n\ + if (translator != null) {\n\ +\treturn this.messages[attribute_name] += translator.call(this.model, attribute_name, options);\n\ + } else {\n\ +\treturn this.messages[attribute_name] += message_key;\n\ + }\n\ + },\n\ + clear: function() {\n\ + var attribute_name, _results;\n\ + if (this.length) {\n\ +\tthis.length = 0;\n\ +\t_results = [];\n\ +\tfor (attribute_name in this.messages) {\n\ +\t _results.push(this.messages[attribute_name] = null);\n\ +\t}\n\ +\treturn _results;\n\ + }\n\ + },\n\ + push: Array.prototype.push,\n\ + splice: Array.prototype.splice,\n\ + indexOf: Array.prototype.indexOf\n\ + }, {\n\ + model: null,\n\ + messages: null,\n\ + length: 0\n\ + }, function() {\n\ + this.messages = {};\n\ + return this;\n\ + });\n\ +\n\ + initializers = {\n\ + define_triggers: function() {\n\ + this.errors = errorsable({\n\ +\tmodel: model[this.resource]\n\ + });\n\ + this.before('save', function() {\n\ +\tif (this.save) return this.validate();\n\ + });\n\ + this.validated = false;\n\ + this.subscribe('dirty', function(value) {\n\ +\treturn value && (this.validated = false);\n\ + });\n\ + return Object.defineProperty(this, 'valid', {\n\ +\tget: function() {\n\ +\t this.validate();\n\ +\t if (this.validation.state() === 'resolved') {\n\ +\t return !this.errors.length;\n\ +\t } else {\n\ +\t return null;\n\ +\t }\n\ +\t},\n\ +\tset: function() {\n\ +\t throw new TypeError(\"You can't set the value for the valid property.\");\n\ +\t},\n\ +\tenumerable: false\n\ + });\n\ + },\n\ + create_validators: function(definitions) {\n\ + var definition, name, validator, validator_options, _ref, _results;\n\ + this.validators = [];\n\ + _ref = manager.validators;\n\ + _results = [];\n\ + for (name in _ref) {\n\ +\tvalidator = _ref[name];\n\ +\tdefinition = definitions[validator.definition_key];\n\ +\tif (definition) {\n\ +\t if (type(definition) !== 'array') definition = [definition];\n\ +\t _results.push((function() {\n\ +\t var _i, _len, _results2;\n\ +\t _results2 = [];\n\ +\t for (_i = 0, _len = definition.length; _i < _len; _i++) {\n\ +\t validator_options = definition[_i];\n\ +\t if (type(validator_options) !== 'object') {\n\ +\t\tvalidator_options = {\n\ +\t\t attribute_name: validator_options\n\ +\t\t};\n\ +\t }\n\ +\t validator_options.model = this;\n\ +\t this.validators.push(validator(validator_options));\n\ +\t _results2.push(delete definitions[validator.definition_key]);\n\ +\t }\n\ +\t return _results2;\n\ +\t }).call(this));\n\ +\t} else {\n\ +\t _results.push(void 0);\n\ +\t}\n\ + }\n\ + return _results;\n\ + }\n\ + };\n\ +\n\ + extensions = {\n\ + model: {\n\ + validators: null\n\ + },\n\ + record: {\n\ + validate_attribute: function(attribute, doned, failed) {\n\ +\tvar results, validation, validator, _i, _len, _ref;\n\ +\tthis.errors.messages[attribute] = null;\n\ +\tresults = [this, attribute];\n\ +\t_ref = model[this.resource.toString()].validators;\n\ +\tfor (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ +\t validator = _ref[_i];\n\ +\t if (validator.attribute_name === attribute) {\n\ +\t results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));\n\ +\t }\n\ +\t}\n\ +\tvalidation = jQuery.when.apply(jQuery, results);\n\ +\tvalidation.done(doned);\n\ +\tvalidation.fail(failed);\n\ +\treturn validation;\n\ + },\n\ + validate: function(doned, failed) {\n\ +\tvar results, validator, _i, _len, _ref;\n\ +\tif (this.validated && !this.dirty) return this.validation;\n\ +\tthis.errors.clear();\n\ +\tresults = [this];\n\ +\t_ref = model[this.resource.toString()].validators;\n\ +\tfor (_i = 0, _len = _ref.length; _i < _len; _i++) {\n\ +\t validator = _ref[_i];\n\ +\t results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));\n\ +\t}\n\ +\tthis.validation = jQuery.when.apply(jQuery, results);\n\ +\tthis.validation.done(doned);\n\ +\tthis.validation.fail(failed);\n\ +\treturn this.validation.done(function(record) {\n\ +\t var old_dirty;\n\ +\t old_dirty = record.dirty;\n\ +\t record.dirty = null;\n\ +\t record.validated || (record.validated = true);\n\ +\t if (record.dirty !== old_dirty) record.dirty = old_dirty;\n\ +\t return record;\n\ +\t});\n\ + }\n\ + }\n\ + };\n\ +\n\ + manager = {\n\ + validators: {}\n\ + };\n\ +\n\ + model.mix(function(modelable) {\n\ + jQuery.extend(modelable, extensions.model);\n\ + jQuery.extend(modelable.record, extensions.record);\n\ + modelable.after_mix.unshift(initializers.create_validators);\n\ + modelable.record.after_initialize.push(initializers.define_triggers);\n\ + return model.validators = manager.validators;\n\ + });\n\ +\n\ + manager.validators.confirmation = require('./validations/confirmation');\n\ +\n\ + manager.validators.associated = require('./validations/associated');\n\ +\n\ + manager.validators.presence = require('./validations/presence');\n\ +\n\ + manager.validators.remote = require('./validations/remote');\n\ +\n\ + manager.validators.type = require('./validations/type');\n\ +\n\ + manager.validators.cpf = require('./validations/cpf');\n\ +\n\ +}).call(this);\n\ +//@ sourceURL=indemma/lib/record/validatable.js" )); require.register("indemma/lib/extensions/rivets.js", Function("exports, require, module", -"var root;\n\nroot = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\nmodel.rivets = function() {\n var model_extensions;\n\n model_extensions = {\n record: {\n tie: function(element) {\n var lasso;\n\n lasso = {};\n lasso[this.resource] = this;\n return rivets.bind(element, lasso);\n }\n },\n preloadData: true\n };\n return model.mix(function(modelable) {\n return $.extend(true, modelable, model_extensions);\n });\n};\n//@ sourceURL=indemma/lib/extensions/rivets.js" +"var root;\n\ +\n\ +root = typeof exports !== \"undefined\" && exports !== null ? exports : this;\n\ +\n\ +model.rivets = function() {\n\ + var model_extensions;\n\ +\n\ + model_extensions = {\n\ + record: {\n\ + tie: function(element) {\n\ + var lasso;\n\ +\n\ + lasso = {};\n\ + lasso[this.resource] = this;\n\ + return rivets.bind(element, lasso);\n\ + }\n\ + },\n\ + preloadData: true\n\ + };\n\ + return model.mix(function(modelable) {\n\ + return $.extend(true, modelable, model_extensions);\n\ + });\n\ +};\n\ +//@ sourceURL=indemma/lib/extensions/rivets.js" )); + + + + + + + + + + + + require.alias("pluma-assimilate/dist/assimilate.js", "indemma/deps/assimilate/dist/assimilate.js"); require.alias("pluma-assimilate/dist/assimilate.js", "indemma/deps/assimilate/index.js"); require.alias("pluma-assimilate/dist/assimilate.js", "assimilate/index.js"); require.alias("pluma-assimilate/dist/assimilate.js", "pluma-assimilate/index.js"); - require.alias("component-type/index.js", "indemma/deps/type/index.js"); require.alias("component-type/index.js", "type/index.js"); require.alias("component-bind/index.js", "indemma/deps/bind/index.js"); require.alias("component-bind/index.js", "bind/index.js"); @@ -338,6 +22196,5 @@ require.alias("indefinido-advisable/index.js", "indemma/deps/advisable/index.js"); require.alias("indefinido-advisable/lib/advisable.js", "indemma/deps/advisable/lib/advisable.js"); require.alias("indefinido-advisable/index.js", "advisable/index.js"); require.alias("component-jquery/index.js", "indefinido-advisable/deps/jquery/index.js"); -