diff --git a/.cache/bootcode.browser.js b/.cache/bootcode.browser.js new file mode 100644 index 00000000..70c09c34 --- /dev/null +++ b/.cache/bootcode.browser.js @@ -0,0 +1 @@ +module.exports=c=>c(null,"require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n this[name] = dispatch.bind(emitter, name);\n });\n}\n\nmodule.exports = PostmanConsole;\n\n},{\"teleport-javascript\":555}],2:[function(require,module,exports){\nconst CookieJar = require('@postman/tough-cookie').CookieJar,\n ToughCookie = require('@postman/tough-cookie').Cookie,\n PostmanCookie = require('postman-collection').Cookie,\n PostmanCookieList = require('postman-collection').CookieList,\n Url = require('postman-collection').Url,\n\n FUNCTION = 'function',\n OBJECT = 'object',\n STRING = 'string',\n\n /**\n * Convert PostmanCookie Cookie instance to ToughCookie instance.\n *\n * @private\n * @param {PostmanCookie} cookie - Postman Cookie instance\n * @returns {ToughCookie} Tough Cookie instance\n */\n serialize = function (cookie) {\n if (!cookie) {\n return;\n }\n\n return ToughCookie.fromJSON({\n key: cookie.name || cookie.key,\n value: cookie.value,\n expires: cookie.expires,\n maxAge: cookie.maxAge,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n hostOnly: cookie.hostOnly,\n extensions: cookie.extensions\n });\n },\n\n /**\n * Convert Tough Cookie instance to Electron Cookie instance.\n *\n * @private\n * @param {ToughCookie} cookie - Tough Cookie instance\n * @returns {ElectronCookie} Electron Cookie instance\n */\n deserialize = function (cookie) {\n if (!cookie) {\n return;\n }\n\n return new PostmanCookie({\n name: cookie.key,\n value: cookie.value,\n expires: cookie.expires === 'Infinity' ? null : cookie.expires,\n maxAge: cookie.maxAge,\n domain: cookie.domain,\n path: cookie.path,\n secure: cookie.secure,\n httpOnly: cookie.httpOnly,\n hostOnly: cookie.hostOnly,\n extensions: cookie.extensions\n });\n },\n\n /**\n * Sanitize url object or string to Postman Url instance.\n *\n * @private\n * @param {Object|String} url -\n * @returns {Url|Null}\n */\n sanitizeURL = function (url) {\n if (Url.isUrl(url)) {\n return url;\n }\n\n if (url && typeof url === STRING) {\n return new Url(url);\n }\n\n return null;\n },\n\n /**\n * Executes a provided function once for each array element.\n *\n * @note not completely asynchronous, don't compare with async.each\n *\n * @private\n * @param {Array} items - Array of items to iterate over\n * @param {Function} fn - An async function to apply to each item in items\n * @param {Function} cb - A callback which is called when all iteratee functions have finished,\n * or an error occurs\n */\n forEachWithCallback = function (items, fn, cb) {\n !cb && (cb = function () { /* (ಠ_ಠ) */ });\n\n if (!(Array.isArray(items) && fn)) { return cb(); }\n\n var index = 0,\n totalItems = items.length,\n next = function (err) {\n if (err || index >= totalItems) {\n return cb(err);\n }\n\n try {\n fn.call(items, items[index++], next);\n }\n catch (error) {\n return cb(error);\n }\n };\n\n if (!totalItems) {\n return cb();\n }\n\n next();\n },\n\n /**\n * Helper function to handle callback.\n *\n * @private\n * @param {Function} callback - Callback function\n * @param {Error|String} err - Error or Error message\n * @param {*} result -\n */\n callbackHandler = function (callback, err, result) {\n if (typeof callback !== FUNCTION) {\n return;\n }\n\n if (err) {\n return callback(err instanceof Error ? err : new Error(err));\n }\n\n callback(null, result);\n },\n\n /**\n * Helper function to fetch a cookie with given name.\n *\n * @private\n * @todo add CookieJar~getCookie to avoid this\n *\n * @param {CookieJar} jar - ToughCookie jar instance\n * @param {String} url - Url string\n * @param {String} name - Cookie name\n * @param {Function} callback - Callback function\n */\n getCookie = function (jar, url, name, callback) {\n jar.getCookies(url, function (err, cookies) {\n var i,\n ii;\n\n if (err) {\n return callback(err);\n }\n\n if (!(cookies && cookies.length)) {\n return callback(null, null);\n }\n\n for (i = 0, ii = cookies.length; i < ii; i++) {\n if (cookies[i].key === name) {\n return callback(null, cookies[i]);\n }\n }\n\n callback(null, null);\n });\n };\n\nclass PostmanCookieJar {\n /**\n * @param {Object} cookieStore -\n */\n constructor (cookieStore) {\n this.store = cookieStore;\n this.jar = new CookieJar(cookieStore, {\n rejectPublicSuffixes: false,\n looseMode: true\n });\n }\n\n /**\n * Get the cookie value with the given name.\n *\n * @param {String} url -\n * @param {String} name -\n * @param {Function} callback -\n */\n get (url, name, callback) {\n url = sanitizeURL(url);\n\n if (!url) {\n throw new TypeError('CookieJar.get() requires a valid url');\n }\n\n if (typeof callback !== FUNCTION) {\n throw new TypeError('CookieJar.get() requires a callback function');\n }\n\n if (typeof name !== STRING) {\n throw new TypeError('CookieJar.get() requires cookie name to be a string');\n }\n\n getCookie(this.jar, url.toString(true), name, function (err, cookie) {\n if (err || !cookie) {\n return callbackHandler(callback, err, null);\n }\n\n cookie = deserialize(cookie);\n\n return callbackHandler(callback, null, cookie.valueOf());\n });\n }\n\n /**\n * Get all the cookies for the given URL.\n *\n * @param {String} url -\n * @param {Object} [options] -\n * @param {Function} callback -\n */\n getAll (url, options, callback) {\n url = sanitizeURL(url);\n\n if (!url) {\n throw new TypeError('CookieJar.getAll() requires a valid url');\n }\n\n if (typeof options === FUNCTION && !callback) {\n callback = options;\n options = {};\n }\n\n if (typeof callback !== FUNCTION) {\n throw new TypeError('CookieJar.getAll() requires a callback function');\n }\n\n if (typeof options !== OBJECT) {\n throw new TypeError('CookieJar.getAll() requires options to be an object');\n }\n\n options = {\n // return HttpOnly cookies by default\n http: Object.hasOwnProperty.call(options, 'http') ? Boolean(options.http) : true,\n // if undefined, auto-detect from url\n secure: Object.hasOwnProperty.call(options, 'secure') ? Boolean(options.secure) : undefined\n };\n\n this.jar.getCookies(url.toString(true), options, function (err, cookies) {\n if (err) {\n return callbackHandler(callback, err);\n }\n\n callbackHandler(callback, null, new PostmanCookieList(null, cookies && cookies.map(deserialize)));\n });\n }\n\n /**\n * Set or update a cookie.\n *\n * @param {String} url -\n * @param {String|Object} name -\n * @param {String|Function} [value] -\n * @param {Function} [callback] -\n */\n set (url, name, value, callback) {\n url = sanitizeURL(url);\n\n if (!url) {\n throw new TypeError('CookieJar.set() requires a valid url');\n }\n\n if (typeof value === FUNCTION && !callback) {\n callback = value;\n value = null;\n }\n\n var cookie;\n\n // @todo avoid else-if to reduce cyclomatic complexity\n if (name && value) {\n cookie = serialize({ name, value });\n }\n else if (typeof name === OBJECT) {\n cookie = serialize(name);\n }\n else if (typeof name === STRING) {\n cookie = name;\n }\n else {\n throw new TypeError('CookieJar.set() requires a valid set cookie arguments');\n }\n\n this.jar.setCookie(cookie, url.toString(true), function (err, cookie) {\n if (err) {\n return callbackHandler(callback, err);\n }\n\n callbackHandler(callback, null, deserialize(cookie));\n });\n }\n\n /**\n * Remove single cookie with the given name.\n *\n * @param {String} url -\n * @param {String} name -\n * @param {Function} [callback] -\n */\n unset (url, name, callback) {\n url = sanitizeURL(url);\n\n if (!url) {\n throw new TypeError('CookieJar.unset() requires a valid url');\n }\n\n if (typeof name !== STRING) {\n throw new TypeError('CookieJar.unset() requires cookie name to be a string');\n }\n\n var store = this.store;\n\n getCookie(this.jar, url.toString(true), name, function (err, cookie) {\n if (err || !cookie) {\n return callbackHandler(callback, err);\n }\n\n store.removeCookie(cookie.domain, cookie.path, cookie.key, function (err) {\n callbackHandler(callback, err);\n });\n });\n }\n\n /**\n * Remove all the cookies for the given URL.\n *\n * @param {String} url -\n * @param {Function} [callback] -\n */\n clear (url, callback) {\n url = sanitizeURL(url);\n\n if (!url) {\n throw new TypeError('CookieJar.clear() requires a valid url');\n }\n\n var store = this.store;\n\n this.jar.getCookies(url.toString(true), function (err, cookies) {\n if (err || !cookies) {\n return callbackHandler(callback, err);\n }\n\n forEachWithCallback(cookies, function (cookie, next) {\n store.removeCookie(cookie.domain, cookie.path, cookie.key, next);\n }, function (err) {\n callbackHandler(callback, err);\n });\n });\n }\n}\n\nmodule.exports = PostmanCookieJar;\n\n},{\"@postman/tough-cookie\":177,\"postman-collection\":\"postman-collection\"}],3:[function(require,module,exports){\nconst _ = require('lodash'),\n\n Store = require('@postman/tough-cookie').Store,\n Cookie = require('@postman/tough-cookie').Cookie,\n\n EXECUTION_EVENT_BASE = 'execution.cookies.',\n EVENT_STORE_ACTION = 'store',\n STORE_METHODS = [\n 'findCookie', 'findCookies', 'putCookie', 'updateCookie',\n 'removeCookie', 'removeCookies', 'removeAllCookies', 'getAllCookies'\n ],\n FUNCTION = 'function',\n\n arrayProtoSlice = Array.prototype.slice;\n\nclass PostmanCookieStore extends Store {\n constructor (id, emitter, timers) {\n super();\n\n this.id = id; // execution identifier\n this.emitter = emitter;\n this.timers = timers;\n }\n}\n\n// Disable CookieJar's *Sync APIs\nPostmanCookieStore.prototype.synchronous = false;\n\n// attach a common handler to all store methods\nSTORE_METHODS.forEach(function (method) {\n PostmanCookieStore.prototype[method] = function () {\n const eventName = EXECUTION_EVENT_BASE + this.id;\n let args,\n eventId,\n callback;\n\n // fetch all the arguments passed to the method\n args = arrayProtoSlice.call(arguments);\n\n // adjust arguments length based on Store's prototype method\n // eslint-disable-next-line lodash/path-style\n args.length = _.get(Store.prototype, [method, 'length'], 0);\n\n // move callback/last argument out of arguments\n // this will be called when timer clears the event\n callback = args.pop();\n\n // set event for the callback\n eventId = this.timers.setEvent(function (err, cookies) {\n if (typeof callback !== FUNCTION) {\n throw new TypeError('callback is not a function');\n }\n\n // methods: putCookie, updateCookie, removeCookie, removeCookies,\n // removeAllCookies\n // or, onError\n if (err || !cookies) {\n return callback(err);\n }\n\n // methods: findCookies, getAllCookies\n if (Array.isArray(cookies)) {\n return callback(err, cookies.map(function (cookie) {\n return Cookie.fromJSON(cookie); // serialize cookie object\n }));\n }\n\n // method: findCookie\n callback(err, Cookie.fromJSON(cookies));\n });\n\n // @note: artificial timeout is added to fix the timers bug when sandbox\n // is executed in the same process (Node.js VM) and the event is\n // processed synchronously by the in-memory cookie store or cache.\n // This timeout ensures that the event is processed asynchronously\n // without blocking the rest of the script execution.\n // Refer: https://github.com/postmanlabs/postman-app-support/issues/11064\n setTimeout(() => {\n // finally, dispatch event over the bridge\n this.emitter.dispatch(eventName, eventId, EVENT_STORE_ACTION, method, args);\n });\n };\n});\n\nmodule.exports = PostmanCookieStore;\n\n},{\"@postman/tough-cookie\":177,\"lodash\":\"lodash\"}],4:[function(require,module,exports){\nconst _ = require('lodash'),\n legacy = require('./postman-legacy-interface'),\n\n NONLEGACY_SANDBOX_MARKERS = {\n '\"use sandbox2\";': true,\n '\\'use sandbox2\\';': true\n };\n\nmodule.exports = function (scope, code, execution, console, timers, pmapi, onAssertion, options) {\n // if there is no code, then no point bubbling anything up\n if (!(code && _.isString(code))) {\n return timers.terminate();\n }\n\n // start by resetting the scope\n scope.reset();\n\n if (NONLEGACY_SANDBOX_MARKERS[code.substr(0, 15)] || options.disableLegacyAPIs) {\n // ensure any previously added global variables from legacy are torn down. side-effect is that if user\n // explicitly created global variables with same name as legacy ones, they will be torn down too!\n // for that reason, the setup function tags the scope and avoids tearing down an scope that was never setup\n legacy.teardown(scope);\n }\n else {\n // prepare legacy environment, which adds a tonne of global variables\n legacy.setup(scope, execution);\n }\n\n // prepare the scope's environment variables\n scope.import({\n Buffer: require('buffer').Buffer,\n // forward console\n console: console,\n // forward pm-api instance\n /**\n * The pm object encloses all information pertaining to the script being executed and\n * allows one to access a copy of the request being sent or the response received.\n * It also allows one to get and set environment and global variables.\n *\n * @type {Postman}\n */\n pm: pmapi,\n // import the timers\n setTimeout: timers.setTimeout,\n setInterval: timers.setInterval,\n setImmediate: timers.setImmediate,\n clearTimeout: timers.clearTimeout,\n clearInterval: timers.clearInterval,\n clearImmediate: timers.clearImmediate\n });\n\n scope.exec(code, function (err) {\n // we check if the execution went async by determining the timer queue length at this time\n execution.return.async = (timers.queueLength() > 0);\n\n // call this hook to perform any post script execution tasks\n legacy.finish(scope, pmapi, onAssertion);\n\n function complete () {\n // if timers are running, we do not need to proceed with any logic of completing execution. instead we wait\n // for timer completion callback to fire\n if (execution.return.async) {\n return err && timers.error(err); // but if we had error, we pass it to async error handler\n }\n\n // at this stage, the script is a synchronous script, we simply forward whatever has come our way\n timers.terminate(err);\n }\n\n timers.wrapped.setImmediate(complete);\n });\n};\n\n},{\"./postman-legacy-interface\":10,\"buffer\":\"buffer\",\"lodash\":\"lodash\"}],5:[function(require,module,exports){\nconst _ = require('lodash'),\n chai = require('chai'),\n Ajv = require('ajv'),\n Scope = require('uniscope'),\n sdk = require('postman-collection'),\n PostmanEvent = sdk.Event,\n Execution = require('./execution'),\n PostmanConsole = require('./console'),\n PostmanTimers = require('./timers'),\n PostmanAPI = require('./pmapi'),\n PostmanCookieStore = require('./cookie-store'),\n\n EXECUTION_RESULT_EVENT_BASE = 'execution.result.',\n EXECUTION_REQUEST_EVENT_BASE = 'execution.request.',\n EXECUTION_ERROR_EVENT = 'execution.error',\n EXECUTION_ERROR_EVENT_BASE = 'execution.error.',\n EXECUTION_ABORT_EVENT_BASE = 'execution.abort.',\n EXECUTION_RESPONSE_EVENT_BASE = 'execution.response.',\n EXECUTION_COOKIES_EVENT_BASE = 'execution.cookies.',\n EXECUTION_ASSERTION_EVENT = 'execution.assertion',\n EXECUTION_ASSERTION_EVENT_BASE = 'execution.assertion.',\n\n executeContext = require('./execute-context');\n\nmodule.exports = function (bridge, glob) {\n // @note we use a common scope for all executions. this causes issues when scripts are run inside the sandbox\n // in parallel, but we still use this way for the legacy \"persistent\" behaviour needed in environment\n const scope = Scope.create({\n eval: true,\n ignore: ['require'],\n block: ['bridge']\n });\n\n // For caching required information provided during\n // initialization which will be used during execution\n let initializationOptions = {},\n initializeExecution,\n\n // Tests state in the context of the current execution\n testsState = {};\n\n /**\n * @param {Object} options\n * @param {String} [options.template]\n * @param {Boolean} [options.disableLegacyAPIs]\n * @param {Array.} [options.disabledAPIs]\n */\n bridge.once('initialize', ({ template, ...initOptions }) => {\n initializationOptions = initOptions || {};\n\n // If no custom template is provided, go ahead with the default steps\n if (!template) {\n chai.use(require('chai-postman')(sdk, _, Ajv));\n\n return bridge.dispatch('initialize');\n }\n\n const _module = { exports: {} },\n scope = Scope.create({\n eval: true,\n ignore: ['require'],\n block: ['bridge']\n });\n\n scope.import({\n Buffer: require('buffer').Buffer,\n module: _module\n });\n\n scope.exec(template, (err) => {\n if (err) {\n return bridge.dispatch('initialize', err);\n }\n\n const { chaiPlugin, initializeExecution: setupExecution } = (_module && _module.exports) || {};\n\n if (_.isFunction(chaiPlugin)) {\n chai.use(chaiPlugin);\n }\n\n if (_.isFunction(setupExecution)) {\n initializeExecution = setupExecution;\n }\n\n bridge.dispatch('initialize');\n });\n });\n\n bridge.once('dispose', () => {\n // Abort all pending assertions and cleanup the global tests state\n Object.values(testsState).forEach((test) => { test.abort(); });\n testsState = {};\n\n bridge.dispatch('dispose');\n });\n\n /**\n * @param {String} id\n * @param {Event} event\n * @param {Object} context\n * @param {Object} options\n * @param {Boolean=} [options.debug]\n * @param {Object=} [options.cursor]\n * @param {Number=} [options.timeout]\n *\n * @note\n * options also take in legacy properties: _itemId, _itemName\n */\n bridge.on('execute', function (id, event, context, options) {\n if (!(id && _.isString(id))) {\n return bridge.dispatch('error', new Error('sandbox: execution identifier parameter(s) missing'));\n }\n\n !options && (options = {});\n !context && (context = {});\n event = (new PostmanEvent(event));\n\n const executionEventName = EXECUTION_RESULT_EVENT_BASE + id,\n executionRequestEventName = EXECUTION_REQUEST_EVENT_BASE + id,\n errorEventName = EXECUTION_ERROR_EVENT_BASE + id,\n abortEventName = EXECUTION_ABORT_EVENT_BASE + id,\n responseEventName = EXECUTION_RESPONSE_EVENT_BASE + id,\n cookiesEventName = EXECUTION_COOKIES_EVENT_BASE + id,\n assertionEventName = EXECUTION_ASSERTION_EVENT_BASE + id,\n\n // extract the code from event. The event can be the code itself and we know that if the event is of type\n // string.\n code = _.isFunction(event.script && event.script.toSource) && event.script.toSource(),\n // create the execution object\n execution = new Execution(id, event, context, { ...options, initializeExecution }),\n\n /**\n * Dispatch assertions from `pm.test` or legacy `test` API.\n *\n * @private\n * @param {Object[]} assertions -\n * @param {String} assertions[].name -\n * @param {Number} assertions[].index -\n * @param {Object} assertions[].error -\n * @param {Boolean} assertions[].async -\n * @param {Boolean} assertions[].passed -\n * @param {Boolean} assertions[].skipped -\n */\n dispatchAssertions = function (assertions) {\n // Legacy `test` API accumulates all the assertions and dispatches at once\n // whereas, `pm.test` dispatch on every single assertion.\n // For compatibility, dispatch the single assertion as an array.\n !Array.isArray(assertions) && (assertions = [assertions]);\n\n bridge.dispatch(assertionEventName, options.cursor, assertions);\n bridge.dispatch(EXECUTION_ASSERTION_EVENT, options.cursor, assertions);\n };\n\n let waiting,\n timers;\n\n execution.return.async = false;\n\n // create the controlled timers\n timers = new PostmanTimers(null, function (err) {\n if (err) { // propagate the error out of sandbox\n bridge.dispatch(errorEventName, options.cursor, err);\n bridge.dispatch(EXECUTION_ERROR_EVENT, options.cursor, err);\n }\n }, function () {\n execution.return.async = true;\n }, function (err, dnd) {\n // clear timeout tracking timer\n waiting && (waiting = timers.wrapped.clearTimeout(waiting));\n\n // do not allow any more timers\n if (timers) {\n timers.seal();\n timers.clearAll();\n }\n\n // remove listener of disconnection event\n bridge.off(abortEventName);\n bridge.off(responseEventName);\n bridge.off(cookiesEventName);\n\n if (err) { // fire extra execution error event\n bridge.dispatch(errorEventName, options.cursor, err);\n bridge.dispatch(EXECUTION_ERROR_EVENT, options.cursor, err);\n }\n\n // @note delete response from the execution object to avoid dispatching\n // the large response payload back due to performance reasons.\n execution.response && (delete execution.response);\n\n // fire the execution completion event\n (dnd !== true) && bridge.dispatch(executionEventName, err || null, execution);\n });\n\n // if a timeout is set, we must ensure that all pending timers are cleared and an execution timeout event is\n // triggered.\n _.isFinite(options.timeout) && (waiting = timers.wrapped.setTimeout(function () {\n timers.terminate(new Error('sandbox: ' +\n (execution.return.async ? 'asynchronous' : 'synchronous') + ' script execution timeout'));\n }, options.timeout));\n\n // if an abort event is sent, compute cleanup and complete\n bridge.on(abortEventName, function () {\n timers.terminate(null, true);\n });\n\n // handle response event from outside sandbox\n bridge.on(responseEventName, function (id, err, res, history) {\n timers.clearEvent(id, err, res, history);\n });\n\n // handle cookies event from outside sandbox\n bridge.on(cookiesEventName, function (id, err, res) {\n timers.clearEvent(id, err, res);\n });\n\n // send control to the function that executes the context and prepares the scope\n executeContext(scope, code, execution,\n // if a console is sent, we use it. otherwise this also prevents erroneous referencing to any console\n // inside this closure.\n (new PostmanConsole(bridge, options.cursor, options.debug && glob.console)),\n timers,\n (\n new PostmanAPI(execution, function (request, callback) {\n var eventId = timers.setEvent(callback);\n\n bridge.dispatch(executionRequestEventName, options.cursor, id, eventId, request);\n }, testsState, dispatchAssertions, new PostmanCookieStore(id, bridge, timers), {\n disabledAPIs: initializationOptions.disabledAPIs\n })\n ),\n dispatchAssertions,\n { disableLegacyAPIs: initializationOptions.disableLegacyAPIs });\n });\n};\n\n},{\"./console\":1,\"./cookie-store\":3,\"./execute-context\":4,\"./execution\":6,\"./pmapi\":9,\"./timers\":12,\"ajv\":\"ajv\",\"buffer\":\"buffer\",\"chai\":\"chai\",\"chai-postman\":241,\"lodash\":\"lodash\",\"postman-collection\":\"postman-collection\",\"uniscope\":557}],6:[function(require,module,exports){\nconst _ = require('lodash'),\n sdk = require('postman-collection'),\n\n PROPERTY = {\n REQUEST: 'request',\n SCRIPT: 'script',\n DATA: 'data',\n COOKIES: 'cookies',\n RESPONSE: 'response'\n },\n\n TARGETS_WITH_REQUEST = {\n test: true,\n prerequest: true\n },\n\n TARGETS_WITH_RESPONSE = {\n test: true\n },\n\n CONTEXT_VARIABLE_SCOPES = ['_variables', 'environment', 'collectionVariables', 'globals'],\n\n trackingOptions = { autoCompact: true };\n\nclass Execution {\n constructor (id, event, context, options) {\n this.id = id;\n this.target = event.listen || PROPERTY.SCRIPT;\n this.legacy = options.legacy || {};\n this.cursor = _.isObject(options.cursor) ? options.cursor : {};\n\n this.data = _.get(context, PROPERTY.DATA, {});\n this.cookies = new sdk.CookieList(null, context.cookies);\n\n CONTEXT_VARIABLE_SCOPES.forEach((variableScope) => {\n // normalize variable scope instances\n this[variableScope] = sdk.VariableScope.isVariableScope(context[variableScope]) ?\n context[variableScope] : new sdk.VariableScope(context[variableScope]);\n\n // enable change tracking\n this[variableScope].enableTracking(trackingOptions);\n });\n\n if (options.initializeExecution) {\n const { request, response } = options.initializeExecution(this.target, context) || {};\n\n this.request = request;\n this.response = response;\n }\n else {\n if (TARGETS_WITH_REQUEST[this.target] || _.has(context, PROPERTY.REQUEST)) {\n /**\n * @note:\n * this reference is passed on as `pm.request`, pm api adds helper functions like `to` to `pm.request`\n * sandbox overrides collection Request.prototype.toJSON to remove helpers before toJSON, see `purse.js`\n */\n this.request = sdk.Request.isRequest(context.request) ?\n context.request : new sdk.Request(context.request);\n }\n\n if (TARGETS_WITH_RESPONSE[this.target] || _.has(context, PROPERTY.RESPONSE)) {\n /**\n * @note:\n * this reference is passed on as `pm.response`, pm api adds helper functions like `to` to `pm.response`\n * sandbox overrides collection Response.prototype.toJSON to remove helpers before toJSON,\n * see `purse.js`\n */\n this.response = sdk.Response.isResponse(context.response) ?\n context.response : new sdk.Response(context.response);\n }\n }\n\n /**\n * @typedef {Object} Return\n *\n * @property {Boolean} async - true if the executed script was async, false otherwise\n * @property {Visualizer} visualizer - visualizer data\n * @property {*} nextRequest - next request to send\n */\n this.return = {};\n }\n\n toJSON () {\n return _.mapValues(this, function (value) {\n // if there is no specific json serialiser, return the raw value\n if (!_.isFunction(value && value.toJSON)) {\n return value;\n }\n\n return value.toJSON();\n });\n }\n}\n\nmodule.exports = Execution;\n\n},{\"lodash\":\"lodash\",\"postman-collection\":\"postman-collection\"}],7:[function(require,module,exports){\nmodule.exports = {\n listener (pong) {\n return function (payload) {\n this.dispatch(pong, payload);\n };\n }\n};\n\n\n},{}],8:[function(require,module,exports){\n/* eslint-disable function-paren-newline */\n/* eslint-disable one-var */\n/**\n * @fileOverview\n *\n * This module externally sets up the test runner on pm api. Essentially, it does not know the insides of pm-api and\n * does the job completely from outside with minimal external dependency\n */\nconst _ = require('lodash'),\n FUNCTION = 'function',\n uuid = require('../vendor/uuid'),\n\n OPTIONS = {\n When: 'when',\n RunCount: 'runCount',\n RunUntil: 'runUntil'\n },\n OPTION_TYPE = {\n [OPTIONS.When]: 'function',\n [OPTIONS.RunCount]: 'number',\n [OPTIONS.RunUntil]: 'number'\n };\n\n/**\n * @module {PMAPI~setupTestRunner}\n * @private\n *\n * @param {PMAPI} pm - an instance of PM API that it needs\n * @param {Object} testsState - State of all the tests for the current execution\n * @param {Function} onAssertion - is the trigger function that is called every time a test is encountered and it\n * receives the AssertionInfo object outlining details of the assertion\n */\nmodule.exports = function (pm, testsState, onAssertion) {\n var assertionIndex = 0,\n\n /**\n * Returns an object that represents data coming out of an assertion.\n *\n * @note This is put in a function since this needs to be done from a number of place and having a single\n * function reduces the chance of bugs\n *\n * @param {String} testId -\n * @param {String} name -\n * @param {Boolean} skipped -\n *\n * @returns {PMAPI~AssertionInfo}\n */\n getAssertionObject = function (testId, name, skipped) {\n /**\n * @typeDef {AssertionInfo}\n * @private\n */\n return {\n testId: testId,\n name: String(name),\n async: false,\n skipped: Boolean(skipped),\n passed: true,\n pending: !skipped,\n error: null,\n index: assertionIndex++ // increment the assertion counter (do it before asserting)\n };\n },\n\n generateTestId = function (eventName, testName, assertFn, options) {\n return [\n eventName,\n testName,\n assertFn ? assertFn.toString() : '',\n JSON.stringify(options)\n ].join('');\n },\n\n getDefaultTestState = function (options) {\n return {\n ...(options ? _.pick(options, _.values(OPTIONS)) : {}),\n testId: uuid(),\n timer: null,\n currRunCount: 0,\n pending: true\n };\n },\n\n isOptionConfigured = function (options, optionName) {\n return _.has(options, optionName) && typeof options[optionName] === OPTION_TYPE[optionName];\n },\n\n\n validateOptions = function (options) {\n if (!options || typeof options !== 'object') {\n throw new Error('Invalid test option: options is not an object');\n }\n\n const supportedOptions = _.values(OPTIONS);\n\n Object.keys(options).forEach((optionName) => {\n if (!supportedOptions.includes(optionName)) {\n throw new Error(`Invalid test option: ${optionName} is not a supported option`);\n }\n\n if (typeof options[optionName] !== OPTION_TYPE[optionName]) {\n throw new Error(`Invalid test options: ${optionName} is not a ${OPTION_TYPE[optionName]}`);\n }\n });\n },\n\n /**\n * Simple function to mark an assertion as failed\n *\n * @private\n *\n * @note This is put in a function since this needs to be done from a number of place and having a single\n * function reduces the chance of bugs\n *\n * @param {Object} assertionData -\n * @param {*} err -\n */\n markAssertionAsFailure = function (assertionData, err) {\n assertionData.error = err;\n assertionData.passed = false;\n },\n\n processAssertion = function (_testId, assertionData, options) {\n const testState = testsState[_testId];\n\n if (!testState) {\n return onAssertion(assertionData);\n }\n\n if (!testState.pending) {\n return;\n }\n\n const shouldResolve = Boolean(\n assertionData.error || // TODO: Make conditions (test status) to mark a test resolved, configurable.\n assertionData.skipped ||\n _.isEmpty(options) ||\n isOptionConfigured(options, OPTIONS.RunCount) && testState.runCount === testState.currRunCount ||\n isOptionConfigured(options, OPTIONS.RunUntil) && testState.currRunCount && !testState.timer\n );\n\n console.log('$$$ runner~processAssertion~shouldResolve', { assertionData, shouldResolve });\n\n testState.pending = assertionData.pending = !shouldResolve;\n\n // Tests without options does not need to be tracked\n if (_.isEmpty(options)) {\n delete testsState[_testId];\n }\n\n onAssertion(assertionData);\n },\n\n processOptions = function (_testId, assertionData, options) {\n const testState = testsState[_testId],\n shouldRun = testState.pending &&\n (isOptionConfigured(options, OPTIONS.When) ? Boolean(options.when()) : true) &&\n (isOptionConfigured(options, OPTIONS.RunCount) ? testState.currRunCount < options.runCount : true);\n\n if (shouldRun) {\n testState.currRunCount++;\n\n const startTimer = isOptionConfigured(options, OPTIONS.RunUntil) && !testState.timer;\n\n if (startTimer) {\n testState.timer = setTimeout(() => {\n testState.timer = null;\n processAssertion(_testId, assertionData, options);\n }, testState.runUntil);\n }\n }\n\n return shouldRun;\n };\n\n /**\n * @param {String} name -\n * @param {Object} [options] -\n * @param {Function} assert -\n * @chainable\n */\n pm.test = function (name, options, assert) {\n if (typeof options === FUNCTION) {\n assert = options;\n options = {};\n }\n\n if (_.isNil(options) || typeof options !== 'object') {\n options = {};\n }\n\n // TODO: Make generateTestId safe i.e handle invalid `options` as well\n const _testId = generateTestId(pm.info.eventName, name, assert, options);\n\n if (!testsState[_testId]) {\n testsState[_testId] = getDefaultTestState(options);\n }\n\n const testState = testsState[_testId],\n testId = testState.testId,\n assertionData = getAssertionObject(testId, name, false);\n\n // TODO: Do this along with test state initialization.\n testState.abort = () => {\n markAssertionAsFailure(assertionData, new Error('Execution aborted before test could complete'));\n processAssertion(_testId, assertionData, options);\n };\n\n // if there is no assertion function, we simply move on\n if (typeof assert !== FUNCTION) {\n // Sending `options` as empty to force resolve the test\n processAssertion(_testId, assertionData, {});\n\n return pm;\n }\n\n try { validateOptions(options); }\n catch (e) {\n markAssertionAsFailure(assertionData, e);\n processAssertion(_testId, assertionData, options);\n\n return pm;\n }\n\n\n const shouldRun = processOptions(_testId, assertionData, options);\n\n console.log('$$$ runner~test', { shouldRun, testState });\n\n if (shouldRun) {\n // if a callback function was sent, then we know that the test is asynchronous\n if (assert.length) {\n try {\n assertionData.async = true; // flag that this was an async test (would be useful later)\n\n // we execute assertion, but pass it a completion function, which, in turn, raises the completion\n // event. we do not need to worry about timers here since we are assuming that some timer within the\n // sandbox had actually been the source of async calls and would take care of this\n assert(function (err) {\n // at first we double check that no synchronous error has happened from the catch block below\n if (assertionData.error && assertionData.passed === false) {\n return;\n }\n\n // user triggered a failure of the assertion, so we mark it the same\n if (err) {\n markAssertionAsFailure(assertionData, err);\n }\n\n processAssertion(_testId, assertionData, options);\n });\n }\n // in case a synchronous error occurs in the the async assertion, we still bail out.\n catch (e) {\n markAssertionAsFailure(assertionData, e);\n processAssertion(_testId, assertionData, options);\n }\n }\n // if the assertion function does not expect a callback, we synchronously execute the same\n else {\n try { assert(); }\n catch (e) {\n markAssertionAsFailure(assertionData, e);\n }\n\n processAssertion(_testId, assertionData, options);\n }\n }\n else {\n processAssertion(_testId, assertionData, options);\n }\n\n return pm; // make it chainable\n };\n\n /**\n * @param {String} name -\n * @chainable\n */\n pm.test.skip = function (name) {\n // trigger the assertion events with skips\n processAssertion(name, getAssertionObject(uuid(), name, true), {});\n\n return pm; // chainable\n };\n\n /**\n * @returns {Number}\n */\n pm.test.index = function () {\n return assertionIndex;\n };\n};\n\n},{\"../vendor/uuid\":\"uuid\",\"lodash\":\"lodash\"}],9:[function(require,module,exports){\nconst _ = require('lodash'),\n sdk = require('postman-collection'),\n PostmanCookieJar = require('./cookie-jar'),\n VariableScope = sdk.VariableScope,\n PostmanRequest = sdk.Request,\n PostmanResponse = sdk.Response,\n PostmanCookieList = sdk.CookieList,\n chai = require('chai'),\n\n /**\n * Use this function to assign readonly properties to an object\n *\n * @private\n *\n * @param {Object} obj -\n * @param {Object} properties -\n * @param {Array.} [disabledProperties=[]] -\n */\n _assignDefinedReadonly = function (obj, properties, disabledProperties = []) {\n var config = {\n writable: false\n },\n\n prop;\n\n for (prop in properties) {\n if (\n !_.includes(disabledProperties, prop) &&\n Object.hasOwnProperty.call(properties, prop) &&\n (properties[prop] !== undefined)\n ) {\n config.value = properties[prop];\n Object.defineProperty(obj, prop, config);\n }\n }\n\n return obj; // chainable\n },\n\n setupTestRunner = require('./pmapi-setup-runner');\n\n/**\n * @constructor\n *\n * @param {Execution} execution -\n * @param {Function} onRequest -\n * @param {Object} testsState -\n * @param {Function} onAssertion -\n * @param {Object} cookieStore -\n * @param {Object} [options] -\n * @param {Array.} [options.disabledAPIs] -\n */\nfunction Postman (execution, onRequest, testsState, onAssertion, cookieStore, options = {}) {\n // @todo - ensure runtime passes data in a scope format\n let iterationData = new VariableScope();\n\n iterationData.syncVariablesFrom(execution.data);\n\n // instead of creating new instance of variableScope,\n // reuse one so that any changes made through pm.variables.set() is directly reflected\n execution._variables.addLayer(iterationData.values);\n execution._variables.addLayer(execution.environment.values);\n execution._variables.addLayer(execution.collectionVariables.values);\n execution._variables.addLayer(execution.globals.values);\n\n execution.cookies && (execution.cookies.jar = function () {\n return new PostmanCookieJar(cookieStore);\n });\n\n _assignDefinedReadonly(this, /** @lends Postman.prototype */ {\n /**\n * Contains information pertaining to the script execution\n *\n * @interface Info\n */\n\n /**\n * The pm.info object contains information pertaining to the script being executed.\n * Useful information such as the request name, request Id, and iteration count are\n * stored inside of this object.\n *\n * @type {Info}\n */\n info: _assignDefinedReadonly({}, /** @lends Info */ {\n /**\n * Contains information whether the script being executed is a \"prerequest\" or a \"test\" script.\n *\n * @type {string}\n * @instance\n */\n eventName: execution.target,\n\n /**\n * Is the value of the current iteration being run.\n *\n * @type {number}\n * @instance\n */\n iteration: execution.cursor.iteration,\n\n /**\n * Is the total number of iterations that are scheduled to run.\n *\n * @type {number}\n * @instance\n */\n iterationCount: execution.cursor.cycles,\n\n /**\n * The saved name of the individual request being run.\n *\n * @type {string}\n * @instance\n */\n requestName: execution.legacy._itemName,\n\n /**\n * The unique guid that identifies the request being run.\n *\n * @type {string}\n * @instance\n */\n requestId: execution.legacy._itemId\n }),\n\n /**\n * @type {VariableScope}\n */\n globals: execution.globals,\n\n /**\n * @type {VariableScope}\n */\n environment: execution.environment,\n\n /**\n * @type {VariableScope}\n */\n collectionVariables: execution.collectionVariables,\n\n /**\n * @type {VariableScope}\n */\n variables: execution._variables,\n\n /**\n * The iterationData object contains data from the data file provided during a collection run.\n *\n * @type {VariableScope}\n */\n iterationData: iterationData,\n\n /**\n * The request object inside pm is a representation of the request for which this script is being run.\n * For a pre-request script, this is the request that is about to be sent and when in a test script,\n * this is the representation of the request that was sent.\n *\n * @type {Request}\n */\n request: execution.request,\n\n /**\n * Inside the test scripts, the pm.response object contains all information pertaining\n * to the response that was received.\n *\n * @type {Response}\n * @customexclude true\n */\n response: execution.response,\n\n /**\n * The cookies object contains a list of cookies that are associated with the domain\n * to which the request was made.\n *\n * @type {CookieList}\n */\n cookies: execution.cookies,\n\n /**\n * @interface Visualizer\n */\n /**\n * @type {Visualizer}\n */\n visualizer: /** @lends Visualizer */ {\n /**\n * Set visualizer template and its options\n *\n * @instance\n * @param {String} template - visualisation layout in form of template\n * @param {Object} [data] - data object to be used in template\n * @param {Object} [options] - options to use while processing the template\n */\n set (template, data, options) {\n if (typeof template !== 'string') {\n throw new Error(`Invalid template. Template must be of type string, found ${typeof template}`);\n }\n\n if (data && typeof data !== 'object') {\n throw new Error(`Invalid data. Data must be an object, found ${typeof data}`);\n }\n\n if (options && typeof options !== 'object') {\n throw new Error(`Invalid options. Options must be an object, found ${typeof options}`);\n }\n\n /**\n *\n * @property {String} template - template string\n * @property {Object} data - data to use while processing template\n * @property {Object} options - options to use while processing template\n */\n execution.return.visualizer = {\n template,\n data,\n options\n };\n },\n\n /**\n * Clear all visualizer data\n *\n * @instance\n */\n clear () {\n execution.return.visualizer = undefined;\n }\n },\n\n /**\n * Allows one to send request from script asynchronously.\n *\n * @param {Request|String} req -\n * @param {Function} callback -\n */\n sendRequest: function (req, callback) {\n var self = this;\n\n if (!req) {\n return _.isFunction(callback) && callback.call(self, new Error('sendrequest: nothing to request'));\n }\n\n onRequest(PostmanRequest.isRequest(req) ? req : (new PostmanRequest(req)), function (err, resp, history) {\n if (history && !PostmanCookieList.isCookieList(history.cookies)) {\n history.cookies = new PostmanCookieList({}, history.cookies);\n }\n\n _.isFunction(callback) && callback.call(self, err,\n PostmanResponse.isResponse(resp) ? resp : (new PostmanResponse(resp)),\n history);\n });\n\n return self;\n }\n }, options.disabledAPIs);\n\n // extend pm api with test runner abilities\n setupTestRunner(this, testsState, onAssertion);\n\n // add response assertions\n if (this.response) {\n // these are removed before serializing see `purse.js`\n Object.defineProperty(this.response, 'to', {\n get () {\n return chai.expect(this).to;\n }\n });\n }\n // add request assertions\n if (this.request) {\n // these are removed before serializing see `purse.js`\n Object.defineProperty(this.request, 'to', {\n get () {\n return chai.expect(this).to;\n }\n });\n }\n\n iterationData = null; // precautionary\n}\n\n// expose chai assertion library via prototype\n/**\n * @type {Chai.ExpectStatic}\n */\nPostman.prototype.expect = chai.expect;\n\n// export\nmodule.exports = Postman;\n\n},{\"./cookie-jar\":2,\"./pmapi-setup-runner\":8,\"chai\":\"chai\",\"lodash\":\"lodash\",\"postman-collection\":\"postman-collection\"}],10:[function(require,module,exports){\n/* eslint-disable max-classes-per-file */\nconst _ = require('lodash'),\n\n scopeLibraries = {\n JSON: require('liquid-json'),\n _: require('lodash3').noConflict(),\n CryptoJS: require('crypto-js'),\n atob: require('atob'),\n btoa: require('btoa'),\n tv4: require('tv4'),\n xml2Json: require('./xml2Json'),\n Backbone: require('backbone'),\n cheerio: require('cheerio')\n },\n\n LEGACY_GLOBS = [\n 'tests', 'globals', 'environment', 'data', 'request', 'responseCookies', 'responseHeaders', 'responseTime',\n 'responseCode', 'responseBody', 'iteration', 'postman',\n // scope libraries\n 'JSON', '_', 'CryptoJS', 'atob', 'btoa', 'tv4', 'xml2Json', 'Backbone', 'cheerio'\n ],\n\n E = '',\n FUNCTION = 'function',\n TARGET_TEST = 'test',\n\n LEGACY_ASSERTION_ERROR_MESSAGE_PREFIX = 'expected ',\n LEGACY_ASSERTION_ERROR_MESSAGE_SUFFIX = ' to be truthy',\n\n /**\n * Different modes for a request body.\n *\n * @enum {String}\n */\n REQUEST_MODES = {\n RAW: 'raw',\n URLENCODED: 'urlencoded',\n FORMDATA: 'formdata',\n FILE: 'file'\n };\n\nfunction getRequestBody (request) {\n var mode = _.get(request, 'body.mode'),\n body = _.get(request, 'body'),\n empty = body ? body.isEmpty() : true,\n content,\n computedBody;\n\n if (empty) {\n return;\n }\n\n content = body[mode];\n\n if (_.isFunction(content && content.all)) {\n content = content.all();\n }\n\n if (mode === REQUEST_MODES.RAW) {\n computedBody = {\n body: content\n };\n }\n else if (mode === REQUEST_MODES.URLENCODED) {\n computedBody = {\n form: _.reduce(content, function (accumulator, param) {\n if (param.disabled) { return accumulator; }\n\n // This is actually pretty simple,\n // If the variable already exists in the accumulator, we need to make the value an Array with\n // all the variable values inside it.\n if (accumulator[param.key]) {\n _.isArray(accumulator[param.key]) ? accumulator[param.key].push(param.value) :\n (accumulator[param.key] = [accumulator[param.key], param.value]);\n }\n else {\n accumulator[param.key] = param.value;\n }\n\n return accumulator;\n }, {})\n };\n }\n else if (request.body.mode === REQUEST_MODES.FORMDATA) {\n computedBody = {\n formData: _.reduce(content, function (accumulator, param) {\n if (param.disabled) { return accumulator; }\n\n // This is actually pretty simple,\n // If the variable already exists in the accumulator, we need to make the value an Array with\n // all the variable values inside it.\n if (accumulator[param.key]) {\n _.isArray(accumulator[param.key]) ? accumulator[param.key].push(param.value) :\n (accumulator[param.key] = [accumulator[param.key], param.value]);\n }\n else {\n accumulator[param.key] = param.value;\n }\n\n return accumulator;\n }, {})\n };\n }\n else if (request.body.mode === REQUEST_MODES.FILE) {\n computedBody = {\n body: _.get(request, 'body.file.content')\n };\n }\n\n return computedBody;\n}\n\n/**\n * Raises a single assertion event with an array of assertions from legacy `tests` object.\n *\n * @param {Uniscope} scope -\n * @param {Object} pmapi -\n * @param {Function} onAssertion -\n */\nfunction raiseAssertionEvent (scope, pmapi, onAssertion) {\n var tests = scope._imports && scope._imports.tests,\n assertionIndex = pmapi.test.index(),\n assertions;\n\n if (_.isEmpty(tests)) {\n return;\n }\n\n assertions = _.map(tests, function (value, key) {\n var assertionName = String(key),\n passed = Boolean(value),\n assertionError = null;\n\n // fake an assertion error for legacy tests\n if (!passed) {\n assertionError = new Error(LEGACY_ASSERTION_ERROR_MESSAGE_PREFIX +\n String(value) + LEGACY_ASSERTION_ERROR_MESSAGE_SUFFIX);\n assertionError.name = 'AssertionError';\n }\n\n // @todo Move getAssertionObject function from pmapi-setup-runner.js to a common place and reuse it here too\n return {\n name: assertionName,\n skipped: false,\n passed: passed,\n error: assertionError,\n index: assertionIndex++\n };\n });\n\n onAssertion(assertions);\n}\n\nclass PostmanLegacyInterface {\n /**\n * @param {Object} execution -\n * @param {Object} globalvars -\n */\n constructor (execution, globalvars) {\n this.__execution = execution;\n this.__environment = globalvars.environment;\n this.__globals = globalvars.globals;\n }\n\n setEnvironmentVariable (key, value) {\n if ((value === false || value) && typeof (value && value.toString) === FUNCTION) {\n value = value.toString();\n }\n this.__environment[key] = value;\n\n return this.__execution.environment.set(key, value);\n }\n\n getEnvironmentVariable (key) {\n return this.__execution.environment.get(key);\n }\n\n clearEnvironmentVariables () {\n for (var prop in this.__environment) {\n if (Object.hasOwnProperty.call(this.__environment, prop)) {\n delete this.__environment[prop];\n }\n }\n\n return this.__execution.environment.clear();\n }\n\n clearEnvironmentVariable (key) {\n key && (delete this.__environment[key]);\n\n return this.__execution.environment.unset(key);\n }\n\n setGlobalVariable (key, value) {\n if ((value === false || value) && typeof (value && value.toString) === FUNCTION) {\n value = value.toString();\n }\n this.__globals[key] = value;\n\n return this.__execution.globals.set(key, value);\n }\n\n getGlobalVariable (key) {\n return this.__execution.globals.get(key);\n }\n\n clearGlobalVariables () {\n for (var prop in this.__globals) {\n if (Object.hasOwnProperty.call(this.__globals, prop)) {\n delete this.__globals[prop];\n }\n }\n\n return this.__execution.globals.clear();\n }\n\n clearGlobalVariable (key) {\n key && (delete this.__globals[key]);\n\n return this.__execution.globals.unset(key);\n }\n\n setNextRequest (what) {\n this.__execution.return && (this.__execution.return.nextRequest = what);\n }\n}\n\n/**\n * @constructor\n * @extends {PostmanLegacyInterface}\n */\nclass PostmanLegacyTestInterface extends PostmanLegacyInterface {\n /**\n * @param {String} cookieName -\n * @returns {Object}\n */\n getResponseCookie (cookieName) {\n return this.__execution.cookies ? this.__execution.cookies.one(String(cookieName)) : undefined;\n }\n\n /**\n * @param {String} headerName -\n * @returns {String}\n */\n getResponseHeader (headerName) {\n var header = (this.__execution.response && this.__execution.response.headers) &&\n this.__execution.response.headers.one(headerName);\n\n return header ? header.value : undefined;\n }\n}\n\nmodule.exports = {\n /**\n *\n * @param {Uniscope} scope -\n * @param {Execution} execution -\n *\n * @note ensure that globalvars variables added here are added as part of the LEGACY_GLOBS array\n */\n setup (scope, execution) {\n /**\n * @name SandboxGlobals\n * @type {Object}\n */\n var globalvars = _.assign({}, scopeLibraries);\n\n // set global variables that are exposed in legacy interface\n // ---------------------------------------------------------\n\n // 1. set the tests object (irrespective of target)\n /**\n * Store your assertions in this object\n *\n * @memberOf SandboxGlobals\n * @type {Object}\n */\n globalvars.tests = {};\n\n // 2. set common environment, globals and data\n /**\n * All global variables at the initial stages when the script ran\n *\n * @memberOf SandboxGlobals\n * @type {Object}\n */\n globalvars.globals = execution.globals.syncVariablesTo();\n\n /**\n * All environment variables at the initial stages when script ran\n *\n * @memberOf SandboxGlobals\n * @type {Object}\n */\n globalvars.environment = execution.environment.syncVariablesTo();\n\n /**\n * The data object if it was passed during a collection run\n *\n * @memberOf SandboxGlobals\n * @type {Object}\n */\n globalvars.data = execution.data || (execution.data = {});\n\n // 3. set the request object in legacy structure\n /**\n * The request that will be sent (or has been sent)\n *\n * @memberOf SandboxGlobals\n * @type {Object}\n */\n globalvars.request = execution.request ? {\n id: execution.legacy ? execution.legacy._itemId : undefined,\n name: execution.legacy ? execution.legacy._itemName : undefined,\n description: execution.request.description ?\n execution.request.description.toString() : undefined,\n headers: execution.request.headers.toObject(true, false, true, true),\n method: execution.request.method,\n url: execution.request.url.toString(),\n data: (function (request) {\n var body = getRequestBody(request);\n\n return body ? (body.form || body.formData || body.body || {}) : {};\n }(execution.request))\n } : {};\n\n // 4. set the response related objects\n if (execution.target === TARGET_TEST) {\n /**\n * Stores the response cookies\n *\n * @memberOf SandboxGlobals\n * @type {Array.}\n */\n globalvars.responseCookies = execution.cookies || [];\n\n /**\n * Stores the response headers with the keys being case sensitive\n *\n * @memberOf SandboxGlobals\n * @type {Array.}\n */\n globalvars.responseHeaders = {};\n execution.response && execution.response.headers.each(function (header) {\n header && !header.disabled && (globalvars.responseHeaders[header.key] = header.value);\n });\n\n /**\n * @memberOf SandboxGlobals\n * @type {Number}\n */\n globalvars.responseTime = execution.response ? execution.response.responseTime : NaN;\n\n /**\n * @memberOf SandboxGlobals\n * @type {Number}\n */\n globalvars.responseCode = execution.response ? _.clone(execution.response.details()) : {\n code: NaN,\n name: E,\n details: E\n };\n\n /**\n * @memberOf SandboxGlobals\n * @type {String}\n */\n globalvars.responseBody = execution.response ? execution.response.text() : undefined;\n }\n\n // 5. add the iteration information\n globalvars.iteration = _.isObject(execution.cursor) ? execution.cursor.iteration : 0;\n\n // 6. create the postman interface object\n /**\n * @memberOf SandboxGlobals\n * @type {PostmanLegacyInterface}\n */\n globalvars.postman = new (execution.target === TARGET_TEST ?\n PostmanLegacyTestInterface : PostmanLegacyInterface)(execution, globalvars);\n\n // make a final pass to ensure that the global variables are present\n\n\n // all the globals are now added to scope\n scope.import(globalvars);\n globalvars = null; // dereference\n\n // add a flag to ensure that when teardown is called, it does not tear down a scope that was never setup\n scope.__postman_legacy_setup = true;\n },\n\n teardown (scope) {\n if (!scope.__postman_legacy_setup) {\n return;\n }\n\n for (var i = 0, ii = LEGACY_GLOBS.length; i < ii; i++) {\n scope.unset(LEGACY_GLOBS[i]);\n }\n\n scope.__postman_legacy_setup = false;\n },\n\n /**\n * This is the place where we should put all the tasks\n * that need to be executed after the completion of script execution\n *\n * @param {Uniscope} scope -\n * @param {Object} pmapi -\n * @param {Function} onAssertion -\n */\n finish (scope, pmapi, onAssertion) {\n if (!scope.__postman_legacy_setup) {\n return;\n }\n\n raiseAssertionEvent(scope, pmapi, onAssertion);\n }\n};\n\n},{\"./xml2Json\":13,\"atob\":\"atob\",\"backbone\":\"backbone\",\"btoa\":\"btoa\",\"cheerio\":\"cheerio\",\"crypto-js\":\"crypto-js\",\"liquid-json\":\"json\",\"lodash\":\"lodash\",\"lodash3\":404,\"tv4\":\"tv4\"}],11:[function(require,module,exports){\n/**\n * This module adds `.toJSON` to prototypes of objects that does not behave well with JSON.stringify() This aides in\n * accurate transport of information between IPC\n *\n */\ntry {\n Error && (Error.prototype.toJSON = function () { // eslint-disable-line no-extend-native\n return {\n type: 'Error',\n name: this.name,\n message: this.message\n };\n });\n}\ncatch (e) {} // eslint-disable-line no-empty\n\nconst { Request, Response } = require('postman-collection');\n\n/**\n * We override toJSON to not export additional helpers that sandbox adds to pm.request and pm.response.\n */\ntry {\n Request.prototype.toJSON = (function (superToJSON) { // eslint-disable-line no-extend-native\n return function () {\n var tmp = this.to,\n json;\n\n // remove properties added by sandbox before doing a toJSON\n delete this.to;\n json = superToJSON.apply(this, arguments);\n\n this.to = tmp;\n\n return json;\n };\n }(Request.prototype.toJSON));\n\n Response.prototype.toJSON = (function (superToJSON) { // eslint-disable-line no-extend-native\n return function () {\n var tmp = this.to,\n json;\n\n // remove properties added by sandbox before doing a toJSON\n delete this.to;\n json = superToJSON.apply(this, arguments);\n\n this.to = tmp;\n\n return json;\n };\n }(Response.prototype.toJSON));\n}\ncatch (e) {} // eslint-disable-line no-empty\n\n},{\"postman-collection\":\"postman-collection\"}],12:[function(require,module,exports){\n/**\n * @fileoverview This file contains the module that is required to enable specialised timers that have better control\n * on a global level.\n *\n * @todo - the architecture of this sucks even if this \"works\".\n * - the way to compute firing of start and end events suck\n * - basically this needs a redo with more \"engineering\" put into it\n */\nconst /**\n *\n * @constant {String}\n */\n FUNCTION = 'function',\n\n /**\n * The set of timer function names. We use this array to define common behaviour of all setters and clearer timer\n * functions\n *\n * @constant {Array.}\n */\n timerFunctionNames = ['Timeout', 'Interval', 'Immediate', 'Event'],\n\n /**\n * This object defines a set of timer function names that are trigerred a number of times instead of a single time.\n * Such timers, when placed in generic rules, needs special attention.\n *\n * @constant {Array.}\n */\n multiFireTimerFunctions = {\n Interval: true\n },\n\n /**\n * This object defines a set of function timer names that do not fire based on any pre-set duration or interval.\n * Such timers, when placed in generic rules, needs special attention.\n *\n * @constant {Array.}\n */\n staticTimerFunctions = {\n Event: true\n },\n\n /**\n * A local copy of Slice function of Array\n *\n * @constant {Function}\n */\n arrayProtoSlice = Array.prototype.slice,\n\n /**\n * This object holds the current global timers\n *\n * @extends Timers\n *\n * @note This is a very important piece of code from compatibility standpoint.\n * The global timers need to be returned as a function that does not hold reference to the scope\n * and does not retain references to scope. Aditionally, the invocation of the timer function is\n * done without changing the scope to avoid Illegal Invocation errors.\n *\n * `timerFunctionNames` returns the suffixes of all timer operations that needs a\n * a setter and clear method.\n */\n defaultTimers = timerFunctionNames.reduce(function (timers, name) {\n var\n\n /**\n * Check if global setter function is available\n *\n * @private\n * @type {Boolean}\n */\n // eslint-disable-next-line no-new-func\n isGlobalSetterAvailable = (new Function(`return typeof set${name} === 'function'`))(),\n\n /**\n * Check if global clear function is available\n *\n * @private\n * @type {Boolean}\n */\n // eslint-disable-next-line no-new-func\n isGlobalClearAvailable = (new Function(`return typeof clear${name} === 'function'`))();\n\n if (isGlobalSetterAvailable) {\n // eslint-disable-next-line no-new-func\n timers[('set' + name)] = (new Function(`return function (fn, ms) { return set${name}(fn, ms); }`))();\n }\n\n if (isGlobalClearAvailable) {\n // eslint-disable-next-line no-new-func\n timers[('clear' + name)] = (new Function(`return function (id) { return clear${name}(id); }`))();\n }\n\n return timers;\n }, {});\n\n/**\n * @constructor\n *\n * @param {Object} [delegations] -\n * @param {Function} [onError] -\n * @param {Function} [onAnyTimerStart] -\n * @param {Function} [onAllTimerEnd] -\n */\nfunction Timerz (delegations, onError, onAnyTimerStart, onAllTimerEnd) {\n var /**\n * Holds the present timers, either delegated or defaults\n *\n * @extends Timers\n */\n timers = delegations || defaultTimers,\n dummyContext = {},\n\n total = 0, // accumulator to keep track of total timers\n pending = 0, // counters to keep track of running timers\n sealed = false, // flag that stops all new timer additions\n computeTimerEvents;\n\n // do special handling to enable emulation of immediate timers in hosts that lacks them\n if (typeof timers.setImmediate !== FUNCTION) {\n timers.setImmediate = function (callback) {\n return timers.setTimeout(callback, 0);\n };\n timers.clearImmediate = function (id) {\n return timers.clearTimeout(id);\n };\n }\n\n // write special handlers for event based timers if the delegations don't contain one\n (typeof timers.setEvent !== FUNCTION) && (function () {\n var events = {},\n total = 0;\n\n timers.setEvent = function (callback) {\n var id = ++total;\n\n events[id] = callback;\n\n return id;\n };\n\n timers.clearEvent = function (id) {\n var cb = events[id];\n\n delete events[id];\n (typeof cb === FUNCTION) && cb.apply(dummyContext, arrayProtoSlice.call(arguments, 1));\n };\n\n timers.clearAllEvents = function () {\n Object.keys(events).forEach(function (prop) {\n delete events[prop];\n });\n };\n }());\n\n // create a function that decides whether to fire appropriate callbacks\n computeTimerEvents = function (increment, clearing) {\n increment && (pending += increment);\n\n function maybeEndAllTimers () {\n if (pending === 0 && computeTimerEvents.started) {\n !clearing && (typeof onAllTimerEnd === FUNCTION) && onAllTimerEnd();\n computeTimerEvents.started = false;\n }\n }\n\n if (pending === 0 && computeTimerEvents.started) {\n timers.setImmediate(maybeEndAllTimers);\n }\n\n if (pending > 0 && !computeTimerEvents.started) {\n !clearing && (typeof onAnyTimerStart === FUNCTION) && onAnyTimerStart();\n computeTimerEvents.started = true;\n }\n };\n\n // iterate through the timer variants and create common setter and clearer function behaviours for each of them.\n timerFunctionNames.forEach(function (name) {\n // create an accumulator for all timer references\n var running = {};\n\n // create the setter function for the timer\n this[('set' + name)] = function (callback) {\n // it is pointless to proceed with setter if there is no callback to execute\n if (sealed || typeof callback !== FUNCTION) {\n return;\n }\n\n var id = ++total, // get hold of the next timer id\n args = arrayProtoSlice.call(arguments);\n\n args[0] = function () {\n // call the actual callback with a dummy context\n try { callback.apply(dummyContext, staticTimerFunctions[name] ? arguments : null); }\n catch (e) { onError && onError(e); }\n\n // interval timers can only be cleared using clearXYZ function and hence we need not do anything\n // except call the timer\n if (staticTimerFunctions[name] || multiFireTimerFunctions[name]) {\n // do not modify counter during interval type events\n computeTimerEvents();\n }\n // when this is fired, the timer dies, so we decrement tracking counters and delete\n // irq references\n else {\n computeTimerEvents(-1);\n delete running[id];\n }\n };\n\n // call the underlying timer function and keep a track of its irq\n running[id] = timers[('set' + name)].apply(this, args);\n args = null; // precaution\n\n // increment the counter and return the tracking ID to be used to pass on to clearXYZ function\n computeTimerEvents(1);\n\n return id;\n };\n\n // create the clear function of the timer\n this[('clear' + name)] = function (id) {\n var underLyingId = running[id],\n args;\n\n // it is pointless and erroenous to proceed in case it seems that it is no longer running\n if (sealed || !underLyingId) {\n return;\n }\n\n // prepare args to be forwarded to clear function\n args = arrayProtoSlice.call(arguments);\n args[0] = underLyingId;\n delete running[id];\n\n // fire the underlying clearing function\n\n try { timers['clear' + name].apply(dummyContext, args); }\n catch (e) { onError(e); }\n\n // decrement counters and call the clearing timer function\n computeTimerEvents(-1);\n\n args = underLyingId = null; // just a precaution\n };\n\n // create a sugar function to clear all running timers of this category\n // @todo: decide how to handle clearing for underlying delegated timers, if they are instances of Timerz itself.\n if (typeof timers[('clearAll' + name + 's')] === FUNCTION) {\n // if native timers have a function to clear all timers, then use it\n this[('clearAll' + name + 's')] = function () {\n timers[('clearAll' + name + 's')]();\n Object.keys(running).forEach(function () {\n computeTimerEvents(-1, true);\n });\n };\n }\n else {\n this[('clearAll' + name + 's')] = function () {\n Object.keys(running).forEach(function (id) {\n computeTimerEvents(-1, true);\n // run clear functions except for static timers\n timers['clear' + name](running[id]);\n });\n };\n }\n }.bind(this));\n\n\n /**\n * @memberof Timerz.prototype\n * @returns {Number}\n */\n this.queueLength = function () {\n return pending;\n };\n\n this.wrapped = timers;\n\n /**\n * @memberof Timerz.prototype\n */\n this.clearAll = function () {\n // call all internal timer clearAll function variants\n timerFunctionNames.forEach(function (name) {\n this[('clearAll' + name + 's')]();\n }.bind(this));\n };\n\n /**\n * @memberof Timerz.prototype\n */\n this.seal = function () {\n sealed = true;\n };\n\n this.error = function (err) {\n return onError.call(dummyContext, err);\n };\n\n this.terminate = function () {\n this.seal();\n this.clearAll();\n\n return onAllTimerEnd.apply(dummyContext, arguments);\n };\n}\n\nmodule.exports = Timerz;\n\n},{}],13:[function(require,module,exports){\nconst xml2js = require('xml2js'),\n\n /**\n * @constant\n * @type {Object}\n */\n xml2jsOptions = {\n explicitArray: false,\n // this ensures that it works in the sync sandbox we currently have in the app\n async: false,\n trim: true,\n mergeAttrs: false\n };\n\nmodule.exports = function (string) {\n var JSON = {};\n\n xml2js.parseString(string, xml2jsOptions, function (_, result) { // @todo - see who swallows the error\n JSON = result;\n });\n\n return JSON;\n};\n\n},{\"xml2js\":\"xml2js\"}],14:[function(require,module,exports){\n/**!\n * @license Copyright 2016 Postdot Technologies, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on\n * an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and limitations under the License.\n *\n * This file is the Postman scripting sandbox's bootstrap code and would during module usage be exported as part of npm\n * cache and deployed for ease of use and performance improvements.\n *\n * @note\n * This file runs within Node and browser sandboxes and standard node aspects may not 100% apply\n */\n/* global bridge */\n\n// Although we execute the user code in a well-defined scope using the uniscope\n// module but still to cutoff the reference to the globally available properties\n// we sanitize the global scope by deleting the forbidden properties in this UVM\n// and create a secure sandboxed environment.\n// @note this is executed at the very beginning of the sandbox code to make sure\n// non of the dependency can keep a reference to a global property.\n// @note since this mutates the global scope, it's possible to mess-up as we\n// update our dependencies.\n(function recreatingTheUniverse () {\n var contextObject = this,\n // 1. allow all the uniscope allowed globals\n allowedGlobals = require('uniscope/lib/allowed-globals').concat([\n // 2. allow properties which can be controlled/ignored using uniscope\n 'require', 'eval', 'console',\n // 3. allow uvm internals because these will be cleared by uvm itself at the end.\n // make sure any new property added in uvm firmware is allowed here as well.\n 'bridge', '__uvm_emit', '__uvm_dispatch', '__uvm_addEventListener',\n // 4.allow all the timer methods\n 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'setImmediate', 'clearImmediate'\n ]),\n deleteProperty = function (key) {\n // directly delete the property without setting it to `null` or `undefined`\n // because a few properties in browser context breaks the sandbox.\n // @note non-configurable keys are not deleted.\n // eslint-disable-next-line lodash/prefer-includes\n allowedGlobals.indexOf(key) === -1 && delete contextObject[key];\n };\n\n do {\n // delete all forbidden properties (including non-enumerable)\n Object.getOwnPropertyNames(contextObject).forEach(deleteProperty);\n // keep looking through the prototype chain until we reach the Object prototype\n // @note this deletes the constructor as well to make sure one can't recreate the same scope\n contextObject = Object.getPrototypeOf(contextObject);\n } while (contextObject && contextObject.constructor !== Object);\n\n // define custom Error.prepareStackTrace\n Object.defineProperty(Error, 'prepareStackTrace', {\n value: function (error, structuredStackTrace) {\n const errorString = String(error);\n\n if (Array.isArray(structuredStackTrace) && structuredStackTrace.length) {\n return `${errorString}\\n at ${structuredStackTrace.join('\\n at ')}`;\n }\n\n return errorString;\n },\n configurable: false,\n enumerable: false,\n writable: false\n });\n}());\n\n// do include json purse\nrequire('./purse');\n\n// setup the ping-pong and execute routines\nbridge.on('ping', require('./ping').listener('pong'));\n\n// initialise execution\nrequire('./execute')(bridge, {\n console: (typeof console !== 'undefined' ? console : null),\n window: (typeof window !== 'undefined' ? window : null)\n});\n\n// We don't need direct access to the global bridge once it's part of execution closure.\n// eslint-disable-next-line no-global-assign, no-implicit-globals, no-delete-var\nbridge = undefined; delete bridge;\n\n},{\"./execute\":5,\"./ping\":7,\"./purse\":11,\"uniscope/lib/allowed-globals\":558}],15:[function(require,module,exports){\n(function (global){(function (){\n/*\n * Sugar Library vedge\n *\n * Freely distributable and licensed under the MIT-style license.\n * Copyright (c) 2013 Andrew Plummer\n * http://sugarjs.com/\n *\n * ---------------------------- */\n(function(){\n /***\n * @package Core\n * @description Internal utility and common methods.\n ***/\n\n\n // A few optimizations for Google Closure Compiler will save us a couple kb in the release script.\n var object = Object, array = Array, regexp = RegExp, date = Date, string = String, number = Number, math = Math, Undefined;\n\n // Internal toString\n var internalToString = object.prototype.toString;\n\n // The global context\n var globalContext = typeof global !== 'undefined' ? global : this;\n\n // Type check methods need a way to be accessed dynamically outside global context.\n var typeChecks = {};\n\n // defineProperty exists in IE8 but will error when trying to define a property on\n // native objects. IE8 does not have defineProperies, however, so this check saves a try/catch block.\n var definePropertySupport = object.defineProperty && object.defineProperties;\n\n\n // Class initializers and class helpers\n\n var ClassNames = 'Array,Boolean,Date,Function,Number,String,RegExp'.split(',');\n\n // postman mod start\n ClassNames.forEach(function (prop) {\n if (globalContext[prop]) return;\n globalContext[prop] = Function('return ' + prop)();\n });\n // postman mod end\n\n var isArray = buildClassCheck(ClassNames[0]);\n var isBoolean = buildClassCheck(ClassNames[1]);\n var isDate = buildClassCheck(ClassNames[2]);\n var isFunction = buildClassCheck(ClassNames[3]);\n var isNumber = buildClassCheck(ClassNames[4]);\n var isString = buildClassCheck(ClassNames[5]);\n var isRegExp = buildClassCheck(ClassNames[6]);\n\n function buildClassCheck(name) {\n var type, fn;\n if(/String|Number|Boolean/.test(name)) {\n type = name.toLowerCase();\n }\n fn = (name === 'Array' && array.isArray) || function(obj) {\n if(type && typeof obj === type) {\n return true;\n }\n return className(obj) === '[object '+name+']';\n }\n typeChecks[name] = fn;\n return fn;\n }\n\n function className(obj) {\n return internalToString.call(obj);\n }\n\n function initializeClasses() {\n initializeClass(object);\n iterateOverObject(ClassNames, function(i,name) {\n initializeClass(globalContext[name]);\n });\n }\n\n function initializeClass(klass) {\n if(klass['SugarMethods']) return;\n defineProperty(klass, 'SugarMethods', {});\n extend(klass, false, false, {\n 'extend': function(methods, override, instance) {\n extend(klass, instance !== false, override, methods);\n },\n 'sugarRestore': function() {\n return batchMethodExecute(klass, arguments, function(target, name, m) {\n defineProperty(target, name, m.method);\n });\n },\n 'sugarRevert': function() {\n return batchMethodExecute(klass, arguments, function(target, name, m) {\n if(m.existed) {\n defineProperty(target, name, m.original);\n } else {\n delete target[name];\n }\n });\n }\n });\n }\n\n // Class extending methods\n\n function extend(klass, instance, override, methods) {\n var extendee = instance ? klass.prototype : klass;\n initializeClass(klass);\n iterateOverObject(methods, function(name, method) {\n var original = extendee[name];\n var existed = hasOwnProperty(extendee, name);\n if(typeof override === 'function') {\n method = wrapNative(extendee[name], method, override);\n }\n if(override !== false || !extendee[name]) {\n defineProperty(extendee, name, method);\n }\n // If the method is internal to Sugar, then store a reference so it can be restored later.\n klass['SugarMethods'][name] = { instance: instance, method: method, original: original, existed: existed };\n });\n }\n\n function extendSimilar(klass, instance, override, set, fn) {\n var methods = {};\n set = isString(set) ? set.split(',') : set;\n set.forEach(function(name, i) {\n fn(methods, name, i);\n });\n extend(klass, instance, override, methods);\n }\n\n function batchMethodExecute(klass, args, fn) {\n var all = args.length === 0, methods = multiArgs(args), changed = false;\n iterateOverObject(klass['SugarMethods'], function(name, m) {\n if(all || methods.indexOf(name) > -1) {\n changed = true;\n fn(m.instance ? klass.prototype : klass, name, m);\n }\n });\n return changed;\n }\n\n function wrapNative(nativeFn, extendedFn, condition) {\n return function() {\n var fn;\n if(nativeFn && (condition === true || !condition.apply(this, arguments))) {\n fn = nativeFn;\n } else {\n fn = extendedFn;\n }\n return fn.apply(this, arguments);\n }\n }\n\n function defineProperty(target, name, method) {\n if(definePropertySupport) {\n object.defineProperty(target, name, { 'value': method, 'configurable': true, 'enumerable': false, 'writable': true });\n } else {\n target[name] = method;\n }\n }\n\n\n // Argument helpers\n\n function multiArgs(args, fn) {\n var result = [], i, len;\n for(i = 0, len = args.length; i < len; i++) {\n result.push(args[i]);\n if(fn) fn.call(args, args[i], i);\n }\n return result;\n }\n\n function flattenedArgs(obj, fn, from) {\n multiArgs(array.prototype.concat.apply([], array.prototype.slice.call(obj, from || 0)), fn);\n }\n\n function checkCallback(fn) {\n if(!fn || !fn.call) {\n throw new TypeError('Callback is not callable');\n }\n }\n\n\n // General helpers\n\n function isDefined(o) {\n return o !== Undefined;\n }\n\n function isUndefined(o) {\n return o === Undefined;\n }\n\n\n // Object helpers\n\n function isObjectPrimitive(obj) {\n // Check for null\n return obj && typeof obj === 'object';\n }\n\n function isObject(obj) {\n // === on the constructor is not safe across iframes\n // 'hasOwnProperty' ensures that the object also inherits\n // from Object, which is false for DOMElements in IE.\n return !!obj && className(obj) === '[object Object]' && 'hasOwnProperty' in obj;\n }\n\n function hasOwnProperty(obj, key) {\n return object['hasOwnProperty'].call(obj, key);\n }\n\n function iterateOverObject(obj, fn) {\n var key;\n for(key in obj) {\n if(!hasOwnProperty(obj, key)) continue;\n if(fn.call(obj, key, obj[key], obj) === false) break;\n }\n }\n\n function simpleMerge(target, source) {\n iterateOverObject(source, function(key) {\n target[key] = source[key];\n });\n return target;\n }\n\n // Hash definition\n\n function Hash(obj) {\n simpleMerge(this, obj);\n };\n\n Hash.prototype.constructor = object;\n\n // Number helpers\n\n function getRange(start, stop, fn, step) {\n var arr = [], i = parseInt(start), down = step < 0;\n while((!down && i <= stop) || (down && i >= stop)) {\n arr.push(i);\n if(fn) fn.call(this, i);\n i += step || 1;\n }\n return arr;\n }\n\n function round(val, precision, method) {\n var fn = math[method || 'round'];\n var multiplier = math.pow(10, math.abs(precision || 0));\n if(precision < 0) multiplier = 1 / multiplier;\n return fn(val * multiplier) / multiplier;\n }\n\n function ceil(val, precision) {\n return round(val, precision, 'ceil');\n }\n\n function floor(val, precision) {\n return round(val, precision, 'floor');\n }\n\n function padNumber(num, place, sign, base) {\n var str = math.abs(num).toString(base || 10);\n str = repeatString(place - str.replace(/\\.\\d+/, '').length, '0') + str;\n if(sign || num < 0) {\n str = (num < 0 ? '-' : '+') + str;\n }\n return str;\n }\n\n function getOrdinalizedSuffix(num) {\n if(num >= 11 && num <= 13) {\n return 'th';\n } else {\n switch(num % 10) {\n case 1: return 'st';\n case 2: return 'nd';\n case 3: return 'rd';\n default: return 'th';\n }\n }\n }\n\n\n // String helpers\n\n // WhiteSpace/LineTerminator as defined in ES5.1 plus Unicode characters in the Space, Separator category.\n function getTrimmableCharacters() {\n return '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u2028\\u2029\\u3000\\uFEFF';\n }\n\n function repeatString(times, str) {\n return array(math.max(0, isDefined(times) ? times : 1) + 1).join(str || '');\n }\n\n\n // RegExp helpers\n\n function getRegExpFlags(reg, add) {\n var flags = reg.toString().match(/[^/]*$/)[0];\n if(add) {\n flags = (flags + add).split('').sort().join('').replace(/([gimy])\\1+/g, '$1');\n }\n return flags;\n }\n\n function escapeRegExp(str) {\n if(!isString(str)) str = string(str);\n return str.replace(/([\\\\/'*+?|()\\[\\]{}.^$])/g,'\\\\$1');\n }\n\n\n // Specialized helpers\n\n\n // Used by Array#unique and Object.equal\n\n function stringify(thing, stack) {\n var type = typeof thing,\n thingIsObject,\n thingIsArray,\n klass, value,\n arr, key, i, len;\n\n // Return quickly if string to save cycles\n if(type === 'string') return thing;\n\n klass = internalToString.call(thing)\n thingIsObject = isObject(thing);\n thingIsArray = klass === '[object Array]';\n\n if(thing != null && thingIsObject || thingIsArray) {\n // This method for checking for cyclic structures was egregiously stolen from\n // the ingenious method by @kitcambridge from the Underscore script:\n // https://github.com/documentcloud/underscore/issues/240\n if(!stack) stack = [];\n // Allowing a step into the structure before triggering this\n // script to save cycles on standard JSON structures and also to\n // try as hard as possible to catch basic properties that may have\n // been modified.\n if(stack.length > 1) {\n i = stack.length;\n while (i--) {\n if (stack[i] === thing) {\n return 'CYC';\n }\n }\n }\n stack.push(thing);\n value = string(thing.constructor);\n arr = thingIsArray ? thing : object.keys(thing).sort();\n for(i = 0, len = arr.length; i < len; i++) {\n key = thingIsArray ? i : arr[i];\n value += key + stringify(thing[key], stack);\n }\n stack.pop();\n } else if(1 / thing === -Infinity) {\n value = '-0';\n } else {\n value = string(thing && thing.valueOf ? thing.valueOf() : thing);\n }\n return type + klass + value;\n }\n\n function isEqual(a, b) {\n if(objectIsMatchedByValue(a) && objectIsMatchedByValue(b)) {\n return stringify(a) === stringify(b);\n } else {\n return a === b;\n }\n }\n\n function objectIsMatchedByValue(obj) {\n var klass = className(obj);\n return /^\\[object Date|Array|String|Number|RegExp|Boolean|Arguments\\]$/.test(klass) ||\n isObject(obj);\n }\n\n\n // Used by Array#at and String#at\n\n function entryAtIndex(arr, args, str) {\n var result = [], length = arr.length, loop = args[args.length - 1] !== false, r;\n multiArgs(args, function(index) {\n if(isBoolean(index)) return false;\n if(loop) {\n index = index % length;\n if(index < 0) index = length + index;\n }\n r = str ? arr.charAt(index) || '' : arr[index];\n result.push(r);\n });\n return result.length < 2 ? result[0] : result;\n }\n\n\n // Object class methods implemented as instance methods\n\n function buildObjectInstanceMethods(set, target) {\n extendSimilar(target, true, false, set, function(methods, name) {\n methods[name + (name === 'equal' ? 's' : '')] = function() {\n return object[name].apply(null, [this].concat(multiArgs(arguments)));\n }\n });\n }\n\n initializeClasses();\n\n\n\n /***\n * @package ES5\n * @description Shim methods that provide ES5 compatible functionality. This package can be excluded if you do not require legacy browser support (IE8 and below).\n *\n ***/\n\n\n /***\n * Object module\n *\n ***/\n\n extend(object, false, false, {\n\n 'keys': function(obj) {\n var keys = [];\n if(!isObjectPrimitive(obj) && !isRegExp(obj) && !isFunction(obj)) {\n throw new TypeError('Object required');\n }\n iterateOverObject(obj, function(key, value) {\n keys.push(key);\n });\n return keys;\n }\n\n });\n\n\n /***\n * Array module\n *\n ***/\n\n // ECMA5 methods\n\n function arrayIndexOf(arr, search, fromIndex, increment) {\n var length = arr.length,\n fromRight = increment == -1,\n start = fromRight ? length - 1 : 0,\n index = toIntegerWithDefault(fromIndex, start);\n if(index < 0) {\n index = length + index;\n }\n if((!fromRight && index < 0) || (fromRight && index >= length)) {\n index = start;\n }\n while((fromRight && index >= 0) || (!fromRight && index < length)) {\n if(arr[index] === search) {\n return index;\n }\n index += increment;\n }\n return -1;\n }\n\n function arrayReduce(arr, fn, initialValue, fromRight) {\n var length = arr.length, count = 0, defined = isDefined(initialValue), result, index;\n checkCallback(fn);\n if(length == 0 && !defined) {\n throw new TypeError('Reduce called on empty array with no initial value');\n } else if(defined) {\n result = initialValue;\n } else {\n result = arr[fromRight ? length - 1 : count];\n count++;\n }\n while(count < length) {\n index = fromRight ? length - count - 1 : count;\n if(index in arr) {\n result = fn(result, arr[index], index, arr);\n }\n count++;\n }\n return result;\n }\n\n function toIntegerWithDefault(i, d) {\n if(isNaN(i)) {\n return d;\n } else {\n return parseInt(i >> 0);\n }\n }\n\n function checkFirstArgumentExists(args) {\n if(args.length === 0) {\n throw new TypeError('First argument must be defined');\n }\n }\n\n\n\n\n extend(array, false, false, {\n\n /***\n *\n * @method Array.isArray()\n * @returns Boolean\n * @short Returns true if is an Array.\n * @extra This method is provided for browsers that don't support it internally.\n * @example\n *\n * Array.isArray(3) -> false\n * Array.isArray(true) -> false\n * Array.isArray('wasabi') -> false\n * Array.isArray([1,2,3]) -> true\n *\n ***/\n 'isArray': function(obj) {\n return isArray(obj);\n }\n\n });\n\n\n extend(array, true, false, {\n\n /***\n * @method every(, [scope])\n * @returns Boolean\n * @short Returns true if all elements in the array match .\n * @extra [scope] is the %this% object. %all% is provided an alias. In addition to providing this method for browsers that don't support it natively, this method also implements @array_matching.\n * @example\n *\n + ['a','a','a'].every(function(n) {\n * return n == 'a';\n * });\n * ['a','a','a'].every('a') -> true\n * [{a:2},{a:2}].every({a:2}) -> true\n ***/\n 'every': function(fn, scope) {\n var length = this.length, index = 0;\n checkFirstArgumentExists(arguments);\n while(index < length) {\n if(index in this && !fn.call(scope, this[index], index, this)) {\n return false;\n }\n index++;\n }\n return true;\n },\n\n /***\n * @method some(, [scope])\n * @returns Boolean\n * @short Returns true if any element in the array matches .\n * @extra [scope] is the %this% object. %any% is provided as an alias. In addition to providing this method for browsers that don't support it natively, this method also implements @array_matching.\n * @example\n *\n + ['a','b','c'].some(function(n) {\n * return n == 'a';\n * });\n + ['a','b','c'].some(function(n) {\n * return n == 'd';\n * });\n * ['a','b','c'].some('a') -> true\n * [{a:2},{b:5}].some({a:2}) -> true\n ***/\n 'some': function(fn, scope) {\n var length = this.length, index = 0;\n checkFirstArgumentExists(arguments);\n while(index < length) {\n if(index in this && fn.call(scope, this[index], index, this)) {\n return true;\n }\n index++;\n }\n return false;\n },\n\n /***\n * @method map(, [scope])\n * @returns Array\n * @short Maps the array to another array containing the values that are the result of calling on each element.\n * @extra [scope] is the %this% object. In addition to providing this method for browsers that don't support it natively, this enhanced method also directly accepts a string, which is a shortcut for a function that gets that property (or invokes a function) on each element.\n * @example\n *\n + [1,2,3].map(function(n) {\n * return n * 3;\n * }); -> [3,6,9]\n * ['one','two','three'].map(function(n) {\n * return n.length;\n * }); -> [3,3,5]\n * ['one','two','three'].map('length') -> [3,3,5]\n ***/\n 'map': function(fn, scope) {\n var length = this.length, index = 0, result = new Array(length);\n checkFirstArgumentExists(arguments);\n while(index < length) {\n if(index in this) {\n result[index] = fn.call(scope, this[index], index, this);\n }\n index++;\n }\n return result;\n },\n\n /***\n * @method filter(, [scope])\n * @returns Array\n * @short Returns any elements in the array that match .\n * @extra [scope] is the %this% object. In addition to providing this method for browsers that don't support it natively, this method also implements @array_matching.\n * @example\n *\n + [1,2,3].filter(function(n) {\n * return n > 1;\n * });\n * [1,2,2,4].filter(2) -> 2\n *\n ***/\n 'filter': function(fn, scope) {\n var length = this.length, index = 0, result = [];\n checkFirstArgumentExists(arguments);\n while(index < length) {\n if(index in this && fn.call(scope, this[index], index, this)) {\n result.push(this[index]);\n }\n index++;\n }\n return result;\n },\n\n /***\n * @method indexOf(, [fromIndex])\n * @returns Number\n * @short Searches the array and returns the first index where occurs, or -1 if the element is not found.\n * @extra [fromIndex] is the index from which to begin the search. This method performs a simple strict equality comparison on . It does not support enhanced functionality such as searching the contents against a regex, callback, or deep comparison of objects. For such functionality, use the %findIndex% method instead.\n * @example\n *\n * [1,2,3].indexOf(3) -> 1\n * [1,2,3].indexOf(7) -> -1\n *\n ***/\n 'indexOf': function(search, fromIndex) {\n if(isString(this)) return this.indexOf(search, fromIndex);\n return arrayIndexOf(this, search, fromIndex, 1);\n },\n\n /***\n * @method lastIndexOf(, [fromIndex])\n * @returns Number\n * @short Searches the array and returns the last index where occurs, or -1 if the element is not found.\n * @extra [fromIndex] is the index from which to begin the search. This method performs a simple strict equality comparison on .\n * @example\n *\n * [1,2,1].lastIndexOf(1) -> 2\n * [1,2,1].lastIndexOf(7) -> -1\n *\n ***/\n 'lastIndexOf': function(search, fromIndex) {\n if(isString(this)) return this.lastIndexOf(search, fromIndex);\n return arrayIndexOf(this, search, fromIndex, -1);\n },\n\n /***\n * @method forEach([fn], [scope])\n * @returns Nothing\n * @short Iterates over the array, calling [fn] on each loop.\n * @extra This method is only provided for those browsers that do not support it natively. [scope] becomes the %this% object.\n * @example\n *\n * ['a','b','c'].forEach(function(a) {\n * // Called 3 times: 'a','b','c'\n * });\n *\n ***/\n 'forEach': function(fn, scope) {\n var length = this.length, index = 0;\n checkCallback(fn);\n while(index < length) {\n if(index in this) {\n fn.call(scope, this[index], index, this);\n }\n index++;\n }\n },\n\n /***\n * @method reduce(, [init])\n * @returns Mixed\n * @short Reduces the array to a single result.\n * @extra If [init] is passed as a starting value, that value will be passed as the first argument to the callback. The second argument will be the first element in the array. From that point, the result of the callback will then be used as the first argument of the next iteration. This is often refered to as \"accumulation\", and [init] is often called an \"accumulator\". If [init] is not passed, then will be called n - 1 times, where n is the length of the array. In this case, on the first iteration only, the first argument will be the first element of the array, and the second argument will be the second. After that callbacks work as normal, using the result of the previous callback as the first argument of the next. This method is only provided for those browsers that do not support it natively.\n *\n * @example\n *\n + [1,2,3,4].reduce(function(a, b) {\n * return a - b;\n * });\n + [1,2,3,4].reduce(function(a, b) {\n * return a - b;\n * }, 100);\n *\n ***/\n 'reduce': function(fn, init) {\n return arrayReduce(this, fn, init);\n },\n\n /***\n * @method reduceRight([fn], [init])\n * @returns Mixed\n * @short Identical to %Array#reduce%, but operates on the elements in reverse order.\n * @extra This method is only provided for those browsers that do not support it natively.\n *\n *\n *\n *\n * @example\n *\n + [1,2,3,4].reduceRight(function(a, b) {\n * return a - b;\n * });\n *\n ***/\n 'reduceRight': function(fn, init) {\n return arrayReduce(this, fn, init, true);\n }\n\n\n });\n\n\n\n\n /***\n * String module\n *\n ***/\n\n\n function buildTrim() {\n var support = getTrimmableCharacters().match(/^\\s+$/);\n try { string.prototype.trim.call([1]); } catch(e) { support = false; }\n extend(string, true, !support, {\n\n /***\n * @method trim[Side]()\n * @returns String\n * @short Removes leading and/or trailing whitespace from the string.\n * @extra Whitespace is defined as line breaks, tabs, and any character in the \"Space, Separator\" Unicode category, conforming to the the ES5 spec. The standard %trim% method is only added when not fully supported natively.\n *\n * @set\n * trim\n * trimLeft\n * trimRight\n *\n * @example\n *\n * ' wasabi '.trim() -> 'wasabi'\n * ' wasabi '.trimLeft() -> 'wasabi '\n * ' wasabi '.trimRight() -> ' wasabi'\n *\n ***/\n 'trim': function() {\n return this.toString().trimLeft().trimRight();\n },\n\n 'trimLeft': function() {\n return this.replace(regexp('^['+getTrimmableCharacters()+']+'), '');\n },\n\n 'trimRight': function() {\n return this.replace(regexp('['+getTrimmableCharacters()+']+$'), '');\n }\n });\n }\n\n\n\n /***\n * Function module\n *\n ***/\n\n\n extend(Function, true, false, {\n\n /***\n * @method bind(, [arg1], ...)\n * @returns Function\n * @short Binds as the %this% object for the function when it is called. Also allows currying an unlimited number of parameters.\n * @extra \"currying\" means setting parameters ([arg1], [arg2], etc.) ahead of time so that they are passed when the function is called later. If you pass additional parameters when the function is actually called, they will be added will be added to the end of the curried parameters. This method is provided for browsers that don't support it internally.\n * @example\n *\n + (function() {\n * return this;\n * }).bind('woof')(); -> returns 'woof'; function is bound with 'woof' as the this object.\n * (function(a) {\n * return a;\n * }).bind(1, 2)(); -> returns 2; function is bound with 1 as the this object and 2 curried as the first parameter\n * (function(a, b) {\n * return a + b;\n * }).bind(1, 2)(3); -> returns 5; function is bound with 1 as the this object, 2 curied as the first parameter and 3 passed as the second when calling the function\n *\n ***/\n 'bind': function(scope) {\n var fn = this, args = multiArgs(arguments).slice(1), nop, bound;\n if(!isFunction(this)) {\n throw new TypeError('Function.prototype.bind called on a non-function');\n }\n bound = function() {\n return fn.apply(fn.prototype && this instanceof fn ? this : scope, args.concat(multiArgs(arguments)));\n }\n bound.prototype = this.prototype;\n return bound;\n }\n\n });\n\n /***\n * Date module\n *\n ***/\n\n /***\n * @method toISOString()\n * @returns String\n * @short Formats the string to ISO8601 format.\n * @extra This will always format as UTC time. Provided for browsers that do not support this method.\n * @example\n *\n * Date.create().toISOString() -> ex. 2011-07-05 12:24:55.528Z\n *\n ***\n * @method toJSON()\n * @returns String\n * @short Returns a JSON representation of the date.\n * @extra This is effectively an alias for %toISOString%. Will always return the date in UTC time. Provided for browsers that do not support this method.\n * @example\n *\n * Date.create().toJSON() -> ex. 2011-07-05 12:24:55.528Z\n *\n ***/\n\n extend(date, false, false, {\n\n /***\n * @method Date.now()\n * @returns String\n * @short Returns the number of milliseconds since January 1st, 1970 00:00:00 (UTC time).\n * @extra Provided for browsers that do not support this method.\n * @example\n *\n * Date.now() -> ex. 1311938296231\n *\n ***/\n 'now': function() {\n return new date().getTime();\n }\n\n });\n\n function buildISOString() {\n var d = new date(date.UTC(1999, 11, 31)), target = '1999-12-31T00:00:00.000Z';\n var support = d.toISOString && d.toISOString() === target;\n extendSimilar(date, true, !support, 'toISOString,toJSON', function(methods, name) {\n methods[name] = function() {\n return padNumber(this.getUTCFullYear(), 4) + '-' +\n padNumber(this.getUTCMonth() + 1, 2) + '-' +\n padNumber(this.getUTCDate(), 2) + 'T' +\n padNumber(this.getUTCHours(), 2) + ':' +\n padNumber(this.getUTCMinutes(), 2) + ':' +\n padNumber(this.getUTCSeconds(), 2) + '.' +\n padNumber(this.getUTCMilliseconds(), 3) + 'Z';\n }\n });\n }\n\n // Initialize\n buildTrim();\n buildISOString();\n\n\n\n /***\n * @package Array\n * @dependency core\n * @description Array manipulation and traversal, \"fuzzy matching\" against elements, alphanumeric sorting and collation, enumerable methods on Object.\n *\n ***/\n\n\n function multiMatch(el, match, scope, params) {\n var result = true;\n if(el === match) {\n // Match strictly equal values up front.\n return true;\n } else if(isRegExp(match) && isString(el)) {\n // Match against a regexp\n return regexp(match).test(el);\n } else if(isFunction(match)) {\n // Match against a filtering function\n return match.apply(scope, params);\n } else if(isObject(match) && isObjectPrimitive(el)) {\n // Match against a hash or array.\n iterateOverObject(match, function(key, value) {\n if(!multiMatch(el[key], match[key], scope, [el[key], el])) {\n result = false;\n }\n });\n return result;\n } else {\n return isEqual(el, match);\n }\n }\n\n function transformArgument(el, map, context, mapArgs) {\n if(isUndefined(map)) {\n return el;\n } else if(isFunction(map)) {\n return map.apply(context, mapArgs || []);\n } else if(isFunction(el[map])) {\n return el[map].call(el);\n } else {\n return el[map];\n }\n }\n\n // Basic array internal methods\n\n function arrayEach(arr, fn, startIndex, loop) {\n var length, index, i;\n if(startIndex < 0) startIndex = arr.length + startIndex;\n i = isNaN(startIndex) ? 0 : startIndex;\n length = loop === true ? arr.length + i : arr.length;\n while(i < length) {\n index = i % arr.length;\n if(!(index in arr)) {\n return iterateOverSparseArray(arr, fn, i, loop);\n } else if(fn.call(arr, arr[index], index, arr) === false) {\n break;\n }\n i++;\n }\n }\n\n function iterateOverSparseArray(arr, fn, fromIndex, loop) {\n var indexes = [], i;\n for(i in arr) {\n if(isArrayIndex(arr, i) && i >= fromIndex) {\n indexes.push(parseInt(i));\n }\n }\n indexes.sort().each(function(index) {\n return fn.call(arr, arr[index], index, arr);\n });\n return arr;\n }\n\n function isArrayIndex(arr, i) {\n return i in arr && toUInt32(i) == i && i != 0xffffffff;\n }\n\n function toUInt32(i) {\n return i >>> 0;\n }\n\n function arrayFind(arr, f, startIndex, loop, returnIndex) {\n var result, index;\n arrayEach(arr, function(el, i, arr) {\n if(multiMatch(el, f, arr, [el, i, arr])) {\n result = el;\n index = i;\n return false;\n }\n }, startIndex, loop);\n return returnIndex ? index : result;\n }\n\n function arrayUnique(arr, map) {\n var result = [], o = {}, transformed;\n arrayEach(arr, function(el, i) {\n transformed = map ? transformArgument(el, map, arr, [el, i, arr]) : el;\n if(!checkForElementInHashAndSet(o, transformed)) {\n result.push(el);\n }\n })\n return result;\n }\n\n function arrayIntersect(arr1, arr2, subtract) {\n var result = [], o = {};\n arr2.each(function(el) {\n checkForElementInHashAndSet(o, el);\n });\n arr1.each(function(el) {\n var stringified = stringify(el),\n isReference = !objectIsMatchedByValue(el);\n // Add the result to the array if:\n // 1. We're subtracting intersections or it doesn't already exist in the result and\n // 2. It exists in the compared array and we're adding, or it doesn't exist and we're removing.\n if(elementExistsInHash(o, stringified, el, isReference) != subtract) {\n discardElementFromHash(o, stringified, el, isReference);\n result.push(el);\n }\n });\n return result;\n }\n\n function arrayFlatten(arr, level, current) {\n level = level || Infinity;\n current = current || 0;\n var result = [];\n arrayEach(arr, function(el) {\n if(isArray(el) && current < level) {\n result = result.concat(arrayFlatten(el, level, current + 1));\n } else {\n result.push(el);\n }\n });\n return result;\n }\n\n function flatArguments(args) {\n var result = [];\n multiArgs(args, function(arg) {\n result = result.concat(arg);\n });\n return result;\n }\n\n function elementExistsInHash(hash, key, element, isReference) {\n var exists = key in hash;\n if(isReference) {\n if(!hash[key]) {\n hash[key] = [];\n }\n exists = hash[key].indexOf(element) !== -1;\n }\n return exists;\n }\n\n function checkForElementInHashAndSet(hash, element) {\n var stringified = stringify(element),\n isReference = !objectIsMatchedByValue(element),\n exists = elementExistsInHash(hash, stringified, element, isReference);\n if(isReference) {\n hash[stringified].push(element);\n } else {\n hash[stringified] = element;\n }\n return exists;\n }\n\n function discardElementFromHash(hash, key, element, isReference) {\n var arr, i = 0;\n if(isReference) {\n arr = hash[key];\n while(i < arr.length) {\n if(arr[i] === element) {\n arr.splice(i, 1);\n } else {\n i += 1;\n }\n }\n } else {\n delete hash[key];\n }\n }\n\n // Support methods\n\n function getMinOrMax(obj, map, which, all) {\n var edge,\n result = [],\n max = which === 'max',\n min = which === 'min',\n isArray = Array.isArray(obj);\n iterateOverObject(obj, function(key) {\n var el = obj[key],\n test = transformArgument(el, map, obj, isArray ? [el, parseInt(key), obj] : []);\n if(isUndefined(test)) {\n throw new TypeError('Cannot compare with undefined');\n }\n if(test === edge) {\n result.push(el);\n } else if(isUndefined(edge) || (max && test > edge) || (min && test < edge)) {\n result = [el];\n edge = test;\n }\n });\n if(!isArray) result = arrayFlatten(result, 1);\n return all ? result : result[0];\n }\n\n\n // Alphanumeric collation helpers\n\n function collateStrings(a, b) {\n var aValue, bValue, aChar, bChar, aEquiv, bEquiv, index = 0, tiebreaker = 0;\n a = getCollationReadyString(a);\n b = getCollationReadyString(b);\n do {\n aChar = getCollationCharacter(a, index);\n bChar = getCollationCharacter(b, index);\n aValue = getCollationValue(aChar);\n bValue = getCollationValue(bChar);\n if(aValue === -1 || bValue === -1) {\n aValue = a.charCodeAt(index) || null;\n bValue = b.charCodeAt(index) || null;\n }\n aEquiv = aChar !== a.charAt(index);\n bEquiv = bChar !== b.charAt(index);\n if(aEquiv !== bEquiv && tiebreaker === 0) {\n tiebreaker = aEquiv - bEquiv;\n }\n index += 1;\n } while(aValue != null && bValue != null && aValue === bValue);\n if(aValue === bValue) return tiebreaker;\n return aValue < bValue ? -1 : 1;\n }\n\n function getCollationReadyString(str) {\n if(array[AlphanumericSortIgnoreCase]) {\n str = str.toLowerCase();\n }\n return str.replace(array[AlphanumericSortIgnore], '');\n }\n\n function getCollationCharacter(str, index) {\n var chr = str.charAt(index), eq = array[AlphanumericSortEquivalents] || {};\n return eq[chr] || chr;\n }\n\n function getCollationValue(chr) {\n var order = array[AlphanumericSortOrder];\n if(!chr) {\n return null;\n } else {\n return order.indexOf(chr);\n }\n }\n\n var AlphanumericSortOrder = 'AlphanumericSortOrder';\n var AlphanumericSortIgnore = 'AlphanumericSortIgnore';\n var AlphanumericSortIgnoreCase = 'AlphanumericSortIgnoreCase';\n var AlphanumericSortEquivalents = 'AlphanumericSortEquivalents';\n\n\n\n function buildEnhancements() {\n var callbackCheck = function() { var a = arguments; return a.length > 0 && !isFunction(a[0]); };\n extendSimilar(array, true, callbackCheck, 'map,every,all,some,any,none,filter', function(methods, name) {\n methods[name] = function(f) {\n return this[name](function(el, index) {\n if(name === 'map') {\n return transformArgument(el, f, this, [el, index, this]);\n } else {\n return multiMatch(el, f, this, [el, index, this]);\n }\n });\n }\n });\n }\n\n function buildAlphanumericSort() {\n var order = 'AÁÀÂÃĄBCĆČÇDĎÐEÉÈĚÊËĘFGĞHıIÍÌİÎÏJKLŁMNŃŇÑOÓÒÔPQRŘSŚŠŞTŤUÚÙŮÛÜVWXYÝZŹŻŽÞÆŒØÕÅÄÖ';\n var equiv = 'AÁÀÂÃÄ,CÇ,EÉÈÊË,IÍÌİÎÏ,OÓÒÔÕÖ,Sß,UÚÙÛÜ';\n array[AlphanumericSortOrder] = order.split('').map(function(str) {\n return str + str.toLowerCase();\n }).join('');\n var equivalents = {};\n arrayEach(equiv.split(','), function(set) {\n var equivalent = set.charAt(0);\n arrayEach(set.slice(1).split(''), function(chr) {\n equivalents[chr] = equivalent;\n equivalents[chr.toLowerCase()] = equivalent.toLowerCase();\n });\n });\n array[AlphanumericSortIgnoreCase] = true;\n array[AlphanumericSortEquivalents] = equivalents;\n }\n\n extend(array, false, false, {\n\n /***\n *\n * @method Array.create(, , ...)\n * @returns Array\n * @short Alternate array constructor.\n * @extra This method will create a single array by calling %concat% on all arguments passed. In addition to ensuring that an unknown variable is in a single, flat array (the standard constructor will create nested arrays, this one will not), it is also a useful shorthand to convert a function's arguments object into a standard array.\n * @example\n *\n * Array.create('one', true, 3) -> ['one', true, 3]\n * Array.create(['one', true, 3]) -> ['one', true, 3]\n + Array.create(function(n) {\n * return arguments;\n * }('howdy', 'doody'));\n *\n ***/\n 'create': function() {\n var result = [], tmp;\n multiArgs(arguments, function(a) {\n if(isObjectPrimitive(a)) {\n try {\n tmp = array.prototype.slice.call(a, 0);\n if(tmp.length > 0) {\n a = tmp;\n }\n } catch(e) {};\n }\n result = result.concat(a);\n });\n return result;\n }\n\n });\n\n extend(array, true, false, {\n\n /***\n * @method find(, [index] = 0, [loop] = false)\n * @returns Mixed\n * @short Returns the first element that matches .\n * @extra will match a string, number, array, object, or alternately test against a function or regex. Starts at [index], and will continue once from index = 0 if [loop] is true. This method implements @array_matching.\n * @example\n *\n + [{a:1,b:2},{a:1,b:3},{a:1,b:4}].find(function(n) {\n * return n['a'] == 1;\n * }); -> {a:1,b:3}\n * ['cuba','japan','canada'].find(/^c/, 2) -> 'canada'\n *\n ***/\n 'find': function(f, index, loop) {\n return arrayFind(this, f, index, loop);\n },\n\n /***\n * @method findAll(, [index] = 0, [loop] = false)\n * @returns Array\n * @short Returns all elements that match .\n * @extra will match a string, number, array, object, or alternately test against a function or regex. Starts at [index], and will continue once from index = 0 if [loop] is true. This method implements @array_matching.\n * @example\n *\n + [{a:1,b:2},{a:1,b:3},{a:2,b:4}].findAll(function(n) {\n * return n['a'] == 1;\n * }); -> [{a:1,b:3},{a:1,b:4}]\n * ['cuba','japan','canada'].findAll(/^c/) -> 'cuba','canada'\n * ['cuba','japan','canada'].findAll(/^c/, 2) -> 'canada'\n *\n ***/\n 'findAll': function(f, index, loop) {\n var result = [];\n arrayEach(this, function(el, i, arr) {\n if(multiMatch(el, f, arr, [el, i, arr])) {\n result.push(el);\n }\n }, index, loop);\n return result;\n },\n\n /***\n * @method findIndex(, [startIndex] = 0, [loop] = false)\n * @returns Number\n * @short Returns the index of the first element that matches or -1 if not found.\n * @extra This method has a few notable differences to native %indexOf%. Although will similarly match a primitive such as a string or number, it will also match deep objects and arrays that are not equal by reference (%===%). Additionally, if a function is passed it will be run as a matching function (similar to the behavior of %Array#filter%) rather than attempting to find that function itself by reference in the array. Starts at [index], and will continue once from index = 0 if [loop] is true. This method implements @array_matching.\n * @example\n *\n + [1,2,3,4].findIndex(3); -> 2\n + [1,2,3,4].findIndex(function(n) {\n * return n % 2 == 0;\n * }); -> 1\n + ['one','two','three'].findIndex(/th/); -> 2\n *\n ***/\n 'findIndex': function(f, startIndex, loop) {\n var index = arrayFind(this, f, startIndex, loop, true);\n return isUndefined(index) ? -1 : index;\n },\n\n /***\n * @method count()\n * @returns Number\n * @short Counts all elements in the array that match .\n * @extra will match a string, number, array, object, or alternately test against a function or regex. This method implements @array_matching.\n * @example\n *\n * [1,2,3,1].count(1) -> 2\n * ['a','b','c'].count(/b/) -> 1\n + [{a:1},{b:2}].count(function(n) {\n * return n['a'] > 1;\n * }); -> 0\n *\n ***/\n 'count': function(f) {\n if(isUndefined(f)) return this.length;\n return this.findAll(f).length;\n },\n\n /***\n * @method removeAt(, [end])\n * @returns Array\n * @short Removes element at . If [end] is specified, removes the range between and [end]. This method will change the array! If you don't intend the array to be changed use %clone% first.\n * @example\n *\n * ['a','b','c'].removeAt(0) -> ['b','c']\n * [1,2,3,4].removeAt(1, 3) -> [1]\n *\n ***/\n 'removeAt': function(start, end) {\n var i, len;\n if(isUndefined(start)) return this;\n if(isUndefined(end)) end = start;\n for(i = 0, len = end - start; i <= len; i++) {\n this.splice(start, 1);\n }\n return this;\n },\n\n /***\n * @method include(, [index])\n * @returns Array\n * @short Adds to the array.\n * @extra This is a non-destructive alias for %add%. It will not change the original array.\n * @example\n *\n * [1,2,3,4].include(5) -> [1,2,3,4,5]\n * [1,2,3,4].include(8, 1) -> [1,8,2,3,4]\n * [1,2,3,4].include([5,6,7]) -> [1,2,3,4,5,6,7]\n *\n ***/\n 'include': function(el, index) {\n return this.clone().add(el, index);\n },\n\n /***\n * @method exclude([f1], [f2], ...)\n * @returns Array\n * @short Removes any element in the array that matches [f1], [f2], etc.\n * @extra This is a non-destructive alias for %remove%. It will not change the original array. This method implements @array_matching.\n * @example\n *\n * [1,2,3].exclude(3) -> [1,2]\n * ['a','b','c'].exclude(/b/) -> ['a','c']\n + [{a:1},{b:2}].exclude(function(n) {\n * return n['a'] == 1;\n * }); -> [{b:2}]\n *\n ***/\n 'exclude': function() {\n return array.prototype.remove.apply(this.clone(), arguments);\n },\n\n /***\n * @method clone()\n * @returns Array\n * @short Makes a shallow clone of the array.\n * @example\n *\n * [1,2,3].clone() -> [1,2,3]\n *\n ***/\n 'clone': function() {\n return simpleMerge([], this);\n },\n\n /***\n * @method unique([map] = null)\n * @returns Array\n * @short Removes all duplicate elements in the array.\n * @extra [map] may be a function mapping the value to be uniqued on or a string acting as a shortcut. This is most commonly used when you have a key that ensures the object's uniqueness, and don't need to check all fields. This method will also correctly operate on arrays of objects.\n * @example\n *\n * [1,2,2,3].unique() -> [1,2,3]\n * [{foo:'bar'},{foo:'bar'}].unique() -> [{foo:'bar'}]\n + [{foo:'bar'},{foo:'bar'}].unique(function(obj){\n * return obj.foo;\n * }); -> [{foo:'bar'}]\n * [{foo:'bar'},{foo:'bar'}].unique('foo') -> [{foo:'bar'}]\n *\n ***/\n 'unique': function(map) {\n return arrayUnique(this, map);\n },\n\n /***\n * @method flatten([limit] = Infinity)\n * @returns Array\n * @short Returns a flattened, one-dimensional copy of the array.\n * @extra You can optionally specify a [limit], which will only flatten that depth.\n * @example\n *\n * [[1], 2, [3]].flatten() -> [1,2,3]\n * [['a'],[],'b','c'].flatten() -> ['a','b','c']\n *\n ***/\n 'flatten': function(limit) {\n return arrayFlatten(this, limit);\n },\n\n /***\n * @method union([a1], [a2], ...)\n * @returns Array\n * @short Returns an array containing all elements in all arrays with duplicates removed.\n * @extra This method will also correctly operate on arrays of objects.\n * @example\n *\n * [1,3,5].union([5,7,9]) -> [1,3,5,7,9]\n * ['a','b'].union(['b','c']) -> ['a','b','c']\n *\n ***/\n 'union': function() {\n return arrayUnique(this.concat(flatArguments(arguments)));\n },\n\n /***\n * @method intersect([a1], [a2], ...)\n * @returns Array\n * @short Returns an array containing the elements all arrays have in common.\n * @extra This method will also correctly operate on arrays of objects.\n * @example\n *\n * [1,3,5].intersect([5,7,9]) -> [5]\n * ['a','b'].intersect('b','c') -> ['b']\n *\n ***/\n 'intersect': function() {\n return arrayIntersect(this, flatArguments(arguments), false);\n },\n\n /***\n * @method subtract([a1], [a2], ...)\n * @returns Array\n * @short Subtracts from the array all elements in [a1], [a2], etc.\n * @extra This method will also correctly operate on arrays of objects.\n * @example\n *\n * [1,3,5].subtract([5,7,9]) -> [1,3]\n * [1,3,5].subtract([3],[5]) -> [1]\n * ['a','b'].subtract('b','c') -> ['a']\n *\n ***/\n 'subtract': function(a) {\n return arrayIntersect(this, flatArguments(arguments), true);\n },\n\n /***\n * @method at(, [loop] = true)\n * @returns Mixed\n * @short Gets the element(s) at a given index.\n * @extra When [loop] is true, overshooting the end of the array (or the beginning) will begin counting from the other end. As an alternate syntax, passing multiple indexes will get the elements at those indexes.\n * @example\n *\n * [1,2,3].at(0) -> 1\n * [1,2,3].at(2) -> 3\n * [1,2,3].at(4) -> 2\n * [1,2,3].at(4, false) -> null\n * [1,2,3].at(-1) -> 3\n * [1,2,3].at(0,1) -> [1,2]\n *\n ***/\n 'at': function() {\n return entryAtIndex(this, arguments);\n },\n\n /***\n * @method first([num] = 1)\n * @returns Mixed\n * @short Returns the first element(s) in the array.\n * @extra When is passed, returns the first elements in the array.\n * @example\n *\n * [1,2,3].first() -> 1\n * [1,2,3].first(2) -> [1,2]\n *\n ***/\n 'first': function(num) {\n if(isUndefined(num)) return this[0];\n if(num < 0) num = 0;\n return this.slice(0, num);\n },\n\n /***\n * @method last([num] = 1)\n * @returns Mixed\n * @short Returns the last element(s) in the array.\n * @extra When is passed, returns the last elements in the array.\n * @example\n *\n * [1,2,3].last() -> 3\n * [1,2,3].last(2) -> [2,3]\n *\n ***/\n 'last': function(num) {\n if(isUndefined(num)) return this[this.length - 1];\n var start = this.length - num < 0 ? 0 : this.length - num;\n return this.slice(start);\n },\n\n /***\n * @method from()\n * @returns Array\n * @short Returns a slice of the array from .\n * @example\n *\n * [1,2,3].from(1) -> [2,3]\n * [1,2,3].from(2) -> [3]\n *\n ***/\n 'from': function(num) {\n return this.slice(num);\n },\n\n /***\n * @method to()\n * @returns Array\n * @short Returns a slice of the array up to .\n * @example\n *\n * [1,2,3].to(1) -> [1]\n * [1,2,3].to(2) -> [1,2]\n *\n ***/\n 'to': function(num) {\n if(isUndefined(num)) num = this.length;\n return this.slice(0, num);\n },\n\n /***\n * @method min([map], [all] = false)\n * @returns Mixed\n * @short Returns the element in the array with the lowest value.\n * @extra [map] may be a function mapping the value to be checked or a string acting as a shortcut. If [all] is true, will return all min values in an array.\n * @example\n *\n * [1,2,3].min() -> 1\n * ['fee','fo','fum'].min('length') -> 'fo'\n * ['fee','fo','fum'].min('length', true) -> ['fo']\n + ['fee','fo','fum'].min(function(n) {\n * return n.length;\n * }); -> ['fo']\n + [{a:3,a:2}].min(function(n) {\n * return n['a'];\n * }); -> [{a:2}]\n *\n ***/\n 'min': function(map, all) {\n return getMinOrMax(this, map, 'min', all);\n },\n\n /***\n * @method max([map], [all] = false)\n * @returns Mixed\n * @short Returns the element in the array with the greatest value.\n * @extra [map] may be a function mapping the value to be checked or a string acting as a shortcut. If [all] is true, will return all max values in an array.\n * @example\n *\n * [1,2,3].max() -> 3\n * ['fee','fo','fum'].max('length') -> 'fee'\n * ['fee','fo','fum'].max('length', true) -> ['fee']\n + [{a:3,a:2}].max(function(n) {\n * return n['a'];\n * }); -> {a:3}\n *\n ***/\n 'max': function(map, all) {\n return getMinOrMax(this, map, 'max', all);\n },\n\n /***\n * @method least([map])\n * @returns Array\n * @short Returns the elements in the array with the least commonly occuring value.\n * @extra [map] may be a function mapping the value to be checked or a string acting as a shortcut.\n * @example\n *\n * [3,2,2].least() -> [3]\n * ['fe','fo','fum'].least('length') -> ['fum']\n + [{age:35,name:'ken'},{age:12,name:'bob'},{age:12,name:'ted'}].least(function(n) {\n * return n.age;\n * }); -> [{age:35,name:'ken'}]\n *\n ***/\n 'least': function(map, all) {\n return getMinOrMax(this.groupBy.apply(this, [map]), 'length', 'min', all);\n },\n\n /***\n * @method most([map])\n * @returns Array\n * @short Returns the elements in the array with the most commonly occuring value.\n * @extra [map] may be a function mapping the value to be checked or a string acting as a shortcut.\n * @example\n *\n * [3,2,2].most() -> [2]\n * ['fe','fo','fum'].most('length') -> ['fe','fo']\n + [{age:35,name:'ken'},{age:12,name:'bob'},{age:12,name:'ted'}].most(function(n) {\n * return n.age;\n * }); -> [{age:12,name:'bob'},{age:12,name:'ted'}]\n *\n ***/\n 'most': function(map, all) {\n return getMinOrMax(this.groupBy.apply(this, [map]), 'length', 'max', all);\n },\n\n /***\n * @method sum([map])\n * @returns Number\n * @short Sums all values in the array.\n * @extra [map] may be a function mapping the value to be summed or a string acting as a shortcut.\n * @example\n *\n * [1,2,2].sum() -> 5\n + [{age:35},{age:12},{age:12}].sum(function(n) {\n * return n.age;\n * }); -> 59\n * [{age:35},{age:12},{age:12}].sum('age') -> 59\n *\n ***/\n 'sum': function(map) {\n var arr = map ? this.map(map) : this;\n return arr.length > 0 ? arr.reduce(function(a,b) { return a + b; }) : 0;\n },\n\n /***\n * @method average([map])\n * @returns Number\n * @short Averages all values in the array.\n * @extra [map] may be a function mapping the value to be averaged or a string acting as a shortcut.\n * @example\n *\n * [1,2,3].average() -> 2\n + [{age:35},{age:11},{age:11}].average(function(n) {\n * return n.age;\n * }); -> 19\n * [{age:35},{age:11},{age:11}].average('age') -> 19\n *\n ***/\n 'average': function(map) {\n var arr = map ? this.map(map) : this;\n return arr.length > 0 ? arr.sum() / arr.length : 0;\n },\n\n /***\n * @method inGroups(, [padding])\n * @returns Array\n * @short Groups the array into arrays.\n * @extra [padding] specifies a value with which to pad the last array so that they are all equal length.\n * @example\n *\n * [1,2,3,4,5,6,7].inGroups(3) -> [ [1,2,3], [4,5,6], [7] ]\n * [1,2,3,4,5,6,7].inGroups(3, 'none') -> [ [1,2,3], [4,5,6], [7,'none','none'] ]\n *\n ***/\n 'inGroups': function(num, padding) {\n var pad = arguments.length > 1;\n var arr = this;\n var result = [];\n var divisor = ceil(this.length / num);\n getRange(0, num - 1, function(i) {\n var index = i * divisor;\n var group = arr.slice(index, index + divisor);\n if(pad && group.length < divisor) {\n getRange(1, divisor - group.length, function() {\n group = group.add(padding);\n });\n }\n result.push(group);\n });\n return result;\n },\n\n /***\n * @method inGroupsOf(, [padding] = null)\n * @returns Array\n * @short Groups the array into arrays of elements each.\n * @extra [padding] specifies a value with which to pad the last array so that they are all equal length.\n * @example\n *\n * [1,2,3,4,5,6,7].inGroupsOf(4) -> [ [1,2,3,4], [5,6,7] ]\n * [1,2,3,4,5,6,7].inGroupsOf(4, 'none') -> [ [1,2,3,4], [5,6,7,'none'] ]\n *\n ***/\n 'inGroupsOf': function(num, padding) {\n var result = [], len = this.length, arr = this, group;\n if(len === 0 || num === 0) return arr;\n if(isUndefined(num)) num = 1;\n if(isUndefined(padding)) padding = null;\n getRange(0, ceil(len / num) - 1, function(i) {\n group = arr.slice(num * i, num * i + num);\n while(group.length < num) {\n group.push(padding);\n }\n result.push(group);\n });\n return result;\n },\n\n /***\n * @method isEmpty()\n * @returns Boolean\n * @short Returns true if the array is empty.\n * @extra This is true if the array has a length of zero, or contains only %undefined%, %null%, or %NaN%.\n * @example\n *\n * [].isEmpty() -> true\n * [null,undefined].isEmpty() -> true\n *\n ***/\n 'isEmpty': function() {\n return this.compact().length == 0;\n },\n\n /***\n * @method sortBy(, [desc] = false)\n * @returns Array\n * @short Sorts the array by .\n * @extra may be a function, a string acting as a shortcut, or blank (direct comparison of array values). [desc] will sort the array in descending order. When the field being sorted on is a string, the resulting order will be determined by an internal collation algorithm that is optimized for major Western languages, but can be customized. For more information see @array_sorting.\n * @example\n *\n * ['world','a','new'].sortBy('length') -> ['a','new','world']\n * ['world','a','new'].sortBy('length', true) -> ['world','new','a']\n + [{age:72},{age:13},{age:18}].sortBy(function(n) {\n * return n.age;\n * }); -> [{age:13},{age:18},{age:72}]\n *\n ***/\n 'sortBy': function(map, desc) {\n var arr = this.clone();\n arr.sort(function(a, b) {\n var aProperty, bProperty, comp;\n aProperty = transformArgument(a, map, arr, [a]);\n bProperty = transformArgument(b, map, arr, [b]);\n if(isString(aProperty) && isString(bProperty)) {\n comp = collateStrings(aProperty, bProperty);\n } else if(aProperty < bProperty) {\n comp = -1;\n } else if(aProperty > bProperty) {\n comp = 1;\n } else {\n comp = 0;\n }\n return comp * (desc ? -1 : 1);\n });\n return arr;\n },\n\n /***\n * @method randomize()\n * @returns Array\n * @short Returns a copy of the array with the elements randomized.\n * @extra Uses Fisher-Yates algorithm.\n * @example\n *\n * [1,2,3,4].randomize() -> [?,?,?,?]\n *\n ***/\n 'randomize': function() {\n var arr = this.concat(), i = arr.length, j, x;\n while(i) {\n j = (math.random() * i) | 0;\n x = arr[--i];\n arr[i] = arr[j];\n arr[j] = x;\n }\n return arr;\n },\n\n /***\n * @method zip([arr1], [arr2], ...)\n * @returns Array\n * @short Merges multiple arrays together.\n * @extra This method \"zips up\" smaller arrays into one large whose elements are \"all elements at index 0\", \"all elements at index 1\", etc. Useful when you have associated data that is split over separated arrays. If the arrays passed have more elements than the original array, they will be discarded. If they have fewer elements, the missing elements will filled with %null%.\n * @example\n *\n * [1,2,3].zip([4,5,6]) -> [[1,2], [3,4], [5,6]]\n * ['Martin','John'].zip(['Luther','F.'], ['King','Kennedy']) -> [['Martin','Luther','King'], ['John','F.','Kennedy']]\n *\n ***/\n 'zip': function() {\n var args = multiArgs(arguments);\n return this.map(function(el, i) {\n return [el].concat(args.map(function(k) {\n return (i in k) ? k[i] : null;\n }));\n });\n },\n\n /***\n * @method sample([num])\n * @returns Mixed\n * @short Returns a random element from the array.\n * @extra If [num] is passed, will return [num] samples from the array.\n * @example\n *\n * [1,2,3,4,5].sample() -> // Random element\n * [1,2,3,4,5].sample(3) -> // Array of 3 random elements\n *\n ***/\n 'sample': function(num) {\n var arr = this.randomize();\n return arguments.length > 0 ? arr.slice(0, num) : arr[0];\n },\n\n /***\n * @method each(, [index] = 0, [loop] = false)\n * @returns Array\n * @short Runs against each element in the array. Enhanced version of %Array#forEach%.\n * @extra Parameters passed to are identical to %forEach%, ie. the first parameter is the current element, second parameter is the current index, and third parameter is the array itself. If returns %false% at any time it will break out of the loop. Once %each% finishes, it will return the array. If [index] is passed, will begin at that index and work its way to the end. If [loop] is true, it will then start over from the beginning of the array and continue until it reaches [index] - 1.\n * @example\n *\n * [1,2,3,4].each(function(n) {\n * // Called 4 times: 1, 2, 3, 4\n * });\n * [1,2,3,4].each(function(n) {\n * // Called 4 times: 3, 4, 1, 2\n * }, 2, true);\n *\n ***/\n 'each': function(fn, index, loop) {\n arrayEach(this, fn, index, loop);\n return this;\n },\n\n /***\n * @method add(, [index])\n * @returns Array\n * @short Adds to the array.\n * @extra If [index] is specified, it will add at [index], otherwise adds to the end of the array. %add% behaves like %concat% in that if is an array it will be joined, not inserted. This method will change the array! Use %include% for a non-destructive alias. Also, %insert% is provided as an alias that reads better when using an index.\n * @example\n *\n * [1,2,3,4].add(5) -> [1,2,3,4,5]\n * [1,2,3,4].add([5,6,7]) -> [1,2,3,4,5,6,7]\n * [1,2,3,4].insert(8, 1) -> [1,8,2,3,4]\n *\n ***/\n 'add': function(el, index) {\n if(!isNumber(number(index)) || isNaN(index)) index = this.length;\n array.prototype.splice.apply(this, [index, 0].concat(el));\n return this;\n },\n\n /***\n * @method remove([f1], [f2], ...)\n * @returns Array\n * @short Removes any element in the array that matches [f1], [f2], etc.\n * @extra Will match a string, number, array, object, or alternately test against a function or regex. This method will change the array! Use %exclude% for a non-destructive alias. This method implements @array_matching.\n * @example\n *\n * [1,2,3].remove(3) -> [1,2]\n * ['a','b','c'].remove(/b/) -> ['a','c']\n + [{a:1},{b:2}].remove(function(n) {\n * return n['a'] == 1;\n * }); -> [{b:2}]\n *\n ***/\n 'remove': function() {\n var i, arr = this;\n multiArgs(arguments, function(f) {\n i = 0;\n while(i < arr.length) {\n if(multiMatch(arr[i], f, arr, [arr[i], i, arr])) {\n arr.splice(i, 1);\n } else {\n i++;\n }\n }\n });\n return arr;\n },\n\n /***\n * @method compact([all] = false)\n * @returns Array\n * @short Removes all instances of %undefined%, %null%, and %NaN% from the array.\n * @extra If [all] is %true%, all \"falsy\" elements will be removed. This includes empty strings, 0, and false.\n * @example\n *\n * [1,null,2,undefined,3].compact() -> [1,2,3]\n * [1,'',2,false,3].compact() -> [1,'',2,false,3]\n * [1,'',2,false,3].compact(true) -> [1,2,3]\n *\n ***/\n 'compact': function(all) {\n var result = [];\n arrayEach(this, function(el, i) {\n if(isArray(el)) {\n result.push(el.compact());\n } else if(all && el) {\n result.push(el);\n } else if(!all && el != null && el.valueOf() === el.valueOf()) {\n result.push(el);\n }\n });\n return result;\n },\n\n /***\n * @method groupBy(, [fn])\n * @returns Object\n * @short Groups the array by .\n * @extra Will return an object with keys equal to the grouped values. may be a mapping function, or a string acting as a shortcut. Optionally calls [fn] for each group.\n * @example\n *\n * ['fee','fi','fum'].groupBy('length') -> { 2: ['fi'], 3: ['fee','fum'] }\n + [{age:35,name:'ken'},{age:15,name:'bob'}].groupBy(function(n) {\n * return n.age;\n * }); -> { 35: [{age:35,name:'ken'}], 15: [{age:15,name:'bob'}] }\n *\n ***/\n 'groupBy': function(map, fn) {\n var arr = this, result = {}, key;\n arrayEach(arr, function(el, index) {\n key = transformArgument(el, map, arr, [el, index, arr]);\n if(!result[key]) result[key] = [];\n result[key].push(el);\n });\n if(fn) {\n iterateOverObject(result, fn);\n }\n return result;\n },\n\n /***\n * @method none()\n * @returns Boolean\n * @short Returns true if none of the elements in the array match .\n * @extra will match a string, number, array, object, or alternately test against a function or regex. This method implements @array_matching.\n * @example\n *\n * [1,2,3].none(5) -> true\n * ['a','b','c'].none(/b/) -> false\n + [{a:1},{b:2}].none(function(n) {\n * return n['a'] > 1;\n * }); -> true\n *\n ***/\n 'none': function() {\n return !this.any.apply(this, arguments);\n }\n\n\n });\n\n // Aliases\n extend(array, true, false, {\n\n /***\n * @method all()\n * @alias every\n *\n ***/\n 'all': array.prototype.every,\n\n /*** @method any()\n * @alias some\n *\n ***/\n 'any': array.prototype.some,\n\n /***\n * @method insert()\n * @alias add\n *\n ***/\n 'insert': array.prototype.add\n\n });\n\n\n /***\n * Object module\n * Enumerable methods on objects\n *\n ***/\n\n function keysWithCoercion(obj) {\n if(obj && obj.valueOf) {\n obj = obj.valueOf();\n }\n return object.keys(obj);\n }\n\n /***\n * @method [enumerable]()\n * @returns Boolean\n * @short Enumerable methods in the Array package are also available to the Object class. They will perform their normal operations for every property in .\n * @extra In cases where a callback is used, instead of %element, index%, the callback will instead be passed %key, value%. Enumerable methods are also available to extended objects as instance methods.\n *\n * @set\n * each\n * map\n * any\n * all\n * none\n * count\n * find\n * findAll\n * reduce\n * isEmpty\n * sum\n * average\n * min\n * max\n * least\n * most\n *\n * @example\n *\n * Object.any({foo:'bar'}, 'bar') -> true\n * Object.extended({foo:'bar'}).any('bar') -> true\n * Object.isEmpty({}) -> true\n + Object.map({ fred: { age: 52 } }, 'age'); -> { fred: 52 }\n *\n ***/\n\n function buildEnumerableMethods(names, mapping) {\n extendSimilar(object, false, false, names, function(methods, name) {\n methods[name] = function(obj, arg1, arg2) {\n var result, coerced = keysWithCoercion(obj);\n result = array.prototype[name].call(coerced, function(key) {\n if(mapping) {\n return transformArgument(obj[key], arg1, obj, [key, obj[key], obj]);\n } else {\n return multiMatch(obj[key], arg1, obj, [key, obj[key], obj]);\n }\n }, arg2);\n if(isArray(result)) {\n // The method has returned an array of keys so use this array\n // to build up the resulting object in the form we want it in.\n result = result.reduce(function(o, key, i) {\n o[key] = obj[key];\n return o;\n }, {});\n }\n return result;\n };\n });\n buildObjectInstanceMethods(names, Hash);\n }\n\n extend(object, false, false, {\n\n 'map': function(obj, map) {\n return keysWithCoercion(obj).reduce(function(result, key) {\n result[key] = transformArgument(obj[key], map, obj, [key, obj[key], obj]);\n return result;\n }, {});\n },\n\n 'reduce': function(obj) {\n var values = keysWithCoercion(obj).map(function(key) {\n return obj[key];\n });\n return values.reduce.apply(values, multiArgs(arguments).slice(1));\n },\n\n 'each': function(obj, fn) {\n checkCallback(fn);\n iterateOverObject(obj, fn);\n return obj;\n },\n\n /***\n * @method size()\n * @returns Number\n * @short Returns the number of properties in .\n * @extra %size% is available as an instance method on extended objects.\n * @example\n *\n * Object.size({ foo: 'bar' }) -> 1\n *\n ***/\n 'size': function (obj) {\n return keysWithCoercion(obj).length;\n }\n\n });\n\n var EnumerableFindingMethods = 'any,all,none,count,find,findAll,isEmpty'.split(',');\n var EnumerableMappingMethods = 'sum,average,min,max,least,most'.split(',');\n var EnumerableOtherMethods = 'map,reduce,size'.split(',');\n var EnumerableMethods = EnumerableFindingMethods.concat(EnumerableMappingMethods).concat(EnumerableOtherMethods);\n\n buildEnhancements();\n buildAlphanumericSort();\n buildEnumerableMethods(EnumerableFindingMethods);\n buildEnumerableMethods(EnumerableMappingMethods, true);\n buildObjectInstanceMethods(EnumerableOtherMethods, Hash);\n\n\n /***\n * @package Date\n * @dependency core\n * @description Date parsing and formatting, relative formats like \"1 minute ago\", Number methods like \"daysAgo\", localization support with default English locale definition.\n *\n ***/\n\n var English;\n var CurrentLocalization;\n\n var TimeFormat = ['ampm','hour','minute','second','ampm','utc','offset_sign','offset_hours','offset_minutes','ampm']\n var DecimalReg = '(?:[,.]\\\\d+)?';\n var HoursReg = '\\\\d{1,2}' + DecimalReg;\n var SixtyReg = '[0-5]\\\\d' + DecimalReg;\n var RequiredTime = '({t})?\\\\s*('+HoursReg+')(?:{h}('+SixtyReg+')?{m}(?::?('+SixtyReg+'){s})?\\\\s*(?:({t})|(Z)|(?:([+-])(\\\\d{2,2})(?::?(\\\\d{2,2}))?)?)?|\\\\s*({t}))';\n\n var KanjiDigits = '〇一二三四五六七八九十百千万';\n var FullWidthDigits = '0123456789';\n var AsianDigitMap = {};\n var AsianDigitReg;\n\n var DateArgumentUnits;\n var DateUnitsReversed;\n var CoreDateFormats = [];\n\n var DateOutputFormats = [\n {\n token: 'f{1,4}|ms|milliseconds',\n format: function(d) {\n return callDateGet(d, 'Milliseconds');\n }\n },\n {\n token: 'ss?|seconds',\n format: function(d, len) {\n return callDateGet(d, 'Seconds');\n }\n },\n {\n token: 'mm?|minutes',\n format: function(d, len) {\n return callDateGet(d, 'Minutes');\n }\n },\n {\n token: 'hh?|hours|12hr',\n format: function(d) {\n return getShortHour(d);\n }\n },\n {\n token: 'HH?|24hr',\n format: function(d) {\n return callDateGet(d, 'Hours');\n }\n },\n {\n token: 'dd?|date|day',\n format: function(d) {\n return callDateGet(d, 'Date');\n }\n },\n {\n token: 'dow|weekday',\n word: true,\n format: function(d, loc, n, t) {\n var dow = callDateGet(d, 'Day');\n return loc['weekdays'][dow + (n - 1) * 7];\n }\n },\n {\n token: 'MM?',\n format: function(d) {\n return callDateGet(d, 'Month') + 1;\n }\n },\n {\n token: 'mon|month',\n word: true,\n format: function(d, loc, n, len) {\n var month = callDateGet(d, 'Month');\n return loc['months'][month + (n - 1) * 12];\n }\n },\n {\n token: 'y{2,4}|year',\n format: function(d) {\n return callDateGet(d, 'FullYear');\n }\n },\n {\n token: '[Tt]{1,2}',\n format: function(d, loc, n, format) {\n if(loc['ampm'].length == 0) return '';\n var hours = callDateGet(d, 'Hours');\n var str = loc['ampm'][floor(hours / 12)];\n if(format.length === 1) str = str.slice(0,1);\n if(format.slice(0,1) === 'T') str = str.toUpperCase();\n return str;\n }\n },\n {\n token: 'z{1,4}|tz|timezone',\n text: true,\n format: function(d, loc, n, format) {\n var tz = d.getUTCOffset();\n if(format == 'z' || format == 'zz') {\n tz = tz.replace(/(\\d{2})(\\d{2})/, function(f,h,m) {\n return padNumber(h, format.length);\n });\n }\n return tz;\n }\n },\n {\n token: 'iso(tz|timezone)',\n format: function(d) {\n return d.getUTCOffset(true);\n }\n },\n {\n token: 'ord',\n format: function(d) {\n var date = callDateGet(d, 'Date');\n return date + getOrdinalizedSuffix(date);\n }\n }\n ];\n\n var DateUnits = [\n {\n unit: 'year',\n method: 'FullYear',\n ambiguous: true,\n multiplier: function(d) {\n var adjust = d ? (d.isLeapYear() ? 1 : 0) : 0.25;\n return (365 + adjust) * 24 * 60 * 60 * 1000;\n }\n },\n {\n unit: 'month',\n method: 'Month',\n ambiguous: true,\n multiplier: function(d, ms) {\n var days = 30.4375, inMonth;\n if(d) {\n inMonth = d.daysInMonth();\n if(ms <= inMonth.days()) {\n days = inMonth;\n }\n }\n return days * 24 * 60 * 60 * 1000;\n },\n error: 0.919\n },\n {\n unit: 'week',\n method: 'ISOWeek',\n multiplier: function() {\n return 7 * 24 * 60 * 60 * 1000;\n }\n },\n {\n unit: 'day',\n method: 'Date',\n ambiguous: true,\n multiplier: function() {\n return 24 * 60 * 60 * 1000;\n }\n },\n {\n unit: 'hour',\n method: 'Hours',\n multiplier: function() {\n return 60 * 60 * 1000;\n }\n },\n {\n unit: 'minute',\n method: 'Minutes',\n multiplier: function() {\n return 60 * 1000;\n }\n },\n {\n unit: 'second',\n method: 'Seconds',\n multiplier: function() {\n return 1000;\n }\n },\n {\n unit: 'millisecond',\n method: 'Milliseconds',\n multiplier: function() {\n return 1;\n }\n }\n ];\n\n\n\n\n // Date Localization\n\n var Localizations = {};\n\n // Localization object\n\n function Localization(l) {\n simpleMerge(this, l);\n this.compiledFormats = CoreDateFormats.concat();\n }\n\n Localization.prototype = {\n\n getMonth: function(n) {\n if(isNumber(n)) {\n return n - 1;\n } else {\n return this['months'].indexOf(n) % 12;\n }\n },\n\n getWeekday: function(n) {\n return this['weekdays'].indexOf(n) % 7;\n },\n\n getNumber: function(n) {\n var i;\n if(isNumber(n)) {\n return n;\n } else if(n && (i = this['numbers'].indexOf(n)) !== -1) {\n return (i + 1) % 10;\n } else {\n return 1;\n }\n },\n\n getNumericDate: function(n) {\n var self = this;\n return n.replace(regexp(this['num'], 'g'), function(d) {\n var num = self.getNumber(d);\n return num || '';\n });\n },\n\n getEnglishUnit: function(n) {\n return English['units'][this['units'].indexOf(n) % 8];\n },\n\n getRelativeFormat: function(adu) {\n return this.convertAdjustedToFormat(adu, adu[2] > 0 ? 'future' : 'past');\n },\n\n getDuration: function(ms) {\n return this.convertAdjustedToFormat(getAdjustedUnit(ms), 'duration');\n },\n\n hasVariant: function(code) {\n code = code || this.code;\n return code === 'en' || code === 'en-US' ? true : this['variant'];\n },\n\n matchAM: function(str) {\n return str === this['ampm'][0];\n },\n\n matchPM: function(str) {\n return str && str === this['ampm'][1];\n },\n\n convertAdjustedToFormat: function(adu, mode) {\n var sign, unit, mult,\n num = adu[0],\n u = adu[1],\n ms = adu[2],\n format = this[mode] || this['relative'];\n if(isFunction(format)) {\n return format.call(this, num, u, ms, mode);\n }\n mult = this['plural'] && num > 1 ? 1 : 0;\n unit = this['units'][mult * 8 + u] || this['units'][u];\n if(this['capitalizeUnit']) unit = simpleCapitalize(unit);\n sign = this['modifiers'].filter(function(m) { return m.name == 'sign' && m.value == (ms > 0 ? 1 : -1); })[0];\n return format.replace(/\\{(.*?)\\}/g, function(full, match) {\n switch(match) {\n case 'num': return num;\n case 'unit': return unit;\n case 'sign': return sign.src;\n }\n });\n },\n\n getFormats: function() {\n return this.cachedFormat ? [this.cachedFormat].concat(this.compiledFormats) : this.compiledFormats;\n },\n\n addFormat: function(src, allowsTime, match, variant, iso) {\n var to = match || [], loc = this, time, timeMarkers, lastIsNumeral;\n\n src = src.replace(/\\s+/g, '[-,. ]*');\n src = src.replace(/\\{([^,]+?)\\}/g, function(all, k) {\n var value, arr, result,\n opt = k.match(/\\?$/),\n nc = k.match(/^(\\d+)\\??$/),\n slice = k.match(/(\\d)(?:-(\\d))?/),\n key = k.replace(/[^a-z]+$/, '');\n if(nc) {\n value = loc['tokens'][nc[1]];\n } else if(loc[key]) {\n value = loc[key];\n } else if(loc[key + 's']) {\n value = loc[key + 's'];\n if(slice) {\n // Can't use filter here as Prototype hijacks the method and doesn't\n // pass an index, so use a simple loop instead!\n arr = [];\n value.forEach(function(m, i) {\n var mod = i % (loc['units'] ? 8 : value.length);\n if(mod >= slice[1] && mod <= (slice[2] || slice[1])) {\n arr.push(m);\n }\n });\n value = arr;\n }\n value = arrayToAlternates(value);\n }\n if(nc) {\n result = '(?:' + value + ')';\n } else {\n if(!match) {\n to.push(key);\n }\n result = '(' + value + ')';\n }\n if(opt) {\n result += '?';\n }\n return result;\n });\n if(allowsTime) {\n time = prepareTime(RequiredTime, loc, iso);\n timeMarkers = ['t','[\\\\s\\\\u3000]'].concat(loc['timeMarker']);\n lastIsNumeral = src.match(/\\\\d\\{\\d,\\d\\}\\)+\\??$/);\n addDateInputFormat(loc, '(?:' + time + ')[,\\\\s\\\\u3000]+?' + src, TimeFormat.concat(to), variant);\n addDateInputFormat(loc, src + '(?:[,\\\\s]*(?:' + timeMarkers.join('|') + (lastIsNumeral ? '+' : '*') +')' + time + ')?', to.concat(TimeFormat), variant);\n } else {\n addDateInputFormat(loc, src, to, variant);\n }\n }\n\n };\n\n\n // Localization helpers\n\n function getLocalization(localeCode, fallback) {\n var loc;\n if(!isString(localeCode)) localeCode = '';\n loc = Localizations[localeCode] || Localizations[localeCode.slice(0,2)];\n if(fallback === false && !loc) {\n throw new Error('Invalid locale.');\n }\n return loc || CurrentLocalization;\n }\n\n function setLocalization(localeCode, set) {\n var loc, canAbbreviate;\n\n function initializeField(name) {\n var val = loc[name];\n if(isString(val)) {\n loc[name] = val.split(',');\n } else if(!val) {\n loc[name] = [];\n }\n }\n\n function eachAlternate(str, fn) {\n str = str.split('+').map(function(split) {\n return split.replace(/(.+):(.+)$/, function(full, base, suffixes) {\n return suffixes.split('|').map(function(suffix) {\n return base + suffix;\n }).join('|');\n });\n }).join('|');\n return str.split('|').forEach(fn);\n }\n\n function setArray(name, abbreviate, multiple) {\n var arr = [];\n loc[name].forEach(function(full, i) {\n if(abbreviate) {\n full += '+' + full.slice(0,3);\n }\n eachAlternate(full, function(day, j) {\n arr[j * multiple + i] = day.toLowerCase();\n });\n });\n loc[name] = arr;\n }\n\n function getDigit(start, stop, allowNumbers) {\n var str = '\\\\d{' + start + ',' + stop + '}';\n if(allowNumbers) str += '|(?:' + arrayToAlternates(loc['numbers']) + ')+';\n return str;\n }\n\n function getNum() {\n var arr = ['\\\\d+'].concat(loc['articles']);\n if(loc['numbers']) arr = arr.concat(loc['numbers']);\n return arrayToAlternates(arr);\n }\n\n function setDefault(name, value) {\n loc[name] = loc[name] || value;\n }\n\n function setModifiers() {\n var arr = [];\n loc.modifiersByName = {};\n loc['modifiers'].push({ 'name': 'day', 'src': 'yesterday', 'value': -1 });\n loc['modifiers'].push({ 'name': 'day', 'src': 'today', 'value': 0 });\n loc['modifiers'].push({ 'name': 'day', 'src': 'tomorrow', 'value': 1 });\n loc['modifiers'].forEach(function(modifier) {\n var name = modifier.name;\n eachAlternate(modifier.src, function(t) {\n var locEntry = loc[name];\n loc.modifiersByName[t] = modifier;\n arr.push({ name: name, src: t, value: modifier.value });\n loc[name] = locEntry ? locEntry + '|' + t : t;\n });\n });\n loc['day'] += '|' + arrayToAlternates(loc['weekdays']);\n loc['modifiers'] = arr;\n }\n\n // Initialize the locale\n loc = new Localization(set);\n initializeField('modifiers');\n 'months,weekdays,units,numbers,articles,tokens,timeMarker,ampm,timeSuffixes,dateParse,timeParse'.split(',').forEach(initializeField);\n\n canAbbreviate = !loc['monthSuffix'];\n\n setArray('months', canAbbreviate, 12);\n setArray('weekdays', canAbbreviate, 7);\n setArray('units', false, 8);\n setArray('numbers', false, 10);\n\n setDefault('code', localeCode);\n setDefault('date', getDigit(1,2, loc['digitDate']));\n setDefault('year', \"'\\\\d{2}|\" + getDigit(4,4));\n setDefault('num', getNum());\n\n setModifiers();\n\n if(loc['monthSuffix']) {\n loc['month'] = getDigit(1,2);\n loc['months'] = getRange(1, 12).map(function(n) { return n + loc['monthSuffix']; });\n }\n loc['full_month'] = getDigit(1,2) + '|' + arrayToAlternates(loc['months']);\n\n // The order of these formats is very important. Order is reversed so formats that come\n // later will take precedence over formats that come before. This generally means that\n // more specific formats should come later, however, the {year} format should come before\n // {day}, as 2011 needs to be parsed as a year (2011) and not date (20) + hours (11)\n\n // If the locale has time suffixes then add a time only format for that locale\n // that is separate from the core English-based one.\n if(loc['timeSuffixes'].length > 0) {\n loc.addFormat(prepareTime(RequiredTime, loc), false, TimeFormat)\n }\n\n loc.addFormat('{day}', true);\n loc.addFormat('{month}' + (loc['monthSuffix'] || ''));\n loc.addFormat('{year}' + (loc['yearSuffix'] || ''));\n\n loc['timeParse'].forEach(function(src) {\n loc.addFormat(src, true);\n });\n\n loc['dateParse'].forEach(function(src) {\n loc.addFormat(src);\n });\n\n return Localizations[localeCode] = loc;\n }\n\n\n // General helpers\n\n function addDateInputFormat(locale, format, match, variant) {\n locale.compiledFormats.unshift({\n variant: variant,\n locale: locale,\n reg: regexp('^' + format + '$', 'i'),\n to: match\n });\n }\n\n function simpleCapitalize(str) {\n return str.slice(0,1).toUpperCase() + str.slice(1);\n }\n\n function arrayToAlternates(arr) {\n return arr.filter(function(el) {\n return !!el;\n }).join('|');\n }\n\n // Date argument helpers\n\n function collectDateArguments(args, allowDuration) {\n var obj, arr;\n if(isObject(args[0])) {\n return args;\n } else if (isNumber(args[0]) && !isNumber(args[1])) {\n return [args[0]];\n } else if (isString(args[0]) && allowDuration) {\n return [getDateParamsFromString(args[0]), args[1]];\n }\n obj = {};\n DateArgumentUnits.forEach(function(u,i) {\n obj[u.unit] = args[i];\n });\n return [obj];\n }\n\n function getDateParamsFromString(str, num) {\n var params = {};\n match = str.match(/^(\\d+)?\\s?(\\w+?)s?$/i);\n if(match) {\n if(isUndefined(num)) {\n num = parseInt(match[1]) || 1;\n }\n params[match[2].toLowerCase()] = num;\n }\n return params;\n }\n\n // Date parsing helpers\n\n function getFormatMatch(match, arr) {\n var obj = {}, value, num;\n arr.forEach(function(key, i) {\n value = match[i + 1];\n if(isUndefined(value) || value === '') return;\n if(key === 'year') {\n obj.yearAsString = value.replace(/'/, '');\n }\n num = parseFloat(value.replace(/'/, '').replace(/,/, '.'));\n obj[key] = !isNaN(num) ? num : value.toLowerCase();\n });\n return obj;\n }\n\n function cleanDateInput(str) {\n str = str.trim().replace(/^just (?=now)|\\.+$/i, '');\n return convertAsianDigits(str);\n }\n\n function convertAsianDigits(str) {\n return str.replace(AsianDigitReg, function(full, disallowed, match) {\n var sum = 0, place = 1, lastWasHolder, lastHolder;\n if(disallowed) return full;\n match.split('').reverse().forEach(function(letter) {\n var value = AsianDigitMap[letter], holder = value > 9;\n if(holder) {\n if(lastWasHolder) sum += place;\n place *= value / (lastHolder || 1);\n lastHolder = value;\n } else {\n if(lastWasHolder === false) {\n place *= 10;\n }\n sum += place * value;\n }\n lastWasHolder = holder;\n });\n if(lastWasHolder) sum += place;\n return sum;\n });\n }\n\n function getExtendedDate(f, localeCode, prefer, forceUTC) {\n var d = new date(), relative = false, baseLocalization, loc, format, set, unit, weekday, num, tmp, after;\n\n d.utc(forceUTC);\n\n if(isDate(f)) {\n // If the source here is already a date object, then the operation\n // is the same as cloning the date, which preserves the UTC flag.\n d.utc(f.isUTC()).setTime(f.getTime());\n } else if(isNumber(f)) {\n d.setTime(f);\n } else if(isObject(f)) {\n d.set(f, true);\n set = f;\n } else if(isString(f)) {\n\n // The act of getting the localization will pre-initialize\n // if it is missing and add the required formats.\n baseLocalization = getLocalization(localeCode);\n\n // Clean the input and convert Kanji based numerals if they exist.\n f = cleanDateInput(f);\n\n if(baseLocalization) {\n iterateOverObject(baseLocalization.getFormats(), function(i, dif) {\n var match = f.match(dif.reg);\n if(match) {\n format = dif;\n loc = format.locale;\n set = getFormatMatch(match, format.to, loc);\n\n if(set['utc']) {\n d.utc();\n }\n\n loc.cachedFormat = format;\n\n if(set.timestamp) {\n set = set.timestamp;\n return false;\n }\n\n // If there's a variant (crazy Endian American format), swap the month and day.\n if(format.variant && !isString(set['month']) && (isString(set['date']) || baseLocalization.hasVariant(localeCode))) {\n tmp = set['month'];\n set['month'] = set['date'];\n set['date'] = tmp;\n }\n\n // If the year is 2 digits then get the implied century.\n if(set['year'] && set.yearAsString.length === 2) {\n set['year'] = getYearFromAbbreviation(set['year']);\n }\n\n // Set the month which may be localized.\n if(set['month']) {\n set['month'] = loc.getMonth(set['month']);\n if(set['shift'] && !set['unit']) set['unit'] = loc['units'][7];\n }\n\n // If there is both a weekday and a date, the date takes precedence.\n if(set['weekday'] && set['date']) {\n delete set['weekday'];\n // Otherwise set a localized weekday.\n } else if(set['weekday']) {\n set['weekday'] = loc.getWeekday(set['weekday']);\n if(set['shift'] && !set['unit']) set['unit'] = loc['units'][5];\n }\n\n // Relative day localizations such as \"today\" and \"tomorrow\".\n if(set['day'] && (tmp = loc.modifiersByName[set['day']])) {\n set['day'] = tmp.value;\n d.reset();\n relative = true;\n // If the day is a weekday, then set that instead.\n } else if(set['day'] && (weekday = loc.getWeekday(set['day'])) > -1) {\n delete set['day'];\n if(set['num'] && set['month']) {\n // If we have \"the 2nd tuesday of June\", set the day to the beginning of the month, then\n // look ahead to set the weekday after all other properties have been set. The weekday needs\n // to be set after the actual set because it requires overriding the \"prefer\" argument which\n // could unintentionally send the year into the future, past, etc.\n after = function() {\n var w = d.getWeekday();\n d.setWeekday((7 * (set['num'] - 1)) + (w > weekday ? weekday + 7 : weekday));\n }\n set['day'] = 1;\n } else {\n set['weekday'] = weekday;\n }\n }\n\n if(set['date'] && !isNumber(set['date'])) {\n set['date'] = loc.getNumericDate(set['date']);\n }\n\n // If the time is 1pm-11pm advance the time by 12 hours.\n if(loc.matchPM(set['ampm']) && set['hour'] < 12) {\n set['hour'] += 12;\n } else if(loc.matchAM(set['ampm']) && set['hour'] === 12) {\n set['hour'] = 0;\n }\n\n // Adjust for timezone offset\n if('offset_hours' in set || 'offset_minutes' in set) {\n d.utc();\n set['offset_minutes'] = set['offset_minutes'] || 0;\n set['offset_minutes'] += set['offset_hours'] * 60;\n if(set['offset_sign'] === '-') {\n set['offset_minutes'] *= -1;\n }\n set['minute'] -= set['offset_minutes'];\n }\n\n // Date has a unit like \"days\", \"months\", etc. are all relative to the current date.\n if(set['unit']) {\n relative = true;\n num = loc.getNumber(set['num']);\n unit = loc.getEnglishUnit(set['unit']);\n\n // Shift and unit, ie \"next month\", \"last week\", etc.\n if(set['shift'] || set['edge']) {\n num *= (tmp = loc.modifiersByName[set['shift']]) ? tmp.value : 0;\n\n // Relative month and static date: \"the 15th of last month\"\n if(unit === 'month' && isDefined(set['date'])) {\n d.set({ 'day': set['date'] }, true);\n delete set['date'];\n }\n\n // Relative year and static month/date: \"June 15th of last year\"\n if(unit === 'year' && isDefined(set['month'])) {\n d.set({ 'month': set['month'], 'day': set['date'] }, true);\n delete set['month'];\n delete set['date'];\n }\n }\n // Unit and sign, ie \"months ago\", \"weeks from now\", etc.\n if(set['sign'] && (tmp = loc.modifiersByName[set['sign']])) {\n num *= tmp.value;\n }\n\n // Units can be with non-relative dates, set here. ie \"the day after monday\"\n if(isDefined(set['weekday'])) {\n d.set({'weekday': set['weekday'] }, true);\n delete set['weekday'];\n }\n\n // Finally shift the unit.\n set[unit] = (set[unit] || 0) + num;\n }\n\n if(set['year_sign'] === '-') {\n set['year'] *= -1;\n }\n\n DateUnitsReversed.slice(1,4).forEach(function(u, i) {\n var value = set[u.unit], fraction = value % 1;\n if(fraction) {\n set[DateUnitsReversed[i].unit] = round(fraction * (u.unit === 'second' ? 1000 : 60));\n set[u.unit] = floor(value);\n }\n });\n return false;\n }\n });\n }\n if(!format) {\n // The Date constructor does something tricky like checking the number\n // of arguments so simply passing in undefined won't work.\n if(f !== 'now') {\n d = new date(f);\n }\n if(forceUTC) {\n // Falling back to system date here which cannot be parsed as UTC,\n // so if we're forcing UTC then simply add the offset.\n d.addMinutes(-d.getTimezoneOffset());\n }\n } else if(relative) {\n d.advance(set);\n } else {\n if(d._utc) {\n // UTC times can traverse into other days or even months,\n // so preemtively reset the time here to prevent this.\n d.reset();\n }\n updateDate(d, set, true, false, prefer);\n }\n\n // If there is an \"edge\" it needs to be set after the\n // other fields are set. ie \"the end of February\"\n if(set && set['edge']) {\n tmp = loc.modifiersByName[set['edge']];\n iterateOverObject(DateUnitsReversed.slice(4), function(i, u) {\n if(isDefined(set[u.unit])) {\n unit = u.unit;\n return false;\n }\n });\n if(unit === 'year') set.specificity = 'month';\n else if(unit === 'month' || unit === 'week') set.specificity = 'day';\n d[(tmp.value < 0 ? 'endOf' : 'beginningOf') + simpleCapitalize(unit)]();\n // This value of -2 is arbitrary but it's a nice clean way to hook into this system.\n if(tmp.value === -2) d.reset();\n }\n if(after) {\n after();\n }\n // A date created by parsing a string presumes that the format *itself* is UTC, but\n // not that the date, once created, should be manipulated as such. In other words,\n // if you are creating a date object from a server time \"2012-11-15T12:00:00Z\",\n // in the majority of cases you are using it to create a date that will, after creation,\n // be manipulated as local, so reset the utc flag here.\n d.utc(false);\n }\n return {\n date: d,\n set: set\n }\n }\n\n // If the year is two digits, add the most appropriate century prefix.\n function getYearFromAbbreviation(year) {\n return round(callDateGet(new date(), 'FullYear') / 100) * 100 - round(year / 100) * 100 + year;\n }\n\n function getShortHour(d) {\n var hours = callDateGet(d, 'Hours');\n return hours === 0 ? 12 : hours - (floor(hours / 13) * 12);\n }\n\n // weeksSince won't work here as the result needs to be floored, not rounded.\n function getWeekNumber(date) {\n date = date.clone();\n var dow = callDateGet(date, 'Day') || 7;\n date.addDays(4 - dow).reset();\n return 1 + floor(date.daysSince(date.clone().beginningOfYear()) / 7);\n }\n\n function getAdjustedUnit(ms) {\n var next, ams = math.abs(ms), value = ams, unit = 0;\n DateUnitsReversed.slice(1).forEach(function(u, i) {\n next = floor(round(ams / u.multiplier() * 10) / 10);\n if(next >= 1) {\n value = next;\n unit = i + 1;\n }\n });\n return [value, unit, ms];\n }\n\n function getAdjustedUnitWithMonthFallback(date) {\n var adu = getAdjustedUnit(date.millisecondsFromNow());\n if(adu[1] === 6) {\n // If the adjusted unit is in months, then better to use\n // the \"monthsfromNow\" which applies a special error margin\n // for edge cases such as Jan-09 - Mar-09 being less than\n // 2 months apart (when using a strict numeric definition).\n // The third \"ms\" element in the array will handle the sign\n // (past or future), so simply take the absolute value here.\n adu[0] = math.abs(date.monthsFromNow());\n }\n return adu;\n }\n\n\n // Date formatting helpers\n\n function formatDate(date, format, relative, localeCode) {\n var adu, loc = getLocalization(localeCode), caps = regexp(/^[A-Z]/), value, shortcut;\n if(!date.isValid()) {\n return 'Invalid Date';\n } else if(Date[format]) {\n format = Date[format];\n } else if(isFunction(format)) {\n adu = getAdjustedUnitWithMonthFallback(date);\n format = format.apply(date, adu.concat(loc));\n }\n if(!format && relative) {\n adu = adu || getAdjustedUnitWithMonthFallback(date);\n // Adjust up if time is in ms, as this doesn't\n // look very good for a standard relative date.\n if(adu[1] === 0) {\n adu[1] = 1;\n adu[0] = 1;\n }\n return loc.getRelativeFormat(adu);\n }\n\n format = format || 'long';\n format = loc[format] || format;\n\n DateOutputFormats.forEach(function(dof) {\n format = format.replace(regexp('\\\\{('+dof.token+')(\\\\d)?\\\\}', dof.word ? 'i' : ''), function(m,t,d) {\n var val = dof.format(date, loc, d || 1, t), l = t.length, one = t.match(/^(.)\\1+$/);\n if(dof.word) {\n if(l === 3) val = val.slice(0,3);\n if(one || t.match(caps)) val = simpleCapitalize(val);\n } else if(one && !dof.text) {\n val = (isNumber(val) ? padNumber(val, l) : val.toString()).slice(-l);\n }\n return val;\n });\n });\n return format;\n }\n\n // Date comparison helpers\n\n function compareDate(d, find, buffer, forceUTC) {\n var p, t, min, max, minOffset, maxOffset, override, capitalized, accuracy = 0, loBuffer = 0, hiBuffer = 0;\n p = getExtendedDate(find, null, null, forceUTC);\n if(buffer > 0) {\n loBuffer = hiBuffer = buffer;\n override = true;\n }\n if(!p.date.isValid()) return false;\n if(p.set && p.set.specificity) {\n DateUnits.forEach(function(u, i) {\n if(u.unit === p.set.specificity) {\n accuracy = u.multiplier(p.date, d - p.date) - 1;\n }\n });\n capitalized = simpleCapitalize(p.set.specificity);\n if(p.set['edge'] || p.set['shift']) {\n p.date['beginningOf' + capitalized]();\n }\n if(p.set.specificity === 'month') {\n max = p.date.clone()['endOf' + capitalized]().getTime();\n }\n if(!override && p.set['sign'] && p.set.specificity != 'millisecond') {\n // If the time is relative, there can occasionally be an disparity between the relative date\n // and \"now\", which it is being compared to, so set an extra buffer to account for this.\n loBuffer = 50;\n hiBuffer = -50;\n }\n }\n t = d.getTime();\n min = p.date.getTime();\n max = max || (min + accuracy);\n max = compensateForTimezoneTraversal(d, min, max);\n return t >= (min - loBuffer) && t <= (max + hiBuffer);\n }\n\n function compensateForTimezoneTraversal(d, min, max) {\n var dMin, dMax, minOffset, maxOffset;\n dMin = new Date(min);\n dMax = new Date(max).utc(d.isUTC());\n if(callDateGet(dMax, 'Hours') !== 23) {\n minOffset = dMin.getTimezoneOffset();\n maxOffset = dMax.getTimezoneOffset();\n if(minOffset !== maxOffset) {\n max += (maxOffset - minOffset).minutes();\n }\n }\n return max;\n }\n\n function updateDate(d, params, reset, advance, prefer) {\n var weekday, specificityIndex;\n\n function getParam(key) {\n return isDefined(params[key]) ? params[key] : params[key + 's'];\n }\n\n function paramExists(key) {\n return isDefined(getParam(key));\n }\n\n function uniqueParamExists(key, isDay) {\n return paramExists(key) || (isDay && paramExists('weekday'));\n }\n\n function canDisambiguate() {\n var now = new date;\n return (prefer === -1 && d > now) || (prefer === 1 && d < now);\n }\n\n if(isNumber(params) && advance) {\n // If param is a number and we're advancing, the number is presumed to be milliseconds.\n params = { 'milliseconds': params };\n } else if(isNumber(params)) {\n // Otherwise just set the timestamp and return.\n d.setTime(params);\n return d;\n }\n\n // \"date\" can also be passed for the day\n if(isDefined(params['date'])) {\n params['day'] = params['date'];\n }\n\n // Reset any unit lower than the least specific unit set. Do not do this for weeks\n // or for years. This needs to be performed before the acutal setting of the date\n // because the order needs to be reversed in order to get the lowest specificity,\n // also because higher order units can be overwritten by lower order units, such\n // as setting hour: 3, minute: 345, etc.\n iterateOverObject(DateUnitsReversed, function(i,u) {\n var isDay = u.unit === 'day';\n if(uniqueParamExists(u.unit, isDay)) {\n params.specificity = u.unit;\n specificityIndex = +i;\n return false;\n } else if(reset && u.unit !== 'week' && (!isDay || !paramExists('week'))) {\n // Days are relative to months, not weeks, so don't reset if a week exists.\n callDateSet(d, u.method, (isDay ? 1 : 0));\n }\n });\n\n\n // Now actually set or advance the date in order, higher units first.\n DateUnits.forEach(function(u,i) {\n var unit = u.unit, method = u.method, higherUnit = DateUnits[i - 1], value;\n value = getParam(unit)\n if(isUndefined(value)) return;\n if(advance) {\n if(unit === 'week') {\n value = (params['day'] || 0) + (value * 7);\n method = 'Date';\n }\n value = (value * advance) + callDateGet(d, method);\n } else if(unit === 'month' && paramExists('day')) {\n // When setting the month, there is a chance that we will traverse into a new month.\n // This happens in DST shifts, for example June 1st DST jumping to January 1st\n // (non-DST) will have a shift of -1:00 which will traverse into the previous year.\n // Prevent this by proactively setting the day when we know it will be set again anyway.\n // It can also happen when there are not enough days in the target month. This second\n // situation is identical to checkMonthTraversal below, however when we are advancing\n // we want to reset the date to \"the last date in the target month\". In the case of\n // DST shifts, however, we want to avoid the \"edges\" of months as that is where this\n // unintended traversal can happen. This is the reason for the different handling of\n // two similar but slightly different situations.\n //\n // TL;DR This method avoids the edges of a month IF not advancing and the date is going\n // to be set anyway, while checkMonthTraversal resets the date to the last day if advancing.\n //\n callDateSet(d, 'Date', 15);\n }\n callDateSet(d, method, value);\n if(advance && unit === 'month') {\n checkMonthTraversal(d, value);\n }\n });\n\n\n // If a weekday is included in the params, set it ahead of time and set the params\n // to reflect the updated date so that resetting works properly.\n if(!advance && !paramExists('day') && paramExists('weekday')) {\n var weekday = getParam('weekday'), isAhead, futurePreferred;\n d.setWeekday(weekday);\n }\n\n if(canDisambiguate()) {\n iterateOverObject(DateUnitsReversed.slice(specificityIndex + 1), function(i,u) {\n var ambiguous = u.ambiguous || (u.unit === 'week' && paramExists('weekday'));\n if(ambiguous && !uniqueParamExists(u.unit, u.unit === 'day')) {\n d[u.addMethod](prefer);\n return false;\n }\n });\n }\n return d;\n }\n\n function callDateGet(d, method) {\n return d['get' + (d._utc ? 'UTC' : '') + method]();\n }\n\n function callDateSet(d, method, value) {\n return d['set' + (d._utc && method != 'ISOWeek' ? 'UTC' : '') + method](value);\n }\n\n // The ISO format allows times strung together without a demarcating \":\", so make sure\n // that these markers are now optional.\n function prepareTime(format, loc, iso) {\n var timeSuffixMapping = {'h':0,'m':1,'s':2}, add;\n loc = loc || English;\n return format.replace(/{([a-z])}/g, function(full, token) {\n var separators = [],\n isHours = token === 'h',\n tokenIsRequired = isHours && !iso;\n if(token === 't') {\n return loc['ampm'].join('|');\n } else {\n if(isHours) {\n separators.push(':');\n }\n if(add = loc['timeSuffixes'][timeSuffixMapping[token]]) {\n separators.push(add + '\\\\s*');\n }\n return separators.length === 0 ? '' : '(?:' + separators.join('|') + ')' + (tokenIsRequired ? '' : '?');\n }\n });\n }\n\n\n // If the month is being set, then we don't want to accidentally\n // traverse into a new month just because the target month doesn't have enough\n // days. In other words, \"5 months ago\" from July 30th is still February, even\n // though there is no February 30th, so it will of necessity be February 28th\n // (or 29th in the case of a leap year).\n\n function checkMonthTraversal(date, targetMonth) {\n if(targetMonth < 0) {\n targetMonth = targetMonth % 12 + 12;\n }\n if(targetMonth % 12 != callDateGet(date, 'Month')) {\n callDateSet(date, 'Date', 0);\n }\n }\n\n function createDate(args, prefer, forceUTC) {\n var f, localeCode;\n if(isNumber(args[1])) {\n // If the second argument is a number, then we have an enumerated constructor type as in \"new Date(2003, 2, 12);\"\n f = collectDateArguments(args)[0];\n } else {\n f = args[0];\n localeCode = args[1];\n }\n return getExtendedDate(f, localeCode, prefer, forceUTC).date;\n }\n\n function buildDateUnits() {\n DateUnitsReversed = DateUnits.concat().reverse();\n DateArgumentUnits = DateUnits.concat();\n DateArgumentUnits.splice(2,1);\n }\n\n\n /***\n * @method [units]Since([d], [locale] = currentLocale)\n * @returns Number\n * @short Returns the time since [d] in the appropriate unit.\n * @extra [d] will accept a date object, timestamp, or text format. If not specified, [d] is assumed to be now. [locale] can be passed to specify the locale that the date is in. %[unit]Ago% is provided as an alias to make this more readable when [d] is assumed to be the current date. For more see @date_format.\n *\n * @set\n * millisecondsSince\n * secondsSince\n * minutesSince\n * hoursSince\n * daysSince\n * weeksSince\n * monthsSince\n * yearsSince\n *\n * @example\n *\n * Date.create().millisecondsSince('1 hour ago') -> 3,600,000\n * Date.create().daysSince('1 week ago') -> 7\n * Date.create().yearsSince('15 years ago') -> 15\n * Date.create('15 years ago').yearsAgo() -> 15\n *\n ***\n * @method [units]Ago()\n * @returns Number\n * @short Returns the time ago in the appropriate unit.\n *\n * @set\n * millisecondsAgo\n * secondsAgo\n * minutesAgo\n * hoursAgo\n * daysAgo\n * weeksAgo\n * monthsAgo\n * yearsAgo\n *\n * @example\n *\n * Date.create('last year').millisecondsAgo() -> 3,600,000\n * Date.create('last year').daysAgo() -> 7\n * Date.create('last year').yearsAgo() -> 15\n *\n ***\n * @method [units]Until([d], [locale] = currentLocale)\n * @returns Number\n * @short Returns the time until [d] in the appropriate unit.\n * @extra [d] will accept a date object, timestamp, or text format. If not specified, [d] is assumed to be now. [locale] can be passed to specify the locale that the date is in. %[unit]FromNow% is provided as an alias to make this more readable when [d] is assumed to be the current date. For more see @date_format.\n *\n * @set\n * millisecondsUntil\n * secondsUntil\n * minutesUntil\n * hoursUntil\n * daysUntil\n * weeksUntil\n * monthsUntil\n * yearsUntil\n *\n * @example\n *\n * Date.create().millisecondsUntil('1 hour from now') -> 3,600,000\n * Date.create().daysUntil('1 week from now') -> 7\n * Date.create().yearsUntil('15 years from now') -> 15\n * Date.create('15 years from now').yearsFromNow() -> 15\n *\n ***\n * @method [units]FromNow()\n * @returns Number\n * @short Returns the time from now in the appropriate unit.\n *\n * @set\n * millisecondsFromNow\n * secondsFromNow\n * minutesFromNow\n * hoursFromNow\n * daysFromNow\n * weeksFromNow\n * monthsFromNow\n * yearsFromNow\n *\n * @example\n *\n * Date.create('next year').millisecondsFromNow() -> 3,600,000\n * Date.create('next year').daysFromNow() -> 7\n * Date.create('next year').yearsFromNow() -> 15\n *\n ***\n * @method add[Units](, [reset] = false)\n * @returns Date\n * @short Adds of the unit to the date. If [reset] is true, all lower units will be reset.\n * @extra Note that \"months\" is ambiguous as a unit of time. If the target date falls on a day that does not exist (ie. August 31 -> February 31), the date will be shifted to the last day of the month. Don't use %addMonths% if you need precision.\n *\n * @set\n * addMilliseconds\n * addSeconds\n * addMinutes\n * addHours\n * addDays\n * addWeeks\n * addMonths\n * addYears\n *\n * @example\n *\n * Date.create().addMilliseconds(5) -> current time + 5 milliseconds\n * Date.create().addDays(5) -> current time + 5 days\n * Date.create().addYears(5) -> current time + 5 years\n *\n ***\n * @method isLast[Unit]()\n * @returns Boolean\n * @short Returns true if the date is last week/month/year.\n *\n * @set\n * isLastWeek\n * isLastMonth\n * isLastYear\n *\n * @example\n *\n * Date.create('yesterday').isLastWeek() -> true or false?\n * Date.create('yesterday').isLastMonth() -> probably not...\n * Date.create('yesterday').isLastYear() -> even less likely...\n *\n ***\n * @method isThis[Unit]()\n * @returns Boolean\n * @short Returns true if the date is this week/month/year.\n *\n * @set\n * isThisWeek\n * isThisMonth\n * isThisYear\n *\n * @example\n *\n * Date.create('tomorrow').isThisWeek() -> true or false?\n * Date.create('tomorrow').isThisMonth() -> probably...\n * Date.create('tomorrow').isThisYear() -> signs point to yes...\n *\n ***\n * @method isNext[Unit]()\n * @returns Boolean\n * @short Returns true if the date is next week/month/year.\n *\n * @set\n * isNextWeek\n * isNextMonth\n * isNextYear\n *\n * @example\n *\n * Date.create('tomorrow').isNextWeek() -> true or false?\n * Date.create('tomorrow').isNextMonth() -> probably not...\n * Date.create('tomorrow').isNextYear() -> even less likely...\n *\n ***\n * @method beginningOf[Unit]()\n * @returns Date\n * @short Sets the date to the beginning of the appropriate unit.\n *\n * @set\n * beginningOfDay\n * beginningOfWeek\n * beginningOfMonth\n * beginningOfYear\n *\n * @example\n *\n * Date.create().beginningOfDay() -> the beginning of today (resets the time)\n * Date.create().beginningOfWeek() -> the beginning of the week\n * Date.create().beginningOfMonth() -> the beginning of the month\n * Date.create().beginningOfYear() -> the beginning of the year\n *\n ***\n * @method endOf[Unit]()\n * @returns Date\n * @short Sets the date to the end of the appropriate unit.\n *\n * @set\n * endOfDay\n * endOfWeek\n * endOfMonth\n * endOfYear\n *\n * @example\n *\n * Date.create().endOfDay() -> the end of today (sets the time to 23:59:59.999)\n * Date.create().endOfWeek() -> the end of the week\n * Date.create().endOfMonth() -> the end of the month\n * Date.create().endOfYear() -> the end of the year\n *\n ***/\n\n function buildDateMethods() {\n extendSimilar(date, true, false, DateUnits, function(methods, u, i) {\n var unit = u.unit, caps = simpleCapitalize(unit), multiplier = u.multiplier(), since, until;\n u.addMethod = 'add' + caps + 's';\n // \"since/until now\" only count \"past\" an integer, i.e. \"2 days ago\" is\n // anything between 2 - 2.999 days. The default margin of error is 0.999,\n // but \"months\" have an inherently larger margin, as the number of days\n // in a given month may be significantly less than the number of days in\n // the average month, so for example \"30 days\" before March 15 may in fact\n // be 1 month ago. Years also have a margin of error due to leap years,\n // but this is roughly 0.999 anyway (365 / 365.25). Other units do not\n // technically need the error margin applied to them but this accounts\n // for discrepancies like (15).hoursAgo() which technically creates the\n // current date first, then creates a date 15 hours before and compares\n // them, the discrepancy between the creation of the 2 dates means that\n // they may actually be 15.0001 hours apart. Milliseconds don't have\n // fractions, so they won't be subject to this error margin.\n function applyErrorMargin(ms) {\n var num = ms / multiplier,\n fraction = num % 1,\n error = u.error || 0.999;\n if(fraction && math.abs(fraction % 1) > error) {\n num = round(num);\n }\n return parseInt(num);\n }\n since = function(f, localeCode) {\n return applyErrorMargin(this.getTime() - date.create(f, localeCode).getTime());\n };\n until = function(f, localeCode) {\n return applyErrorMargin(date.create(f, localeCode).getTime() - this.getTime());\n };\n methods[unit+'sAgo'] = until;\n methods[unit+'sUntil'] = until;\n methods[unit+'sSince'] = since;\n methods[unit+'sFromNow'] = since;\n methods[u.addMethod] = function(num, reset) {\n var set = {};\n set[unit] = num;\n return this.advance(set, reset);\n };\n buildNumberToDateAlias(u, multiplier);\n if(i < 3) {\n ['Last','This','Next'].forEach(function(shift) {\n methods['is' + shift + caps] = function() {\n return this.is(shift + ' ' + unit);\n };\n });\n }\n if(i < 4) {\n methods['beginningOf' + caps] = function() {\n var set = {};\n switch(unit) {\n case 'year': set['year'] = callDateGet(this, 'FullYear'); break;\n case 'month': set['month'] = callDateGet(this, 'Month'); break;\n case 'day': set['day'] = callDateGet(this, 'Date'); break;\n case 'week': set['weekday'] = 0; break;\n }\n return this.set(set, true);\n };\n methods['endOf' + caps] = function() {\n var set = { 'hours': 23, 'minutes': 59, 'seconds': 59, 'milliseconds': 999 };\n switch(unit) {\n case 'year': set['month'] = 11; set['day'] = 31; break;\n case 'month': set['day'] = this.daysInMonth(); break;\n case 'week': set['weekday'] = 6; break;\n }\n return this.set(set, true);\n };\n }\n });\n }\n\n function buildCoreInputFormats() {\n English.addFormat('([+-])?(\\\\d{4,4})[-.]?{full_month}[-.]?(\\\\d{1,2})?', true, ['year_sign','year','month','date'], false, true);\n English.addFormat('(\\\\d{1,2})[-.\\\\/]{full_month}(?:[-.\\\\/](\\\\d{2,4}))?', true, ['date','month','year'], true);\n English.addFormat('{full_month}[-.](\\\\d{4,4})', false, ['month','year']);\n English.addFormat('\\\\/Date\\\\((\\\\d+(?:\\\\+\\\\d{4,4})?)\\\\)\\\\/', false, ['timestamp'])\n English.addFormat(prepareTime(RequiredTime, English), false, TimeFormat)\n\n // When a new locale is initialized it will have the CoreDateFormats initialized by default.\n // From there, adding new formats will push them in front of the previous ones, so the core\n // formats will be the last to be reached. However, the core formats themselves have English\n // months in them, which means that English needs to first be initialized and creates a race\n // condition. I'm getting around this here by adding these generalized formats in the order\n // specific -> general, which will mean they will be added to the English localization in\n // general -> specific order, then chopping them off the front and reversing to get the correct\n // order. Note that there are 7 formats as 2 have times which adds a front and a back format.\n CoreDateFormats = English.compiledFormats.slice(0,7).reverse();\n English.compiledFormats = English.compiledFormats.slice(7).concat(CoreDateFormats);\n }\n\n function buildDateOutputShortcuts() {\n extendSimilar(date, true, false, 'short,long,full', function(methods, name) {\n methods[name] = function(localeCode) {\n return formatDate(this, name, false, localeCode);\n }\n });\n }\n\n function buildAsianDigits() {\n KanjiDigits.split('').forEach(function(digit, value) {\n var holder;\n if(value > 9) {\n value = math.pow(10, value - 9);\n }\n AsianDigitMap[digit] = value;\n });\n FullWidthDigits.split('').forEach(function(digit, value) {\n AsianDigitMap[digit] = value;\n });\n // Kanji numerals may also be included in phrases which are text-based rather\n // than actual numbers such as Chinese weekdays (上周三), and \"the day before\n // yesterday\" (一昨日) in Japanese, so don't match these.\n AsianDigitReg = regexp('([期週周])?([' + KanjiDigits + FullWidthDigits + ']+)(?!昨)', 'g');\n }\n\n /***\n * @method is[Day]()\n * @returns Boolean\n * @short Returns true if the date falls on that day.\n * @extra Also available: %isYesterday%, %isToday%, %isTomorrow%, %isWeekday%, and %isWeekend%.\n *\n * @set\n * isToday\n * isYesterday\n * isTomorrow\n * isWeekday\n * isWeekend\n * isSunday\n * isMonday\n * isTuesday\n * isWednesday\n * isThursday\n * isFriday\n * isSaturday\n *\n * @example\n *\n * Date.create('tomorrow').isToday() -> false\n * Date.create('thursday').isTomorrow() -> ?\n * Date.create('yesterday').isWednesday() -> ?\n * Date.create('today').isWeekend() -> ?\n *\n ***\n * @method isFuture()\n * @returns Boolean\n * @short Returns true if the date is in the future.\n * @example\n *\n * Date.create('next week').isFuture() -> true\n * Date.create('last week').isFuture() -> false\n *\n ***\n * @method isPast()\n * @returns Boolean\n * @short Returns true if the date is in the past.\n * @example\n *\n * Date.create('last week').isPast() -> true\n * Date.create('next week').isPast() -> false\n *\n ***/\n function buildRelativeAliases() {\n var special = 'today,yesterday,tomorrow,weekday,weekend,future,past'.split(',');\n var weekdays = English['weekdays'].slice(0,7);\n var months = English['months'].slice(0,12);\n extendSimilar(date, true, false, special.concat(weekdays).concat(months), function(methods, name) {\n methods['is'+ simpleCapitalize(name)] = function(utc) {\n return this.is(name, 0, utc);\n };\n });\n }\n\n function buildUTCAliases() {\n date.extend({\n 'utc': {\n\n 'create': function() {\n return createDate(arguments, 0, true);\n },\n\n 'past': function() {\n return createDate(arguments, -1, true);\n },\n\n 'future': function() {\n return createDate(arguments, 1, true);\n }\n\n }\n }, false, false);\n }\n\n function setDateProperties() {\n date.extend({\n 'RFC1123': '{Dow}, {dd} {Mon} {yyyy} {HH}:{mm}:{ss} {tz}',\n 'RFC1036': '{Weekday}, {dd}-{Mon}-{yy} {HH}:{mm}:{ss} {tz}',\n 'ISO8601_DATE': '{yyyy}-{MM}-{dd}',\n 'ISO8601_DATETIME': '{yyyy}-{MM}-{dd}T{HH}:{mm}:{ss}.{fff}{isotz}'\n }, false, false);\n }\n\n\n date.extend({\n\n /***\n * @method Date.create(, [locale] = currentLocale)\n * @returns Date\n * @short Alternate Date constructor which understands many different text formats, a timestamp, or another date.\n * @extra If no argument is given, date is assumed to be now. %Date.create% additionally can accept enumerated parameters as with the standard date constructor. [locale] can be passed to specify the locale that the date is in. When unspecified, the current locale (default is English) is assumed. UTC-based dates can be created through the %utc% object. For more see @date_format.\n * @set\n * Date.utc.create\n *\n * @example\n *\n * Date.create('July') -> July of this year\n * Date.create('1776') -> 1776\n * Date.create('today') -> today\n * Date.create('wednesday') -> This wednesday\n * Date.create('next friday') -> Next friday\n * Date.create('July 4, 1776') -> July 4, 1776\n * Date.create(-446806800000) -> November 5, 1955\n * Date.create(1776, 6, 4) -> July 4, 1776\n * Date.create('1776年07月04日', 'ja') -> July 4, 1776\n * Date.utc.create('July 4, 1776', 'en') -> July 4, 1776\n *\n ***/\n 'create': function() {\n return createDate(arguments);\n },\n\n /***\n * @method Date.past(, [locale] = currentLocale)\n * @returns Date\n * @short Alternate form of %Date.create% with any ambiguity assumed to be the past.\n * @extra For example %\"Sunday\"% can be either \"the Sunday coming up\" or \"the Sunday last\" depending on context. Note that dates explicitly in the future (\"next Sunday\") will remain in the future. This method simply provides a hint when ambiguity exists. UTC-based dates can be created through the %utc% object. For more, see @date_format.\n * @set\n * Date.utc.past\n * @example\n *\n * Date.past('July') -> July of this year or last depending on the current month\n * Date.past('Wednesday') -> This wednesday or last depending on the current weekday\n *\n ***/\n 'past': function() {\n return createDate(arguments, -1);\n },\n\n /***\n * @method Date.future(, [locale] = currentLocale)\n * @returns Date\n * @short Alternate form of %Date.create% with any ambiguity assumed to be the future.\n * @extra For example %\"Sunday\"% can be either \"the Sunday coming up\" or \"the Sunday last\" depending on context. Note that dates explicitly in the past (\"last Sunday\") will remain in the past. This method simply provides a hint when ambiguity exists. UTC-based dates can be created through the %utc% object. For more, see @date_format.\n * @set\n * Date.utc.future\n *\n * @example\n *\n * Date.future('July') -> July of this year or next depending on the current month\n * Date.future('Wednesday') -> This wednesday or next depending on the current weekday\n *\n ***/\n 'future': function() {\n return createDate(arguments, 1);\n },\n\n /***\n * @method Date.addLocale(, )\n * @returns Locale\n * @short Adds a locale to the locales understood by Sugar.\n * @extra For more see @date_format.\n *\n ***/\n 'addLocale': function(localeCode, set) {\n return setLocalization(localeCode, set);\n },\n\n /***\n * @method Date.setLocale()\n * @returns Locale\n * @short Sets the current locale to be used with dates.\n * @extra Sugar has support for 13 locales that are available through the \"Date Locales\" package. In addition you can define a new locale with %Date.addLocale%. For more see @date_format.\n *\n ***/\n 'setLocale': function(localeCode, set) {\n var loc = getLocalization(localeCode, false);\n CurrentLocalization = loc;\n // The code is allowed to be more specific than the codes which are required:\n // i.e. zh-CN or en-US. Currently this only affects US date variants such as 8/10/2000.\n if(localeCode && localeCode != loc['code']) {\n loc['code'] = localeCode;\n }\n return loc;\n },\n\n /***\n * @method Date.getLocale([code] = current)\n * @returns Locale\n * @short Gets the locale for the given code, or the current locale.\n * @extra The resulting locale object can be manipulated to provide more control over date localizations. For more about locales, see @date_format.\n *\n ***/\n 'getLocale': function(localeCode) {\n return !localeCode ? CurrentLocalization : getLocalization(localeCode, false);\n },\n\n /**\n * @method Date.addFormat(, , [code] = null)\n * @returns Nothing\n * @short Manually adds a new date input format.\n * @extra This method allows fine grained control for alternate formats. is a string that can have regex tokens inside. is an array of the tokens that each regex capturing group will map to, for example %year%, %date%, etc. For more, see @date_format.\n *\n **/\n 'addFormat': function(format, match, localeCode) {\n addDateInputFormat(getLocalization(localeCode), format, match);\n }\n\n }, false, false);\n\n date.extend({\n\n /***\n * @method set(, [reset] = false)\n * @returns Date\n * @short Sets the date object.\n * @extra This method can accept multiple formats including a single number as a timestamp, an object, or enumerated parameters (as with the Date constructor). If [reset] is %true%, any units more specific than those passed will be reset.\n *\n * @example\n *\n * new Date().set({ year: 2011, month: 11, day: 31 }) -> December 31, 2011\n * new Date().set(2011, 11, 31) -> December 31, 2011\n * new Date().set(86400000) -> 1 day after Jan 1, 1970\n * new Date().set({ year: 2004, month: 6 }, true) -> June 1, 2004, 00:00:00.000\n *\n ***/\n 'set': function() {\n var args = collectDateArguments(arguments);\n return updateDate(this, args[0], args[1])\n },\n\n /***\n * @method setWeekday()\n * @returns Nothing\n * @short Sets the weekday of the date.\n * @extra In order to maintain a parallel with %getWeekday% (which itself is an alias for Javascript native %getDay%), Sunday is considered day %0%. This contrasts with ISO-8601 standard (used in %getISOWeek% and %setISOWeek%) which places Sunday at the end of the week (day 7). This effectively means that passing %0% to this method while in the middle of a week will rewind the date, where passing %7% will advance it.\n *\n * @example\n *\n * d = new Date(); d.setWeekday(1); d; -> Monday of this week\n * d = new Date(); d.setWeekday(6); d; -> Saturday of this week\n *\n ***/\n 'setWeekday': function(dow) {\n if(isUndefined(dow)) return;\n return callDateSet(this, 'Date', callDateGet(this, 'Date') + dow - callDateGet(this, 'Day'));\n },\n\n /***\n * @method setISOWeek()\n * @returns Nothing\n * @short Sets the week (of the year) as defined by the ISO-8601 standard.\n * @extra Note that this standard places Sunday at the end of the week (day 7).\n *\n * @example\n *\n * d = new Date(); d.setISOWeek(15); d; -> 15th week of the year\n *\n ***/\n 'setISOWeek': function(week) {\n var weekday = callDateGet(this, 'Day') || 7;\n if(isUndefined(week)) return;\n this.set({ 'month': 0, 'date': 4 });\n this.set({ 'weekday': 1 });\n if(week > 1) {\n this.addWeeks(week - 1);\n }\n if(weekday !== 1) {\n this.advance({ 'days': weekday - 1 });\n }\n return this.getTime();\n },\n\n /***\n * @method getISOWeek()\n * @returns Number\n * @short Gets the date's week (of the year) as defined by the ISO-8601 standard.\n * @extra Note that this standard places Sunday at the end of the week (day 7). If %utc% is set on the date, the week will be according to UTC time.\n *\n * @example\n *\n * new Date().getISOWeek() -> today's week of the year\n *\n ***/\n 'getISOWeek': function() {\n return getWeekNumber(this);\n },\n\n /***\n * @method getUTCOffset([iso])\n * @returns String\n * @short Returns a string representation of the offset from UTC time. If [iso] is true the offset will be in ISO8601 format.\n * @example\n *\n * new Date().getUTCOffset() -> \"+0900\"\n * new Date().getUTCOffset(true) -> \"+09:00\"\n *\n ***/\n 'getUTCOffset': function(iso) {\n var offset = this._utc ? 0 : this.getTimezoneOffset();\n var colon = iso === true ? ':' : '';\n if(!offset && iso) return 'Z';\n return padNumber(floor(-offset / 60), 2, true) + colon + padNumber(math.abs(offset % 60), 2);\n },\n\n /***\n * @method utc([on] = true)\n * @returns Date\n * @short Sets the internal utc flag for the date. When on, UTC-based methods will be called internally.\n * @extra For more see @date_format.\n * @example\n *\n * new Date().utc(true)\n * new Date().utc(false)\n *\n ***/\n 'utc': function(set) {\n defineProperty(this, '_utc', set === true || arguments.length === 0);\n return this;\n },\n\n /***\n * @method isUTC()\n * @returns Boolean\n * @short Returns true if the date has no timezone offset.\n * @extra This will also return true for utc-based dates (dates that have the %utc% method set true). Note that even if the utc flag is set, %getTimezoneOffset% will always report the same thing as Javascript always reports that based on the environment's locale.\n * @example\n *\n * new Date().isUTC() -> true or false?\n * new Date().utc(true).isUTC() -> true\n *\n ***/\n 'isUTC': function() {\n return !!this._utc || this.getTimezoneOffset() === 0;\n },\n\n /***\n * @method advance(, [reset] = false)\n * @returns Date\n * @short Sets the date forward.\n * @extra This method can accept multiple formats including an object, a string in the format %3 days%, a single number as milliseconds, or enumerated parameters (as with the Date constructor). If [reset] is %true%, any units more specific than those passed will be reset. For more see @date_format.\n * @example\n *\n * new Date().advance({ year: 2 }) -> 2 years in the future\n * new Date().advance('2 days') -> 2 days in the future\n * new Date().advance(0, 2, 3) -> 2 months 3 days in the future\n * new Date().advance(86400000) -> 1 day in the future\n *\n ***/\n 'advance': function() {\n var args = collectDateArguments(arguments, true);\n return updateDate(this, args[0], args[1], 1);\n },\n\n /***\n * @method rewind(, [reset] = false)\n * @returns Date\n * @short Sets the date back.\n * @extra This method can accept multiple formats including a single number as a timestamp, an object, or enumerated parameters (as with the Date constructor). If [reset] is %true%, any units more specific than those passed will be reset. For more see @date_format.\n * @example\n *\n * new Date().rewind({ year: 2 }) -> 2 years in the past\n * new Date().rewind(0, 2, 3) -> 2 months 3 days in the past\n * new Date().rewind(86400000) -> 1 day in the past\n *\n ***/\n 'rewind': function() {\n var args = collectDateArguments(arguments, true);\n return updateDate(this, args[0], args[1], -1);\n },\n\n /***\n * @method isValid()\n * @returns Boolean\n * @short Returns true if the date is valid.\n * @example\n *\n * new Date().isValid() -> true\n * new Date('flexor').isValid() -> false\n *\n ***/\n 'isValid': function() {\n return !isNaN(this.getTime());\n },\n\n /***\n * @method isAfter(, [margin] = 0)\n * @returns Boolean\n * @short Returns true if the date is after the .\n * @extra [margin] is to allow extra margin of error (in ms). will accept a date object, timestamp, or text format. If not specified, is assumed to be now. See @date_format for more.\n * @example\n *\n * new Date().isAfter('tomorrow') -> false\n * new Date().isAfter('yesterday') -> true\n *\n ***/\n 'isAfter': function(d, margin, utc) {\n return this.getTime() > date.create(d).getTime() - (margin || 0);\n },\n\n /***\n * @method isBefore(, [margin] = 0)\n * @returns Boolean\n * @short Returns true if the date is before .\n * @extra [margin] is to allow extra margin of error (in ms). will accept a date object, timestamp, or text format. If not specified, is assumed to be now. See @date_format for more.\n * @example\n *\n * new Date().isBefore('tomorrow') -> true\n * new Date().isBefore('yesterday') -> false\n *\n ***/\n 'isBefore': function(d, margin) {\n return this.getTime() < date.create(d).getTime() + (margin || 0);\n },\n\n /***\n * @method isBetween(, , [margin] = 0)\n * @returns Boolean\n * @short Returns true if the date falls between and .\n * @extra [margin] is to allow extra margin of error (in ms). and will accept a date object, timestamp, or text format. If not specified, they are assumed to be now. See @date_format for more.\n * @example\n *\n * new Date().isBetween('yesterday', 'tomorrow') -> true\n * new Date().isBetween('last year', '2 years ago') -> false\n *\n ***/\n 'isBetween': function(d1, d2, margin) {\n var t = this.getTime();\n var t1 = date.create(d1).getTime();\n var t2 = date.create(d2).getTime();\n var lo = math.min(t1, t2);\n var hi = math.max(t1, t2);\n margin = margin || 0;\n return (lo - margin < t) && (hi + margin > t);\n },\n\n /***\n * @method isLeapYear()\n * @returns Boolean\n * @short Returns true if the date is a leap year.\n * @example\n *\n * Date.create('2000').isLeapYear() -> true\n *\n ***/\n 'isLeapYear': function() {\n var year = callDateGet(this, 'FullYear');\n return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);\n },\n\n /***\n * @method daysInMonth()\n * @returns Number\n * @short Returns the number of days in the date's month.\n * @example\n *\n * Date.create('May').daysInMonth() -> 31\n * Date.create('February, 2000').daysInMonth() -> 29\n *\n ***/\n 'daysInMonth': function() {\n return 32 - callDateGet(new date(callDateGet(this, 'FullYear'), callDateGet(this, 'Month'), 32), 'Date');\n },\n\n /***\n * @method format(, [locale] = currentLocale)\n * @returns String\n * @short Formats and outputs the date.\n * @extra can be a number of pre-determined formats or a string of tokens. Locale-specific formats are %short%, %long%, and %full% which have their own aliases and can be called with %date.short()%, etc. If is not specified the %long% format is assumed. [locale] specifies a locale code to use (if not specified the current locale is used). See @date_format for more details.\n *\n * @set\n * short\n * long\n * full\n *\n * @example\n *\n * Date.create().format() -> ex. July 4, 2003\n * Date.create().format('{Weekday} {d} {Month}, {yyyy}') -> ex. Monday July 4, 2003\n * Date.create().format('{hh}:{mm}') -> ex. 15:57\n * Date.create().format('{12hr}:{mm}{tt}') -> ex. 3:57pm\n * Date.create().format(Date.ISO8601_DATETIME) -> ex. 2011-07-05 12:24:55.528Z\n * Date.create('last week').format('short', 'ja') -> ex. 先週\n * Date.create('yesterday').format(function(value,unit,ms,loc) {\n * // value = 1, unit = 3, ms = -86400000, loc = [current locale object]\n * }); -> ex. 1 day ago\n *\n ***/\n 'format': function(f, localeCode) {\n return formatDate(this, f, false, localeCode);\n },\n\n /***\n * @method relative([fn], [locale] = currentLocale)\n * @returns String\n * @short Returns a relative date string offset to the current time.\n * @extra [fn] can be passed to provide for more granular control over the resulting string. [fn] is passed 4 arguments: the adjusted value, unit, offset in milliseconds, and a localization object. As an alternate syntax, [locale] can also be passed as the first (and only) parameter. For more, see @date_format.\n * @example\n *\n * Date.create('90 seconds ago').relative() -> 1 minute ago\n * Date.create('January').relative() -> ex. 5 months ago\n * Date.create('January').relative('ja') -> 3ヶ月前\n * Date.create('120 minutes ago').relative(function(val,unit,ms,loc) {\n * // value = 2, unit = 3, ms = -7200, loc = [current locale object]\n * }); -> ex. 5 months ago\n *\n ***/\n 'relative': function(f, localeCode) {\n if(isString(f)) {\n localeCode = f;\n f = null;\n }\n return formatDate(this, f, true, localeCode);\n },\n\n /***\n * @method is(, [margin] = 0)\n * @returns Boolean\n * @short Returns true if the date is .\n * @extra will accept a date object, timestamp, or text format. %is% additionally understands more generalized expressions like month/weekday names, 'today', etc, and compares to the precision implied in . [margin] allows an extra margin of error in milliseconds. For more, see @date_format.\n * @example\n *\n * Date.create().is('July') -> true or false?\n * Date.create().is('1776') -> false\n * Date.create().is('today') -> true\n * Date.create().is('weekday') -> true or false?\n * Date.create().is('July 4, 1776') -> false\n * Date.create().is(-6106093200000) -> false\n * Date.create().is(new Date(1776, 6, 4)) -> false\n *\n ***/\n 'is': function(d, margin, utc) {\n var tmp, comp;\n if(!this.isValid()) return;\n if(isString(d)) {\n d = d.trim().toLowerCase();\n comp = this.clone().utc(utc);\n switch(true) {\n case d === 'future': return this.getTime() > new date().getTime();\n case d === 'past': return this.getTime() < new date().getTime();\n case d === 'weekday': return callDateGet(comp, 'Day') > 0 && callDateGet(comp, 'Day') < 6;\n case d === 'weekend': return callDateGet(comp, 'Day') === 0 || callDateGet(comp, 'Day') === 6;\n case (tmp = English['weekdays'].indexOf(d) % 7) > -1: return callDateGet(comp, 'Day') === tmp;\n case (tmp = English['months'].indexOf(d) % 12) > -1: return callDateGet(comp, 'Month') === tmp;\n }\n }\n return compareDate(this, d, margin, utc);\n },\n\n /***\n * @method reset([unit] = 'hours')\n * @returns Date\n * @short Resets the unit passed and all smaller units. Default is \"hours\", effectively resetting the time.\n * @example\n *\n * Date.create().reset('day') -> Beginning of today\n * Date.create().reset('month') -> 1st of the month\n *\n ***/\n 'reset': function(unit) {\n var params = {}, recognized;\n unit = unit || 'hours';\n if(unit === 'date') unit = 'days';\n recognized = DateUnits.some(function(u) {\n return unit === u.unit || unit === u.unit + 's';\n });\n params[unit] = unit.match(/^days?/) ? 1 : 0;\n return recognized ? this.set(params, true) : this;\n },\n\n /***\n * @method clone()\n * @returns Date\n * @short Clones the date.\n * @example\n *\n * Date.create().clone() -> Copy of now\n *\n ***/\n 'clone': function() {\n var d = new date(this.getTime());\n d.utc(!!this._utc);\n return d;\n }\n\n });\n\n\n // Instance aliases\n date.extend({\n\n /***\n * @method iso()\n * @alias toISOString\n *\n ***/\n 'iso': function() {\n return this.toISOString();\n },\n\n /***\n * @method getWeekday()\n * @returns Number\n * @short Alias for %getDay%.\n * @set\n * getUTCWeekday\n *\n * @example\n *\n + Date.create().getWeekday(); -> (ex.) 3\n + Date.create().getUTCWeekday(); -> (ex.) 3\n *\n ***/\n 'getWeekday': date.prototype.getDay,\n 'getUTCWeekday': date.prototype.getUTCDay\n\n });\n\n\n\n /***\n * Number module\n *\n ***/\n\n /***\n * @method [unit]()\n * @returns Number\n * @short Takes the number as a corresponding unit of time and converts to milliseconds.\n * @extra Method names can be both singular and plural. Note that as \"a month\" is ambiguous as a unit of time, %months% will be equivalent to 30.4375 days, the average number in a month. Be careful using %months% if you need exact precision.\n *\n * @set\n * millisecond\n * milliseconds\n * second\n * seconds\n * minute\n * minutes\n * hour\n * hours\n * day\n * days\n * week\n * weeks\n * month\n * months\n * year\n * years\n *\n * @example\n *\n * (5).milliseconds() -> 5\n * (10).hours() -> 36000000\n * (1).day() -> 86400000\n *\n ***\n * @method [unit]Before([d], [locale] = currentLocale)\n * @returns Date\n * @short Returns a date that is units before [d], where is the number.\n * @extra [d] will accept a date object, timestamp, or text format. Note that \"months\" is ambiguous as a unit of time. If the target date falls on a day that does not exist (ie. August 31 -> February 31), the date will be shifted to the last day of the month. Be careful using %monthsBefore% if you need exact precision. See @date_format for more.\n *\n * @set\n * millisecondBefore\n * millisecondsBefore\n * secondBefore\n * secondsBefore\n * minuteBefore\n * minutesBefore\n * hourBefore\n * hoursBefore\n * dayBefore\n * daysBefore\n * weekBefore\n * weeksBefore\n * monthBefore\n * monthsBefore\n * yearBefore\n * yearsBefore\n *\n * @example\n *\n * (5).daysBefore('tuesday') -> 5 days before tuesday of this week\n * (1).yearBefore('January 23, 1997') -> January 23, 1996\n *\n ***\n * @method [unit]Ago()\n * @returns Date\n * @short Returns a date that is units ago.\n * @extra Note that \"months\" is ambiguous as a unit of time. If the target date falls on a day that does not exist (ie. August 31 -> February 31), the date will be shifted to the last day of the month. Be careful using %monthsAgo% if you need exact precision.\n *\n * @set\n * millisecondAgo\n * millisecondsAgo\n * secondAgo\n * secondsAgo\n * minuteAgo\n * minutesAgo\n * hourAgo\n * hoursAgo\n * dayAgo\n * daysAgo\n * weekAgo\n * weeksAgo\n * monthAgo\n * monthsAgo\n * yearAgo\n * yearsAgo\n *\n * @example\n *\n * (5).weeksAgo() -> 5 weeks ago\n * (1).yearAgo() -> January 23, 1996\n *\n ***\n * @method [unit]After([d], [locale] = currentLocale)\n * @returns Date\n * @short Returns a date units after [d], where is the number.\n * @extra [d] will accept a date object, timestamp, or text format. Note that \"months\" is ambiguous as a unit of time. If the target date falls on a day that does not exist (ie. August 31 -> February 31), the date will be shifted to the last day of the month. Be careful using %monthsAfter% if you need exact precision. See @date_format for more.\n *\n * @set\n * millisecondAfter\n * millisecondsAfter\n * secondAfter\n * secondsAfter\n * minuteAfter\n * minutesAfter\n * hourAfter\n * hoursAfter\n * dayAfter\n * daysAfter\n * weekAfter\n * weeksAfter\n * monthAfter\n * monthsAfter\n * yearAfter\n * yearsAfter\n *\n * @example\n *\n * (5).daysAfter('tuesday') -> 5 days after tuesday of this week\n * (1).yearAfter('January 23, 1997') -> January 23, 1998\n *\n ***\n * @method [unit]FromNow()\n * @returns Date\n * @short Returns a date units from now.\n * @extra Note that \"months\" is ambiguous as a unit of time. If the target date falls on a day that does not exist (ie. August 31 -> February 31), the date will be shifted to the last day of the month. Be careful using %monthsFromNow% if you need exact precision.\n *\n * @set\n * millisecondFromNow\n * millisecondsFromNow\n * secondFromNow\n * secondsFromNow\n * minuteFromNow\n * minutesFromNow\n * hourFromNow\n * hoursFromNow\n * dayFromNow\n * daysFromNow\n * weekFromNow\n * weeksFromNow\n * monthFromNow\n * monthsFromNow\n * yearFromNow\n * yearsFromNow\n *\n * @example\n *\n * (5).weeksFromNow() -> 5 weeks ago\n * (1).yearFromNow() -> January 23, 1998\n *\n ***/\n function buildNumberToDateAlias(u, multiplier) {\n var unit = u.unit, methods = {};\n function base() { return round(this * multiplier); }\n function after() { return createDate(arguments)[u.addMethod](this); }\n function before() { return createDate(arguments)[u.addMethod](-this); }\n methods[unit] = base;\n methods[unit + 's'] = base;\n methods[unit + 'Before'] = before;\n methods[unit + 'sBefore'] = before;\n methods[unit + 'Ago'] = before;\n methods[unit + 'sAgo'] = before;\n methods[unit + 'After'] = after;\n methods[unit + 'sAfter'] = after;\n methods[unit + 'FromNow'] = after;\n methods[unit + 'sFromNow'] = after;\n number.extend(methods);\n }\n\n number.extend({\n\n /***\n * @method duration([locale] = currentLocale)\n * @returns String\n * @short Takes the number as milliseconds and returns a unit-adjusted localized string.\n * @extra This method is the same as %Date#relative% without the localized equivalent of \"from now\" or \"ago\". [locale] can be passed as the first (and only) parameter. Note that this method is only available when the dates package is included.\n * @example\n *\n * (500).duration() -> '500 milliseconds'\n * (1200).duration() -> '1 second'\n * (75).minutes().duration() -> '1 hour'\n * (75).minutes().duration('es') -> '1 hora'\n *\n ***/\n 'duration': function(localeCode) {\n return getLocalization(localeCode).getDuration(this);\n }\n\n });\n\n\n English = CurrentLocalization = date.addLocale('en', {\n 'plural': true,\n 'timeMarker': 'at',\n 'ampm': 'am,pm',\n 'months': 'January,February,March,April,May,June,July,August,September,October,November,December',\n 'weekdays': 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday',\n 'units': 'millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s',\n 'numbers': 'one,two,three,four,five,six,seven,eight,nine,ten',\n 'articles': 'a,an,the',\n 'tokens': 'the,st|nd|rd|th,of',\n 'short': '{Month} {d}, {yyyy}',\n 'long': '{Month} {d}, {yyyy} {h}:{mm}{tt}',\n 'full': '{Weekday} {Month} {d}, {yyyy} {h}:{mm}:{ss}{tt}',\n 'past': '{num} {unit} {sign}',\n 'future': '{num} {unit} {sign}',\n 'duration': '{num} {unit}',\n 'modifiers': [\n { 'name': 'sign', 'src': 'ago|before', 'value': -1 },\n { 'name': 'sign', 'src': 'from now|after|from|in|later', 'value': 1 },\n { 'name': 'edge', 'src': 'last day', 'value': -2 },\n { 'name': 'edge', 'src': 'end', 'value': -1 },\n { 'name': 'edge', 'src': 'first day|beginning', 'value': 1 },\n { 'name': 'shift', 'src': 'last', 'value': -1 },\n { 'name': 'shift', 'src': 'the|this', 'value': 0 },\n { 'name': 'shift', 'src': 'next', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{month} {year}',\n '{shift} {unit=5-7}',\n '{0?} {date}{1}',\n '{0?} {edge} of {shift?} {unit=4-7?}{month?}{year?}'\n ],\n 'timeParse': [\n '{0} {num}{1} {day} of {month} {year?}',\n '{weekday?} {month} {date}{1?} {year?}',\n '{date} {month} {year}',\n '{date} {month}',\n '{shift} {weekday}',\n '{shift} week {weekday}',\n '{weekday} {2?} {shift} week',\n '{num} {unit=4-5} {sign} {day}',\n '{0?} {date}{1} of {month}',\n '{0?}{month?} {date?}{1?} of {shift} {unit=6-7}'\n ]\n });\n\n buildDateUnits();\n buildDateMethods();\n buildCoreInputFormats();\n buildDateOutputShortcuts();\n buildAsianDigits();\n buildRelativeAliases();\n buildUTCAliases();\n setDateProperties();\n\n\n /***\n * @package DateRange\n * @dependency date\n * @description Date Ranges define a range of time. They can enumerate over specific points within that range, and be manipulated and compared.\n *\n ***/\n\n var DateRange = function(start, end) {\n this.start = date.create(start);\n this.end = date.create(end);\n };\n\n // 'toString' doesn't appear in a for..in loop in IE even though\n // hasOwnProperty reports true, so extend() can't be used here.\n // Also tried simply setting the prototype = {} up front for all\n // methods but GCC very oddly started dropping properties in the\n // object randomly (maybe because of the global scope?) hence\n // the need for the split logic here.\n DateRange.prototype.toString = function() {\n /***\n * @method toString()\n * @returns String\n * @short Returns a string representation of the DateRange.\n * @example\n *\n * Date.range('2003', '2005').toString() -> January 1, 2003..January 1, 2005\n *\n ***/\n return this.isValid() ? this.start.full() + '..' + this.end.full() : 'Invalid DateRange';\n };\n\n extend(DateRange, true, false, {\n\n /***\n * @method isValid()\n * @returns Boolean\n * @short Returns true if the DateRange is valid, false otherwise.\n * @example\n *\n * Date.range('2003', '2005').isValid() -> true\n * Date.range('2005', '2003').isValid() -> false\n *\n ***/\n 'isValid': function() {\n return this.start < this.end;\n },\n\n /***\n * @method duration()\n * @returns Number\n * @short Return the duration of the DateRange in milliseconds.\n * @example\n *\n * Date.range('2003', '2005').duration() -> 94694400000\n *\n ***/\n 'duration': function() {\n return this.isValid() ? this.end.getTime() - this.start.getTime() : NaN;\n },\n\n /***\n * @method contains()\n * @returns Boolean\n * @short Returns true if is contained inside the DateRange. may be a date or another DateRange.\n * @example\n *\n * Date.range('2003', '2005').contains(Date.create('2004')) -> true\n *\n ***/\n 'contains': function(obj) {\n var self = this, arr = obj.start && obj.end ? [obj.start, obj.end] : [obj];\n return arr.every(function(d) {\n return d >= self.start && d <= self.end;\n });\n },\n\n /***\n * @method every(, [fn])\n * @returns Array\n * @short Iterates through the DateRange for every , calling [fn] if it is passed. Returns an array of each increment visited.\n * @extra When is a number, increments will be to the exact millisecond. can also be a string in the format %{number} {unit}s%, in which case it will increment in the unit specified. Note that a discrepancy exists in the case of months, as %(2).months()% is an approximation. Stepping through the actual months by passing %\"2 months\"% is usually preferable in this case.\n * @example\n *\n * Date.range('2003-01', '2003-03').every(\"2 months\") -> [...]\n *\n ***/\n 'every': function(increment, fn) {\n var current = this.start.clone(), result = [], index = 0, params, isDay;\n if(isString(increment)) {\n current.advance(getDateParamsFromString(increment, 0), true);\n params = getDateParamsFromString(increment);\n isDay = increment.toLowerCase() === 'day';\n } else {\n params = { 'milliseconds': increment };\n }\n while(current <= this.end) {\n result.push(current);\n if(fn) fn(current, index);\n if(isDay && callDateGet(current, 'Hours') === 23) {\n // When DST traversal happens at 00:00 hours, the time is effectively\n // pushed back to 23:00, meaning 1) 00:00 for that day does not exist,\n // and 2) there is no difference between 23:00 and 00:00, as you are\n // \"jumping\" around in time. Hours here will be reset before the date\n // is advanced and the date will never in fact advance, so set the hours\n // directly ahead to the next day to avoid this problem.\n current = current.clone();\n callDateSet(current, 'Hours', 48);\n } else {\n current = current.clone().advance(params, true);\n }\n index++;\n }\n return result;\n },\n\n /***\n * @method union()\n * @returns DateRange\n * @short Returns a new DateRange with the earliest starting point as its start, and the latest ending point as its end. If the two ranges do not intersect this will effectively remove the \"gap\" between them.\n * @example\n *\n * Date.range('2003=01', '2005-01').union(Date.range('2004-01', '2006-01')) -> Jan 1, 2003..Jan 1, 2006\n *\n ***/\n 'union': function(range) {\n return new DateRange(\n this.start < range.start ? this.start : range.start,\n this.end > range.end ? this.end : range.end\n );\n },\n\n /***\n * @method intersect()\n * @returns DateRange\n * @short Returns a new DateRange with the latest starting point as its start, and the earliest ending point as its end. If the two ranges do not intersect this will effectively produce an invalid range.\n * @example\n *\n * Date.range('2003-01', '2005-01').intersect(Date.range('2004-01', '2006-01')) -> Jan 1, 2004..Jan 1, 2005\n *\n ***/\n 'intersect': function(range) {\n return new DateRange(\n this.start > range.start ? this.start : range.start,\n this.end < range.end ? this.end : range.end\n );\n },\n\n /***\n * @method clone()\n * @returns DateRange\n * @short Clones the DateRange.\n * @example\n *\n * Date.range('2003-01', '2005-01').intersect(Date.range('2004-01', '2006-01')) -> Jan 1, 2004..Jan 1, 2005\n *\n ***/\n 'clone': function(range) {\n return new DateRange(this.start, this.end);\n }\n\n });\n\n /***\n * @method each[Unit]([fn])\n * @returns Date\n * @short Increments through the date range for each [unit], calling [fn] if it is passed. Returns an array of each increment visited.\n *\n * @set\n * eachMillisecond\n * eachSecond\n * eachMinute\n * eachHour\n * eachDay\n * eachWeek\n * eachMonth\n * eachYear\n *\n * @example\n *\n * Date.range('2003-01', '2003-02').eachMonth() -> [...]\n * Date.range('2003-01-15', '2003-01-16').eachDay() -> [...]\n *\n ***/\n extendSimilar(DateRange, true, false, 'Millisecond,Second,Minute,Hour,Day,Week,Month,Year', function(methods, name) {\n methods['each' + name] = function(fn) { return this.every(name, fn); }\n });\n\n\n /***\n * Date module\n ***/\n\n extend(date, false, false, {\n\n /***\n * @method Date.range([start], [end])\n * @returns DateRange\n * @short Creates a new date range.\n * @extra If either [start] or [end] are null, they will default to the current date.\n *\n ***/\n 'range': function(start, end) {\n return new DateRange(start, end);\n }\n\n });\n\n\n /***\n * @package Function\n * @dependency core\n * @description Lazy, throttled, and memoized functions, delayed functions and handling of timers, argument currying.\n *\n ***/\n\n function setDelay(fn, ms, after, scope, args) {\n var index;\n // Delay of infinity is never called of course...\n if(ms === Infinity) return;\n if(!fn.timers) fn.timers = [];\n if(!isNumber(ms)) ms = 0;\n fn.timers.push(setTimeout(function(){\n fn.timers.splice(index, 1);\n after.apply(scope, args || []);\n }, ms));\n index = fn.timers.length;\n }\n\n extend(Function, true, false, {\n\n /***\n * @method lazy([ms] = 1, [limit] = Infinity)\n * @returns Function\n * @short Creates a lazy function that, when called repeatedly, will queue execution and wait [ms] milliseconds to execute again.\n * @extra Lazy functions will always execute as many times as they are called up to [limit], after which point subsequent calls will be ignored (if it is set to a finite number). Compare this to %throttle%, which will execute only once per [ms] milliseconds. %lazy% is useful when you need to be sure that every call to a function is executed, but in a non-blocking manner. Calling %cancel% on a lazy function will clear the entire queue. Note that [ms] can also be a fraction.\n * @example\n *\n * (function() {\n * // Executes immediately.\n * }).lazy()();\n * (3).times(function() {\n * // Executes 3 times, with each execution 20ms later than the last.\n * }.lazy(20));\n * (100).times(function() {\n * // Executes 50 times, with each execution 20ms later than the last.\n * }.lazy(20, 50));\n *\n ***/\n 'lazy': function(ms, limit) {\n var fn = this, queue = [], lock = false, execute, rounded, perExecution, result;\n ms = ms || 1;\n limit = limit || Infinity;\n rounded = ceil(ms);\n perExecution = round(rounded / ms) || 1;\n execute = function() {\n if(lock || queue.length == 0) return;\n // Allow fractions of a millisecond by calling\n // multiple times per actual timeout execution\n var max = math.max(queue.length - perExecution, 0);\n while(queue.length > max) {\n // Getting uber-meta here...\n result = Function.prototype.apply.apply(fn, queue.shift());\n }\n setDelay(lazy, rounded, function() {\n lock = false;\n execute();\n });\n lock = true;\n }\n function lazy() {\n // The first call is immediate, so having 1 in the queue\n // implies two calls have already taken place.\n if(!lock || queue.length < limit - 1) {\n queue.push([this, arguments]);\n execute();\n }\n // Return the memoized result\n return result;\n }\n return lazy;\n },\n\n /***\n * @method delay([ms] = 0, [arg1], ...)\n * @returns Function\n * @short Executes the function after milliseconds.\n * @extra Returns a reference to itself. %delay% is also a way to execute non-blocking operations that will wait until the CPU is free. Delayed functions can be canceled using the %cancel% method. Can also curry arguments passed in after .\n * @example\n *\n * (function(arg1) {\n * // called 1s later\n * }).delay(1000, 'arg1');\n *\n ***/\n 'delay': function(ms) {\n var fn = this;\n var args = multiArgs(arguments).slice(1);\n setDelay(fn, ms, fn, fn, args);\n return fn;\n },\n\n /***\n * @method throttle()\n * @returns Function\n * @short Creates a \"throttled\" version of the function that will only be executed once per milliseconds.\n * @extra This is functionally equivalent to calling %lazy% with a [limit] of %1%. %throttle% is appropriate when you want to make sure a function is only executed at most once for a given duration. Compare this to %lazy%, which will queue rapid calls and execute them later.\n * @example\n *\n * (3).times(function() {\n * // called only once. will wait 50ms until it responds again\n * }.throttle(50));\n *\n ***/\n 'throttle': function(ms) {\n return this.lazy(ms, 1);\n },\n\n /***\n * @method debounce()\n * @returns Function\n * @short Creates a \"debounced\" function that postpones its execution until after milliseconds have passed.\n * @extra This method is useful to execute a function after things have \"settled down\". A good example of this is when a user tabs quickly through form fields, execution of a heavy operation should happen after a few milliseconds when they have \"settled\" on a field.\n * @example\n *\n * var fn = (function(arg1) {\n * // called once 50ms later\n * }).debounce(50); fn() fn() fn();\n *\n ***/\n 'debounce': function(ms) {\n var fn = this;\n function debounced() {\n debounced.cancel();\n setDelay(debounced, ms, fn, this, arguments);\n };\n return debounced;\n },\n\n /***\n * @method cancel()\n * @returns Function\n * @short Cancels a delayed function scheduled to be run.\n * @extra %delay%, %lazy%, %throttle%, and %debounce% can all set delays.\n * @example\n *\n * (function() {\n * alert('hay'); // Never called\n * }).delay(500).cancel();\n *\n ***/\n 'cancel': function() {\n if(isArray(this.timers)) {\n while(this.timers.length > 0) {\n clearTimeout(this.timers.shift());\n }\n }\n return this;\n },\n\n /***\n * @method after([num] = 1)\n * @returns Function\n * @short Creates a function that will execute after [num] calls.\n * @extra %after% is useful for running a final callback after a series of asynchronous operations, when the order in which the operations will complete is unknown.\n * @example\n *\n * var fn = (function() {\n * // Will be executed once only\n * }).after(3); fn(); fn(); fn();\n *\n ***/\n 'after': function(num) {\n var fn = this, counter = 0, storedArguments = [];\n if(!isNumber(num)) {\n num = 1;\n } else if(num === 0) {\n fn.call();\n return fn;\n }\n return function() {\n var ret;\n storedArguments.push(multiArgs(arguments));\n counter++;\n if(counter == num) {\n ret = fn.call(this, storedArguments);\n counter = 0;\n storedArguments = [];\n return ret;\n }\n }\n },\n\n /***\n * @method once()\n * @returns Function\n * @short Creates a function that will execute only once and store the result.\n * @extra %once% is useful for creating functions that will cache the result of an expensive operation and use it on subsequent calls. Also it can be useful for creating initialization functions that only need to be run once.\n * @example\n *\n * var fn = (function() {\n * // Will be executed once only\n * }).once(); fn(); fn(); fn();\n *\n ***/\n 'once': function() {\n return this.throttle(Infinity);\n },\n\n /***\n * @method fill(, , ...)\n * @returns Function\n * @short Returns a new version of the function which when called will have some of its arguments pre-emptively filled in, also known as \"currying\".\n * @extra Arguments passed to a \"filled\" function are generally appended to the curried arguments. However, if %undefined% is passed as any of the arguments to %fill%, it will be replaced, when the \"filled\" function is executed. This allows currying of arguments even when they occur toward the end of an argument list (the example demonstrates this much more clearly).\n * @example\n *\n * var delayOneSecond = setTimeout.fill(undefined, 1000);\n * delayOneSecond(function() {\n * // Will be executed 1s later\n * });\n *\n ***/\n 'fill': function() {\n var fn = this, curried = multiArgs(arguments);\n return function() {\n var args = multiArgs(arguments);\n curried.forEach(function(arg, index) {\n if(arg != null || index >= args.length) args.splice(index, 0, arg);\n });\n return fn.apply(this, args);\n }\n }\n\n\n });\n\n\n /***\n * @package Number\n * @dependency core\n * @description Number formatting, rounding (with precision), and ranges. Aliases to Math methods.\n *\n ***/\n\n\n function abbreviateNumber(num, roundTo, str, mid, limit, bytes) {\n var fixed = num.toFixed(20),\n decimalPlace = fixed.search(/\\./),\n numeralPlace = fixed.search(/[1-9]/),\n significant = decimalPlace - numeralPlace,\n unit, i, divisor;\n if(significant > 0) {\n significant -= 1;\n }\n i = math.max(math.min((significant / 3).floor(), limit === false ? str.length : limit), -mid);\n unit = str.charAt(i + mid - 1);\n if(significant < -9) {\n i = -3;\n roundTo = significant.abs() - 9;\n unit = str.slice(0,1);\n }\n divisor = bytes ? (2).pow(10 * i) : (10).pow(i * 3);\n return (num / divisor).round(roundTo || 0).format() + unit.trim();\n }\n\n\n extend(number, false, false, {\n\n /***\n * @method Number.random([n1], [n2])\n * @returns Number\n * @short Returns a random integer between [n1] and [n2].\n * @extra If only 1 number is passed, the other will be 0. If none are passed, the number will be either 0 or 1.\n * @example\n *\n * Number.random(50, 100) -> ex. 85\n * Number.random(50) -> ex. 27\n * Number.random() -> ex. 0\n *\n ***/\n 'random': function(n1, n2) {\n var min, max;\n if(arguments.length == 1) n2 = n1, n1 = 0;\n min = math.min(n1 || 0, isUndefined(n2) ? 1 : n2);\n max = math.max(n1 || 0, isUndefined(n2) ? 1 : n2) + 1;\n return floor((math.random() * (max - min)) + min);\n }\n\n });\n\n extend(number, true, false, {\n\n /***\n * @method log( = Math.E)\n * @returns Number\n * @short Returns the logarithm of the number with base , or natural logarithm of the number if is undefined.\n * @example\n *\n * (64).log(2) -> 6\n * (9).log(3) -> 2\n * (5).log() -> 1.6094379124341003\n *\n ***/\n\n 'log': function(base) {\n return math.log(this) / (base ? math.log(base) : 1);\n },\n\n /***\n * @method abbr([precision] = 0)\n * @returns String\n * @short Returns an abbreviated form of the number.\n * @extra [precision] will round to the given precision.\n * @example\n *\n * (1000).abbr() -> \"1k\"\n * (1000000).abbr() -> \"1m\"\n * (1280).abbr(1) -> \"1.3k\"\n *\n ***/\n 'abbr': function(precision) {\n return abbreviateNumber(this, precision, 'kmbt', 0, 4);\n },\n\n /***\n * @method metric([precision] = 0, [limit] = 1)\n * @returns String\n * @short Returns the number as a string in metric notation.\n * @extra [precision] will round to the given precision. Both very large numbers and very small numbers are supported. [limit] is the upper limit for the units. The default is %1%, which is \"kilo\". If [limit] is %false%, the upper limit will be \"exa\". The lower limit is \"nano\", and cannot be changed.\n * @example\n *\n * (1000).metric() -> \"1k\"\n * (1000000).metric() -> \"1,000k\"\n * (1000000).metric(0, false) -> \"1M\"\n * (1249).metric(2) + 'g' -> \"1.25kg\"\n * (0.025).metric() + 'm' -> \"25mm\"\n *\n ***/\n 'metric': function(precision, limit) {\n return abbreviateNumber(this, precision, 'nμm kMGTPE', 4, isUndefined(limit) ? 1 : limit);\n },\n\n /***\n * @method bytes([precision] = 0, [limit] = 4)\n * @returns String\n * @short Returns an abbreviated form of the number, considered to be \"Bytes\".\n * @extra [precision] will round to the given precision. [limit] is the upper limit for the units. The default is %4%, which is \"terabytes\" (TB). If [limit] is %false%, the upper limit will be \"exa\".\n * @example\n *\n * (1000).bytes() -> \"1kB\"\n * (1000).bytes(2) -> \"0.98kB\"\n * ((10).pow(20)).bytes() -> \"90,949,470TB\"\n * ((10).pow(20)).bytes(0, false) -> \"87EB\"\n *\n ***/\n 'bytes': function(precision, limit) {\n return abbreviateNumber(this, precision, 'kMGTPE', 0, isUndefined(limit) ? 4 : limit, true) + 'B';\n },\n\n /***\n * @method isInteger()\n * @returns Boolean\n * @short Returns true if the number has no trailing decimal.\n * @example\n *\n * (420).isInteger() -> true\n * (4.5).isInteger() -> false\n *\n ***/\n 'isInteger': function() {\n return this % 1 == 0;\n },\n\n /***\n * @method isOdd()\n * @returns Boolean\n * @short Returns true if the number is odd.\n * @example\n *\n * (3).isOdd() -> true\n * (18).isOdd() -> false\n *\n ***/\n 'isOdd': function() {\n return !isNaN(this) && !this.isMultipleOf(2);\n },\n\n /***\n * @method isEven()\n * @returns Boolean\n * @short Returns true if the number is even.\n * @example\n *\n * (6).isEven() -> true\n * (17).isEven() -> false\n *\n ***/\n 'isEven': function() {\n return this.isMultipleOf(2);\n },\n\n /***\n * @method isMultipleOf()\n * @returns Boolean\n * @short Returns true if the number is a multiple of .\n * @example\n *\n * (6).isMultipleOf(2) -> true\n * (17).isMultipleOf(2) -> false\n * (32).isMultipleOf(4) -> true\n * (34).isMultipleOf(4) -> false\n *\n ***/\n 'isMultipleOf': function(num) {\n return this % num === 0;\n },\n\n\n /***\n * @method format([place] = 0, [thousands] = ',', [decimal] = '.')\n * @returns String\n * @short Formats the number to a readable string.\n * @extra If [place] is %undefined%, will automatically determine the place. [thousands] is the character used for the thousands separator. [decimal] is the character used for the decimal point.\n * @example\n *\n * (56782).format() -> '56,782'\n * (56782).format(2) -> '56,782.00'\n * (4388.43).format(2, ' ') -> '4 388.43'\n * (4388.43).format(2, '.', ',') -> '4.388,43'\n *\n ***/\n 'format': function(place, thousands, decimal) {\n var i, str, split, integer, fraction, result = '';\n if(isUndefined(thousands)) {\n thousands = ',';\n }\n if(isUndefined(decimal)) {\n decimal = '.';\n }\n str = (isNumber(place) ? round(this, place || 0).toFixed(math.max(place, 0)) : this.toString()).replace(/^-/, '');\n split = str.split('.');\n integer = split[0];\n fraction = split[1];\n for(i = integer.length; i > 0; i -= 3) {\n if(i < integer.length) {\n result = thousands + result;\n }\n result = integer.slice(math.max(0, i - 3), i) + result;\n }\n if(fraction) {\n result += decimal + repeatString((place || 0) - fraction.length, '0') + fraction;\n }\n return (this < 0 ? '-' : '') + result;\n },\n\n /***\n * @method hex([pad] = 1)\n * @returns String\n * @short Converts the number to hexidecimal.\n * @extra [pad] will pad the resulting string to that many places.\n * @example\n *\n * (255).hex() -> 'ff';\n * (255).hex(4) -> '00ff';\n * (23654).hex() -> '5c66';\n *\n ***/\n 'hex': function(pad) {\n return this.pad(pad || 1, false, 16);\n },\n\n /***\n * @method upto(, [fn], [step] = 1)\n * @returns Array\n * @short Returns an array containing numbers from the number up to .\n * @extra Optionally calls [fn] callback for each number in that array. [step] allows multiples greater than 1.\n * @example\n *\n * (2).upto(6) -> [2, 3, 4, 5, 6]\n * (2).upto(6, function(n) {\n * // This function is called 5 times receiving n as the value.\n * });\n * (2).upto(8, null, 2) -> [2, 4, 6, 8]\n *\n ***/\n 'upto': function(num, fn, step) {\n return getRange(this, num, fn, step || 1);\n },\n\n /***\n * @method downto(, [fn], [step] = 1)\n * @returns Array\n * @short Returns an array containing numbers from the number down to .\n * @extra Optionally calls [fn] callback for each number in that array. [step] allows multiples greater than 1.\n * @example\n *\n * (8).downto(3) -> [8, 7, 6, 5, 4, 3]\n * (8).downto(3, function(n) {\n * // This function is called 6 times receiving n as the value.\n * });\n * (8).downto(2, null, 2) -> [8, 6, 4, 2]\n *\n ***/\n 'downto': function(num, fn, step) {\n return getRange(this, num, fn, -(step || 1));\n },\n\n /***\n * @method times()\n * @returns Number\n * @short Calls a number of times equivalent to the number.\n * @example\n *\n * (8).times(function(i) {\n * // This function is called 8 times.\n * });\n *\n ***/\n 'times': function(fn) {\n if(fn) {\n for(var i = 0; i < this; i++) {\n fn.call(this, i);\n }\n }\n return this.toNumber();\n },\n\n /***\n * @method chr()\n * @returns String\n * @short Returns a string at the code point of the number.\n * @example\n *\n * (65).chr() -> \"A\"\n * (75).chr() -> \"K\"\n *\n ***/\n 'chr': function() {\n return string.fromCharCode(this);\n },\n\n /***\n * @method pad( = 0, [sign] = false, [base] = 10)\n * @returns String\n * @short Pads a number with \"0\" to .\n * @extra [sign] allows you to force the sign as well (+05, etc). [base] can change the base for numeral conversion.\n * @example\n *\n * (5).pad(2) -> '05'\n * (-5).pad(4) -> '-0005'\n * (82).pad(3, true) -> '+082'\n *\n ***/\n 'pad': function(place, sign, base) {\n return padNumber(this, place, sign, base);\n },\n\n /***\n * @method ordinalize()\n * @returns String\n * @short Returns an ordinalized (English) string, i.e. \"1st\", \"2nd\", etc.\n * @example\n *\n * (1).ordinalize() -> '1st';\n * (2).ordinalize() -> '2nd';\n * (8).ordinalize() -> '8th';\n *\n ***/\n 'ordinalize': function() {\n var suffix, num = this.abs(), last = parseInt(num.toString().slice(-2));\n return this + getOrdinalizedSuffix(last);\n },\n\n /***\n * @method toNumber()\n * @returns Number\n * @short Returns a number. This is mostly for compatibility reasons.\n * @example\n *\n * (420).toNumber() -> 420\n *\n ***/\n 'toNumber': function() {\n return parseFloat(this, 10);\n }\n\n });\n\n /***\n * @method round( = 0)\n * @returns Number\n * @short Shortcut for %Math.round% that also allows a .\n *\n * @example\n *\n * (3.241).round() -> 3\n * (-3.841).round() -> -4\n * (3.241).round(2) -> 3.24\n * (3748).round(-2) -> 3800\n *\n ***\n * @method ceil( = 0)\n * @returns Number\n * @short Shortcut for %Math.ceil% that also allows a .\n *\n * @example\n *\n * (3.241).ceil() -> 4\n * (-3.241).ceil() -> -3\n * (3.241).ceil(2) -> 3.25\n * (3748).ceil(-2) -> 3800\n *\n ***\n * @method floor( = 0)\n * @returns Number\n * @short Shortcut for %Math.floor% that also allows a .\n *\n * @example\n *\n * (3.241).floor() -> 3\n * (-3.841).floor() -> -4\n * (3.241).floor(2) -> 3.24\n * (3748).floor(-2) -> 3700\n *\n ***\n * @method [math]()\n * @returns Number\n * @short Math related functions are mapped as shortcuts to numbers and are identical. Note that %Number#log% provides some special defaults.\n *\n * @set\n * abs\n * sin\n * asin\n * cos\n * acos\n * tan\n * atan\n * sqrt\n * exp\n * pow\n *\n * @example\n *\n * (3).pow(3) -> 27\n * (-3).abs() -> 3\n * (1024).sqrt() -> 32\n *\n ***/\n\n function buildNumber() {\n extendSimilar(number, true, false, 'round,floor,ceil', function(methods, name) {\n methods[name] = function(precision) {\n return round(this, precision, name);\n }\n });\n extendSimilar(number, true, false, 'abs,pow,sin,asin,cos,acos,tan,atan,exp,pow,sqrt', function(methods, name) {\n methods[name] = function(a, b) {\n return math[name](this, a, b);\n }\n });\n }\n\n buildNumber();\n\n /***\n * @package Object\n * @dependency core\n * @description Object manipulation, type checking (isNumber, isString, ...), extended objects with hash-like methods available as instance methods.\n *\n * Much thanks to kangax for his informative aricle about how problems with instanceof and constructor\n * http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/\n *\n ***/\n\n var ObjectTypeMethods = 'isObject,isNaN'.split(',');\n var ObjectHashMethods = 'keys,values,select,reject,each,merge,clone,equal,watch,tap,has,toQueryString'.split(',');\n\n function setParamsObject(obj, param, value, deep) {\n var reg = /^(.+?)(\\[.*\\])$/, paramIsArray, match, allKeys, key;\n if(deep !== false && (match = param.match(reg))) {\n key = match[1];\n allKeys = match[2].replace(/^\\[|\\]$/g, '').split('][');\n allKeys.forEach(function(k) {\n paramIsArray = !k || k.match(/^\\d+$/);\n if(!key && isArray(obj)) key = obj.length;\n if(!hasOwnProperty(obj, key)) {\n obj[key] = paramIsArray ? [] : {};\n }\n obj = obj[key];\n key = k;\n });\n if(!key && paramIsArray) key = obj.length.toString();\n setParamsObject(obj, key, value);\n } else if(value.match(/^[+-]?\\d+(\\.\\d+)?$/)) {\n obj[param] = parseFloat(value);\n } else if(value === 'true') {\n obj[param] = true;\n } else if(value === 'false') {\n obj[param] = false;\n } else {\n obj[param] = value;\n }\n }\n\n function objectToQueryString(base, obj) {\n var tmp;\n // If a custom toString exists bail here and use that instead\n if(isArray(obj) || (isObject(obj) && obj.toString === internalToString)) {\n tmp = [];\n iterateOverObject(obj, function(key, value) {\n if(base) {\n key = base + '[' + key + ']';\n }\n tmp.push(objectToQueryString(key, value));\n });\n return tmp.join('&');\n } else {\n if(!base) return '';\n return sanitizeURIComponent(base) + '=' + (isDate(obj) ? obj.getTime() : sanitizeURIComponent(obj));\n }\n }\n\n function sanitizeURIComponent(obj) {\n // undefined, null, and NaN are represented as a blank string,\n // while false and 0 are stringified. \"+\" is allowed in query string\n return !obj && obj !== false && obj !== 0 ? '' : encodeURIComponent(obj).replace(/%20/g, '+');\n }\n\n function matchKey(key, match) {\n if(isRegExp(match)) {\n return match.test(key);\n } else if(isObjectPrimitive(match)) {\n return hasOwnProperty(match, key);\n } else {\n return key === string(match);\n }\n }\n\n function selectFromObject(obj, args, select) {\n var result = {}, match;\n iterateOverObject(obj, function(key, value) {\n match = false;\n flattenedArgs(args, function(arg) {\n if(matchKey(key, arg)) {\n match = true;\n }\n }, 1);\n if(match === select) {\n result[key] = value;\n }\n });\n return result;\n }\n\n\n /***\n * @method Object.is[Type]()\n * @returns Boolean\n * @short Returns true if is an object of that type.\n * @extra %isObject% will return false on anything that is not an object literal, including instances of inherited classes. Note also that %isNaN% will ONLY return true if the object IS %NaN%. It does not mean the same as browser native %isNaN%, which returns true for anything that is \"not a number\".\n *\n * @set\n * isArray\n * isObject\n * isBoolean\n * isDate\n * isFunction\n * isNaN\n * isNumber\n * isString\n * isRegExp\n *\n * @example\n *\n * Object.isArray([1,2,3]) -> true\n * Object.isDate(3) -> false\n * Object.isRegExp(/wasabi/) -> true\n * Object.isObject({ broken:'wear' }) -> true\n *\n ***/\n function buildTypeMethods() {\n extendSimilar(object, false, false, ClassNames, function(methods, name) {\n var method = 'is' + name;\n ObjectTypeMethods.push(method);\n methods[method] = typeChecks[name];\n });\n }\n\n function buildObjectExtend() {\n extend(object, false, function(){ return arguments.length === 0; }, {\n 'extend': function() {\n var methods = ObjectTypeMethods.concat(ObjectHashMethods)\n if(typeof EnumerableMethods !== 'undefined') {\n methods = methods.concat(EnumerableMethods);\n }\n buildObjectInstanceMethods(methods, object);\n }\n });\n }\n\n extend(object, false, true, {\n /***\n * @method watch(, , )\n * @returns Nothing\n * @short Watches a property of and runs when it changes.\n * @extra is passed three arguments: the property , the old value, and the new value. The return value of [fn] will be set as the new value. This method is useful for things such as validating or cleaning the value when it is set. Warning: this method WILL NOT work in browsers that don't support %Object.defineProperty%. This notably includes IE 8 and below, and Opera. This is the only method in Sugar that is not fully compatible with all browsers. %watch% is available as an instance method on extended objects.\n * @example\n *\n * Object.watch({ foo: 'bar' }, 'foo', function(prop, oldVal, newVal) {\n * // Will be run when the property 'foo' is set on the object.\n * });\n * Object.extended().watch({ foo: 'bar' }, 'foo', function(prop, oldVal, newVal) {\n * // Will be run when the property 'foo' is set on the object.\n * });\n *\n ***/\n 'watch': function(obj, prop, fn) {\n if(!definePropertySupport) return;\n var value = obj[prop];\n object.defineProperty(obj, prop, {\n 'enumerable' : true,\n 'configurable': true,\n 'get': function() {\n return value;\n },\n 'set': function(to) {\n value = fn.call(obj, prop, value, to);\n }\n });\n }\n });\n\n extend(object, false, function(arg1, arg2) { return isFunction(arg2); }, {\n\n /***\n * @method keys(, [fn])\n * @returns Array\n * @short Returns an array containing the keys in . Optionally calls [fn] for each key.\n * @extra This method is provided for browsers that don't support it natively, and additionally is enhanced to accept the callback [fn]. Returned keys are in no particular order. %keys% is available as an instance method on extended objects.\n * @example\n *\n * Object.keys({ broken: 'wear' }) -> ['broken']\n * Object.keys({ broken: 'wear' }, function(key, value) {\n * // Called once for each key.\n * });\n * Object.extended({ broken: 'wear' }).keys() -> ['broken']\n *\n ***/\n 'keys': function(obj, fn) {\n var keys = object.keys(obj);\n keys.forEach(function(key) {\n fn.call(obj, key, obj[key]);\n });\n return keys;\n }\n\n });\n\n extend(object, false, false, {\n\n 'isObject': function(obj) {\n return isObject(obj);\n },\n\n 'isNaN': function(obj) {\n // This is only true of NaN\n return isNumber(obj) && obj.valueOf() !== obj.valueOf();\n },\n\n /***\n * @method equal(, )\n * @returns Boolean\n * @short Returns true if and are equal.\n * @extra %equal% in Sugar is \"egal\", meaning the values are equal if they are \"not observably distinguishable\". Note that on extended objects the name is %equals% for readability.\n * @example\n *\n * Object.equal({a:2}, {a:2}) -> true\n * Object.equal({a:2}, {a:3}) -> false\n * Object.extended({a:2}).equals({a:3}) -> false\n *\n ***/\n 'equal': function(a, b) {\n return isEqual(a, b);\n },\n\n /***\n * @method Object.extended( = {})\n * @returns Extended object\n * @short Creates a new object, equivalent to %new Object()% or %{}%, but with extended methods.\n * @extra See extended objects for more.\n * @example\n *\n * Object.extended()\n * Object.extended({ happy:true, pappy:false }).keys() -> ['happy','pappy']\n * Object.extended({ happy:true, pappy:false }).values() -> [true, false]\n *\n ***/\n 'extended': function(obj) {\n return new Hash(obj);\n },\n\n /***\n * @method merge(, , [deep] = false, [resolve] = true)\n * @returns Merged object\n * @short Merges all the properties of into .\n * @extra Merges are shallow unless [deep] is %true%. Properties of will win in the case of conflicts, unless [resolve] is %false%. [resolve] can also be a function that resolves the conflict. In this case it will be passed 3 arguments, %key%, %targetVal%, and %sourceVal%, with the context set to . This will allow you to solve conflict any way you want, ie. adding two numbers together, etc. %merge% is available as an instance method on extended objects.\n * @example\n *\n * Object.merge({a:1},{b:2}) -> { a:1, b:2 }\n * Object.merge({a:1},{a:2}, false, false) -> { a:1 }\n + Object.merge({a:1},{a:2}, false, function(key, a, b) {\n * return a + b;\n * }); -> { a:3 }\n * Object.extended({a:1}).merge({b:2}) -> { a:1, b:2 }\n *\n ***/\n 'merge': function(target, source, deep, resolve) {\n var key, val;\n // Strings cannot be reliably merged thanks to\n // their properties not being enumerable in < IE8.\n if(target && typeof source != 'string') {\n for(key in source) {\n if(!hasOwnProperty(source, key) || !target) continue;\n val = source[key];\n // Conflict!\n if(isDefined(target[key])) {\n // Do not merge.\n if(resolve === false) {\n continue;\n }\n // Use the result of the callback as the result.\n if(isFunction(resolve)) {\n val = resolve.call(source, key, target[key], source[key])\n }\n }\n // Deep merging.\n if(deep === true && val && isObjectPrimitive(val)) {\n if(isDate(val)) {\n val = new date(val.getTime());\n } else if(isRegExp(val)) {\n val = new regexp(val.source, getRegExpFlags(val));\n } else {\n if(!target[key]) target[key] = array.isArray(val) ? [] : {};\n object.merge(target[key], source[key], deep, resolve);\n continue;\n }\n }\n target[key] = val;\n }\n }\n return target;\n },\n\n /***\n * @method values(, [fn])\n * @returns Array\n * @short Returns an array containing the values in . Optionally calls [fn] for each value.\n * @extra Returned values are in no particular order. %values% is available as an instance method on extended objects.\n * @example\n *\n * Object.values({ broken: 'wear' }) -> ['wear']\n * Object.values({ broken: 'wear' }, function(value) {\n * // Called once for each value.\n * });\n * Object.extended({ broken: 'wear' }).values() -> ['wear']\n *\n ***/\n 'values': function(obj, fn) {\n var values = [];\n iterateOverObject(obj, function(k,v) {\n values.push(v);\n if(fn) fn.call(obj,v);\n });\n return values;\n },\n\n /***\n * @method clone( = {}, [deep] = false)\n * @returns Cloned object\n * @short Creates a clone (copy) of .\n * @extra Default is a shallow clone, unless [deep] is true. %clone% is available as an instance method on extended objects.\n * @example\n *\n * Object.clone({foo:'bar'}) -> { foo: 'bar' }\n * Object.clone() -> {}\n * Object.extended({foo:'bar'}).clone() -> { foo: 'bar' }\n *\n ***/\n 'clone': function(obj, deep) {\n var target;\n // Preserve internal UTC flag when applicable.\n if(isDate(obj) && obj.clone) {\n return obj.clone();\n } else if(!isObjectPrimitive(obj)) {\n return obj;\n } else if (obj instanceof Hash) {\n target = new Hash;\n } else {\n target = new obj.constructor;\n }\n return object.merge(target, obj, deep);\n },\n\n /***\n * @method Object.fromQueryString(, [deep] = true)\n * @returns Object\n * @short Converts the query string of a URL into an object.\n * @extra If [deep] is %false%, conversion will only accept shallow params (ie. no object or arrays with %[]% syntax) as these are not universally supported.\n * @example\n *\n * Object.fromQueryString('foo=bar&broken=wear') -> { foo: 'bar', broken: 'wear' }\n * Object.fromQueryString('foo[]=1&foo[]=2') -> { foo: [1,2] }\n *\n ***/\n 'fromQueryString': function(str, deep) {\n var result = object.extended(), split;\n str = str && str.toString ? str.toString() : '';\n str.replace(/^.*?\\?/, '').split('&').forEach(function(p) {\n var split = p.split('=');\n if(split.length !== 2) return;\n setParamsObject(result, split[0], decodeURIComponent(split[1]), deep);\n });\n return result;\n },\n\n /***\n * @method Object.toQueryString(, [namespace] = true)\n * @returns Object\n * @short Converts the object into a query string.\n * @extra Accepts deep nested objects and arrays. If [namespace] is passed, it will be prefixed to all param names.\n * @example\n *\n * Object.toQueryString({foo:'bar'}) -> 'foo=bar'\n * Object.toQueryString({foo:['a','b','c']}) -> 'foo[0]=a&foo[1]=b&foo[2]=c'\n * Object.toQueryString({name:'Bob'}, 'user') -> 'user[name]=Bob'\n *\n ***/\n 'toQueryString': function(obj, namespace) {\n return objectToQueryString(namespace, obj);\n },\n\n /***\n * @method tap(, )\n * @returns Object\n * @short Runs and returns .\n * @extra A string can also be used as a shortcut to a method. This method is used to run an intermediary function in the middle of method chaining. As a standalone method on the Object class it doesn't have too much use. The power of %tap% comes when using extended objects or modifying the Object prototype with Object.extend().\n * @example\n *\n * Object.extend();\n * [2,4,6].map(Math.exp).tap(function(arr) {\n * arr.pop()\n * });\n * [2,4,6].map(Math.exp).tap('pop').map(Math.round); -> [7,55]\n *\n ***/\n 'tap': function(obj, arg) {\n var fn = arg;\n if(!isFunction(arg)) {\n fn = function() {\n if(arg) obj[arg]();\n }\n }\n fn.call(obj, obj);\n return obj;\n },\n\n /***\n * @method has(, )\n * @returns Boolean\n * @short Checks if has using hasOwnProperty from Object.prototype.\n * @extra This method is considered safer than %Object#hasOwnProperty% when using objects as hashes. See http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/ for more.\n * @example\n *\n * Object.has({ foo: 'bar' }, 'foo') -> true\n * Object.has({ foo: 'bar' }, 'baz') -> false\n * Object.has({ hasOwnProperty: true }, 'foo') -> false\n *\n ***/\n 'has': function (obj, key) {\n return hasOwnProperty(obj, key);\n },\n\n /***\n * @method select(, , ...)\n * @returns Object\n * @short Builds a new object containing the values specified in .\n * @extra When is a string, that single key will be selected. It can also be a regex, selecting any key that matches, or an object which will match if the key also exists in that object, effectively doing an \"intersect\" operation on that object. Multiple selections may also be passed as an array or directly as enumerated arguments. %select% is available as an instance method on extended objects.\n * @example\n *\n * Object.select({a:1,b:2}, 'a') -> {a:1}\n * Object.select({a:1,b:2}, /[a-z]/) -> {a:1,ba:2}\n * Object.select({a:1,b:2}, {a:1}) -> {a:1}\n * Object.select({a:1,b:2}, 'a', 'b') -> {a:1,b:2}\n * Object.select({a:1,b:2}, ['a', 'b']) -> {a:1,b:2}\n *\n ***/\n 'select': function (obj) {\n return selectFromObject(obj, arguments, true);\n },\n\n /***\n * @method reject(, , ...)\n * @returns Object\n * @short Builds a new object containing all values except those specified in .\n * @extra When is a string, that single key will be rejected. It can also be a regex, rejecting any key that matches, or an object which will match if the key also exists in that object, effectively \"subtracting\" that object. Multiple selections may also be passed as an array or directly as enumerated arguments. %reject% is available as an instance method on extended objects.\n * @example\n *\n * Object.reject({a:1,b:2}, 'a') -> {b:2}\n * Object.reject({a:1,b:2}, /[a-z]/) -> {}\n * Object.reject({a:1,b:2}, {a:1}) -> {b:2}\n * Object.reject({a:1,b:2}, 'a', 'b') -> {}\n * Object.reject({a:1,b:2}, ['a', 'b']) -> {}\n *\n ***/\n 'reject': function (obj) {\n return selectFromObject(obj, arguments, false);\n }\n\n });\n\n\n buildTypeMethods();\n buildObjectExtend();\n buildObjectInstanceMethods(ObjectHashMethods, Hash);\n\n\n /***\n * @package RegExp\n * @dependency core\n * @description Escaping regexes and manipulating their flags.\n *\n * Note here that methods on the RegExp class like .exec and .test will fail in the current version of SpiderMonkey being\n * used by CouchDB when using shorthand regex notation like /foo/. This is the reason for the intermixed use of shorthand\n * and compiled regexes here. If you're using JS in CouchDB, it is safer to ALWAYS compile your regexes from a string.\n *\n ***/\n\n extend(regexp, false, false, {\n\n /***\n * @method RegExp.escape( = '')\n * @returns String\n * @short Escapes all RegExp tokens in a string.\n * @example\n *\n * RegExp.escape('really?') -> 'really\\?'\n * RegExp.escape('yes.') -> 'yes\\.'\n * RegExp.escape('(not really)') -> '\\(not really\\)'\n *\n ***/\n 'escape': function(str) {\n return escapeRegExp(str);\n }\n\n });\n\n extend(regexp, true, false, {\n\n /***\n * @method getFlags()\n * @returns String\n * @short Returns the flags of the regex as a string.\n * @example\n *\n * /texty/gim.getFlags('testy') -> 'gim'\n *\n ***/\n 'getFlags': function() {\n return getRegExpFlags(this);\n },\n\n /***\n * @method setFlags()\n * @returns RegExp\n * @short Sets the flags on a regex and retuns a copy.\n * @example\n *\n * /texty/.setFlags('gim') -> now has global, ignoreCase, and multiline set\n *\n ***/\n 'setFlags': function(flags) {\n return regexp(this.source, flags);\n },\n\n /***\n * @method addFlag()\n * @returns RegExp\n * @short Adds to the regex.\n * @example\n *\n * /texty/.addFlag('g') -> now has global flag set\n *\n ***/\n 'addFlag': function(flag) {\n return this.setFlags(getRegExpFlags(this, flag));\n },\n\n /***\n * @method removeFlag()\n * @returns RegExp\n * @short Removes from the regex.\n * @example\n *\n * /texty/g.removeFlag('g') -> now has global flag removed\n *\n ***/\n 'removeFlag': function(flag) {\n return this.setFlags(getRegExpFlags(this).replace(flag, ''));\n }\n\n });\n\n\n\n /***\n * @package String\n * @dependency core\n * @description String manupulation, escaping, encoding, truncation, and:conversion.\n *\n ***/\n\n function getAcronym(word) {\n var inflector = string.Inflector;\n var word = inflector && inflector.acronyms[word];\n if(isString(word)) {\n return word;\n }\n }\n\n function padString(str, p, left, right) {\n var padding = string(p);\n if(padding != p) {\n padding = '';\n }\n if(!isNumber(left)) left = 1;\n if(!isNumber(right)) right = 1;\n return padding.repeat(left) + str + padding.repeat(right);\n }\n\n function chr(num) {\n return string.fromCharCode(num);\n }\n\n var btoa, atob;\n\n function buildBase64(key) {\n if(this.btoa) {\n btoa = this.btoa;\n atob = this.atob;\n return;\n }\n var base64reg = /[^A-Za-z0-9\\+\\/\\=]/g;\n btoa = function(str) {\n var output = '';\n var chr1, chr2, chr3;\n var enc1, enc2, enc3, enc4;\n var i = 0;\n do {\n chr1 = str.charCodeAt(i++);\n chr2 = str.charCodeAt(i++);\n chr3 = str.charCodeAt(i++);\n enc1 = chr1 >> 2;\n enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n enc4 = chr3 & 63;\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n output = output + key.charAt(enc1) + key.charAt(enc2) + key.charAt(enc3) + key.charAt(enc4);\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n } while (i < str.length);\n return output;\n }\n atob = function(input) {\n var output = '';\n var chr1, chr2, chr3;\n var enc1, enc2, enc3, enc4;\n var i = 0;\n if(input.match(base64reg)) {\n throw new Error('String contains invalid base64 characters');\n }\n input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n do {\n enc1 = key.indexOf(input.charAt(i++));\n enc2 = key.indexOf(input.charAt(i++));\n enc3 = key.indexOf(input.charAt(i++));\n enc4 = key.indexOf(input.charAt(i++));\n chr1 = (enc1 << 2) | (enc2 >> 4);\n chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n chr3 = ((enc3 & 3) << 6) | enc4;\n output = output + chr(chr1);\n if (enc3 != 64) {\n output = output + chr(chr2);\n }\n if (enc4 != 64) {\n output = output + chr(chr3);\n }\n chr1 = chr2 = chr3 = '';\n enc1 = enc2 = enc3 = enc4 = '';\n } while (i < input.length);\n return output;\n }\n }\n\n\n extend(string, true, function(reg) { return isRegExp(reg) || arguments.length > 2; }, {\n\n /***\n * @method startsWith(, [pos] = 0, [case] = true)\n * @returns Boolean\n * @short Returns true if the string starts with .\n * @extra may be either a string or regex. Search begins at [pos], which defaults to the entire string. Case sensitive if [case] is true.\n * @example\n *\n * 'hello'.startsWith('hell') -> true\n * 'hello'.startsWith(/[a-h]/) -> true\n * 'hello'.startsWith('HELL') -> false\n * 'hello'.startsWith('ell', 1) -> true\n * 'hello'.startsWith('HELL', 0, false) -> true\n *\n ***/\n 'startsWith': function(reg, pos, c) {\n var str = this, source;\n if(pos) str = str.slice(pos);\n if(isUndefined(c)) c = true;\n source = isRegExp(reg) ? reg.source.replace('^', '') : escapeRegExp(reg);\n return regexp('^' + source, c ? '' : 'i').test(str);\n },\n\n /***\n * @method endsWith(, [pos] = length, [case] = true)\n * @returns Boolean\n * @short Returns true if the string ends with .\n * @extra may be either a string or regex. Search ends at [pos], which defaults to the entire string. Case sensitive if [case] is true.\n * @example\n *\n * 'jumpy'.endsWith('py') -> true\n * 'jumpy'.endsWith(/[q-z]/) -> true\n * 'jumpy'.endsWith('MPY') -> false\n * 'jumpy'.endsWith('mp', 4) -> false\n * 'jumpy'.endsWith('MPY', 5, false) -> true\n *\n ***/\n 'endsWith': function(reg, pos, c) {\n var str = this, source;\n if(isDefined(pos)) str = str.slice(0, pos);\n if(isUndefined(c)) c = true;\n source = isRegExp(reg) ? reg.source.replace('$', '') : escapeRegExp(reg);\n return regexp(source + '$', c ? '' : 'i').test(str);\n }\n\n });\n\n\n extend(string, true, false, {\n\n /***\n * @method escapeRegExp()\n * @returns String\n * @short Escapes all RegExp tokens in the string.\n * @example\n *\n * 'really?'.escapeRegExp() -> 'really\\?'\n * 'yes.'.escapeRegExp() -> 'yes\\.'\n * '(not really)'.escapeRegExp() -> '\\(not really\\)'\n *\n ***/\n 'escapeRegExp': function() {\n return escapeRegExp(this);\n },\n\n /***\n * @method escapeURL([param] = false)\n * @returns String\n * @short Escapes characters in a string to make a valid URL.\n * @extra If [param] is true, it will also escape valid URL characters for use as a URL parameter.\n * @example\n *\n * 'http://foo.com/\"bar\"'.escapeURL() -> 'http://foo.com/%22bar%22'\n * 'http://foo.com/\"bar\"'.escapeURL(true) -> 'http%3A%2F%2Ffoo.com%2F%22bar%22'\n *\n ***/\n 'escapeURL': function(param) {\n return param ? encodeURIComponent(this) : encodeURI(this);\n },\n\n /***\n * @method unescapeURL([partial] = false)\n * @returns String\n * @short Restores escaped characters in a URL escaped string.\n * @extra If [partial] is true, it will only unescape non-valid URL characters. [partial] is included here for completeness, but should very rarely be needed.\n * @example\n *\n * 'http%3A%2F%2Ffoo.com%2Fthe%20bar'.unescapeURL() -> 'http://foo.com/the bar'\n * 'http%3A%2F%2Ffoo.com%2Fthe%20bar'.unescapeURL(true) -> 'http%3A%2F%2Ffoo.com%2Fthe bar'\n *\n ***/\n 'unescapeURL': function(param) {\n return param ? decodeURI(this) : decodeURIComponent(this);\n },\n\n /***\n * @method escapeHTML()\n * @returns String\n * @short Converts HTML characters to their entity equivalents.\n * @example\n *\n * '

some text

'.escapeHTML() -> '<p>some text</p>'\n * 'one & two'.escapeHTML() -> 'one & two'\n *\n ***/\n 'escapeHTML': function() {\n return this.replace(/&/g, '&' )\n .replace(//g, '>' )\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n },\n\n /***\n * @method unescapeHTML([partial] = false)\n * @returns String\n * @short Restores escaped HTML characters.\n * @example\n *\n * '<p>some text</p>'.unescapeHTML() -> '

some text

'\n * 'one & two'.unescapeHTML() -> 'one & two'\n *\n ***/\n 'unescapeHTML': function() {\n return this.replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(///g, '/')\n .replace(/&/g, '&');\n },\n\n /***\n * @method encodeBase64()\n * @returns String\n * @short Encodes the string into base64 encoding.\n * @extra This method wraps the browser native %btoa% when available, and uses a custom implementation when not available.\n * @example\n *\n * 'gonna get encoded!'.encodeBase64() -> 'Z29ubmEgZ2V0IGVuY29kZWQh'\n * 'http://twitter.com/'.encodeBase64() -> 'aHR0cDovL3R3aXR0ZXIuY29tLw=='\n *\n ***/\n 'encodeBase64': function() {\n return btoa(this);\n },\n\n /***\n * @method decodeBase64()\n * @returns String\n * @short Decodes the string from base64 encoding.\n * @extra This method wraps the browser native %atob% when available, and uses a custom implementation when not available.\n * @example\n *\n * 'aHR0cDovL3R3aXR0ZXIuY29tLw=='.decodeBase64() -> 'http://twitter.com/'\n * 'anVzdCBnb3QgZGVjb2RlZA=='.decodeBase64() -> 'just got decoded!'\n *\n ***/\n 'decodeBase64': function() {\n return atob(this);\n },\n\n /***\n * @method each([search] = single character, [fn])\n * @returns Array\n * @short Runs callback [fn] against each occurence of [search].\n * @extra Returns an array of matches. [search] may be either a string or regex, and defaults to every character in the string.\n * @example\n *\n * 'jumpy'.each() -> ['j','u','m','p','y']\n * 'jumpy'.each(/[r-z]/) -> ['u','y']\n * 'jumpy'.each(/[r-z]/, function(m) {\n * // Called twice: \"u\", \"y\"\n * });\n *\n ***/\n 'each': function(search, fn) {\n var match, i, len;\n if(isFunction(search)) {\n fn = search;\n search = /[\\s\\S]/g;\n } else if(!search) {\n search = /[\\s\\S]/g\n } else if(isString(search)) {\n search = regexp(escapeRegExp(search), 'gi');\n } else if(isRegExp(search)) {\n search = regexp(search.source, getRegExpFlags(search, 'g'));\n }\n match = this.match(search) || [];\n if(fn) {\n for(i = 0, len = match.length; i < len; i++) {\n match[i] = fn.call(this, match[i], i, match) || match[i];\n }\n }\n return match;\n },\n\n /***\n * @method shift()\n * @returns Array\n * @short Shifts each character in the string places in the character map.\n * @example\n *\n * 'a'.shift(1) -> 'b'\n * 'ク'.shift(1) -> 'グ'\n *\n ***/\n 'shift': function(n) {\n var result = '';\n n = n || 0;\n this.codes(function(c) {\n result += chr(c + n);\n });\n return result;\n },\n\n /***\n * @method codes([fn])\n * @returns Array\n * @short Runs callback [fn] against each character code in the string. Returns an array of character codes.\n * @example\n *\n * 'jumpy'.codes() -> [106,117,109,112,121]\n * 'jumpy'.codes(function(c) {\n * // Called 5 times: 106, 117, 109, 112, 121\n * });\n *\n ***/\n 'codes': function(fn) {\n var codes = [], i, len;\n for(i = 0, len = this.length; i < len; i++) {\n var code = this.charCodeAt(i);\n codes.push(code);\n if(fn) fn.call(this, code, i);\n }\n return codes;\n },\n\n /***\n * @method chars([fn])\n * @returns Array\n * @short Runs callback [fn] against each character in the string. Returns an array of characters.\n * @example\n *\n * 'jumpy'.chars() -> ['j','u','m','p','y']\n * 'jumpy'.chars(function(c) {\n * // Called 5 times: \"j\",\"u\",\"m\",\"p\",\"y\"\n * });\n *\n ***/\n 'chars': function(fn) {\n return this.each(fn);\n },\n\n /***\n * @method words([fn])\n * @returns Array\n * @short Runs callback [fn] against each word in the string. Returns an array of words.\n * @extra A \"word\" here is defined as any sequence of non-whitespace characters.\n * @example\n *\n * 'broken wear'.words() -> ['broken','wear']\n * 'broken wear'.words(function(w) {\n * // Called twice: \"broken\", \"wear\"\n * });\n *\n ***/\n 'words': function(fn) {\n return this.trim().each(/\\S+/g, fn);\n },\n\n /***\n * @method lines([fn])\n * @returns Array\n * @short Runs callback [fn] against each line in the string. Returns an array of lines.\n * @example\n *\n * 'broken wear\\nand\\njumpy jump'.lines() -> ['broken wear','and','jumpy jump']\n * 'broken wear\\nand\\njumpy jump'.lines(function(l) {\n * // Called three times: \"broken wear\", \"and\", \"jumpy jump\"\n * });\n *\n ***/\n 'lines': function(fn) {\n return this.trim().each(/^.*$/gm, fn);\n },\n\n /***\n * @method paragraphs([fn])\n * @returns Array\n * @short Runs callback [fn] against each paragraph in the string. Returns an array of paragraphs.\n * @extra A paragraph here is defined as a block of text bounded by two or more line breaks.\n * @example\n *\n * 'Once upon a time.\\n\\nIn the land of oz...'.paragraphs() -> ['Once upon a time.','In the land of oz...']\n * 'Once upon a time.\\n\\nIn the land of oz...'.paragraphs(function(p) {\n * // Called twice: \"Once upon a time.\", \"In teh land of oz...\"\n * });\n *\n ***/\n 'paragraphs': function(fn) {\n var paragraphs = this.trim().split(/[\\r\\n]{2,}/);\n paragraphs = paragraphs.map(function(p) {\n if(fn) var s = fn.call(p);\n return s ? s : p;\n });\n return paragraphs;\n },\n\n /***\n * @method isBlank()\n * @returns Boolean\n * @short Returns true if the string has a length of 0 or contains only whitespace.\n * @example\n *\n * ''.isBlank() -> true\n * ' '.isBlank() -> true\n * 'noway'.isBlank() -> false\n *\n ***/\n 'isBlank': function() {\n return this.trim().length === 0;\n },\n\n /***\n * @method has()\n * @returns Boolean\n * @short Returns true if the string matches .\n * @extra may be a string or regex.\n * @example\n *\n * 'jumpy'.has('py') -> true\n * 'broken'.has(/[a-n]/) -> true\n * 'broken'.has(/[s-z]/) -> false\n *\n ***/\n 'has': function(find) {\n return this.search(isRegExp(find) ? find : escapeRegExp(find)) !== -1;\n },\n\n\n /***\n * @method add(, [index] = length)\n * @returns String\n * @short Adds at [index]. Negative values are also allowed.\n * @extra %insert% is provided as an alias, and is generally more readable when using an index.\n * @example\n *\n * 'schfifty'.add(' five') -> schfifty five\n * 'dopamine'.insert('e', 3) -> dopeamine\n * 'spelling eror'.insert('r', -3) -> spelling error\n *\n ***/\n 'add': function(str, index) {\n index = isUndefined(index) ? this.length : index;\n return this.slice(0, index) + str + this.slice(index);\n },\n\n /***\n * @method remove()\n * @returns String\n * @short Removes any part of the string that matches .\n * @extra can be a string or a regex.\n * @example\n *\n * 'schfifty five'.remove('f') -> 'schity ive'\n * 'schfifty five'.remove(/[a-f]/g) -> 'shity iv'\n *\n ***/\n 'remove': function(f) {\n return this.replace(f, '');\n },\n\n /***\n * @method reverse()\n * @returns String\n * @short Reverses the string.\n * @example\n *\n * 'jumpy'.reverse() -> 'ypmuj'\n * 'lucky charms'.reverse() -> 'smrahc ykcul'\n *\n ***/\n 'reverse': function() {\n return this.split('').reverse().join('');\n },\n\n /***\n * @method compact()\n * @returns String\n * @short Compacts all white space in the string to a single space and trims the ends.\n * @example\n *\n * 'too \\n much \\n space'.compact() -> 'too much space'\n * 'enough \\n '.compact() -> 'enought'\n *\n ***/\n 'compact': function() {\n return this.trim().replace(/([\\r\\n\\s ])+/g, function(match, whitespace){\n return whitespace === ' ' ? whitespace : ' ';\n });\n },\n\n /***\n * @method at(, [loop] = true)\n * @returns String or Array\n * @short Gets the character(s) at a given index.\n * @extra When [loop] is true, overshooting the end of the string (or the beginning) will begin counting from the other end. As an alternate syntax, passing multiple indexes will get the characters at those indexes.\n * @example\n *\n * 'jumpy'.at(0) -> 'j'\n * 'jumpy'.at(2) -> 'm'\n * 'jumpy'.at(5) -> 'j'\n * 'jumpy'.at(5, false) -> ''\n * 'jumpy'.at(-1) -> 'y'\n * 'lucky charms'.at(2,4,6,8) -> ['u','k','y',c']\n *\n ***/\n 'at': function() {\n return entryAtIndex(this, arguments, true);\n },\n\n /***\n * @method from([index] = 0)\n * @returns String\n * @short Returns a section of the string starting from [index].\n * @example\n *\n * 'lucky charms'.from() -> 'lucky charms'\n * 'lucky charms'.from(7) -> 'harms'\n *\n ***/\n 'from': function(num) {\n return this.slice(num);\n },\n\n /***\n * @method to([index] = end)\n * @returns String\n * @short Returns a section of the string ending at [index].\n * @example\n *\n * 'lucky charms'.to() -> 'lucky charms'\n * 'lucky charms'.to(7) -> 'lucky ch'\n *\n ***/\n 'to': function(num) {\n if(isUndefined(num)) num = this.length;\n return this.slice(0, num);\n },\n\n /***\n * @method dasherize()\n * @returns String\n * @short Converts underscores and camel casing to hypens.\n * @example\n *\n * 'a_farewell_to_arms'.dasherize() -> 'a-farewell-to-arms'\n * 'capsLock'.dasherize() -> 'caps-lock'\n *\n ***/\n 'dasherize': function() {\n return this.underscore().replace(/_/g, '-');\n },\n\n /***\n * @method underscore()\n * @returns String\n * @short Converts hyphens and camel casing to underscores.\n * @example\n *\n * 'a-farewell-to-arms'.underscore() -> 'a_farewell_to_arms'\n * 'capsLock'.underscore() -> 'caps_lock'\n *\n ***/\n 'underscore': function() {\n return this\n .replace(/[-\\s]+/g, '_')\n .replace(string.Inflector && string.Inflector.acronymRegExp, function(acronym, index) {\n return (index > 0 ? '_' : '') + acronym.toLowerCase();\n })\n .replace(/([A-Z\\d]+)([A-Z][a-z])/g,'$1_$2')\n .replace(/([a-z\\d])([A-Z])/g,'$1_$2')\n .toLowerCase();\n },\n\n /***\n * @method camelize([first] = true)\n * @returns String\n * @short Converts underscores and hyphens to camel case. If [first] is true the first letter will also be capitalized.\n * @extra If the Inflections package is included acryonyms can also be defined that will be used when camelizing.\n * @example\n *\n * 'caps_lock'.camelize() -> 'CapsLock'\n * 'moz-border-radius'.camelize() -> 'MozBorderRadius'\n * 'moz-border-radius'.camelize(false) -> 'mozBorderRadius'\n *\n ***/\n 'camelize': function(first) {\n return this.underscore().replace(/(^|_)([^_]+)/g, function(match, pre, word, index) {\n var acronym = getAcronym(word), capitalize = first !== false || index > 0;\n if(acronym) return capitalize ? acronym : acronym.toLowerCase();\n return capitalize ? word.capitalize() : word;\n });\n },\n\n /***\n * @method spacify()\n * @returns String\n * @short Converts camel case, underscores, and hyphens to a properly spaced string.\n * @example\n *\n * 'camelCase'.spacify() -> 'camel case'\n * 'an-ugly-string'.spacify() -> 'an ugly string'\n * 'oh-no_youDid-not'.spacify().capitalize(true) -> 'something else'\n *\n ***/\n 'spacify': function() {\n return this.underscore().replace(/_/g, ' ');\n },\n\n /***\n * @method stripTags([tag1], [tag2], ...)\n * @returns String\n * @short Strips all HTML tags from the string.\n * @extra Tags to strip may be enumerated in the parameters, otherwise will strip all.\n * @example\n *\n * '

just some text

'.stripTags() -> 'just some text'\n * '

just some text

'.stripTags('p') -> 'just some text'\n *\n ***/\n 'stripTags': function() {\n var str = this, args = arguments.length > 0 ? arguments : [''];\n flattenedArgs(args, function(tag) {\n str = str.replace(regexp('<\\/?' + escapeRegExp(tag) + '[^<>]*>', 'gi'), '');\n });\n return str;\n },\n\n /***\n * @method removeTags([tag1], [tag2], ...)\n * @returns String\n * @short Removes all HTML tags and their contents from the string.\n * @extra Tags to remove may be enumerated in the parameters, otherwise will remove all.\n * @example\n *\n * '

just some text

'.removeTags() -> ''\n * '

just some text

'.removeTags('b') -> '

just text

'\n *\n ***/\n 'removeTags': function() {\n var str = this, args = arguments.length > 0 ? arguments : ['\\\\S+'];\n flattenedArgs(args, function(t) {\n var reg = regexp('<(' + t + ')[^<>]*(?:\\\\/>|>.*?<\\\\/\\\\1>)', 'gi');\n str = str.replace(reg, '');\n });\n return str;\n },\n\n /***\n * @method truncate(, [split] = true, [from] = 'right', [ellipsis] = '...')\n * @returns String\n * @short Truncates a string.\n * @extra If [split] is %false%, will not split words up, and instead discard the word where the truncation occurred. [from] can also be %\"middle\"% or %\"left\"%.\n * @example\n *\n * 'just sittin on the dock of the bay'.truncate(20) -> 'just sittin on the do...'\n * 'just sittin on the dock of the bay'.truncate(20, false) -> 'just sittin on the...'\n * 'just sittin on the dock of the bay'.truncate(20, true, 'middle') -> 'just sitt...of the bay'\n * 'just sittin on the dock of the bay'.truncate(20, true, 'left') -> '...the dock of the bay'\n *\n ***/\n 'truncate': function(length, split, from, ellipsis) {\n var pos,\n prepend = '',\n append = '',\n str = this.toString(),\n chars = '[' + getTrimmableCharacters() + ']+',\n space = '[^' + getTrimmableCharacters() + ']*',\n reg = regexp(chars + space + '$');\n ellipsis = isUndefined(ellipsis) ? '...' : string(ellipsis);\n if(str.length <= length) {\n return str;\n }\n switch(from) {\n case 'left':\n pos = str.length - length;\n prepend = ellipsis;\n str = str.slice(pos);\n reg = regexp('^' + space + chars);\n break;\n case 'middle':\n pos = floor(length / 2);\n append = ellipsis + str.slice(str.length - pos).trimLeft();\n str = str.slice(0, pos);\n break;\n default:\n pos = length;\n append = ellipsis;\n str = str.slice(0, pos);\n }\n if(split === false && this.slice(pos, pos + 1).match(/\\S/)) {\n str = str.remove(reg);\n }\n return prepend + str + append;\n },\n\n /***\n * @method pad[Side]( = '', [num] = 1)\n * @returns String\n * @short Pads either/both sides of the string.\n * @extra [num] is the number of characters on each side, and [padding] is the character to pad with.\n *\n * @set\n * pad\n * padLeft\n * padRight\n *\n * @example\n *\n * 'wasabi'.pad('-') -> '-wasabi-'\n * 'wasabi'.pad('-', 2) -> '--wasabi--'\n * 'wasabi'.padLeft('-', 2) -> '--wasabi'\n * 'wasabi'.padRight('-', 2) -> 'wasabi--'\n *\n ***/\n 'pad': function(padding, num) {\n return repeatString(num, padding) + this + repeatString(num, padding);\n },\n\n 'padLeft': function(padding, num) {\n return repeatString(num, padding) + this;\n },\n\n 'padRight': function(padding, num) {\n return this + repeatString(num, padding);\n },\n\n /***\n * @method first([n] = 1)\n * @returns String\n * @short Returns the first [n] characters of the string.\n * @example\n *\n * 'lucky charms'.first() -> 'l'\n * 'lucky charms'.first(3) -> 'luc'\n *\n ***/\n 'first': function(num) {\n if(isUndefined(num)) num = 1;\n return this.substr(0, num);\n },\n\n /***\n * @method last([n] = 1)\n * @returns String\n * @short Returns the last [n] characters of the string.\n * @example\n *\n * 'lucky charms'.last() -> 's'\n * 'lucky charms'.last(3) -> 'rms'\n *\n ***/\n 'last': function(num) {\n if(isUndefined(num)) num = 1;\n var start = this.length - num < 0 ? 0 : this.length - num;\n return this.substr(start);\n },\n\n /***\n * @method repeat([num] = 0)\n * @returns String\n * @short Returns the string repeated [num] times.\n * @example\n *\n * 'jumpy'.repeat(2) -> 'jumpyjumpy'\n * 'a'.repeat(5) -> 'aaaaa'\n * 'a'.repeat(0) -> ''\n *\n ***/\n 'repeat': function(num) {\n var result = '', str = this;\n if(!isNumber(num) || num < 1) return '';\n while (num) {\n if (num & 1) {\n result += str;\n }\n if (num >>= 1) {\n str += str;\n }\n }\n return result;\n },\n\n /***\n * @method toNumber([base] = 10)\n * @returns Number\n * @short Converts the string into a number.\n * @extra Any value with a \".\" fill be converted to a floating point value, otherwise an integer.\n * @example\n *\n * '153'.toNumber() -> 153\n * '12,000'.toNumber() -> 12000\n * '10px'.toNumber() -> 10\n * 'ff'.toNumber(16) -> 255\n *\n ***/\n 'toNumber': function(base) {\n var str = this.replace(/,/g, '');\n return str.match(/\\./) ? parseFloat(str) : parseInt(str, base || 10);\n },\n\n /***\n * @method capitalize([all] = false)\n * @returns String\n * @short Capitalizes the first character in the string.\n * @extra If [all] is true, all words in the string will be capitalized.\n * @example\n *\n * 'hello'.capitalize() -> 'Hello'\n * 'hello kitty'.capitalize() -> 'Hello kitty'\n * 'hello kitty'.capitalize(true) -> 'Hello Kitty'\n *\n *\n ***/\n 'capitalize': function(all) {\n var lastResponded;\n return this.toLowerCase().replace(all ? /[\\s\\S]/g : /^\\S/, function(lower) {\n var upper = lower.toUpperCase(), result;\n result = lastResponded ? lower : upper;\n lastResponded = upper !== lower;\n return result;\n });\n },\n\n /***\n * @method assign(, , ...)\n * @returns String\n * @short Assigns variables to tokens in a string.\n * @extra If an object is passed, it's properties can be assigned using the object's keys. If a non-object (string, number, etc.) is passed it can be accessed by the argument number beginning with 1 (as with regex tokens). Multiple objects can be passed and will be merged together (original objects are unaffected).\n * @example\n *\n * 'Welcome, Mr. {name}.'.assign({ name: 'Franklin' }) -> 'Welcome, Mr. Franklin.'\n * 'You are {1} years old today.'.assign(14) -> 'You are 14 years old today.'\n * '{n} and {r}'.assign({ n: 'Cheech' }, { r: 'Chong' }) -> 'Cheech and Chong'\n *\n ***/\n 'assign': function() {\n var assign = {};\n multiArgs(arguments, function(a, i) {\n if(isObject(a)) {\n simpleMerge(assign, a);\n } else {\n assign[i + 1] = a;\n }\n });\n return this.replace(/\\{([^{]+?)\\}/g, function(m, key) {\n return hasOwnProperty(assign, key) ? assign[key] : m;\n });\n }\n\n });\n\n\n // Aliases\n\n extend(string, true, false, {\n\n /***\n * @method insert()\n * @alias add\n *\n ***/\n 'insert': string.prototype.add\n });\n\n buildBase64('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=');\n\n\n /***\n *\n * @package Inflections\n * @dependency string\n * @description Pluralization similar to ActiveSupport including uncountable words and acronyms. Humanized and URL-friendly strings.\n *\n ***/\n\n /***\n * String module\n *\n ***/\n\n\n var plurals = [],\n singulars = [],\n uncountables = [],\n humans = [],\n acronyms = {},\n Downcased,\n Inflector;\n\n function removeFromArray(arr, find) {\n var index = arr.indexOf(find);\n if(index > -1) {\n arr.splice(index, 1);\n }\n }\n\n function removeFromUncountablesAndAddTo(arr, rule, replacement) {\n if(isString(rule)) {\n removeFromArray(uncountables, rule);\n }\n removeFromArray(uncountables, replacement);\n arr.unshift({ rule: rule, replacement: replacement })\n }\n\n function paramMatchesType(param, type) {\n return param == type || param == 'all' || !param;\n }\n\n function isUncountable(word) {\n return uncountables.some(function(uncountable) {\n return new regexp('\\\\b' + uncountable + '$', 'i').test(word);\n });\n }\n\n function inflect(word, pluralize) {\n word = isString(word) ? word.toString() : '';\n if(word.isBlank() || isUncountable(word)) {\n return word;\n } else {\n return runReplacements(word, pluralize ? plurals : singulars);\n }\n }\n\n function runReplacements(word, table) {\n iterateOverObject(table, function(i, inflection) {\n if(word.match(inflection.rule)) {\n word = word.replace(inflection.rule, inflection.replacement);\n return false;\n }\n });\n return word;\n }\n\n function capitalize(word) {\n return word.replace(/^\\W*[a-z]/, function(w){\n return w.toUpperCase();\n });\n }\n\n Inflector = {\n\n /*\n * Specifies a new acronym. An acronym must be specified as it will appear in a camelized string. An underscore\n * string that contains the acronym will retain the acronym when passed to %camelize%, %humanize%, or %titleize%.\n * A camelized string that contains the acronym will maintain the acronym when titleized or humanized, and will\n * convert the acronym into a non-delimited single lowercase word when passed to String#underscore.\n *\n * Examples:\n * String.Inflector.acronym('HTML')\n * 'html'.titleize() -> 'HTML'\n * 'html'.camelize() -> 'HTML'\n * 'MyHTML'.underscore() -> 'my_html'\n *\n * The acronym, however, must occur as a delimited unit and not be part of another word for conversions to recognize it:\n *\n * String.Inflector.acronym('HTTP')\n * 'my_http_delimited'.camelize() -> 'MyHTTPDelimited'\n * 'https'.camelize() -> 'Https', not 'HTTPs'\n * 'HTTPS'.underscore() -> 'http_s', not 'https'\n *\n * String.Inflector.acronym('HTTPS')\n * 'https'.camelize() -> 'HTTPS'\n * 'HTTPS'.underscore() -> 'https'\n *\n * Note: Acronyms that are passed to %pluralize% will no longer be recognized, since the acronym will not occur as\n * a delimited unit in the pluralized result. To work around this, you must specify the pluralized form as an\n * acronym as well:\n *\n * String.Inflector.acronym('API')\n * 'api'.pluralize().camelize() -> 'Apis'\n *\n * String.Inflector.acronym('APIs')\n * 'api'.pluralize().camelize() -> 'APIs'\n *\n * %acronym% may be used to specify any word that contains an acronym or otherwise needs to maintain a non-standard\n * capitalization. The only restriction is that the word must begin with a capital letter.\n *\n * Examples:\n * String.Inflector.acronym('RESTful')\n * 'RESTful'.underscore() -> 'restful'\n * 'RESTfulController'.underscore() -> 'restful_controller'\n * 'RESTfulController'.titleize() -> 'RESTful Controller'\n * 'restful'.camelize() -> 'RESTful'\n * 'restful_controller'.camelize() -> 'RESTfulController'\n *\n * String.Inflector.acronym('McDonald')\n * 'McDonald'.underscore() -> 'mcdonald'\n * 'mcdonald'.camelize() -> 'McDonald'\n */\n 'acronym': function(word) {\n acronyms[word.toLowerCase()] = word;\n var all = object.keys(acronyms).map(function(key) {\n return acronyms[key];\n });\n Inflector.acronymRegExp = regexp(all.join('|'), 'g');\n },\n\n /*\n * Specifies a new pluralization rule and its replacement. The rule can either be a string or a regular expression.\n * The replacement should always be a string that may include references to the matched data from the rule.\n */\n 'plural': function(rule, replacement) {\n removeFromUncountablesAndAddTo(plurals, rule, replacement);\n },\n\n /*\n * Specifies a new singularization rule and its replacement. The rule can either be a string or a regular expression.\n * The replacement should always be a string that may include references to the matched data from the rule.\n */\n 'singular': function(rule, replacement) {\n removeFromUncountablesAndAddTo(singulars, rule, replacement);\n },\n\n /*\n * Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used\n * for strings, not regular expressions. You simply pass the irregular in singular and plural form.\n *\n * Examples:\n * String.Inflector.irregular('octopus', 'octopi')\n * String.Inflector.irregular('person', 'people')\n */\n 'irregular': function(singular, plural) {\n var singularFirst = singular.first(),\n singularRest = singular.from(1),\n pluralFirst = plural.first(),\n pluralRest = plural.from(1),\n pluralFirstUpper = pluralFirst.toUpperCase(),\n pluralFirstLower = pluralFirst.toLowerCase(),\n singularFirstUpper = singularFirst.toUpperCase(),\n singularFirstLower = singularFirst.toLowerCase();\n removeFromArray(uncountables, singular);\n removeFromArray(uncountables, plural);\n if(singularFirstUpper == pluralFirstUpper) {\n Inflector.plural(new regexp('({1}){2}$'.assign(singularFirst, singularRest), 'i'), '$1' + pluralRest);\n Inflector.plural(new regexp('({1}){2}$'.assign(pluralFirst, pluralRest), 'i'), '$1' + pluralRest);\n Inflector.singular(new regexp('({1}){2}$'.assign(pluralFirst, pluralRest), 'i'), '$1' + singularRest);\n } else {\n Inflector.plural(new regexp('{1}{2}$'.assign(singularFirstUpper, singularRest)), pluralFirstUpper + pluralRest);\n Inflector.plural(new regexp('{1}{2}$'.assign(singularFirstLower, singularRest)), pluralFirstLower + pluralRest);\n Inflector.plural(new regexp('{1}{2}$'.assign(pluralFirstUpper, pluralRest)), pluralFirstUpper + pluralRest);\n Inflector.plural(new regexp('{1}{2}$'.assign(pluralFirstLower, pluralRest)), pluralFirstLower + pluralRest);\n Inflector.singular(new regexp('{1}{2}$'.assign(pluralFirstUpper, pluralRest)), singularFirstUpper + singularRest);\n Inflector.singular(new regexp('{1}{2}$'.assign(pluralFirstLower, pluralRest)), singularFirstLower + singularRest);\n }\n },\n\n /*\n * Add uncountable words that shouldn't be attempted inflected.\n *\n * Examples:\n * String.Inflector.uncountable('money')\n * String.Inflector.uncountable('money', 'information')\n * String.Inflector.uncountable(['money', 'information', 'rice'])\n */\n 'uncountable': function(first) {\n var add = array.isArray(first) ? first : multiArgs(arguments);\n uncountables = uncountables.concat(add);\n },\n\n /*\n * Specifies a humanized form of a string by a regular expression rule or by a string mapping.\n * When using a regular expression based replacement, the normal humanize formatting is called after the replacement.\n * When a string is used, the human form should be specified as desired (example: 'The name', not 'the_name')\n *\n * Examples:\n * String.Inflector.human(/_cnt$/i, '_count')\n * String.Inflector.human('legacy_col_person_name', 'Name')\n */\n 'human': function(rule, replacement) {\n humans.unshift({ rule: rule, replacement: replacement })\n },\n\n\n /*\n * Clears the loaded inflections within a given scope (default is 'all').\n * Options are: 'all', 'plurals', 'singulars', 'uncountables', 'humans'.\n *\n * Examples:\n * String.Inflector.clear('all')\n * String.Inflector.clear('plurals')\n */\n 'clear': function(type) {\n if(paramMatchesType(type, 'singulars')) singulars = [];\n if(paramMatchesType(type, 'plurals')) plurals = [];\n if(paramMatchesType(type, 'uncountables')) uncountables = [];\n if(paramMatchesType(type, 'humans')) humans = [];\n if(paramMatchesType(type, 'acronyms')) acronyms = {};\n }\n\n };\n\n Downcased = [\n 'and', 'or', 'nor', 'a', 'an', 'the', 'so', 'but', 'to', 'of', 'at',\n 'by', 'from', 'into', 'on', 'onto', 'off', 'out', 'in', 'over',\n 'with', 'for'\n ];\n\n Inflector.plural(/$/, 's');\n Inflector.plural(/s$/gi, 's');\n Inflector.plural(/(ax|test)is$/gi, '$1es');\n Inflector.plural(/(octop|vir|fung|foc|radi|alumn)(i|us)$/gi, '$1i');\n Inflector.plural(/(census|alias|status)$/gi, '$1es');\n Inflector.plural(/(bu)s$/gi, '$1ses');\n Inflector.plural(/(buffal|tomat)o$/gi, '$1oes');\n Inflector.plural(/([ti])um$/gi, '$1a');\n Inflector.plural(/([ti])a$/gi, '$1a');\n Inflector.plural(/sis$/gi, 'ses');\n Inflector.plural(/f+e?$/gi, 'ves');\n Inflector.plural(/(cuff|roof)$/gi, '$1s');\n Inflector.plural(/([ht]ive)$/gi, '$1s');\n Inflector.plural(/([^aeiouy]o)$/gi, '$1es');\n Inflector.plural(/([^aeiouy]|qu)y$/gi, '$1ies');\n Inflector.plural(/(x|ch|ss|sh)$/gi, '$1es');\n Inflector.plural(/(matr|vert|ind)(?:ix|ex)$/gi, '$1ices');\n Inflector.plural(/([ml])ouse$/gi, '$1ice');\n Inflector.plural(/([ml])ice$/gi, '$1ice');\n Inflector.plural(/^(ox)$/gi, '$1en');\n Inflector.plural(/^(oxen)$/gi, '$1');\n Inflector.plural(/(quiz)$/gi, '$1zes');\n Inflector.plural(/(phot|cant|hom|zer|pian|portic|pr|quart|kimon)o$/gi, '$1os');\n Inflector.plural(/(craft)$/gi, '$1');\n Inflector.plural(/([ft])[eo]{2}(th?)$/gi, '$1ee$2');\n\n Inflector.singular(/s$/gi, '');\n Inflector.singular(/([pst][aiu]s)$/gi, '$1');\n Inflector.singular(/([aeiouy])ss$/gi, '$1ss');\n Inflector.singular(/(n)ews$/gi, '$1ews');\n Inflector.singular(/([ti])a$/gi, '$1um');\n Inflector.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/gi, '$1$2sis');\n Inflector.singular(/(^analy)ses$/gi, '$1sis');\n Inflector.singular(/(i)(f|ves)$/i, '$1fe');\n Inflector.singular(/([aeolr]f?)(f|ves)$/i, '$1f');\n Inflector.singular(/([ht]ive)s$/gi, '$1');\n Inflector.singular(/([^aeiouy]|qu)ies$/gi, '$1y');\n Inflector.singular(/(s)eries$/gi, '$1eries');\n Inflector.singular(/(m)ovies$/gi, '$1ovie');\n Inflector.singular(/(x|ch|ss|sh)es$/gi, '$1');\n Inflector.singular(/([ml])(ous|ic)e$/gi, '$1ouse');\n Inflector.singular(/(bus)(es)?$/gi, '$1');\n Inflector.singular(/(o)es$/gi, '$1');\n Inflector.singular(/(shoe)s?$/gi, '$1');\n Inflector.singular(/(cris|ax|test)[ie]s$/gi, '$1is');\n Inflector.singular(/(octop|vir|fung|foc|radi|alumn)(i|us)$/gi, '$1us');\n Inflector.singular(/(census|alias|status)(es)?$/gi, '$1');\n Inflector.singular(/^(ox)(en)?/gi, '$1');\n Inflector.singular(/(vert|ind)(ex|ices)$/gi, '$1ex');\n Inflector.singular(/(matr)(ix|ices)$/gi, '$1ix');\n Inflector.singular(/(quiz)(zes)?$/gi, '$1');\n Inflector.singular(/(database)s?$/gi, '$1');\n Inflector.singular(/ee(th?)$/gi, 'oo$1');\n\n Inflector.irregular('person', 'people');\n Inflector.irregular('man', 'men');\n Inflector.irregular('child', 'children');\n Inflector.irregular('sex', 'sexes');\n Inflector.irregular('move', 'moves');\n Inflector.irregular('save', 'saves');\n Inflector.irregular('save', 'saves');\n Inflector.irregular('cow', 'kine');\n Inflector.irregular('goose', 'geese');\n Inflector.irregular('zombie', 'zombies');\n\n Inflector.uncountable('equipment,information,rice,money,species,series,fish,sheep,jeans'.split(','));\n\n\n extend(string, true, false, {\n\n /***\n * @method pluralize()\n * @returns String\n * @short Returns the plural form of the word in the string.\n * @example\n *\n * 'post'.pluralize() -> 'posts'\n * 'octopus'.pluralize() -> 'octopi'\n * 'sheep'.pluralize() -> 'sheep'\n * 'words'.pluralize() -> 'words'\n * 'CamelOctopus'.pluralize() -> 'CamelOctopi'\n *\n ***/\n 'pluralize': function() {\n return inflect(this, true);\n },\n\n /***\n * @method singularize()\n * @returns String\n * @short The reverse of String#pluralize. Returns the singular form of a word in a string.\n * @example\n *\n * 'posts'.singularize() -> 'post'\n * 'octopi'.singularize() -> 'octopus'\n * 'sheep'.singularize() -> 'sheep'\n * 'word'.singularize() -> 'word'\n * 'CamelOctopi'.singularize() -> 'CamelOctopus'\n *\n ***/\n 'singularize': function() {\n return inflect(this, false);\n },\n\n /***\n * @method humanize()\n * @returns String\n * @short Creates a human readable string.\n * @extra Capitalizes the first word and turns underscores into spaces and strips a trailing '_id', if any. Like String#titleize, this is meant for creating pretty output.\n * @example\n *\n * 'employee_salary'.humanize() -> 'Employee salary'\n * 'author_id'.humanize() -> 'Author'\n *\n ***/\n 'humanize': function() {\n var str = runReplacements(this, humans), acronym;\n str = str.replace(/_id$/g, '');\n str = str.replace(/(_)?([a-z\\d]*)/gi, function(match, _, word){\n acronym = hasOwnProperty(acronyms, word) ? acronyms[word] : null;\n return (_ ? ' ' : '') + (acronym || word.toLowerCase());\n });\n return capitalize(str);\n },\n\n /***\n * @method titleize()\n * @returns String\n * @short Creates a title version of the string.\n * @extra Capitalizes all the words and replaces some characters in the string to create a nicer looking title. String#titleize is meant for creating pretty output.\n * @example\n *\n * 'man from the boondocks'.titleize() -> 'Man from the Boondocks'\n * 'x-men: the last stand'.titleize() -> 'X Men: The Last Stand'\n * 'TheManWithoutAPast'.titleize() -> 'The Man Without a Past'\n * 'raiders_of_the_lost_ark'.titleize() -> 'Raiders of the Lost Ark'\n *\n ***/\n 'titleize': function() {\n var fullStopPunctuation = /[.:;!]$/, hasPunctuation, lastHadPunctuation, isFirstOrLast;\n return this.spacify().humanize().words(function(word, index, words) {\n hasPunctuation = fullStopPunctuation.test(word);\n isFirstOrLast = index == 0 || index == words.length - 1 || hasPunctuation || lastHadPunctuation;\n lastHadPunctuation = hasPunctuation;\n if(isFirstOrLast || Downcased.indexOf(word) === -1) {\n return capitalize(word);\n } else {\n return word;\n }\n }).join(' ');\n },\n\n /***\n * @method parameterize()\n * @returns String\n * @short Replaces special characters in a string so that it may be used as part of a pretty URL.\n * @example\n *\n * 'hell, no!'.parameterize() -> 'hell-no'\n *\n ***/\n 'parameterize': function(separator) {\n var str = this;\n if(separator === undefined) separator = '-';\n if(str.normalize) {\n str = str.normalize();\n }\n str = str.replace(/[^a-z0-9\\-_]+/gi, separator)\n if(separator) {\n str = str.replace(new regexp('^{sep}+|{sep}+$|({sep}){sep}+'.assign({ 'sep': escapeRegExp(separator) }), 'g'), '$1');\n }\n return encodeURI(str.toLowerCase());\n }\n\n });\n\n string.Inflector = Inflector;\n string.Inflector.acronyms = acronyms;\n\n\n /***\n *\n * @package Language\n * @dependency string\n * @description Normalizing accented characters, character width conversion, Hiragana and Katakana conversions.\n *\n ***/\n\n /***\n * String module\n *\n ***/\n\n\n\n var NormalizeMap,\n NormalizeReg = '',\n NormalizeSource;\n\n\n /***\n * @method has[Script]()\n * @returns Boolean\n * @short Returns true if the string contains any characters in that script.\n *\n * @set\n * hasArabic\n * hasCyrillic\n * hasGreek\n * hasHangul\n * hasHan\n * hasKanji\n * hasHebrew\n * hasHiragana\n * hasKana\n * hasKatakana\n * hasLatin\n * hasThai\n * hasDevanagari\n *\n * @example\n *\n * 'أتكلم'.hasArabic() -> true\n * 'визит'.hasCyrillic() -> true\n * '잘 먹겠습니다!'.hasHangul() -> true\n * 'ミックスです'.hasKatakana() -> true\n * \"l'année\".hasLatin() -> true\n *\n ***\n * @method is[Script]()\n * @returns Boolean\n * @short Returns true if the string contains only characters in that script. Whitespace is ignored.\n *\n * @set\n * isArabic\n * isCyrillic\n * isGreek\n * isHangul\n * isHan\n * isKanji\n * isHebrew\n * isHiragana\n * isKana\n * isKatakana\n * isKatakana\n * isThai\n * isDevanagari\n *\n * @example\n *\n * 'أتكلم'.isArabic() -> true\n * 'визит'.isCyrillic() -> true\n * '잘 먹겠습니다!'.isHangul() -> true\n * 'ミックスです'.isKatakana() -> false\n * \"l'année\".isLatin() -> true\n *\n ***/\n var unicodeScripts = [\n { names: ['Arabic'], source: '\\u0600-\\u06FF' },\n { names: ['Cyrillic'], source: '\\u0400-\\u04FF' },\n { names: ['Devanagari'], source: '\\u0900-\\u097F' },\n { names: ['Greek'], source: '\\u0370-\\u03FF' },\n { names: ['Hangul'], source: '\\uAC00-\\uD7AF\\u1100-\\u11FF' },\n { names: ['Han','Kanji'], source: '\\u4E00-\\u9FFF\\uF900-\\uFAFF' },\n { names: ['Hebrew'], source: '\\u0590-\\u05FF' },\n { names: ['Hiragana'], source: '\\u3040-\\u309F\\u30FB-\\u30FC' },\n { names: ['Kana'], source: '\\u3040-\\u30FF\\uFF61-\\uFF9F' },\n { names: ['Katakana'], source: '\\u30A0-\\u30FF\\uFF61-\\uFF9F' },\n { names: ['Latin'], source: '\\u0001-\\u007F\\u0080-\\u00FF\\u0100-\\u017F\\u0180-\\u024F' },\n { names: ['Thai'], source: '\\u0E00-\\u0E7F' }\n ];\n\n function buildUnicodeScripts() {\n unicodeScripts.forEach(function(s) {\n var is = regexp('^['+s.source+'\\\\s]+$');\n var has = regexp('['+s.source+']');\n s.names.forEach(function(name) {\n defineProperty(string.prototype, 'is' + name, function() { return is.test(this.trim()); });\n defineProperty(string.prototype, 'has' + name, function() { return has.test(this); });\n });\n });\n }\n\n // Support for converting character widths and katakana to hiragana.\n\n var widthConversionRanges = [\n { type: 'a', shift: 65248, start: 65, end: 90 },\n { type: 'a', shift: 65248, start: 97, end: 122 },\n { type: 'n', shift: 65248, start: 48, end: 57 },\n { type: 'p', shift: 65248, start: 33, end: 47 },\n { type: 'p', shift: 65248, start: 58, end: 64 },\n { type: 'p', shift: 65248, start: 91, end: 96 },\n { type: 'p', shift: 65248, start: 123, end: 126 }\n ];\n\n var WidthConversionTable;\n var allHankaku = /[\\u0020-\\u00A5]|[\\uFF61-\\uFF9F][゙゚]?/g;\n var allZenkaku = /[\\u3000-\\u301C]|[\\u301A-\\u30FC]|[\\uFF01-\\uFF60]|[\\uFFE0-\\uFFE6]/g;\n var hankakuPunctuation = '。、「」¥¢£';\n var zenkakuPunctuation = '。、「」¥¢£';\n var voicedKatakana = /[カキクケコサシスセソタチツテトハヒフヘホ]/;\n var semiVoicedKatakana = /[ハヒフヘホヲ]/;\n var hankakuKatakana = 'アイウエオァィゥェォカキクケコサシスセソタチツッテトナニヌネノハヒフヘホマミムメモヤャユュヨョラリルレロワヲンー・';\n var zenkakuKatakana = 'アイウエオァィゥェォカキクケコサシスセソタチツッテトナニヌネノハヒフヘホマミムメモヤャユュヨョラリルレロワヲンー・';\n\n function convertCharacterWidth(str, args, reg, type) {\n if(!WidthConversionTable) {\n buildWidthConversionTables();\n }\n var mode = multiArgs(args).join(''), table = WidthConversionTable[type];\n mode = mode.replace(/all/, '').replace(/(\\w)lphabet|umbers?|atakana|paces?|unctuation/g, '$1');\n return str.replace(reg, function(c) {\n if(table[c] && (!mode || mode.has(table[c].type))) {\n return table[c].to;\n } else {\n return c;\n }\n });\n }\n\n function buildWidthConversionTables() {\n var hankaku;\n WidthConversionTable = {\n 'zenkaku': {},\n 'hankaku': {}\n };\n widthConversionRanges.forEach(function(r) {\n getRange(r.start, r.end, function(n) {\n setWidthConversion(r.type, chr(n), chr(n + r.shift));\n });\n });\n zenkakuKatakana.each(function(c, i) {\n hankaku = hankakuKatakana.charAt(i);\n setWidthConversion('k', hankaku, c);\n if(c.match(voicedKatakana)) {\n setWidthConversion('k', hankaku + '゙', c.shift(1));\n }\n if(c.match(semiVoicedKatakana)) {\n setWidthConversion('k', hankaku + '゚', c.shift(2));\n }\n });\n zenkakuPunctuation.each(function(c, i) {\n setWidthConversion('p', hankakuPunctuation.charAt(i), c);\n });\n setWidthConversion('k', 'ヴ', 'ヴ');\n setWidthConversion('k', 'ヺ', 'ヺ');\n setWidthConversion('s', ' ', ' ');\n }\n\n function setWidthConversion(type, half, full) {\n WidthConversionTable['zenkaku'][half] = { type: type, to: full };\n WidthConversionTable['hankaku'][full] = { type: type, to: half };\n }\n\n\n\n\n function buildNormalizeMap() {\n NormalizeMap = {};\n iterateOverObject(NormalizeSource, function(normalized, str) {\n str.split('').forEach(function(character) {\n NormalizeMap[character] = normalized;\n });\n NormalizeReg += str;\n });\n NormalizeReg = regexp('[' + NormalizeReg + ']', 'g');\n }\n\n NormalizeSource = {\n 'A': 'AⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ',\n 'B': 'BⒷBḂḄḆɃƂƁ',\n 'C': 'CⒸCĆĈĊČÇḈƇȻꜾ',\n 'D': 'DⒹDḊĎḌḐḒḎĐƋƊƉꝹ',\n 'E': 'EⒺEÈÉÊỀẾỄỂẼĒḔḖĔĖËẺĚȄȆẸỆȨḜĘḘḚƐƎ',\n 'F': 'FⒻFḞƑꝻ',\n 'G': 'GⒼGǴĜḠĞĠǦĢǤƓꞠꝽꝾ',\n 'H': 'HⒽHĤḢḦȞḤḨḪĦⱧⱵꞍ',\n 'I': 'IⒾIÌÍÎĨĪĬİÏḮỈǏȈȊỊĮḬƗ',\n 'J': 'JⒿJĴɈ',\n 'K': 'KⓀKḰǨḲĶḴƘⱩꝀꝂꝄꞢ',\n 'L': 'LⓁLĿĹĽḶḸĻḼḺŁȽⱢⱠꝈꝆꞀ',\n 'M': 'MⓂMḾṀṂⱮƜ',\n 'N': 'NⓃNǸŃÑṄŇṆŅṊṈȠƝꞐꞤ',\n 'O': 'OⓄOÒÓÔỒỐỖỔÕṌȬṎŌṐṒŎȮȰÖȪỎŐǑȌȎƠỜỚỠỞỢỌỘǪǬØǾƆƟꝊꝌ',\n 'P': 'PⓅPṔṖƤⱣꝐꝒꝔ',\n 'Q': 'QⓆQꝖꝘɊ',\n 'R': 'RⓇRŔṘŘȐȒṚṜŖṞɌⱤꝚꞦꞂ',\n 'S': 'SⓈSẞŚṤŜṠŠṦṢṨȘŞⱾꞨꞄ',\n 'T': 'TⓉTṪŤṬȚŢṰṮŦƬƮȾꞆ',\n 'U': 'UⓊUÙÚÛŨṸŪṺŬÜǛǗǕǙỦŮŰǓȔȖƯỪỨỮỬỰỤṲŲṶṴɄ',\n 'V': 'VⓋVṼṾƲꝞɅ',\n 'W': 'WⓌWẀẂŴẆẄẈⱲ',\n 'X': 'XⓍXẊẌ',\n 'Y': 'YⓎYỲÝŶỸȲẎŸỶỴƳɎỾ',\n 'Z': 'ZⓏZŹẐŻŽẒẔƵȤⱿⱫꝢ',\n 'a': 'aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐ',\n 'b': 'bⓑbḃḅḇƀƃɓ',\n 'c': 'cⓒcćĉċčçḉƈȼꜿↄ',\n 'd': 'dⓓdḋďḍḑḓḏđƌɖɗꝺ',\n 'e': 'eⓔeèéêềếễểẽēḕḗĕėëẻěȅȇẹệȩḝęḙḛɇɛǝ',\n 'f': 'fⓕfḟƒꝼ',\n 'g': 'gⓖgǵĝḡğġǧģǥɠꞡᵹꝿ',\n 'h': 'hⓗhĥḣḧȟḥḩḫẖħⱨⱶɥ',\n 'i': 'iⓘiìíîĩīĭïḯỉǐȉȋịįḭɨı',\n 'j': 'jⓙjĵǰɉ',\n 'k': 'kⓚkḱǩḳķḵƙⱪꝁꝃꝅꞣ',\n 'l': 'lⓛlŀĺľḷḹļḽḻſłƚɫⱡꝉꞁꝇ',\n 'm': 'mⓜmḿṁṃɱɯ',\n 'n': 'nⓝnǹńñṅňṇņṋṉƞɲʼnꞑꞥ',\n 'o': 'oⓞoòóôồốỗổõṍȭṏōṑṓŏȯȱöȫỏőǒȍȏơờớỡởợọộǫǭøǿɔꝋꝍɵ',\n 'p': 'pⓟpṕṗƥᵽꝑꝓꝕ',\n 'q': 'qⓠqɋꝗꝙ',\n 'r': 'rⓡrŕṙřȑȓṛṝŗṟɍɽꝛꞧꞃ',\n 's': 'sⓢsśṥŝṡšṧṣṩșşȿꞩꞅẛ',\n 't': 'tⓣtṫẗťṭțţṱṯŧƭʈⱦꞇ',\n 'u': 'uⓤuùúûũṹūṻŭüǜǘǖǚủůűǔȕȗưừứữửựụṳųṷṵʉ',\n 'v': 'vⓥvṽṿʋꝟʌ',\n 'w': 'wⓦwẁẃŵẇẅẘẉⱳ',\n 'x': 'xⓧxẋẍ',\n 'y': 'yⓨyỳýŷỹȳẏÿỷẙỵƴɏỿ',\n 'z': 'zⓩzźẑżžẓẕƶȥɀⱬꝣ',\n 'AA': 'Ꜳ',\n 'AE': 'ÆǼǢ',\n 'AO': 'Ꜵ',\n 'AU': 'Ꜷ',\n 'AV': 'ꜸꜺ',\n 'AY': 'Ꜽ',\n 'DZ': 'DZDŽ',\n 'Dz': 'DzDž',\n 'LJ': 'LJ',\n 'Lj': 'Lj',\n 'NJ': 'NJ',\n 'Nj': 'Nj',\n 'OI': 'Ƣ',\n 'OO': 'Ꝏ',\n 'OU': 'Ȣ',\n 'TZ': 'Ꜩ',\n 'VY': 'Ꝡ',\n 'aa': 'ꜳ',\n 'ae': 'æǽǣ',\n 'ao': 'ꜵ',\n 'au': 'ꜷ',\n 'av': 'ꜹꜻ',\n 'ay': 'ꜽ',\n 'dz': 'dzdž',\n 'hv': 'ƕ',\n 'lj': 'lj',\n 'nj': 'nj',\n 'oi': 'ƣ',\n 'ou': 'ȣ',\n 'oo': 'ꝏ',\n 'ss': 'ß',\n 'tz': 'ꜩ',\n 'vy': 'ꝡ'\n };\n\n extend(string, true, false, {\n /***\n * @method normalize()\n * @returns String\n * @short Returns the string with accented and non-standard Latin-based characters converted into ASCII approximate equivalents.\n * @example\n *\n * 'á'.normalize() -> 'a'\n * 'Ménage à trois'.normalize() -> 'Menage a trois'\n * 'Volkswagen'.normalize() -> 'Volkswagen'\n * 'FULLWIDTH'.normalize() -> 'FULLWIDTH'\n *\n ***/\n 'normalize': function() {\n if(!NormalizeMap) {\n buildNormalizeMap();\n }\n return this.replace(NormalizeReg, function(character) {\n return NormalizeMap[character];\n });\n },\n\n /***\n * @method hankaku([mode] = 'all')\n * @returns String\n * @short Converts full-width characters (zenkaku) to half-width (hankaku).\n * @extra [mode] accepts any combination of \"a\" (alphabet), \"n\" (numbers), \"k\" (katakana), \"s\" (spaces), \"p\" (punctuation), or \"all\".\n * @example\n *\n * 'タロウ YAMADAです!'.hankaku() -> 'タロウ YAMADAです!'\n * 'タロウ YAMADAです!'.hankaku('a') -> 'タロウ YAMADAです!'\n * 'タロウ YAMADAです!'.hankaku('alphabet') -> 'タロウ YAMADAです!'\n * 'タロウです! 25歳です!'.hankaku('katakana', 'numbers') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.hankaku('k', 'n') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.hankaku('kn') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.hankaku('sp') -> 'タロウです! 25歳です!'\n *\n ***/\n 'hankaku': function() {\n return convertCharacterWidth(this, arguments, allZenkaku, 'hankaku');\n },\n\n /***\n * @method zenkaku([mode] = 'all')\n * @returns String\n * @short Converts half-width characters (hankaku) to full-width (zenkaku).\n * @extra [mode] accepts any combination of \"a\" (alphabet), \"n\" (numbers), \"k\" (katakana), \"s\" (spaces), \"p\" (punctuation), or \"all\".\n * @example\n *\n * 'タロウ YAMADAです!'.zenkaku() -> 'タロウ YAMADAです!'\n * 'タロウ YAMADAです!'.zenkaku('a') -> 'タロウ YAMADAです!'\n * 'タロウ YAMADAです!'.zenkaku('alphabet') -> 'タロウ YAMADAです!'\n * 'タロウです! 25歳です!'.zenkaku('katakana', 'numbers') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.zenkaku('k', 'n') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.zenkaku('kn') -> 'タロウです! 25歳です!'\n * 'タロウです! 25歳です!'.zenkaku('sp') -> 'タロウです! 25歳です!'\n *\n ***/\n 'zenkaku': function() {\n return convertCharacterWidth(this, arguments, allHankaku, 'zenkaku');\n },\n\n /***\n * @method hiragana([all] = true)\n * @returns String\n * @short Converts katakana into hiragana.\n * @extra If [all] is false, only full-width katakana will be converted.\n * @example\n *\n * 'カタカナ'.hiragana() -> 'かたかな'\n * 'コンニチハ'.hiragana() -> 'こんにちは'\n * 'カタカナ'.hiragana() -> 'かたかな'\n * 'カタカナ'.hiragana(false) -> 'カタカナ'\n *\n ***/\n 'hiragana': function(all) {\n var str = this;\n if(all !== false) {\n str = str.zenkaku('k');\n }\n return str.replace(/[\\u30A1-\\u30F6]/g, function(c) {\n return c.shift(-96);\n });\n },\n\n /***\n * @method katakana()\n * @returns String\n * @short Converts hiragana into katakana.\n * @example\n *\n * 'かたかな'.katakana() -> 'カタカナ'\n * 'こんにちは'.katakana() -> 'コンニチハ'\n *\n ***/\n 'katakana': function() {\n return this.replace(/[\\u3041-\\u3096]/g, function(c) {\n return c.shift(96);\n });\n }\n\n\n });\n\n buildUnicodeScripts();\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('da');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('da', {\n 'plural': true,\n 'months': 'januar,februar,marts,april,maj,juni,juli,august,september,oktober,november,december',\n 'weekdays': 'søndag|sondag,mandag,tirsdag,onsdag,torsdag,fredag,lørdag|lordag',\n 'units': 'millisekund:|er,sekund:|er,minut:|ter,tim:e|er,dag:|e,ug:e|er|en,måned:|er|en+maaned:|er|en,år:||et+aar:||et',\n 'numbers': 'en|et,to,tre,fire,fem,seks,syv,otte,ni,ti',\n 'tokens': 'den,for',\n 'articles': 'den',\n 'short':'d. {d}. {month} {yyyy}',\n 'long': 'den {d}. {month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} den {d}. {month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'forgårs|i forgårs|forgaars|i forgaars', 'value': -2 },\n { 'name': 'day', 'src': 'i går|igår|i gaar|igaar', 'value': -1 },\n { 'name': 'day', 'src': 'i dag|idag', 'value': 0 },\n { 'name': 'day', 'src': 'i morgen|imorgen', 'value': 1 },\n { 'name': 'day', 'src': 'over morgon|overmorgen|i over morgen|i overmorgen|iovermorgen', 'value': 2 },\n { 'name': 'sign', 'src': 'siden', 'value': -1 },\n { 'name': 'sign', 'src': 'om', 'value': 1 },\n { 'name': 'shift', 'src': 'i sidste|sidste', 'value': -1 },\n { 'name': 'shift', 'src': 'denne', 'value': 0 },\n { 'name': 'shift', 'src': 'næste|naeste', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{1?} {num} {unit} {sign}',\n '{shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{0?} {weekday?} {date?} {month} {year}',\n '{date} {month}',\n '{shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('de');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('de', {\n 'plural': true,\n 'capitalizeUnit': true,\n 'months': 'Januar,Februar,März|Marz,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember',\n 'weekdays': 'Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag',\n 'units': 'Millisekunde:|n,Sekunde:|n,Minute:|n,Stunde:|n,Tag:|en,Woche:|n,Monat:|en,Jahr:|en',\n 'numbers': 'ein:|e|er|en|em,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,zehn',\n 'tokens': 'der',\n 'short':'{d}. {Month} {yyyy}',\n 'long': '{d}. {Month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} {d}. {Month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{sign} {num} {unit}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'timeMarker': 'um',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'vorgestern', 'value': -2 },\n { 'name': 'day', 'src': 'gestern', 'value': -1 },\n { 'name': 'day', 'src': 'heute', 'value': 0 },\n { 'name': 'day', 'src': 'morgen', 'value': 1 },\n { 'name': 'day', 'src': 'übermorgen|ubermorgen|uebermorgen', 'value': 2 },\n { 'name': 'sign', 'src': 'vor:|her', 'value': -1 },\n { 'name': 'sign', 'src': 'in', 'value': 1 },\n { 'name': 'shift', 'src': 'letzte:|r|n|s', 'value': -1 },\n { 'name': 'shift', 'src': 'nächste:|r|n|s+nachste:|r|n|s+naechste:|r|n|s+kommende:n|r', 'value': 1 }\n ],\n 'dateParse': [\n '{sign} {num} {unit}',\n '{num} {unit} {sign}',\n '{shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{weekday?} {date?} {month} {year?}',\n '{shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('es');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('es', {\n 'plural': true,\n 'months': 'enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre',\n 'weekdays': 'domingo,lunes,martes,miércoles|miercoles,jueves,viernes,sábado|sabado',\n 'units': 'milisegundo:|s,segundo:|s,minuto:|s,hora:|s,día|días|dia|dias,semana:|s,mes:|es,año|años|ano|anos',\n 'numbers': 'uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve,diez',\n 'tokens': 'el,de',\n 'short':'{d} {month} {yyyy}',\n 'long': '{d} {month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} {d} {month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{sign} {num} {unit}',\n 'future': '{num} {unit} {sign}',\n 'duration': '{num} {unit}',\n 'timeMarker': 'a las',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'anteayer', 'value': -2 },\n { 'name': 'day', 'src': 'ayer', 'value': -1 },\n { 'name': 'day', 'src': 'hoy', 'value': 0 },\n { 'name': 'day', 'src': 'mañana|manana', 'value': 1 },\n { 'name': 'sign', 'src': 'hace', 'value': -1 },\n { 'name': 'sign', 'src': 'de ahora', 'value': 1 },\n { 'name': 'shift', 'src': 'pasad:o|a', 'value': -1 },\n { 'name': 'shift', 'src': 'próximo|próxima|proximo|proxima', 'value': 1 }\n ],\n 'dateParse': [\n '{sign} {num} {unit}',\n '{num} {unit} {sign}',\n '{0?} {unit=5-7} {shift}',\n '{0?} {shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{shift} {weekday}',\n '{weekday} {shift}',\n '{date?} {1?} {month} {1?} {year?}'\n ]\n});\nDate.addLocale('fi', {\n 'plural': true,\n 'timeMarker': 'kello',\n 'ampm': ',',\n 'months': 'tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kesäkuu,heinäkuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu',\n 'weekdays': 'sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai',\n 'units': 'millisekun:ti|tia|teja|tina|nin,sekun:ti|tia|teja|tina|nin,minuut:ti|tia|teja|tina|in,tun:ti|tia|teja|tina|nin,päiv:ä|ää|iä|änä|än,viik:ko|koa|koja|on|kona,kuukau:si|sia|tta|den|tena,vuo:si|sia|tta|den|tena',\n 'numbers': 'yksi|ensimmäinen,kaksi|toinen,kolm:e|as,neljä:s,vii:si|des,kuu:si|des,seitsemä:n|s,kahdeksa:n|s,yhdeksä:n|s,kymmene:n|s',\n 'articles': '',\n 'optionals': '',\n 'short': '{d}. {month}ta {yyyy}',\n 'long': '{d}. {month}ta {yyyy} kello {H}.{mm}',\n 'full': '{Weekday}na {d}. {month}ta {yyyy} kello {H}.{mm}',\n 'relative': function(num, unit, ms, format) {\n var units = this['units'];\n function numberWithUnit(mult) {\n return (num === 1 ? '' : num + ' ') + units[(8 * mult) + unit];\n }\n switch(format) {\n case 'duration': return numberWithUnit(0);\n case 'past': return numberWithUnit(num > 1 ? 1 : 0) + ' sitten';\n case 'future': return numberWithUnit(4) + ' päästä';\n }\n },\n 'modifiers': [\n { 'name': 'day', 'src': 'toissa päivänä|toissa päiväistä', 'value': -2 },\n { 'name': 'day', 'src': 'eilen|eilistä', 'value': -1 },\n { 'name': 'day', 'src': 'tänään', 'value': 0 },\n { 'name': 'day', 'src': 'huomenna|huomista', 'value': 1 },\n { 'name': 'day', 'src': 'ylihuomenna|ylihuomista', 'value': 2 },\n { 'name': 'sign', 'src': 'sitten|aiemmin', 'value': -1 },\n { 'name': 'sign', 'src': 'päästä|kuluttua|myöhemmin', 'value': 1 },\n { 'name': 'edge', 'src': 'viimeinen|viimeisenä', 'value': -2 },\n { 'name': 'edge', 'src': 'lopussa', 'value': -1 },\n { 'name': 'edge', 'src': 'ensimmäinen|ensimmäisenä', 'value': 1 },\n { 'name': 'shift', 'src': 'edellinen|edellisenä|edeltävä|edeltävänä|viime|toissa', 'value': -1 },\n { 'name': 'shift', 'src': 'tänä|tämän', 'value': 0 },\n { 'name': 'shift', 'src': 'seuraava|seuraavana|tuleva|tulevana|ensi', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{num} {unit=4-5} {sign} {day}',\n '{month} {year}',\n '{shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{0} {num}{1} {day} of {month} {year?}',\n '{weekday?} {month} {date}{1} {year?}',\n '{date} {month} {year}',\n '{shift} {weekday}',\n '{shift} week {weekday}',\n '{weekday} {2} {shift} week',\n '{0} {date}{1} of {month}',\n '{0}{month?} {date?}{1} of {shift} {unit=6-7}'\n ]\n});\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('fr');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('fr', {\n 'plural': true,\n 'months': 'janvier,février|fevrier,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre|decembre',\n 'weekdays': 'dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi',\n 'units': 'milliseconde:|s,seconde:|s,minute:|s,heure:|s,jour:|s,semaine:|s,mois,an:|s|née|nee',\n 'numbers': 'un:|e,deux,trois,quatre,cinq,six,sept,huit,neuf,dix',\n 'tokens': [\"l'|la|le\"],\n 'short':'{d} {month} {yyyy}',\n 'long': '{d} {month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} {d} {month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{sign} {num} {unit}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'timeMarker': 'à',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'hier', 'value': -1 },\n { 'name': 'day', 'src': \"aujourd'hui\", 'value': 0 },\n { 'name': 'day', 'src': 'demain', 'value': 1 },\n { 'name': 'sign', 'src': 'il y a', 'value': -1 },\n { 'name': 'sign', 'src': \"dans|d'ici\", 'value': 1 },\n { 'name': 'shift', 'src': 'derni:èr|er|ère|ere', 'value': -1 },\n { 'name': 'shift', 'src': 'prochain:|e', 'value': 1 }\n ],\n 'dateParse': [\n '{sign} {num} {unit}',\n '{sign} {num} {unit}',\n '{0?} {unit=5-7} {shift}'\n ],\n 'timeParse': [\n '{weekday?} {0?} {date?} {month} {year?}',\n '{0?} {weekday} {shift}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('it');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('it', {\n 'plural': true,\n 'months': 'Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre',\n 'weekdays': 'Domenica,Luned:ì|i,Marted:ì|i,Mercoled:ì|i,Gioved:ì|i,Venerd:ì|i,Sabato',\n 'units': 'millisecond:o|i,second:o|i,minut:o|i,or:a|e,giorn:o|i,settiman:a|e,mes:e|i,ann:o|i',\n 'numbers': \"un:|a|o|',due,tre,quattro,cinque,sei,sette,otto,nove,dieci\",\n 'tokens': \"l'|la|il\",\n 'short':'{d} {Month} {yyyy}',\n 'long': '{d} {Month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} {d} {Month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{num} {unit} {sign}',\n 'duration': '{num} {unit}',\n 'timeMarker': 'alle',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'ieri', 'value': -1 },\n { 'name': 'day', 'src': 'oggi', 'value': 0 },\n { 'name': 'day', 'src': 'domani', 'value': 1 },\n { 'name': 'day', 'src': 'dopodomani', 'value': 2 },\n { 'name': 'sign', 'src': 'fa', 'value': -1 },\n { 'name': 'sign', 'src': 'da adesso', 'value': 1 },\n { 'name': 'shift', 'src': 'scors:o|a', 'value': -1 },\n { 'name': 'shift', 'src': 'prossim:o|a', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{0?} {unit=5-7} {shift}',\n '{0?} {shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{weekday?} {date?} {month} {year?}',\n '{shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('ja');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('ja', {\n 'monthSuffix': '月',\n 'weekdays': '日曜日,月曜日,火曜日,水曜日,木曜日,金曜日,土曜日',\n 'units': 'ミリ秒,秒,分,時間,日,週間|週,ヶ月|ヵ月|月,年',\n 'short': '{yyyy}年{M}月{d}日',\n 'long': '{yyyy}年{M}月{d}日 {H}時{mm}分',\n 'full': '{yyyy}年{M}月{d}日 {Weekday} {H}時{mm}分{ss}秒',\n 'past': '{num}{unit}{sign}',\n 'future': '{num}{unit}{sign}',\n 'duration': '{num}{unit}',\n 'timeSuffixes': '時,分,秒',\n 'ampm': '午前,午後',\n 'modifiers': [\n { 'name': 'day', 'src': '一昨日', 'value': -2 },\n { 'name': 'day', 'src': '昨日', 'value': -1 },\n { 'name': 'day', 'src': '今日', 'value': 0 },\n { 'name': 'day', 'src': '明日', 'value': 1 },\n { 'name': 'day', 'src': '明後日', 'value': 2 },\n { 'name': 'sign', 'src': '前', 'value': -1 },\n { 'name': 'sign', 'src': '後', 'value': 1 },\n { 'name': 'shift', 'src': '去|先', 'value': -1 },\n { 'name': 'shift', 'src': '来', 'value': 1 }\n ],\n 'dateParse': [\n '{num}{unit}{sign}'\n ],\n 'timeParse': [\n '{shift}{unit=5-7}{weekday?}',\n '{year}年{month?}月?{date?}日?',\n '{month}月{date?}日?',\n '{date}日'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('ko');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('ko', {\n 'digitDate': true,\n 'monthSuffix': '월',\n 'weekdays': '일요일,월요일,화요일,수요일,목요일,금요일,토요일',\n 'units': '밀리초,초,분,시간,일,주,개월|달,년',\n 'numbers': '일|한,이,삼,사,오,육,칠,팔,구,십',\n 'short': '{yyyy}년{M}월{d}일',\n 'long': '{yyyy}년{M}월{d}일 {H}시{mm}분',\n 'full': '{yyyy}년{M}월{d}일 {Weekday} {H}시{mm}분{ss}초',\n 'past': '{num}{unit} {sign}',\n 'future': '{num}{unit} {sign}',\n 'duration': '{num}{unit}',\n 'timeSuffixes': '시,분,초',\n 'ampm': '오전,오후',\n 'modifiers': [\n { 'name': 'day', 'src': '그저께', 'value': -2 },\n { 'name': 'day', 'src': '어제', 'value': -1 },\n { 'name': 'day', 'src': '오늘', 'value': 0 },\n { 'name': 'day', 'src': '내일', 'value': 1 },\n { 'name': 'day', 'src': '모레', 'value': 2 },\n { 'name': 'sign', 'src': '전', 'value': -1 },\n { 'name': 'sign', 'src': '후', 'value': 1 },\n { 'name': 'shift', 'src': '지난|작', 'value': -1 },\n { 'name': 'shift', 'src': '이번', 'value': 0 },\n { 'name': 'shift', 'src': '다음|내', 'value': 1 }\n ],\n 'dateParse': [\n '{num}{unit} {sign}',\n '{shift?} {unit=5-7}'\n ],\n 'timeParse': [\n '{shift} {unit=5?} {weekday}',\n '{year}년{month?}월?{date?}일?',\n '{month}월{date?}일?',\n '{date}일'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('nl');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('nl', {\n 'plural': true,\n 'months': 'januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december',\n 'weekdays': 'zondag|zo,maandag|ma,dinsdag|di,woensdag|woe|wo,donderdag|do,vrijdag|vrij|vr,zaterdag|za',\n 'units': 'milliseconde:|n,seconde:|n,minu:ut|ten,uur,dag:|en,we:ek|ken,maand:|en,jaar',\n 'numbers': 'een,twee,drie,vier,vijf,zes,zeven,acht,negen',\n 'tokens': '',\n 'short':'{d} {Month} {yyyy}',\n 'long': '{d} {Month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} {d} {Month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{num} {unit} {sign}',\n 'duration': '{num} {unit}',\n 'timeMarker': \"'s|om\",\n 'modifiers': [\n { 'name': 'day', 'src': 'gisteren', 'value': -1 },\n { 'name': 'day', 'src': 'vandaag', 'value': 0 },\n { 'name': 'day', 'src': 'morgen', 'value': 1 },\n { 'name': 'day', 'src': 'overmorgen', 'value': 2 },\n { 'name': 'sign', 'src': 'geleden', 'value': -1 },\n { 'name': 'sign', 'src': 'vanaf nu', 'value': 1 },\n { 'name': 'shift', 'src': 'laatste|vorige|afgelopen', 'value': -1 },\n { 'name': 'shift', 'src': 'volgend:|e', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{0?} {unit=5-7} {shift}',\n '{0?} {shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{weekday?} {date?} {month} {year?}',\n '{shift} {weekday}'\n ]\n});\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('pl');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.optionals. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('pl', {\n 'plural': true,\n 'months': 'Styczeń|Stycznia,Luty|Lutego,Marzec|Marca,Kwiecień|Kwietnia,Maj|Maja,Czerwiec|Czerwca,Lipiec|Lipca,Sierpień|Sierpnia,Wrzesień|Września,Październik|Października,Listopad|Listopada,Grudzień|Grudnia',\n 'weekdays': 'Niedziela|Niedzielę,Poniedziałek,Wtorek,Środ:a|ę,Czwartek,Piątek,Sobota|Sobotę',\n 'units': 'milisekund:a|y|,sekund:a|y|,minut:a|y|,godzin:a|y|,dzień|dni,tydzień|tygodnie|tygodni,miesiące|miesiące|miesięcy,rok|lata|lat',\n 'numbers': 'jeden|jedną,dwa|dwie,trzy,cztery,pięć,sześć,siedem,osiem,dziewięć,dziesięć',\n 'optionals': 'w|we,roku',\n 'short': '{d} {Month} {yyyy}',\n 'long': '{d} {Month} {yyyy} {H}:{mm}',\n 'full' : '{Weekday}, {d} {Month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'timeMarker':'o',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'przedwczoraj', 'value': -2 },\n { 'name': 'day', 'src': 'wczoraj', 'value': -1 },\n { 'name': 'day', 'src': 'dzisiaj|dziś', 'value': 0 },\n { 'name': 'day', 'src': 'jutro', 'value': 1 },\n { 'name': 'day', 'src': 'pojutrze', 'value': 2 },\n { 'name': 'sign', 'src': 'temu|przed', 'value': -1 },\n { 'name': 'sign', 'src': 'za', 'value': 1 },\n { 'name': 'shift', 'src': 'zeszły|zeszła|ostatni|ostatnia', 'value': -1 },\n { 'name': 'shift', 'src': 'następny|następna|następnego|przyszły|przyszła|przyszłego', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{month} {year}',\n '{shift} {unit=5-7}',\n '{0} {shift?} {weekday}'\n ],\n 'timeParse': [\n '{date} {month} {year?} {1}',\n '{0} {shift?} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('pt');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('pt', {\n 'plural': true,\n 'months': 'janeiro,fevereiro,março,abril,maio,junho,julho,agosto,setembro,outubro,novembro,dezembro',\n 'weekdays': 'domingo,segunda-feira,terça-feira,quarta-feira,quinta-feira,sexta-feira,sábado|sabado',\n 'units': 'milisegundo:|s,segundo:|s,minuto:|s,hora:|s,dia:|s,semana:|s,mês|mêses|mes|meses,ano:|s',\n 'numbers': 'um,dois,três|tres,quatro,cinco,seis,sete,oito,nove,dez,uma,duas',\n 'tokens': 'a,de',\n 'short':'{d} de {month} de {yyyy}',\n 'long': '{d} de {month} de {yyyy} {H}:{mm}',\n 'full': '{Weekday}, {d} de {month} de {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'timeMarker': 'às',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'anteontem', 'value': -2 },\n { 'name': 'day', 'src': 'ontem', 'value': -1 },\n { 'name': 'day', 'src': 'hoje', 'value': 0 },\n { 'name': 'day', 'src': 'amanh:ã|a', 'value': 1 },\n { 'name': 'sign', 'src': 'atrás|atras|há|ha', 'value': -1 },\n { 'name': 'sign', 'src': 'daqui a', 'value': 1 },\n { 'name': 'shift', 'src': 'passad:o|a', 'value': -1 },\n { 'name': 'shift', 'src': 'próximo|próxima|proximo|proxima', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{0?} {unit=5-7} {shift}',\n '{0?} {shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{date?} {1?} {month} {1?} {year?}',\n '{0?} {shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('ru');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('ru', {\n 'months': 'Январ:я|ь,Феврал:я|ь,Март:а|,Апрел:я|ь,Ма:я|й,Июн:я|ь,Июл:я|ь,Август:а|,Сентябр:я|ь,Октябр:я|ь,Ноябр:я|ь,Декабр:я|ь',\n 'weekdays': 'Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,Суббота',\n 'units': 'миллисекунд:а|у|ы|,секунд:а|у|ы|,минут:а|у|ы|,час:||а|ов,день|день|дня|дней,недел:я|ю|и|ь|е,месяц:||а|ев|е,год|год|года|лет|году',\n 'numbers': 'од:ин|ну,дв:а|е,три,четыре,пять,шесть,семь,восемь,девять,десять',\n 'tokens': 'в|на,года',\n 'short':'{d} {month} {yyyy} года',\n 'long': '{d} {month} {yyyy} года {H}:{mm}',\n 'full': '{Weekday} {d} {month} {yyyy} года {H}:{mm}:{ss}',\n 'relative': function(num, unit, ms, format) {\n var numberWithUnit, last = num.toString().slice(-1);\n switch(true) {\n case num >= 11 && num <= 15: mult = 3; break;\n case last == 1: mult = 1; break;\n case last >= 2 && last <= 4: mult = 2; break;\n default: mult = 3;\n }\n numberWithUnit = num + ' ' + this['units'][(mult * 8) + unit];\n switch(format) {\n case 'duration': return numberWithUnit;\n case 'past': return numberWithUnit + ' назад';\n case 'future': return 'через ' + numberWithUnit;\n }\n },\n 'timeMarker': 'в',\n 'ampm': ' утра, вечера',\n 'modifiers': [\n { 'name': 'day', 'src': 'позавчера', 'value': -2 },\n { 'name': 'day', 'src': 'вчера', 'value': -1 },\n { 'name': 'day', 'src': 'сегодня', 'value': 0 },\n { 'name': 'day', 'src': 'завтра', 'value': 1 },\n { 'name': 'day', 'src': 'послезавтра', 'value': 2 },\n { 'name': 'sign', 'src': 'назад', 'value': -1 },\n { 'name': 'sign', 'src': 'через', 'value': 1 },\n { 'name': 'shift', 'src': 'прошл:ый|ой|ом', 'value': -1 },\n { 'name': 'shift', 'src': 'следующ:ий|ей|ем', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{month} {year}',\n '{0?} {shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{date} {month} {year?} {1?}',\n '{0?} {shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('sv');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('sv', {\n 'plural': true,\n 'months': 'januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december',\n 'weekdays': 'söndag|sondag,måndag:|en+mandag:|en,tisdag,onsdag,torsdag,fredag,lördag|lordag',\n 'units': 'millisekund:|er,sekund:|er,minut:|er,timm:e|ar,dag:|ar,veck:a|or|an,månad:|er|en+manad:|er|en,år:||et+ar:||et',\n 'numbers': 'en|ett,två|tva,tre,fyra,fem,sex,sju,åtta|atta,nio,tio',\n 'tokens': 'den,för|for',\n 'articles': 'den',\n 'short':'den {d} {month} {yyyy}',\n 'long': 'den {d} {month} {yyyy} {H}:{mm}',\n 'full': '{Weekday} den {d} {month} {yyyy} {H}:{mm}:{ss}',\n 'past': '{num} {unit} {sign}',\n 'future': '{sign} {num} {unit}',\n 'duration': '{num} {unit}',\n 'ampm': 'am,pm',\n 'modifiers': [\n { 'name': 'day', 'src': 'förrgår|i förrgår|iförrgår|forrgar|i forrgar|iforrgar', 'value': -2 },\n { 'name': 'day', 'src': 'går|i går|igår|gar|i gar|igar', 'value': -1 },\n { 'name': 'day', 'src': 'dag|i dag|idag', 'value': 0 },\n { 'name': 'day', 'src': 'morgon|i morgon|imorgon', 'value': 1 },\n { 'name': 'day', 'src': 'över morgon|övermorgon|i över morgon|i övermorgon|iövermorgon|over morgon|overmorgon|i over morgon|i overmorgon|iovermorgon', 'value': 2 },\n { 'name': 'sign', 'src': 'sedan|sen', 'value': -1 },\n { 'name': 'sign', 'src': 'om', 'value': 1 },\n { 'name': 'shift', 'src': 'i förra|förra|i forra|forra', 'value': -1 },\n { 'name': 'shift', 'src': 'denna', 'value': 0 },\n { 'name': 'shift', 'src': 'nästa|nasta', 'value': 1 }\n ],\n 'dateParse': [\n '{num} {unit} {sign}',\n '{sign} {num} {unit}',\n '{1?} {num} {unit} {sign}',\n '{shift} {unit=5-7}'\n ],\n 'timeParse': [\n '{0?} {weekday?} {date?} {month} {year}',\n '{date} {month}',\n '{shift} {weekday}'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('zh-CN');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\nDate.addLocale('zh-CN', {\n 'variant': true,\n 'monthSuffix': '月',\n 'weekdays': '星期日|周日,星期一|周一,星期二|周二,星期三|周三,星期四|周四,星期五|周五,星期六|周六',\n 'units': '毫秒,秒钟,分钟,小时,天,个星期|周,个月,年',\n 'tokens': '日|号',\n 'short':'{yyyy}年{M}月{d}日',\n 'long': '{yyyy}年{M}月{d}日 {tt}{h}:{mm}',\n 'full': '{yyyy}年{M}月{d}日 {weekday} {tt}{h}:{mm}:{ss}',\n 'past': '{num}{unit}{sign}',\n 'future': '{num}{unit}{sign}',\n 'duration': '{num}{unit}',\n 'timeSuffixes': '点|时,分钟?,秒',\n 'ampm': '上午,下午',\n 'modifiers': [\n { 'name': 'day', 'src': '前天', 'value': -2 },\n { 'name': 'day', 'src': '昨天', 'value': -1 },\n { 'name': 'day', 'src': '今天', 'value': 0 },\n { 'name': 'day', 'src': '明天', 'value': 1 },\n { 'name': 'day', 'src': '后天', 'value': 2 },\n { 'name': 'sign', 'src': '前', 'value': -1 },\n { 'name': 'sign', 'src': '后', 'value': 1 },\n { 'name': 'shift', 'src': '上|去', 'value': -1 },\n { 'name': 'shift', 'src': '这', 'value': 0 },\n { 'name': 'shift', 'src': '下|明', 'value': 1 }\n ],\n 'dateParse': [\n '{num}{unit}{sign}',\n '{shift}{unit=5-7}'\n ],\n 'timeParse': [\n '{shift}{weekday}',\n '{year}年{month?}月?{date?}{0?}',\n '{month}月{date?}{0?}',\n '{date}[日号]'\n ]\n});\n\n/*\n *\n * Date.addLocale() adds this locale to Sugar.\n * To set the locale globally, simply call:\n *\n * Date.setLocale('zh-TW');\n *\n * var locale = Date.getLocale() will return this object, which\n * can be tweaked to change the behavior of parsing/formatting in the locales.\n *\n * locale.addFormat adds a date format (see this file for examples).\n * Special tokens in the date format will be parsed out into regex tokens:\n *\n * {0} is a reference to an entry in locale.tokens. Output: (?:the)?\n * {unit} is a reference to all units. Output: (day|week|month|...)\n * {unit3} is a reference to a specific unit. Output: (hour)\n * {unit3-5} is a reference to a subset of the units array. Output: (hour|day|week)\n * {unit?} \"?\" makes that token optional. Output: (day|week|month)?\n *\n * {day} Any reference to tokens in the modifiers array will include all with the same name. Output: (yesterday|today|tomorrow)\n *\n * All spaces are optional and will be converted to \"\\s*\"\n *\n * Locale arrays months, weekdays, units, numbers, as well as the \"src\" field for\n * all entries in the modifiers array follow a special format indicated by a colon:\n *\n * minute:|s = minute|minutes\n * thicke:n|r = thicken|thicker\n *\n * Additionally in the months, weekdays, units, and numbers array these will be added at indexes that are multiples\n * of the relevant number for retrieval. For example having \"sunday:|s\" in the units array will result in:\n *\n * units: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sundays']\n *\n * When matched, the index will be found using:\n *\n * units.indexOf(match) % 7;\n *\n * Resulting in the correct index with any number of alternates for that entry.\n *\n */\n\n //'zh-TW': '1;月;年;;星期日|週日,星期一|週一,星期二|週二,星期三|週三,星期四|週四,星期五|週五,星期六|週六;毫秒,秒鐘,分鐘,小時,天,個星期|週,個月,年;;;日|號;;上午,下午;點|時,分鐘?,秒;{num}{unit}{sign},{shift}{unit=5-7};{shift}{weekday},{year}年{month?}月?{date?}{0},{month}月{date?}{0},{date}{0};{yyyy}年{M}月{d}日 {Weekday};{tt}{h}:{mm}:{ss};前天,昨天,今天,明天,後天;,前,,後;,上|去,這,下|明',\n\nDate.addLocale('zh-TW', {\n 'monthSuffix': '月',\n 'weekdays': '星期日|週日,星期一|週一,星期二|週二,星期三|週三,星期四|週四,星期五|週五,星期六|週六',\n 'units': '毫秒,秒鐘,分鐘,小時,天,個星期|週,個月,年',\n 'tokens': '日|號',\n 'short':'{yyyy}年{M}月{d}日',\n 'long': '{yyyy}年{M}月{d}日 {tt}{h}:{mm}',\n 'full': '{yyyy}年{M}月{d}日 {Weekday} {tt}{h}:{mm}:{ss}',\n 'past': '{num}{unit}{sign}',\n 'future': '{num}{unit}{sign}',\n 'duration': '{num}{unit}',\n 'timeSuffixes': '點|時,分鐘?,秒',\n 'ampm': '上午,下午',\n 'modifiers': [\n { 'name': 'day', 'src': '前天', 'value': -2 },\n { 'name': 'day', 'src': '昨天', 'value': -1 },\n { 'name': 'day', 'src': '今天', 'value': 0 },\n { 'name': 'day', 'src': '明天', 'value': 1 },\n { 'name': 'day', 'src': '後天', 'value': 2 },\n { 'name': 'sign', 'src': '前', 'value': -1 },\n { 'name': 'sign', 'src': '後', 'value': 1 },\n { 'name': 'shift', 'src': '上|去', 'value': -1 },\n { 'name': 'shift', 'src': '這', 'value': 0 },\n { 'name': 'shift', 'src': '下|明', 'value': 1 }\n ],\n 'dateParse': [\n '{num}{unit}{sign}',\n '{shift}{unit=5-7}'\n ],\n 'timeParse': [\n '{shift}{weekday}',\n '{year}年{month?}月?{date?}{0?}',\n '{month}月{date?}{0?}',\n '{date}[日號]'\n ]\n});\n\n})();\n\n}).call(this)}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],16:[function(require,module,exports){\n/**\n *\n * @namespace faker.address\n */\nfunction Address (faker) {\n var f = faker.fake,\n Helpers = faker.helpers;\n\n /**\n * Generates random zipcode from format. If format is not specified, the\n * locale's zip format is used.\n *\n * @method faker.address.zipCode\n * @param {String} format\n */\n this.zipCode = function(format) {\n // if zip format is not specified, use the zip format defined for the locale\n if (typeof format === 'undefined') {\n var localeFormat = faker.definitions.address.postcode;\n if (typeof localeFormat === 'string') {\n format = localeFormat;\n } else {\n format = faker.random.arrayElement(localeFormat);\n }\n }\n return Helpers.replaceSymbols(format);\n }\n\n /**\n * Generates random zipcode from state abbreviation. If state abbreviation is\n * not specified, a random zip code is generated according to the locale's zip format.\n * Only works for locales with postcode_by_state definition. If a locale does not\n * have a postcode_by_state definition, a random zip code is generated according\n * to the locale's zip format.\n *\n * @method faker.address.zipCodeByState\n * @param {String} state\n */\n this.zipCodeByState = function (state) {\n var zipRange = faker.definitions.address.postcode_by_state[state];\n if (zipRange) {\n return faker.datatype.number(zipRange);\n }\n return faker.address.zipCode();\n }\n\n /**\n * Generates a random localized city name. The format string can contain any\n * method provided by faker wrapped in `{{}}`, e.g. `{{name.firstName}}` in\n * order to build the city name.\n *\n * If no format string is provided one of the following is randomly used:\n *\n * * `{{address.cityPrefix}} {{name.firstName}}{{address.citySuffix}}`\n * * `{{address.cityPrefix}} {{name.firstName}}`\n * * `{{name.firstName}}{{address.citySuffix}}`\n * * `{{name.lastName}}{{address.citySuffix}}`\n * * `{{address.cityName}}` when city name is available\n *\n * @method faker.address.city\n * @param {String} format\n */\n this.city = function (format) {\n var formats = [\n '{{address.cityPrefix}} {{name.firstName}}{{address.citySuffix}}',\n '{{address.cityPrefix}} {{name.firstName}}',\n '{{name.firstName}}{{address.citySuffix}}',\n '{{name.lastName}}{{address.citySuffix}}'\n ];\n\n if (!format && faker.definitions.address.city_name) {\n formats.push('{{address.cityName}}');\n }\n\n if (typeof format !== \"number\") {\n format = faker.datatype.number(formats.length - 1);\n }\n\n return f(formats[format]);\n\n }\n\n /**\n * Return a random localized city prefix\n * @method faker.address.cityPrefix\n */\n this.cityPrefix = function () {\n return faker.random.arrayElement(faker.definitions.address.city_prefix);\n }\n\n /**\n * Return a random localized city suffix\n *\n * @method faker.address.citySuffix\n */\n this.citySuffix = function () {\n return faker.random.arrayElement(faker.definitions.address.city_suffix);\n }\n\n /**\n * Returns a random city name\n * \n * @method faker.address.cityName\n */\n this.cityName = function() {\n return faker.random.arrayElement(faker.definitions.address.city_name);\n }\n\n /**\n * Returns a random localized street name\n *\n * @method faker.address.streetName\n */\n this.streetName = function () {\n var result;\n var suffix = faker.address.streetSuffix();\n if (suffix !== \"\") {\n suffix = \" \" + suffix\n }\n\n switch (faker.datatype.number(1)) {\n case 0:\n result = faker.name.lastName() + suffix;\n break;\n case 1:\n result = faker.name.firstName() + suffix;\n break;\n }\n return result;\n }\n\n //\n // TODO: change all these methods that accept a boolean to instead accept an options hash.\n //\n /**\n * Returns a random localized street address\n *\n * @method faker.address.streetAddress\n * @param {Boolean} useFullAddress\n */\n this.streetAddress = function (useFullAddress) {\n if (useFullAddress === undefined) { useFullAddress = false; }\n var address = \"\";\n switch (faker.datatype.number(2)) {\n case 0:\n address = Helpers.replaceSymbolWithNumber(\"#####\") + \" \" + faker.address.streetName();\n break;\n case 1:\n address = Helpers.replaceSymbolWithNumber(\"####\") + \" \" + faker.address.streetName();\n break;\n case 2:\n address = Helpers.replaceSymbolWithNumber(\"###\") + \" \" + faker.address.streetName();\n break;\n }\n return useFullAddress ? (address + \" \" + faker.address.secondaryAddress()) : address;\n }\n\n /**\n * streetSuffix\n *\n * @method faker.address.streetSuffix\n */\n this.streetSuffix = function () {\n return faker.random.arrayElement(faker.definitions.address.street_suffix);\n }\n\n /**\n * streetPrefix\n *\n * @method faker.address.streetPrefix\n */\n this.streetPrefix = function () {\n return faker.random.arrayElement(faker.definitions.address.street_prefix);\n }\n\n /**\n * secondaryAddress\n *\n * @method faker.address.secondaryAddress\n */\n this.secondaryAddress = function () {\n return Helpers.replaceSymbolWithNumber(faker.random.arrayElement(\n [\n 'Apt. ###',\n 'Suite ###'\n ]\n ));\n }\n\n /**\n * county\n *\n * @method faker.address.county\n */\n this.county = function () {\n return faker.random.arrayElement(faker.definitions.address.county);\n }\n\n /**\n * country\n *\n * @method faker.address.country\n */\n this.country = function () {\n return faker.random.arrayElement(faker.definitions.address.country);\n }\n\n /**\n * countryCode\n *\n * @method faker.address.countryCode\n * @param {string} alphaCode default alpha-2\n */\n this.countryCode = function (alphaCode) {\n \n if (typeof alphaCode === 'undefined' || alphaCode === 'alpha-2') {\n return faker.random.arrayElement(faker.definitions.address.country_code);\n }\n\n if (alphaCode === 'alpha-3') {\n return faker.random.arrayElement(faker.definitions.address.country_code_alpha_3);\n }\n \n return faker.random.arrayElement(faker.definitions.address.country_code);\n\n }\n\n /**\n * state\n *\n * @method faker.address.state\n * @param {Boolean} useAbbr\n */\n this.state = function (useAbbr) {\n return faker.random.arrayElement(faker.definitions.address.state);\n }\n\n /**\n * stateAbbr\n *\n * @method faker.address.stateAbbr\n */\n this.stateAbbr = function () {\n return faker.random.arrayElement(faker.definitions.address.state_abbr);\n }\n\n /**\n * latitude\n *\n * @method faker.address.latitude\n * @param {Double} max default is 90\n * @param {Double} min default is -90\n * @param {number} precision default is 4\n */\n this.latitude = function (max, min, precision) {\n max = max || 90\n min = min || -90\n precision = precision || 4\n\n return faker.datatype.number({\n max: max,\n min: min,\n precision: parseFloat((0.0).toPrecision(precision) + '1')\n }).toFixed(precision);\n }\n\n /**\n * longitude\n *\n * @method faker.address.longitude\n * @param {Double} max default is 180\n * @param {Double} min default is -180\n * @param {number} precision default is 4\n */\n this.longitude = function (max, min, precision) {\n max = max || 180\n min = min || -180\n precision = precision || 4\n\n return faker.datatype.number({\n max: max,\n min: min,\n precision: parseFloat((0.0).toPrecision(precision) + '1')\n }).toFixed(precision);\n }\n\n /**\n * direction\n *\n * @method faker.address.direction\n * @param {Boolean} useAbbr return direction abbreviation. defaults to false\n */\n this.direction = function (useAbbr) {\n if (typeof useAbbr === 'undefined' || useAbbr === false) {\n return faker.random.arrayElement(faker.definitions.address.direction);\n }\n return faker.random.arrayElement(faker.definitions.address.direction_abbr);\n }\n\n this.direction.schema = {\n \"description\": \"Generates a direction. Use optional useAbbr bool to return abbreviation\",\n \"sampleResults\": [\"Northwest\", \"South\", \"SW\", \"E\"]\n };\n\n /**\n * cardinal direction\n *\n * @method faker.address.cardinalDirection\n * @param {Boolean} useAbbr return direction abbreviation. defaults to false\n */\n this.cardinalDirection = function (useAbbr) {\n if (typeof useAbbr === 'undefined' || useAbbr === false) {\n return (\n faker.random.arrayElement(faker.definitions.address.direction.slice(0, 4))\n );\n }\n return (\n faker.random.arrayElement(faker.definitions.address.direction_abbr.slice(0, 4))\n );\n }\n\n this.cardinalDirection.schema = {\n \"description\": \"Generates a cardinal direction. Use optional useAbbr boolean to return abbreviation\",\n \"sampleResults\": [\"North\", \"South\", \"E\", \"W\"]\n };\n\n /**\n * ordinal direction\n *\n * @method faker.address.ordinalDirection\n * @param {Boolean} useAbbr return direction abbreviation. defaults to false\n */\n this.ordinalDirection = function (useAbbr) {\n if (typeof useAbbr === 'undefined' || useAbbr === false) {\n return (\n faker.random.arrayElement(faker.definitions.address.direction.slice(4, 8))\n );\n }\n return (\n faker.random.arrayElement(faker.definitions.address.direction_abbr.slice(4, 8))\n );\n }\n\n this.ordinalDirection.schema = {\n \"description\": \"Generates an ordinal direction. Use optional useAbbr boolean to return abbreviation\",\n \"sampleResults\": [\"Northwest\", \"Southeast\", \"SW\", \"NE\"]\n };\n\n this.nearbyGPSCoordinate = function(coordinate, radius, isMetric) {\n function randomFloat(min, max) {\n return Math.random() * (max-min) + min;\n }\n function degreesToRadians(degrees) {\n return degrees * (Math.PI/180.0);\n }\n function radiansToDegrees(radians) {\n return radians * (180.0/Math.PI);\n }\n function kilometersToMiles(miles) {\n return miles * 0.621371;\n }\n function coordinateWithOffset(coordinate, bearing, distance, isMetric) {\n var R = 6378.137; // Radius of the Earth (http://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html)\n var d = isMetric ? distance : kilometersToMiles(distance); // Distance in km\n\n var lat1 = degreesToRadians(coordinate[0]); //Current lat point converted to radians\n var lon1 = degreesToRadians(coordinate[1]); //Current long point converted to radians\n\n var lat2 = Math.asin(Math.sin(lat1) * Math.cos(d/R) +\n Math.cos(lat1) * Math.sin(d/R) * Math.cos(bearing));\n\n var lon2 = lon1 + Math.atan2(\n Math.sin(bearing) * Math.sin(d/R) * Math.cos(lat1),\n Math.cos(d/R) - Math.sin(lat1) * Math.sin(lat2));\n\n // Keep longitude in range [-180, 180]\n if (lon2 > degreesToRadians(180)) {\n lon2 = lon2 - degreesToRadians(360);\n } else if (lon2 < degreesToRadians(-180)) {\n lon2 = lon2 + degreesToRadians(360);\n }\n\n return [radiansToDegrees(lat2), radiansToDegrees(lon2)];\n }\n\n // If there is no coordinate, the best we can do is return a random GPS coordinate.\n if (coordinate === undefined) {\n return [faker.address.latitude(), faker.address.longitude()]\n }\n radius = radius || 10.0;\n isMetric = isMetric || false;\n\n // TODO: implement either a gaussian/uniform distribution of points in cicular region.\n // Possibly include param to function that allows user to choose between distributions.\n\n // This approach will likely result in a higher density of points near the center.\n var randomCoord = coordinateWithOffset(coordinate, degreesToRadians(Math.random() * 360.0), radius, isMetric);\n return [randomCoord[0].toFixed(4), randomCoord[1].toFixed(4)];\n }\n\n /**\n * Return a random time zone\n * @method faker.address.timeZone\n */\n this.timeZone = function() {\n return faker.random.arrayElement(faker.definitions.address.time_zone);\n }\n\n return this;\n}\n\nmodule.exports = Address;\n\n},{}],17:[function(require,module,exports){\n/**\n *\n * @namespace faker.animal\n */\nvar Animal = function (faker) {\n var self = this;\n\n /**\n * dog\n *\n * @method faker.animal.dog\n */\n self.dog = function() {\n return faker.random.arrayElement(faker.definitions.animal.dog);\n };\n /**\n * cat\n *\n * @method faker.animal.cat\n */\n self.cat = function() {\n return faker.random.arrayElement(faker.definitions.animal.cat);\n };\n /**\n * snake \n *\n * @method faker.animal.snake\n */\n self.snake = function() {\n return faker.random.arrayElement(faker.definitions.animal.snake);\n };\n /**\n * bear \n *\n * @method faker.animal.bear\n */\n self.bear = function() {\n return faker.random.arrayElement(faker.definitions.animal.bear);\n };\n /**\n * lion \n *\n * @method faker.animal.lion\n */\n self.lion = function() {\n return faker.random.arrayElement(faker.definitions.animal.lion);\n };\n /**\n * cetacean \n *\n * @method faker.animal.cetacean\n */\n self.cetacean = function() {\n return faker.random.arrayElement(faker.definitions.animal.cetacean);\n };\n /**\n * horse \n *\n * @method faker.animal.horse\n */\n self.horse = function() {\n return faker.random.arrayElement(faker.definitions.animal.horse);\n };\n /**\n * bird\n *\n * @method faker.animal.bird\n */\n self.bird = function() {\n return faker.random.arrayElement(faker.definitions.animal.bird);\n };\n /**\n * cow \n *\n * @method faker.animal.cow\n */\n self.cow = function() {\n return faker.random.arrayElement(faker.definitions.animal.cow);\n };\n /**\n * fish\n *\n * @method faker.animal.fish\n */\n self.fish = function() {\n return faker.random.arrayElement(faker.definitions.animal.fish);\n };\n /**\n * crocodilia\n *\n * @method faker.animal.crocodilia\n */\n self.crocodilia = function() {\n return faker.random.arrayElement(faker.definitions.animal.crocodilia);\n };\n /**\n * insect \n *\n * @method faker.animal.insect\n */\n self.insect = function() {\n return faker.random.arrayElement(faker.definitions.animal.insect);\n };\n /**\n * rabbit \n *\n * @method faker.animal.rabbit\n */\n self.rabbit = function() {\n return faker.random.arrayElement(faker.definitions.animal.rabbit);\n };\n /**\n * type \n *\n * @method faker.animal.type\n */\n self.type = function() {\n return faker.random.arrayElement(faker.definitions.animal.type);\n };\n\n return self;\n};\n\nmodule['exports'] = Animal;\n\n},{}],18:[function(require,module,exports){\n/**\n *\n * @namespace faker.commerce\n */\nvar Commerce = function (faker) {\n var self = this;\n\n /**\n * color\n *\n * @method faker.commerce.color\n */\n self.color = function() {\n return faker.random.arrayElement(faker.definitions.commerce.color);\n };\n\n /**\n * department\n *\n * @method faker.commerce.department\n */\n self.department = function() {\n return faker.random.arrayElement(faker.definitions.commerce.department);\n };\n\n /**\n * productName\n *\n * @method faker.commerce.productName\n */\n self.productName = function() {\n return faker.commerce.productAdjective() + \" \" +\n faker.commerce.productMaterial() + \" \" +\n faker.commerce.product();\n };\n\n /**\n * price\n *\n * @method faker.commerce.price\n * @param {number} min\n * @param {number} max\n * @param {number} dec\n * @param {string} symbol\n *\n * @return {string}\n */\n self.price = function(min, max, dec, symbol) {\n min = min || 1;\n max = max || 1000;\n dec = dec === undefined ? 2 : dec;\n symbol = symbol || '';\n\n if (min < 0 || max < 0) {\n return symbol + 0.00;\n }\n\n var randValue = faker.datatype.number({ max: max, min: min });\n\n return symbol + (Math.round(randValue * Math.pow(10, dec)) / Math.pow(10, dec)).toFixed(dec);\n };\n\n /*\n self.categories = function(num) {\n var categories = [];\n\n do {\n var category = faker.random.arrayElement(faker.definitions.commerce.department);\n if(categories.indexOf(category) === -1) {\n categories.push(category);\n }\n } while(categories.length < num);\n\n return categories;\n };\n\n */\n /*\n self.mergeCategories = function(categories) {\n var separator = faker.definitions.separator || \" &\";\n // TODO: find undefined here\n categories = categories || faker.definitions.commerce.categories;\n var commaSeparated = categories.slice(0, -1).join(', ');\n\n return [commaSeparated, categories[categories.length - 1]].join(separator + \" \");\n };\n */\n\n /**\n * productAdjective\n *\n * @method faker.commerce.productAdjective\n */\n self.productAdjective = function() {\n return faker.random.arrayElement(faker.definitions.commerce.product_name.adjective);\n };\n\n /**\n * productMaterial\n *\n * @method faker.commerce.productMaterial\n */\n self.productMaterial = function() {\n return faker.random.arrayElement(faker.definitions.commerce.product_name.material);\n };\n\n /**\n * product\n *\n * @method faker.commerce.product\n */\n self.product = function() {\n return faker.random.arrayElement(faker.definitions.commerce.product_name.product);\n };\n\n /**\n * productDescription\n *\n * @method faker.commerce.productDescription\n */\n self.productDescription = function() {\n return faker.random.arrayElement(faker.definitions.commerce.product_description);\n };\n\n return self;\n};\n\nmodule['exports'] = Commerce;\n\n},{}],19:[function(require,module,exports){\n/**\n *\n * @namespace faker.company\n */\nvar Company = function (faker) {\n \n var self = this;\n var f = faker.fake;\n \n /**\n * suffixes\n *\n * @method faker.company.suffixes\n */\n this.suffixes = function () {\n // Don't want the source array exposed to modification, so return a copy\n return faker.definitions.company.suffix.slice(0);\n }\n\n /**\n * companyName\n *\n * @method faker.company.companyName\n * @param {string} format\n */\n this.companyName = function (format) {\n\n var formats = [\n '{{name.lastName}} {{company.companySuffix}}',\n '{{name.lastName}} - {{name.lastName}}',\n '{{name.lastName}}, {{name.lastName}} and {{name.lastName}}'\n ];\n\n if (typeof format !== \"number\") {\n format = faker.datatype.number(formats.length - 1);\n }\n\n return f(formats[format]);\n }\n\n /**\n * companySuffix\n *\n * @method faker.company.companySuffix\n */\n this.companySuffix = function () {\n return faker.random.arrayElement(faker.company.suffixes());\n }\n\n /**\n * catchPhrase\n *\n * @method faker.company.catchPhrase\n */\n this.catchPhrase = function () {\n return f('{{company.catchPhraseAdjective}} {{company.catchPhraseDescriptor}} {{company.catchPhraseNoun}}')\n }\n\n /**\n * bs\n *\n * @method faker.company.bs\n */\n this.bs = function () {\n return f('{{company.bsBuzz}} {{company.bsAdjective}} {{company.bsNoun}}');\n }\n\n /**\n * catchPhraseAdjective\n *\n * @method faker.company.catchPhraseAdjective\n */\n this.catchPhraseAdjective = function () {\n return faker.random.arrayElement(faker.definitions.company.adjective);\n }\n\n /**\n * catchPhraseDescriptor\n *\n * @method faker.company.catchPhraseDescriptor\n */\n this.catchPhraseDescriptor = function () {\n return faker.random.arrayElement(faker.definitions.company.descriptor);\n }\n\n /**\n * catchPhraseNoun\n *\n * @method faker.company.catchPhraseNoun\n */\n this.catchPhraseNoun = function () {\n return faker.random.arrayElement(faker.definitions.company.noun);\n }\n\n /**\n * bsAdjective\n *\n * @method faker.company.bsAdjective\n */\n this.bsAdjective = function () {\n return faker.random.arrayElement(faker.definitions.company.bs_adjective);\n }\n\n /**\n * bsBuzz\n *\n * @method faker.company.bsBuzz\n */\n this.bsBuzz = function () {\n return faker.random.arrayElement(faker.definitions.company.bs_verb);\n }\n\n /**\n * bsNoun\n *\n * @method faker.company.bsNoun\n */\n this.bsNoun = function () {\n return faker.random.arrayElement(faker.definitions.company.bs_noun);\n }\n \n}\n\nmodule['exports'] = Company;\n},{}],20:[function(require,module,exports){\n/**\n *\n * @namespace faker.database\n */\nvar Database = function (faker) {\n var self = this;\n /**\n * column\n *\n * @method faker.database.column\n */\n self.column = function () {\n return faker.random.arrayElement(faker.definitions.database.column);\n };\n\n self.column.schema = {\n \"description\": \"Generates a column name.\",\n \"sampleResults\": [\"id\", \"title\", \"createdAt\"]\n };\n\n /**\n * type\n *\n * @method faker.database.type\n */\n self.type = function () {\n return faker.random.arrayElement(faker.definitions.database.type);\n };\n\n self.type.schema = {\n \"description\": \"Generates a column type.\",\n \"sampleResults\": [\"byte\", \"int\", \"varchar\", \"timestamp\"]\n };\n\n /**\n * collation\n *\n * @method faker.database.collation\n */\n self.collation = function () {\n return faker.random.arrayElement(faker.definitions.database.collation);\n };\n\n self.collation.schema = {\n \"description\": \"Generates a collation.\",\n \"sampleResults\": [\"utf8_unicode_ci\", \"utf8_bin\"]\n };\n\n /**\n * engine\n *\n * @method faker.database.engine\n */\n self.engine = function () {\n return faker.random.arrayElement(faker.definitions.database.engine);\n };\n\n self.engine.schema = {\n \"description\": \"Generates a storage engine.\",\n \"sampleResults\": [\"MyISAM\", \"InnoDB\"]\n };\n};\n\nmodule[\"exports\"] = Database;\n\n},{}],21:[function(require,module,exports){\n/**\r\n *\r\n * @namespace faker.datatype\r\n */\r\nfunction Datatype (faker, seed) {\r\n // Use a user provided seed if it is an array or number\r\n if (Array.isArray(seed) && seed.length) {\r\n faker.mersenne.seed_array(seed);\r\n }\r\n else if(!isNaN(seed)) {\r\n faker.mersenne.seed(seed);\r\n }\r\n\r\n /**\r\n * returns a single random number based on a max number or range\r\n *\r\n * @method faker.datatype.number\r\n * @param {mixed} options {min, max, precision}\r\n */\r\n this.number = function (options) {\r\n\r\n if (typeof options === \"number\") {\r\n options = {\r\n max: options\r\n };\r\n }\r\n\r\n options = options || {};\r\n\r\n if (typeof options.min === \"undefined\") {\r\n options.min = 0;\r\n }\r\n\r\n if (typeof options.max === \"undefined\") {\r\n options.max = 99999;\r\n }\r\n if (typeof options.precision === \"undefined\") {\r\n options.precision = 1;\r\n }\r\n\r\n // Make the range inclusive of the max value\r\n var max = options.max;\r\n if (max >= 0) {\r\n max += options.precision;\r\n }\r\n\r\n var randomNumber = Math.floor(\r\n faker.mersenne.rand(max / options.precision, options.min / options.precision));\r\n // Workaround problem in Float point arithmetics for e.g. 6681493 / 0.01\r\n randomNumber = randomNumber / (1 / options.precision);\r\n\r\n return randomNumber;\r\n\r\n };\r\n\r\n /**\r\n * returns a single random floating-point number based on a max number or range\r\n *\r\n * @method faker.datatype.float\r\n * @param {mixed} options\r\n */\r\n this.float = function (options) {\r\n if (typeof options === \"number\") {\r\n options = {\r\n precision: options\r\n };\r\n }\r\n options = options || {};\r\n var opts = {};\r\n for (var p in options) {\r\n opts[p] = options[p];\r\n }\r\n if (typeof opts.precision === 'undefined') {\r\n opts.precision = 0.01;\r\n }\r\n return faker.datatype.number(opts);\r\n };\r\n\r\n /**\r\n * method returns a Date object using a random number of milliseconds since 1. Jan 1970 UTC\r\n * Caveat: seeding is not working\r\n *\r\n * @method faker.datatype.datetime\r\n * @param {mixed} options, pass min OR max as number of milliseconds since 1. Jan 1970 UTC\r\n */\r\n this.datetime = function (options) {\r\n if (typeof options === \"number\") {\r\n options = {\r\n max: options\r\n };\r\n }\r\n\r\n var minMax = 8640000000000000;\r\n\r\n options = options || {};\r\n\r\n if (typeof options.min === \"undefined\" || options.min < minMax*-1) {\r\n options.min = new Date().setFullYear(1990, 1, 1);\r\n }\r\n\r\n if (typeof options.max === \"undefined\" || options.max > minMax) {\r\n options.max = new Date().setFullYear(2100,1,1);\r\n }\r\n\r\n var random = faker.datatype.number(options);\r\n return new Date(random);\r\n };\r\n\r\n /**\r\n * Returns a string, containing UTF-16 chars between 33 and 125 ('!' to '}')\r\n *\r\n *\r\n * @method faker.datatype.string\r\n * @param { number } length: length of generated string, default = 10, max length = 2^20\r\n */\r\n this.string = function (length) {\r\n if(length === undefined ){\r\n length = 10;\r\n }\r\n\r\n var maxLength = Math.pow(2, 20);\r\n if(length >= (maxLength)){\r\n length = maxLength;\r\n }\r\n\r\n var charCodeOption = {\r\n min: 33,\r\n max: 125\r\n };\r\n\r\n var returnString = '';\r\n\r\n for(var i = 0; i < length; i++){\r\n returnString += String.fromCharCode(faker.datatype.number(charCodeOption));\r\n }\r\n return returnString;\r\n };\r\n\r\n /**\r\n * uuid\r\n *\r\n * @method faker.datatype.uuid\r\n */\r\n this.uuid = function () {\r\n var RFC4122_TEMPLATE = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\r\n var replacePlaceholders = function (placeholder) {\r\n var random = faker.datatype.number({ min: 0, max: 15 });\r\n var value = placeholder == 'x' ? random : (random &0x3 | 0x8);\r\n return value.toString(16);\r\n };\r\n return RFC4122_TEMPLATE.replace(/[xy]/g, replacePlaceholders);\r\n };\r\n\r\n /**\r\n * boolean\r\n *\r\n * @method faker.datatype.boolean\r\n */\r\n this.boolean = function () {\r\n return !!faker.datatype.number(1);\r\n };\r\n\r\n\r\n /**\r\n * hexaDecimal\r\n *\r\n * @method faker.datatype.hexaDecimal\r\n * @param {number} count defaults to 1\r\n */\r\n this.hexaDecimal = function hexaDecimal(count) {\r\n if (typeof count === \"undefined\") {\r\n count = 1;\r\n }\r\n\r\n var wholeString = \"\";\r\n for(var i = 0; i < count; i++) {\r\n wholeString += faker.random.arrayElement([\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]);\r\n }\r\n\r\n return \"0x\"+wholeString;\r\n };\r\n\r\n /**\r\n * returns json object with 7 pre-defined properties\r\n *\r\n * @method faker.datatype.json\r\n */\r\n this.json = function json() {\r\n\r\n var properties = ['foo', 'bar', 'bike', 'a', 'b', 'name', 'prop'];\r\n\r\n var returnObject = {};\r\n properties.forEach(function(prop){\r\n returnObject[prop] = faker.datatype.boolean() ?\r\n faker.datatype.string() : faker.datatype.number();\r\n });\r\n\r\n return JSON.stringify(returnObject);\r\n };\r\n\r\n /**\r\n * returns an array with values generated by faker.datatype.number and faker.datatype.string\r\n *\r\n * @method faker.datatype.array\r\n * @param { number } length of the returned array\r\n */\r\n\r\n this.array = function array(length) {\r\n\r\n\r\n if(length === undefined){\r\n length = 10;\r\n }\r\n var returnArray = new Array(length);\r\n for(var i = 0; i < length; i++){\r\n returnArray[i] = faker.datatype.boolean() ?\r\n faker.datatype.string() : faker.datatype.number();\r\n }\r\n return returnArray;\r\n\r\n };\r\n\r\n return this;\r\n}\r\n\r\nmodule['exports'] = Datatype;\r\n\n},{}],22:[function(require,module,exports){\n/**\n *\n * @namespace faker.date\n */\nvar _Date = function (faker) {\n var self = this;\n /**\n * past\n *\n * @method faker.date.past\n * @param {number} years\n * @param {date} refDate\n */\n self.past = function (years, refDate) {\n var date = new Date();\n if (typeof refDate !== \"undefined\") {\n date = new Date(Date.parse(refDate));\n }\n\n var range = {\n min: 1000,\n max: (years || 1) * 365 * 24 * 3600 * 1000\n };\n\n var past = date.getTime();\n past -= faker.datatype.number(range); // some time from now to N years ago, in milliseconds\n date.setTime(past);\n\n return date;\n };\n\n /**\n * future\n *\n * @method faker.date.future\n * @param {number} years\n * @param {date} refDate\n */\n self.future = function (years, refDate) {\n var date = new Date();\n if (typeof refDate !== \"undefined\") {\n date = new Date(Date.parse(refDate));\n }\n\n var range = {\n min: 1000,\n max: (years || 1) * 365 * 24 * 3600 * 1000\n };\n\n var future = date.getTime();\n future += faker.datatype.number(range); // some time from now to N years later, in milliseconds\n date.setTime(future);\n\n return date;\n };\n\n /**\n * between\n *\n * @method faker.date.between\n * @param {date} from\n * @param {date} to\n */\n self.between = function (from, to) {\n var fromMilli = Date.parse(from);\n var dateOffset = faker.datatype.number(Date.parse(to) - fromMilli);\n\n var newDate = new Date(fromMilli + dateOffset);\n\n return newDate;\n };\n\n /**\n * betweens\n *\n * @method faker.date.between\n * @param {date} from\n * @param {date} to\n */\n self.betweens = function (from, to, num) {\n if (typeof num == 'undefined') { num = 3; }\n var newDates = [];\n var fromMilli = Date.parse(from);\n var dateOffset = (Date.parse(to) - fromMilli) / ( num + 1 );\n var lastDate = from\n for (var i = 0; i < num; i++) {\n fromMilli = Date.parse(lastDate);\n lastDate = new Date(fromMilli + dateOffset)\n newDates.push(lastDate)\n }\n return newDates;\n };\n\n\n /**\n * recent\n *\n * @method faker.date.recent\n * @param {number} days\n * @param {date} refDate\n */\n self.recent = function (days, refDate) {\n var date = new Date();\n if (typeof refDate !== \"undefined\") {\n date = new Date(Date.parse(refDate));\n }\n\n var range = {\n min: 1000,\n max: (days || 1) * 24 * 3600 * 1000\n };\n\n var future = date.getTime();\n future -= faker.datatype.number(range); // some time from now to N days ago, in milliseconds\n date.setTime(future);\n\n return date;\n };\n\n /**\n * soon\n *\n * @method faker.date.soon\n * @param {number} days\n * @param {date} refDate\n */\n self.soon = function (days, refDate) {\n var date = new Date();\n if (typeof refDate !== \"undefined\") {\n date = new Date(Date.parse(refDate));\n }\n\n var range = {\n min: 1000,\n max: (days || 1) * 24 * 3600 * 1000\n };\n\n var future = date.getTime();\n future += faker.datatype.number(range); // some time from now to N days later, in milliseconds\n date.setTime(future);\n\n return date;\n };\n\n /**\n * month\n *\n * @method faker.date.month\n * @param {object} options\n */\n self.month = function (options) {\n options = options || {};\n\n var type = 'wide';\n if (options.abbr) {\n type = 'abbr';\n }\n if (options.context && typeof faker.definitions.date.month[type + '_context'] !== 'undefined') {\n type += '_context';\n }\n\n var source = faker.definitions.date.month[type];\n\n return faker.random.arrayElement(source);\n };\n\n /**\n * weekday\n *\n * @param {object} options\n * @method faker.date.weekday\n */\n self.weekday = function (options) {\n options = options || {};\n\n var type = 'wide';\n if (options.abbr) {\n type = 'abbr';\n }\n if (options.context && typeof faker.definitions.date.weekday[type + '_context'] !== 'undefined') {\n type += '_context';\n }\n\n var source = faker.definitions.date.weekday[type];\n\n return faker.random.arrayElement(source);\n };\n\n return self;\n\n};\n\nmodule['exports'] = _Date;\n\n},{}],23:[function(require,module,exports){\n/*\n fake.js - generator method for combining faker methods based on string input\n\n*/\n\nfunction Fake (faker) {\n \n /**\n * Generator method for combining faker methods based on string input\n *\n * __Example:__\n *\n * ```\n * console.log(faker.fake('{{name.lastName}}, {{name.firstName}} {{name.suffix}}'));\n * //outputs: \"Marks, Dean Sr.\"\n * ```\n *\n * This will interpolate the format string with the value of methods\n * [name.lastName]{@link faker.name.lastName}, [name.firstName]{@link faker.name.firstName},\n * and [name.suffix]{@link faker.name.suffix}\n *\n * @method faker.fake\n * @param {string} str\n */\n this.fake = function fake (str) {\n // setup default response as empty string\n var res = '';\n\n // if incoming str parameter is not provided, return error message\n if (typeof str !== 'string' || str.length === 0) {\n throw new Error('string parameter is required!');\n }\n\n // find first matching {{ and }}\n var start = str.search('{{');\n var end = str.search('}}');\n\n // if no {{ and }} is found, we are done\n if (start === -1 && end === -1) {\n return str;\n }\n\n // console.log('attempting to parse', str);\n\n // extract method name from between the {{ }} that we found\n // for example: {{name.firstName}}\n var token = str.substr(start + 2, end - start - 2);\n var method = token.replace('}}', '').replace('{{', '');\n\n // console.log('method', method)\n\n // extract method parameters\n var regExp = /\\(([^)]+)\\)/;\n var matches = regExp.exec(method);\n var parameters = '';\n if (matches) {\n method = method.replace(regExp, '');\n parameters = matches[1];\n }\n\n // split the method into module and function\n var parts = method.split('.');\n\n if (typeof faker[parts[0]] === \"undefined\") {\n throw new Error('Invalid module: ' + parts[0]);\n }\n\n if (typeof faker[parts[0]][parts[1]] === \"undefined\") {\n throw new Error('Invalid method: ' + parts[0] + \".\" + parts[1]);\n }\n\n // assign the function from the module.function namespace\n var fn = faker[parts[0]][parts[1]];\n\n // If parameters are populated here, they are always going to be of string type\n // since we might actually be dealing with an object or array,\n // we always attempt to the parse the incoming parameters into JSON\n var params;\n // Note: we experience a small performance hit here due to JSON.parse try / catch\n // If anyone actually needs to optimize this specific code path, please open a support issue on github\n try {\n params = JSON.parse(parameters)\n } catch (err) {\n // since JSON.parse threw an error, assume parameters was actually a string\n params = parameters;\n }\n\n var result;\n if (typeof params === \"string\" && params.length === 0) {\n result = fn.call(this);\n } else {\n result = fn.call(this, params);\n }\n\n // replace the found tag with the returned fake value\n res = str.replace('{{' + token + '}}', result);\n\n // return the response recursively until we are done finding all tags\n return fake(res); \n }\n \n return this;\n \n \n}\n\nmodule['exports'] = Fake;\n},{}],24:[function(require,module,exports){\n/**\n * @namespace faker.finance\n */\nvar Finance = function (faker) {\n var ibanLib = require(\"./iban\");\n var Helpers = faker.helpers,\n self = this;\n\n /**\n * account\n *\n * @method faker.finance.account\n * @param {number} length\n */\n self.account = function (length) {\n\n length = length || 8;\n\n var template = '';\n\n for (var i = 0; i < length; i++) {\n template = template + '#';\n }\n length = null;\n return Helpers.replaceSymbolWithNumber(template);\n };\n\n /**\n * accountName\n *\n * @method faker.finance.accountName\n */\n self.accountName = function () {\n\n return [Helpers.randomize(faker.definitions.finance.account_type), 'Account'].join(' ');\n };\n\n /**\n * routingNumber\n *\n * @method faker.finance.routingNumber\n */\n self.routingNumber = function () {\n\n var routingNumber = Helpers.replaceSymbolWithNumber('########');\n\n // Modules 10 straight summation.\n var sum = 0;\n\n for (var i = 0; i < routingNumber.length; i += 3) {\n sum += Number(routingNumber[i]) * 3;\n sum += Number(routingNumber[i + 1]) * 7;\n sum += Number(routingNumber[i + 2]) || 0;\n }\n\n return routingNumber + (Math.ceil(sum / 10) * 10 - sum);\n }\n\n /**\n * mask\n *\n * @method faker.finance.mask\n * @param {number} length\n * @param {boolean} parens\n * @param {boolean} ellipsis\n */\n self.mask = function (length, parens, ellipsis) {\n\n //set defaults\n length = (length == 0 || !length || typeof length == 'undefined') ? 4 : length;\n parens = (parens === null) ? true : parens;\n ellipsis = (ellipsis === null) ? true : ellipsis;\n\n //create a template for length\n var template = '';\n\n for (var i = 0; i < length; i++) {\n template = template + '#';\n }\n\n //prefix with ellipsis\n template = (ellipsis) ? ['...', template].join('') : template;\n\n template = (parens) ? ['(', template, ')'].join('') : template;\n\n //generate random numbers\n template = Helpers.replaceSymbolWithNumber(template);\n\n return template;\n };\n\n //min and max take in minimum and maximum amounts, dec is the decimal place you want rounded to, symbol is $, €, £, etc\n //NOTE: this returns a string representation of the value, if you want a number use parseFloat and no symbol\n\n /**\n * amount\n *\n * @method faker.finance.amount\n * @param {number} min\n * @param {number} max\n * @param {number} dec\n * @param {string} symbol\n *\n * @return {string}\n */\n self.amount = function (min, max, dec, symbol, autoFormat) {\n\n min = min || 0;\n max = max || 1000;\n dec = dec === undefined ? 2 : dec;\n symbol = symbol || '';\n const randValue = faker.datatype.number({ max: max, min: min, precision: Math.pow(10, -dec) });\n\n var formattedString;\n if(autoFormat) {\n formattedString = randValue.toLocaleString(undefined, {minimumFractionDigits: dec});\n }\n else {\n formattedString = randValue.toFixed(dec);\n }\n\n return symbol + formattedString;\n };\n\n /**\n * transactionType\n *\n * @method faker.finance.transactionType\n */\n self.transactionType = function () {\n return Helpers.randomize(faker.definitions.finance.transaction_type);\n };\n\n /**\n * currencyCode\n *\n * @method faker.finance.currencyCode\n */\n self.currencyCode = function () {\n return faker.random.objectElement(faker.definitions.finance.currency)['code'];\n };\n\n /**\n * currencyName\n *\n * @method faker.finance.currencyName\n */\n self.currencyName = function () {\n return faker.random.objectElement(faker.definitions.finance.currency, 'key');\n };\n\n /**\n * currencySymbol\n *\n * @method faker.finance.currencySymbol\n */\n self.currencySymbol = function () {\n var symbol;\n\n while (!symbol) {\n symbol = faker.random.objectElement(faker.definitions.finance.currency)['symbol'];\n }\n return symbol;\n };\n\n /**\n * bitcoinAddress\n *\n * @method faker.finance.bitcoinAddress\n */\n self.bitcoinAddress = function () {\n var addressLength = faker.datatype.number({ min: 25, max: 34 });\n\n var address = faker.random.arrayElement(['1', '3']);\n\n for (var i = 0; i < addressLength - 1; i++)\n address += faker.random.arrayElement('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.split(''));\n\n return address;\n }\n\n/**\n * litecoinAddress\n *\n * @method faker.finance.litecoinAddress\n */\nself.litecoinAddress = function () {\n var addressLength = faker.datatype.number({ min: 26, max: 33 });\n\n var address = faker.random.arrayElement(['L', 'M', '3']);\n\n for (var i = 0; i < addressLength - 1; i++)\n address += faker.random.arrayElement('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'.split(''));\n\n return address;\n}\n\n /**\n * Credit card number\n * @method faker.finance.creditCardNumber\n * @param {string} provider | scheme\n */\n self.creditCardNumber = function(provider){\n provider = provider || \"\";\n var format, formats;\n var localeFormat = faker.definitions.finance.credit_card;\n if (provider in localeFormat) {\n formats = localeFormat[provider]; // there chould be multiple formats\n if (typeof formats === \"string\") {\n format = formats;\n } else {\n format = faker.random.arrayElement(formats);\n }\n } else if (provider.match(/#/)) { // The user chose an optional scheme\n format = provider;\n } else { // Choose a random provider\n if (typeof localeFormat === 'string') {\n format = localeFormat;\n } else if( typeof localeFormat === \"object\") {\n // Credit cards are in a object structure\n formats = faker.random.objectElement(localeFormat, \"value\"); // There chould be multiple formats\n if (typeof formats === \"string\") {\n format = formats;\n } else {\n format = faker.random.arrayElement(formats);\n }\n }\n }\n format = format.replace(/\\//g,\"\")\n return Helpers.replaceCreditCardSymbols(format);\n };\n /**\n * Credit card CVV\n * @method faker.finance.creditCardCVV\n */\n self.creditCardCVV = function() {\n var cvv = \"\";\n for (var i = 0; i < 3; i++) {\n cvv += faker.datatype.number({max:9}).toString();\n }\n return cvv;\n };\n\n /**\n * ethereumAddress\n *\n * @method faker.finance.ethereumAddress\n */\n self.ethereumAddress = function () {\n var address = faker.datatype.hexaDecimal(40).toLowerCase();\n return address;\n };\n\n /**\n * iban\n *\n * @param {boolean} [formatted=false] - Return a formatted version of the generated IBAN.\n * @param {string} [countryCode] - The country code from which you want to generate an IBAN, if none is provided a random country will be used.\n * @throws Will throw an error if the passed country code is not supported.\n *\n * @method faker.finance.iban\n */\n self.iban = function (formatted, countryCode) {\n var ibanFormat;\n if (countryCode) {\n var findFormat = function(currentFormat) { return currentFormat.country === countryCode; };\n ibanFormat = ibanLib.formats.find(findFormat);\n } else {\n ibanFormat = faker.random.arrayElement(ibanLib.formats);\n }\n\n if (!ibanFormat) {\n throw new Error('Country code ' + countryCode + ' not supported.');\n }\n\n var s = \"\";\n var count = 0;\n for (var b = 0; b < ibanFormat.bban.length; b++) {\n var bban = ibanFormat.bban[b];\n var c = bban.count;\n count += bban.count;\n while (c > 0) {\n if (bban.type == \"a\") {\n s += faker.random.arrayElement(ibanLib.alpha);\n } else if (bban.type == \"c\") {\n if (faker.datatype.number(100) < 80) {\n s += faker.datatype.number(9);\n } else {\n s += faker.random.arrayElement(ibanLib.alpha);\n }\n } else {\n if (c >= 3 && faker.datatype.number(100) < 30) {\n if (faker.datatype.boolean()) {\n s += faker.random.arrayElement(ibanLib.pattern100);\n c -= 2;\n } else {\n s += faker.random.arrayElement(ibanLib.pattern10);\n c--;\n }\n } else {\n s += faker.datatype.number(9);\n }\n }\n c--;\n }\n s = s.substring(0, count);\n }\n var checksum = 98 - ibanLib.mod97(ibanLib.toDigitString(s + ibanFormat.country + \"00\"));\n if (checksum < 10) {\n checksum = \"0\" + checksum;\n }\n var iban = ibanFormat.country + checksum + s;\n return formatted ? iban.match(/.{1,4}/g).join(\" \") : iban;\n };\n\n /**\n * bic\n *\n * @method faker.finance.bic\n */\n self.bic = function () {\n var vowels = [\"A\", \"E\", \"I\", \"O\", \"U\"];\n var prob = faker.datatype.number(100);\n return Helpers.replaceSymbols(\"???\") +\n faker.random.arrayElement(vowels) +\n faker.random.arrayElement(ibanLib.iso3166) +\n Helpers.replaceSymbols(\"?\") + \"1\" +\n (prob < 10 ?\n Helpers.replaceSymbols(\"?\" + faker.random.arrayElement(vowels) + \"?\") :\n prob < 40 ?\n Helpers.replaceSymbols(\"###\") : \"\");\n };\n\n /**\n * description\n *\n * @method faker.finance.transactionDescription\n */\n self.transactionDescription = function() {\n var transaction = Helpers.createTransaction();\n var account = transaction.account;\n var amount = transaction.amount;\n var transactionType = transaction.type;\n var company = transaction.business;\n var card = faker.finance.mask();\n var currency = faker.finance.currencyCode();\n return transactionType + \" transaction at \" + company + \" using card ending with ***\" + card + \" for \" + currency + \" \" + amount + \" in account ***\" + account\n };\n\n};\n\nmodule['exports'] = Finance;\n\n},{\"./iban\":28}],25:[function(require,module,exports){\n/**\n * @namespace faker.git\n */\n\nvar Git = function(faker) {\n var self = this;\n var f = faker.fake;\n\n var hexChars = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n\n /**\n * branch\n *\n * @method faker.git.branch\n */\n self.branch = function() {\n var noun = faker.hacker.noun().replace(' ', '-');\n var verb = faker.hacker.verb().replace(' ', '-');\n return noun + '-' + verb;\n }\n\n /**\n * commitEntry\n *\n * @method faker.git.commitEntry\n * @param {object} options\n */\n self.commitEntry = function(options) {\n options = options || {};\n\n var entry = 'commit {{git.commitSha}}\\r\\n';\n\n if (options.merge || (faker.datatype.number({ min: 0, max: 4 }) === 0)) {\n entry += 'Merge: {{git.shortSha}} {{git.shortSha}}\\r\\n';\n }\n\n entry += 'Author: {{name.firstName}} {{name.lastName}} <{{internet.email}}>\\r\\n';\n entry += 'Date: ' + faker.date.recent().toString() + '\\r\\n';\n entry += '\\r\\n\\xa0\\xa0\\xa0\\xa0{{git.commitMessage}}\\r\\n';\n\n return f(entry);\n };\n\n /**\n * commitMessage\n *\n * @method faker.git.commitMessage\n */\n self.commitMessage = function() {\n var format = '{{hacker.verb}} {{hacker.adjective}} {{hacker.noun}}';\n return f(format);\n };\n\n /**\n * commitSha\n *\n * @method faker.git.commitSha\n */\n self.commitSha = function() {\n var commit = \"\";\n\n for (var i = 0; i < 40; i++) {\n commit += faker.random.arrayElement(hexChars);\n }\n\n return commit;\n };\n\n /**\n * shortSha\n *\n * @method faker.git.shortSha\n */\n self.shortSha = function() {\n var shortSha = \"\";\n\n for (var i = 0; i < 7; i++) {\n shortSha += faker.random.arrayElement(hexChars);\n }\n\n return shortSha;\n };\n\n return self;\n}\n\nmodule['exports'] = Git;\n\n},{}],26:[function(require,module,exports){\n/**\n *\n * @namespace faker.hacker\n */\nvar Hacker = function (faker) {\n var self = this;\n \n /**\n * abbreviation\n *\n * @method faker.hacker.abbreviation\n */\n self.abbreviation = function () {\n return faker.random.arrayElement(faker.definitions.hacker.abbreviation);\n };\n\n /**\n * adjective\n *\n * @method faker.hacker.adjective\n */\n self.adjective = function () {\n return faker.random.arrayElement(faker.definitions.hacker.adjective);\n };\n\n /**\n * noun\n *\n * @method faker.hacker.noun\n */\n self.noun = function () {\n return faker.random.arrayElement(faker.definitions.hacker.noun);\n };\n\n /**\n * verb\n *\n * @method faker.hacker.verb\n */\n self.verb = function () {\n return faker.random.arrayElement(faker.definitions.hacker.verb);\n };\n\n /**\n * ingverb\n *\n * @method faker.hacker.ingverb\n */\n self.ingverb = function () {\n return faker.random.arrayElement(faker.definitions.hacker.ingverb);\n };\n\n /**\n * phrase\n *\n * @method faker.hacker.phrase\n */\n self.phrase = function () {\n\n var data = {\n abbreviation: self.abbreviation,\n adjective: self.adjective,\n ingverb: self.ingverb,\n noun: self.noun,\n verb: self.verb\n };\n\n var phrase = faker.random.arrayElement(faker.definitions.hacker.phrase);\n return faker.helpers.mustache(phrase, data);\n };\n \n return self;\n};\n\nmodule['exports'] = Hacker;\n},{}],27:[function(require,module,exports){\n/**\n *\n * @namespace faker.helpers\n */\nvar Helpers = function (faker) {\n\n var self = this;\n\n /**\n * backward-compatibility\n *\n * @method faker.helpers.randomize\n * @param {array} array\n */\n self.randomize = function (array) {\n array = array || [\"a\", \"b\", \"c\"];\n return faker.random.arrayElement(array);\n };\n\n /**\n * slugifies string\n *\n * @method faker.helpers.slugify\n * @param {string} string\n */\n self.slugify = function (string) {\n string = string || \"\";\n return string.replace(/ /g, '-').replace(/[^\\一-龠\\ぁ-ゔ\\ァ-ヴー\\w\\.\\-]+/g, '');\n };\n\n /**\n * parses string for a symbol and replace it with a random number from 1-10\n *\n * @method faker.helpers.replaceSymbolWithNumber\n * @param {string} string\n * @param {string} symbol defaults to `\"#\"`\n */\n self.replaceSymbolWithNumber = function (string, symbol) {\n string = string || \"\";\n // default symbol is '#'\n if (symbol === undefined) {\n symbol = '#';\n }\n\n var str = '';\n for (var i = 0; i < string.length; i++) {\n if (string.charAt(i) == symbol) {\n str += faker.datatype.number(9);\n } else if (string.charAt(i) == \"!\"){\n str += faker.datatype.number({min: 2, max: 9});\n } else {\n str += string.charAt(i);\n }\n }\n return str;\n };\n\n /**\n * parses string for symbols (numbers or letters) and replaces them appropriately (# will be replaced with number,\n * ? with letter and * will be replaced with number or letter)\n *\n * @method faker.helpers.replaceSymbols\n * @param {string} string\n */\n self.replaceSymbols = function (string) {\n string = string || \"\";\n var alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']\n var str = '';\n\n for (var i = 0; i < string.length; i++) {\n if (string.charAt(i) == \"#\") {\n str += faker.datatype.number(9);\n } else if (string.charAt(i) == \"?\") {\n str += faker.random.arrayElement(alpha);\n } else if (string.charAt(i) == \"*\") {\n str += faker.datatype.boolean() ? faker.random.arrayElement(alpha) : faker.datatype.number(9);\n } else {\n str += string.charAt(i);\n }\n }\n return str;\n };\n\n /**\n * replace symbols in a credit card schems including Luhn checksum\n *\n * @method faker.helpers.replaceCreditCardSymbols\n * @param {string} string\n * @param {string} symbol\n */\n\n self.replaceCreditCardSymbols = function(string, symbol) {\n\n // default values required for calling method without arguments\n string = string || \"6453-####-####-####-###L\";\n symbol = symbol || \"#\";\n\n // Function calculating the Luhn checksum of a number string\n var getCheckBit = function(number) {\n number.reverse();\n number = number.map(function(num, index){\n if (index%2 === 0) {\n num *= 2;\n if(num>9) {\n num -= 9;\n }\n }\n return num;\n });\n var sum = number.reduce(function(prev,curr){return prev + curr;});\n return sum % 10;\n };\n\n string = faker.helpers.regexpStyleStringParse(string); // replace [4-9] with a random number in range etc...\n string = faker.helpers.replaceSymbolWithNumber(string, symbol); // replace ### with random numbers\n\n var numberList = string.replace(/\\D/g,\"\").split(\"\").map(function(num){return parseInt(num);});\n var checkNum = getCheckBit(numberList);\n return string.replace(\"L\",checkNum);\n };\n\n /** string repeat helper, alternative to String.prototype.repeat.... See PR #382\n *\n * @method faker.helpers.repeatString\n * @param {string} string\n * @param {number} num\n */\n self.repeatString = function(string, num) {\n if(typeof num ===\"undefined\") {\n num = 0;\n }\n var text = \"\";\n for(var i = 0; i < num; i++){\n text += string.toString();\n }\n return text;\n };\n\n /**\n * parse string patterns in a similar way to RegExp\n *\n * e.g. \"#{3}test[1-5]\" -> \"###test4\"\n *\n * @method faker.helpers.regexpStyleStringParse\n * @param {string} string\n */\n self.regexpStyleStringParse = function(string){\n string = string || \"\";\n // Deal with range repeat `{min,max}`\n var RANGE_REP_REG = /(.)\\{(\\d+)\\,(\\d+)\\}/;\n var REP_REG = /(.)\\{(\\d+)\\}/;\n var RANGE_REG = /\\[(\\d+)\\-(\\d+)\\]/;\n var min, max, tmp, repetitions;\n var token = string.match(RANGE_REP_REG);\n while(token !== null){\n min = parseInt(token[2]);\n max = parseInt(token[3]);\n // switch min and max\n if(min>max) {\n tmp = max;\n max = min;\n min = tmp;\n }\n repetitions = faker.datatype.number({min:min,max:max});\n string = string.slice(0,token.index) + faker.helpers.repeatString(token[1], repetitions) + string.slice(token.index+token[0].length);\n token = string.match(RANGE_REP_REG);\n }\n // Deal with repeat `{num}`\n token = string.match(REP_REG);\n while(token !== null){\n repetitions = parseInt(token[2]);\n string = string.slice(0,token.index)+ faker.helpers.repeatString(token[1], repetitions) + string.slice(token.index+token[0].length);\n token = string.match(REP_REG);\n }\n // Deal with range `[min-max]` (only works with numbers for now)\n //TODO: implement for letters e.g. [0-9a-zA-Z] etc.\n\n token = string.match(RANGE_REG);\n while(token !== null){\n min = parseInt(token[1]); // This time we are not capturing the char before `[]`\n max = parseInt(token[2]);\n // switch min and max\n if(min>max) {\n tmp = max;\n max = min;\n min = tmp;\n }\n string = string.slice(0,token.index) +\n faker.datatype.number({min:min, max:max}).toString() +\n string.slice(token.index+token[0].length);\n token = string.match(RANGE_REG);\n }\n return string;\n };\n\n /**\n * takes an array and randomizes it in place then returns it\n * \n * uses the modern version of the Fisher–Yates algorithm\n *\n * @method faker.helpers.shuffle\n * @param {array} o\n */\n self.shuffle = function (o) {\n if (typeof o === 'undefined' || o.length === 0) {\n return o || [];\n }\n o = o || [\"a\", \"b\", \"c\"];\n for (var x, j, i = o.length - 1; i > 0; --i) {\n j = faker.datatype.number(i);\n x = o[i];\n o[i] = o[j];\n o[j] = x;\n }\n return o;\n };\n\n /**\n * mustache\n *\n * @method faker.helpers.mustache\n * @param {string} str\n * @param {object} data\n */\n self.mustache = function (str, data) {\n if (typeof str === 'undefined') {\n return '';\n }\n for(var p in data) {\n var re = new RegExp('{{' + p + '}}', 'g')\n str = str.replace(re, data[p]);\n }\n return str;\n };\n\n /**\n * createCard\n *\n * @method faker.helpers.createCard\n */\n self.createCard = function () {\n return {\n \"name\": faker.name.findName(),\n \"username\": faker.internet.userName(),\n \"email\": faker.internet.email(),\n \"address\": {\n \"streetA\": faker.address.streetName(),\n \"streetB\": faker.address.streetAddress(),\n \"streetC\": faker.address.streetAddress(true),\n \"streetD\": faker.address.secondaryAddress(),\n \"city\": faker.address.city(),\n \"state\": faker.address.state(),\n \"country\": faker.address.country(),\n \"zipcode\": faker.address.zipCode(),\n \"geo\": {\n \"lat\": faker.address.latitude(),\n \"lng\": faker.address.longitude()\n }\n },\n \"phone\": faker.phone.phoneNumber(),\n \"website\": faker.internet.domainName(),\n \"company\": {\n \"name\": faker.company.companyName(),\n \"catchPhrase\": faker.company.catchPhrase(),\n \"bs\": faker.company.bs()\n },\n \"posts\": [\n {\n \"words\": faker.lorem.words(),\n \"sentence\": faker.lorem.sentence(),\n \"sentences\": faker.lorem.sentences(),\n \"paragraph\": faker.lorem.paragraph()\n },\n {\n \"words\": faker.lorem.words(),\n \"sentence\": faker.lorem.sentence(),\n \"sentences\": faker.lorem.sentences(),\n \"paragraph\": faker.lorem.paragraph()\n },\n {\n \"words\": faker.lorem.words(),\n \"sentence\": faker.lorem.sentence(),\n \"sentences\": faker.lorem.sentences(),\n \"paragraph\": faker.lorem.paragraph()\n }\n ],\n \"accountHistory\": [faker.helpers.createTransaction(), faker.helpers.createTransaction(), faker.helpers.createTransaction()]\n };\n };\n\n /**\n * contextualCard\n *\n * @method faker.helpers.contextualCard\n */\n self.contextualCard = function () {\n var name = faker.name.firstName(),\n userName = faker.internet.userName(name);\n return {\n \"name\": name,\n \"username\": userName,\n \"avatar\": faker.internet.avatar(),\n \"email\": faker.internet.email(userName),\n \"dob\": faker.date.past(50, new Date(\"Sat Sep 20 1992 21:35:02 GMT+0200 (CEST)\")),\n \"phone\": faker.phone.phoneNumber(),\n \"address\": {\n \"street\": faker.address.streetName(true),\n \"suite\": faker.address.secondaryAddress(),\n \"city\": faker.address.city(),\n \"zipcode\": faker.address.zipCode(),\n \"geo\": {\n \"lat\": faker.address.latitude(),\n \"lng\": faker.address.longitude()\n }\n },\n \"website\": faker.internet.domainName(),\n \"company\": {\n \"name\": faker.company.companyName(),\n \"catchPhrase\": faker.company.catchPhrase(),\n \"bs\": faker.company.bs()\n }\n };\n };\n\n\n /**\n * userCard\n *\n * @method faker.helpers.userCard\n */\n self.userCard = function () {\n return {\n \"name\": faker.name.findName(),\n \"username\": faker.internet.userName(),\n \"email\": faker.internet.email(),\n \"address\": {\n \"street\": faker.address.streetName(true),\n \"suite\": faker.address.secondaryAddress(),\n \"city\": faker.address.city(),\n \"zipcode\": faker.address.zipCode(),\n \"geo\": {\n \"lat\": faker.address.latitude(),\n \"lng\": faker.address.longitude()\n }\n },\n \"phone\": faker.phone.phoneNumber(),\n \"website\": faker.internet.domainName(),\n \"company\": {\n \"name\": faker.company.companyName(),\n \"catchPhrase\": faker.company.catchPhrase(),\n \"bs\": faker.company.bs()\n }\n };\n };\n\n /**\n * createTransaction\n *\n * @method faker.helpers.createTransaction\n */\n self.createTransaction = function(){\n return {\n \"amount\" : faker.finance.amount(),\n \"date\" : new Date(2012, 1, 2), //TODO: add a ranged date method\n \"business\": faker.company.companyName(),\n \"name\": [faker.finance.accountName(), faker.finance.mask()].join(' '),\n \"type\" : self.randomize(faker.definitions.finance.transaction_type),\n \"account\" : faker.finance.account()\n };\n };\n\n return self;\n\n};\n\n\n/*\nString.prototype.capitalize = function () { //v1.0\n return this.replace(/\\w+/g, function (a) {\n return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();\n });\n};\n*/\n\nmodule['exports'] = Helpers;\n\n},{}],28:[function(require,module,exports){\nmodule[\"exports\"] = {\n alpha: [\n 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'\n ],\n pattern10: [\n \"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\"\n ],\n pattern100: [\n \"001\", \"002\", \"003\", \"004\", \"005\", \"006\", \"007\", \"008\", \"009\"\n ],\n toDigitString: function (str) {\n return str.replace(/[A-Z]/gi, function(match) {\n return match.toUpperCase().charCodeAt(0) - 55;\n });\n },\n mod97: function (digitStr) {\n var m = 0;\n for (var i = 0; i < digitStr.length; i++) {\n m = ((m * 10) + (digitStr[i] |0)) % 97;\n }\n return m;\n },\n formats: [\n {\n country: \"AL\",\n total: 28,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"c\",\n count: 16\n }\n ],\n format: \"ALkk bbbs sssx cccc cccc cccc cccc\"\n },\n {\n country: \"AD\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"c\",\n count: 12\n }\n ],\n format: \"ADkk bbbb ssss cccc cccc cccc\"\n },\n {\n country: \"AT\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"n\",\n count: 11\n }\n ],\n format: \"ATkk bbbb bccc cccc cccc\"\n },\n {\n // Azerbaijan\n // https://transferwise.com/fr/iban/azerbaijan\n // Length 28\n // BBAN 2c,16n\n // GEkk bbbb cccc cccc cccc cccc cccc\n // b = National bank code (alpha)\n // c = Account number\n // example IBAN AZ21 NABZ 0000 0000 1370 1000 1944\n country: \"AZ\",\n total: 28,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 20\n }\n ],\n format: \"AZkk bbbb cccc cccc cccc cccc cccc\"\n },\n {\n country: \"BH\",\n total: 22,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 14\n }\n ],\n format: \"BHkk bbbb cccc cccc cccc cc\"\n },\n {\n country: \"BE\",\n total: 16,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 9\n }\n ],\n format: \"BEkk bbbc cccc ccxx\"\n },\n {\n country: \"BA\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"BAkk bbbs sscc cccc ccxx\"\n },\n {\n country: \"BR\",\n total: 29,\n bban: [\n {\n type: \"n\",\n count: 13\n },\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"a\",\n count: 1\n },\n {\n type: \"c\",\n count: 1\n }\n ],\n format: \"BRkk bbbb bbbb ssss sccc cccc ccct n\"\n },\n {\n country: \"BG\",\n total: 22,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"c\",\n count: 8\n }\n ],\n format: \"BGkk bbbb ssss ddcc cccc cc\"\n },\n {\n country: \"CR\",\n total: 21,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 14\n }\n ],\n format: \"CRkk bbbc cccc cccc cccc c\"\n },\n {\n country: \"HR\",\n total: 21,\n bban: [\n {\n type: \"n\",\n count: 7\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"HRkk bbbb bbbc cccc cccc c\"\n },\n {\n country: \"CY\",\n total: 28,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"c\",\n count: 16\n }\n ],\n format: \"CYkk bbbs ssss cccc cccc cccc cccc\"\n },\n {\n country: \"CZ\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"CZkk bbbb ssss sscc cccc cccc\"\n },\n {\n country: \"DK\",\n total: 18,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"DKkk bbbb cccc cccc cc\"\n },\n {\n country: \"DO\",\n total: 28,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 20\n }\n ],\n format: \"DOkk bbbb cccc cccc cccc cccc cccc\"\n },\n {\n country: \"TL\",\n total: 23,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"TLkk bbbc cccc cccc cccc cxx\"\n },\n {\n country: \"EE\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 12\n }\n ],\n format: \"EEkk bbss cccc cccc cccx\"\n },\n {\n country: \"FO\",\n total: 18,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"FOkk bbbb cccc cccc cx\"\n },\n {\n country: \"FI\",\n total: 18,\n bban: [\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 8\n }\n ],\n format: \"FIkk bbbb bbcc cccc cx\"\n },\n {\n country: \"FR\",\n total: 27,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"c\",\n count: 11\n },\n {\n type: \"n\",\n count: 2\n }\n ],\n format: \"FRkk bbbb bggg ggcc cccc cccc cxx\"\n },\n {\n country: \"GE\",\n total: 22,\n bban: [\n {\n type: \"a\",\n count: 2\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"GEkk bbcc cccc cccc cccc cc\"\n },\n {\n country: \"DE\",\n total: 22,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"DEkk bbbb bbbb cccc cccc cc\"\n },\n {\n country: \"GI\",\n total: 23,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 15\n }\n ],\n format: \"GIkk bbbb cccc cccc cccc ccc\"\n },\n {\n country: \"GR\",\n total: 27,\n bban: [\n {\n type: \"n\",\n count: 7\n },\n {\n type: \"c\",\n count: 16\n }\n ],\n format: \"GRkk bbbs sssc cccc cccc cccc ccc\"\n },\n {\n country: \"GL\",\n total: 18,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"GLkk bbbb cccc cccc cc\"\n },\n {\n country: \"GT\",\n total: 28,\n bban: [\n {\n type: \"c\",\n count: 4\n },\n {\n type: \"c\",\n count: 4\n },\n {\n type: \"c\",\n count: 16\n }\n ],\n format: \"GTkk bbbb mmtt cccc cccc cccc cccc\"\n },\n {\n country: \"HU\",\n total: 28,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"HUkk bbbs sssk cccc cccc cccc cccx\"\n },\n {\n country: \"IS\",\n total: 26,\n bban: [\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"ISkk bbbb sscc cccc iiii iiii ii\"\n },\n {\n country: \"IE\",\n total: 22,\n bban: [\n {\n type: \"c\",\n count: 4\n },\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 8\n }\n ],\n format: \"IEkk aaaa bbbb bbcc cccc cc\"\n },\n {\n country: \"IL\",\n total: 23,\n bban: [\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 13\n }\n ],\n format: \"ILkk bbbn nncc cccc cccc ccc\"\n },\n {\n country: \"IT\",\n total: 27,\n bban: [\n {\n type: \"a\",\n count: 1\n },\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"c\",\n count: 12\n }\n ],\n format: \"ITkk xaaa aabb bbbc cccc cccc ccc\"\n },\n {\n country: \"JO\",\n total: 30,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 18\n }\n ],\n format: \"JOkk bbbb nnnn cccc cccc cccc cccc cc\"\n },\n {\n country: \"KZ\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"c\",\n count: 13\n }\n ],\n format: \"KZkk bbbc cccc cccc cccc\"\n },\n {\n country: \"XK\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 12\n }\n ],\n format: \"XKkk bbbb cccc cccc cccc\"\n },\n {\n country: \"KW\",\n total: 30,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 22\n }\n ],\n format: \"KWkk bbbb cccc cccc cccc cccc cccc cc\"\n },\n {\n country: \"LV\",\n total: 21,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 13\n }\n ],\n format: \"LVkk bbbb cccc cccc cccc c\"\n },\n {\n country: \"LB\",\n total: 28,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"c\",\n count: 20\n }\n ],\n format: \"LBkk bbbb cccc cccc cccc cccc cccc\"\n },\n {\n country: \"LI\",\n total: 21,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"c\",\n count: 12\n }\n ],\n format: \"LIkk bbbb bccc cccc cccc c\"\n },\n {\n country: \"LT\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"n\",\n count: 11\n }\n ],\n format: \"LTkk bbbb bccc cccc cccc\"\n },\n {\n country: \"LU\",\n total: 20,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"c\",\n count: 13\n }\n ],\n format: \"LUkk bbbc cccc cccc cccc\"\n },\n {\n country: \"MK\",\n total: 19,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"c\",\n count: 10\n },\n {\n type: \"n\",\n count: 2\n }\n ],\n format: \"MKkk bbbc cccc cccc cxx\"\n },\n {\n country: \"MT\",\n total: 31,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"c\",\n count: 18\n }\n ],\n format: \"MTkk bbbb ssss sccc cccc cccc cccc ccc\"\n },\n {\n country: \"MR\",\n total: 27,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"n\",\n count: 13\n }\n ],\n format: \"MRkk bbbb bsss sscc cccc cccc cxx\"\n },\n {\n country: \"MU\",\n total: 30,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 15\n },\n {\n type: \"a\",\n count: 3\n }\n ],\n format: \"MUkk bbbb bbss cccc cccc cccc 000d dd\"\n },\n {\n country: \"MC\",\n total: 27,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"c\",\n count: 11\n },\n {\n type: \"n\",\n count: 2\n }\n ],\n format: \"MCkk bbbb bsss sscc cccc cccc cxx\"\n },\n {\n country: \"MD\",\n total: 24,\n bban: [\n {\n type: \"c\",\n count: 2\n },\n {\n type: \"c\",\n count: 18\n }\n ],\n format: \"MDkk bbcc cccc cccc cccc cccc\"\n },\n {\n country: \"ME\",\n total: 22,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 15\n }\n ],\n format: \"MEkk bbbc cccc cccc cccc xx\"\n },\n {\n country: \"NL\",\n total: 18,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"NLkk bbbb cccc cccc cc\"\n },\n {\n country: \"NO\",\n total: 15,\n bban: [\n {\n type: \"n\",\n count: 4\n },\n {\n type: \"n\",\n count: 7\n }\n ],\n format: \"NOkk bbbb cccc ccx\"\n },\n {\n country: \"PK\",\n total: 24,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"PKkk bbbb cccc cccc cccc cccc\"\n },\n {\n country: \"PS\",\n total: 29,\n bban: [\n {\n type: \"c\",\n count: 4\n },\n {\n type: \"n\",\n count: 9\n },\n {\n type: \"n\",\n count: 12\n }\n ],\n format: \"PSkk bbbb xxxx xxxx xccc cccc cccc c\"\n },\n {\n country: \"PL\",\n total: 28,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"PLkk bbbs sssx cccc cccc cccc cccc\"\n },\n {\n country: \"PT\",\n total: 25,\n bban: [\n {\n type: \"n\",\n count: 8\n },\n {\n type: \"n\",\n count: 13\n }\n ],\n format: \"PTkk bbbb ssss cccc cccc cccx x\"\n },\n {\n country: \"QA\",\n total: 29,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 21\n }\n ],\n format: \"QAkk bbbb cccc cccc cccc cccc cccc c\"\n },\n {\n country: \"RO\",\n total: 24,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"c\",\n count: 16\n }\n ],\n format: \"ROkk bbbb cccc cccc cccc cccc\"\n },\n {\n country: \"SM\",\n total: 27,\n bban: [\n {\n type: \"a\",\n count: 1\n },\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"c\",\n count: 12\n }\n ],\n format: \"SMkk xaaa aabb bbbc cccc cccc ccc\"\n },\n {\n country: \"SA\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 2\n },\n {\n type: \"c\",\n count: 18\n }\n ],\n format: \"SAkk bbcc cccc cccc cccc cccc\"\n },\n {\n country: \"RS\",\n total: 22,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 15\n }\n ],\n format: \"RSkk bbbc cccc cccc cccc xx\"\n },\n {\n country: \"SK\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"SKkk bbbb ssss sscc cccc cccc\"\n },\n {\n country: \"SI\",\n total: 19,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"SIkk bbss sccc cccc cxx\"\n },\n {\n country: \"ES\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 10\n },\n {\n type: \"n\",\n count: 10\n }\n ],\n format: \"ESkk bbbb gggg xxcc cccc cccc\"\n },\n {\n country: \"SE\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 17\n }\n ],\n format: \"SEkk bbbc cccc cccc cccc cccc\"\n },\n {\n country: \"CH\",\n total: 21,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"c\",\n count: 12\n }\n ],\n format: \"CHkk bbbb bccc cccc cccc c\"\n },\n {\n country: \"TN\",\n total: 24,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"n\",\n count: 15\n }\n ],\n format: \"TNkk bbss sccc cccc cccc cccc\"\n },\n {\n country: \"TR\",\n total: 26,\n bban: [\n {\n type: \"n\",\n count: 5\n },\n {\n type: \"n\",\n count: 1\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"TRkk bbbb bxcc cccc cccc cccc cc\"\n },\n {\n country: \"AE\",\n total: 23,\n bban: [\n {\n type: \"n\",\n count: 3\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"AEkk bbbc cccc cccc cccc ccc\"\n },\n {\n country: \"GB\",\n total: 22,\n bban: [\n {\n type: \"a\",\n count: 4\n },\n {\n type: \"n\",\n count: 6\n },\n {\n type: \"n\",\n count: 8\n }\n ],\n format: \"GBkk bbbb ssss sscc cccc cc\"\n },\n {\n country: \"VG\",\n total: 24,\n bban: [\n {\n type: \"c\",\n count: 4\n },\n {\n type: \"n\",\n count: 16\n }\n ],\n format: \"VGkk bbbb cccc cccc cccc cccc\"\n }\n ],\n iso3166: [\n \"AC\", \"AD\", \"AE\", \"AF\", \"AG\", \"AI\", \"AL\", \"AM\", \"AN\", \"AO\", \"AQ\", \"AR\", \"AS\",\n \"AT\", \"AU\", \"AW\", \"AX\", \"AZ\", \"BA\", \"BB\", \"BD\", \"BE\", \"BF\", \"BG\", \"BH\", \"BI\",\n \"BJ\", \"BL\", \"BM\", \"BN\", \"BO\", \"BQ\", \"BR\", \"BS\", \"BT\", \"BU\", \"BV\", \"BW\", \"BY\",\n \"BZ\", \"CA\", \"CC\", \"CD\", \"CE\", \"CF\", \"CG\", \"CH\", \"CI\", \"CK\", \"CL\", \"CM\", \"CN\",\n \"CO\", \"CP\", \"CR\", \"CS\", \"CS\", \"CU\", \"CV\", \"CW\", \"CX\", \"CY\", \"CZ\", \"DD\", \"DE\",\n \"DG\", \"DJ\", \"DK\", \"DM\", \"DO\", \"DZ\", \"EA\", \"EC\", \"EE\", \"EG\", \"EH\", \"ER\", \"ES\",\n \"ET\", \"EU\", \"FI\", \"FJ\", \"FK\", \"FM\", \"FO\", \"FR\", \"FX\", \"GA\", \"GB\", \"GD\", \"GE\",\n \"GF\", \"GG\", \"GH\", \"GI\", \"GL\", \"GM\", \"GN\", \"GP\", \"GQ\", \"GR\", \"GS\", \"GT\", \"GU\",\n \"GW\", \"GY\", \"HK\", \"HM\", \"HN\", \"HR\", \"HT\", \"HU\", \"IC\", \"ID\", \"IE\", \"IL\", \"IM\",\n \"IN\", \"IO\", \"IQ\", \"IR\", \"IS\", \"IT\", \"JE\", \"JM\", \"JO\", \"JP\", \"KE\", \"KG\", \"KH\",\n \"KI\", \"KM\", \"KN\", \"KP\", \"KR\", \"KW\", \"KY\", \"KZ\", \"LA\", \"LB\", \"LC\", \"LI\", \"LK\",\n \"LR\", \"LS\", \"LT\", \"LU\", \"LV\", \"LY\", \"MA\", \"MC\", \"MD\", \"ME\", \"MF\", \"MG\", \"MH\",\n \"MK\", \"ML\", \"MM\", \"MN\", \"MO\", \"MP\", \"MQ\", \"MR\", \"MS\", \"MT\", \"MU\", \"MV\", \"MW\",\n \"MX\", \"MY\", \"MZ\", \"NA\", \"NC\", \"NE\", \"NF\", \"NG\", \"NI\", \"NL\", \"NO\", \"NP\", \"NR\",\n \"NT\", \"NU\", \"NZ\", \"OM\", \"PA\", \"PE\", \"PF\", \"PG\", \"PH\", \"PK\", \"PL\", \"PM\", \"PN\",\n \"PR\", \"PS\", \"PT\", \"PW\", \"PY\", \"QA\", \"RE\", \"RO\", \"RS\", \"RU\", \"RW\", \"SA\", \"SB\",\n \"SC\", \"SD\", \"SE\", \"SG\", \"SH\", \"SI\", \"SJ\", \"SK\", \"SL\", \"SM\", \"SN\", \"SO\", \"SR\",\n \"SS\", \"ST\", \"SU\", \"SV\", \"SX\", \"SY\", \"SZ\", \"TA\", \"TC\", \"TD\", \"TF\", \"TG\", \"TH\",\n \"TJ\", \"TK\", \"TL\", \"TM\", \"TN\", \"TO\", \"TR\", \"TT\", \"TV\", \"TW\", \"TZ\", \"UA\", \"UG\",\n \"UM\", \"US\", \"UY\", \"UZ\", \"VA\", \"VC\", \"VE\", \"VG\", \"VI\", \"VN\", \"VU\", \"WF\", \"WS\",\n \"YE\", \"YT\", \"YU\", \"ZA\", \"ZM\", \"ZR\", \"ZW\"\n ]\n}\n\n},{}],29:[function(require,module,exports){\n/**\n *\n * @namespace faker.image\n * @property {object} lorempixel - faker.image.lorempixel\n * @property {object} unsplash - faker.image.unsplash\n * @property {object} unsplash - faker.image.lorempicsum\n * @default Default provider is unsplash image provider\n */\nvar Image = function (faker) {\n\n var self = this;\n var Lorempixel = require('./image_providers/lorempixel');\n var Unsplash = require('./image_providers/unsplash');\n var LoremPicsum = require('./image_providers/lorempicsum');\n\n /**\n * image\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.image\n */\n self.image = function (width, height, randomize) {\n var categories = [\"abstract\", \"animals\", \"business\", \"cats\", \"city\", \"food\", \"nightlife\", \"fashion\", \"people\", \"nature\", \"sports\", \"technics\", \"transport\"];\n return self[faker.random.arrayElement(categories)](width, height, randomize);\n };\n /**\n * avatar\n *\n * @method faker.image.avatar\n */\n self.avatar = function () {\n return faker.internet.avatar();\n };\n /**\n * imageUrl\n *\n * @param {number} width\n * @param {number} height\n * @param {string} category\n * @param {boolean} randomize\n * @method faker.image.imageUrl\n */\n self.imageUrl = function (width, height, category, randomize, https) {\n var width = width || 640;\n var height = height || 480;\n var protocol = 'http://';\n if (typeof https !== 'undefined' && https === true) {\n protocol = 'https://';\n }\n var url = protocol + 'placeimg.com/' + width + '/' + height;\n if (typeof category !== 'undefined') {\n url += '/' + category;\n }\n\n if (randomize) {\n url += '?' + faker.datatype.number()\n }\n\n return url;\n };\n /**\n * abstract\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.abstract\n */\n self.abstract = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'abstract', randomize);\n };\n /**\n * animals\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.animals\n */\n self.animals = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'animals', randomize);\n };\n /**\n * business\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.business\n */\n self.business = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'business', randomize);\n };\n /**\n * cats\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.cats\n */\n self.cats = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'cats', randomize);\n };\n /**\n * city\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.city\n */\n self.city = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'city', randomize);\n };\n /**\n * food\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.food\n */\n self.food = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'food', randomize);\n };\n /**\n * nightlife\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.nightlife\n */\n self.nightlife = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'nightlife', randomize);\n };\n /**\n * fashion\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.fashion\n */\n self.fashion = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'fashion', randomize);\n };\n /**\n * people\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.people\n */\n self.people = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'people', randomize);\n };\n /**\n * nature\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.nature\n */\n self.nature = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'nature', randomize);\n };\n /**\n * sports\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.sports\n */\n self.sports = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'sports', randomize);\n };\n /**\n * technics\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.technics\n */\n self.technics = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'technics', randomize);\n };\n /**\n * transport\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.transport\n */\n self.transport = function (width, height, randomize) {\n return faker.image.imageUrl(width, height, 'transport', randomize);\n };\n /**\n * dataUri\n *\n * @param {number} width\n * @param {number} height\n * @param {string} color\n * @method faker.image.dataUri\n */\n self.dataUri = function (width, height, color) {\n color = color || 'grey';\n var svgString = '' + width + 'x' + height + '';\n var rawPrefix = 'data:image/svg+xml;charset=UTF-8,';\n return rawPrefix + encodeURIComponent(svgString);\n };\n\n self.lorempixel = new Lorempixel(faker);\n self.unsplash = new Unsplash(faker);\n self.lorempicsum = new LoremPicsum(faker);\n\n // Object.assign(self, self.unsplash);\n // How to set default as unsplash? should be image.default?\n}\n\n\nmodule[\"exports\"] = Image;\n\n},{\"./image_providers/lorempicsum\":30,\"./image_providers/lorempixel\":31,\"./image_providers/unsplash\":32}],30:[function(require,module,exports){\n/**\n *\n * @namespace lorempicsum\n * @memberof faker.image\n */\nvar LoremPicsum = function (faker) {\n\n var self = this;\n\n /**\n * image\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} grayscale\n * @param {number} blur 1-10\n * @method faker.image.lorempicsum.image\n * @description search image from unsplash\n */\n self.image = function (width, height, grayscale, blur) {\n return self.imageUrl(width, height, grayscale, blur);\n };\n /**\n * imageGrayscaled\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} grayscale\n * @method faker.image.lorempicsum.imageGrayscaled\n * @description search grayscale image from unsplash\n */\n self.imageGrayscale = function (width, height, grayscale) {\n return self.imageUrl(width, height, grayscale);\n };\n /**\n * imageBlurred\n *\n * @param {number} width\n * @param {number} height\n * @param {number} blur 1-10\n * @method faker.image.lorempicsum.imageBlurred\n * @description search blurred image from unsplash\n */\n self.imageBlurred = function (width, height, blur) {\n return self.imageUrl(width, height, undefined, blur);\n };\n /**\n * imageRandomSeeded\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} grayscale\n * @param {number} blur 1-10\n * @param {string} seed\n * @method faker.image.lorempicsum.imageRandomSeeded\n * @description search same random image from unsplash, based on a seed\n */\n self.imageRandomSeeded = function (width, height, grayscale, blur, seed) {\n return self.imageUrl(width, height, grayscale, blur, seed);\n };\n /**\n * avatar\n *\n * @method faker.image.lorempicsum.avatar\n */\n self.avatar = function () {\n return faker.internet.avatar();\n };\n /**\n * imageUrl\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} grayscale\n * @param {number} blur 1-10\n * @param {string} seed\n * @method faker.image.lorempicsum.imageUrl\n */\n self.imageUrl = function (width, height, grayscale, blur, seed) {\n var width = width || 640;\n var height = height || 480;\n \n var url = 'https://picsum.photos';\n \n if (seed) {\n url += '/seed/' + seed;\n }\n\n url += '/' + width + '/' + height;\n \n if (grayscale && blur) {\n return url + '?grayscale' + '&blur=' + blur;\n }\n\n if (grayscale) {\n return url + '?grayscale';\n }\n\n if (blur) {\n return url + '?blur=' + blur;\n }\n \n return url;\n };\n }\n \n module[\"exports\"] = LoremPicsum;\n \n},{}],31:[function(require,module,exports){\n/**\n *\n * @namespace lorempixel\n * @memberof faker.image\n */\nvar Lorempixel = function (faker) {\n\n var self = this;\n\n /**\n * image\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.image\n */\n self.image = function (width, height, randomize) {\n var categories = [\"abstract\", \"animals\", \"business\", \"cats\", \"city\", \"food\", \"nightlife\", \"fashion\", \"people\", \"nature\", \"sports\", \"technics\", \"transport\"];\n return self[faker.random.arrayElement(categories)](width, height, randomize);\n };\n /**\n * avatar\n *\n * @method faker.image.lorempixel.avatar\n */\n self.avatar = function () {\n return faker.internet.avatar();\n };\n /**\n * imageUrl\n *\n * @param {number} width\n * @param {number} height\n * @param {string} category\n * @param {boolean} randomize\n * @method faker.image.lorempixel.imageUrl\n */\n self.imageUrl = function (width, height, category, randomize) {\n var width = width || 640;\n var height = height || 480;\n\n var url ='https://lorempixel.com/' + width + '/' + height;\n if (typeof category !== 'undefined') {\n url += '/' + category;\n }\n\n if (randomize) {\n url += '?' + faker.datatype.number()\n }\n\n return url;\n };\n /**\n * abstract\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.abstract\n */\n self.abstract = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'abstract', randomize);\n };\n /**\n * animals\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.animals\n */\n self.animals = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'animals', randomize);\n };\n /**\n * business\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.business\n */\n self.business = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'business', randomize);\n };\n /**\n * cats\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.cats\n */\n self.cats = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'cats', randomize);\n };\n /**\n * city\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.city\n */\n self.city = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'city', randomize);\n };\n /**\n * food\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.food\n */\n self.food = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'food', randomize);\n };\n /**\n * nightlife\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.nightlife\n */\n self.nightlife = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'nightlife', randomize);\n };\n /**\n * fashion\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.fashion\n */\n self.fashion = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'fashion', randomize);\n };\n /**\n * people\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.people\n */\n self.people = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'people', randomize);\n };\n /**\n * nature\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.nature\n */\n self.nature = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'nature', randomize);\n };\n /**\n * sports\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.sports\n */\n self.sports = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'sports', randomize);\n };\n /**\n * technics\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.technics\n */\n self.technics = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'technics', randomize);\n };\n /**\n * transport\n *\n * @param {number} width\n * @param {number} height\n * @param {boolean} randomize\n * @method faker.image.lorempixel.transport\n */\n self.transport = function (width, height, randomize) {\n return faker.image.lorempixel.imageUrl(width, height, 'transport', randomize);\n }\n}\n\nmodule[\"exports\"] = Lorempixel;\n\n},{}],32:[function(require,module,exports){\n/**\n *\n * @namespace unsplash\n * @memberof faker.image\n */\nvar Unsplash = function (faker) {\n\n var self = this;\n var categories = [\"food\", \"nature\", \"people\", \"technology\", \"objects\", \"buildings\"];\n\n /**\n * image\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.image\n * @description search image from unsplash\n */\n self.image = function (width, height, keyword) {\n return self.imageUrl(width, height, undefined, keyword);\n };\n /**\n * avatar\n *\n * @method faker.image.unsplash.avatar\n */\n self.avatar = function () {\n return faker.internet.avatar();\n };\n /**\n * imageUrl\n *\n * @param {number} width\n * @param {number} height\n * @param {string} category\n * @param {string} keyword\n * @method faker.image.unsplash.imageUrl\n */\n self.imageUrl = function (width, height, category, keyword) {\n var width = width || 640;\n var height = height || 480;\n\n var url ='https://source.unsplash.com';\n\n if (typeof category !== 'undefined') {\n url += '/category/' + category;\n }\n\n url += '/' + width + 'x' + height;\n\n if (typeof keyword !== 'undefined') {\n var keywordFormat = new RegExp('^([A-Za-z0-9].+,[A-Za-z0-9]+)$|^([A-Za-z0-9]+)$');\n if (keywordFormat.test(keyword)) {\n url += '?' + keyword;\n }\n }\n\n return url;\n };\n /**\n * food\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.food\n */\n self.food = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'food', keyword);\n };\n /**\n * people\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.people\n */\n self.people = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'people', keyword);\n };\n /**\n * nature\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.nature\n */\n self.nature = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'nature', keyword);\n };\n /**\n * technology\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.technology\n */\n self.technology = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'technology', keyword);\n };\n /**\n * objects\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.objects\n */\n self.objects = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'objects', keyword);\n };\n /**\n * buildings\n *\n * @param {number} width\n * @param {number} height\n * @param {string} keyword\n * @method faker.image.unsplash.buildings\n */\n self.buildings = function (width, height, keyword) {\n return faker.image.unsplash.imageUrl(width, height, 'buildings', keyword);\n };\n}\n\nmodule[\"exports\"] = Unsplash;\n\n},{}],33:[function(require,module,exports){\n/*\n\n this index.js file is used for including the faker library as a CommonJS module, instead of a bundle\n\n you can include the faker library into your existing node.js application by requiring the entire /faker directory\n\n var faker = require(./faker);\n var randomName = faker.name.findName();\n\n you can also simply include the \"faker.js\" file which is the auto-generated bundled version of the faker library\n\n var faker = require(./customAppPath/faker);\n var randomName = faker.name.findName();\n\n\n if you plan on modifying the faker library you should be performing your changes in the /lib/ directory\n\n*/\n\n/**\n *\n * @namespace faker\n */\nfunction Faker (opts) {\n\n var self = this;\n\n opts = opts || {};\n\n // assign options\n var locales = self.locales || opts.locales || {};\n var locale = self.locale || opts.locale || \"en\";\n var localeFallback = self.localeFallback || opts.localeFallback || \"en\";\n\n self.locales = locales;\n self.locale = locale;\n self.localeFallback = localeFallback;\n\n self.definitions = {};\n\n var _definitions = {\n \"name\": [\"first_name\", \"last_name\", \"prefix\", \"suffix\", \"binary_gender\", \"gender\", \"title\", \"male_prefix\", \"female_prefix\", \"male_first_name\", \"female_first_name\", \"male_middle_name\", \"female_middle_name\", \"male_last_name\", \"female_last_name\"],\n \"address\": [\"city_name\", \"city_prefix\", \"city_suffix\", \"street_suffix\", \"county\", \"country\", \"country_code\", \"country_code_alpha_3\", \"state\", \"state_abbr\", \"street_prefix\", \"postcode\", \"postcode_by_state\", \"direction\", \"direction_abbr\", \"time_zone\"],\n \"animal\": [\"dog\", \"cat\", \"snake\", \"bear\", \"lion\", \"cetacean\", \"insect\", \"crocodilia\", \"cow\", \"bird\", \"fish\", \"rabbit\", \"horse\", \"type\"],\n \"company\": [\"adjective\", \"noun\", \"descriptor\", \"bs_adjective\", \"bs_noun\", \"bs_verb\", \"suffix\"],\n \"lorem\": [\"words\"],\n \"hacker\": [\"abbreviation\", \"adjective\", \"noun\", \"verb\", \"ingverb\", \"phrase\"],\n \"phone_number\": [\"formats\"],\n \"finance\": [\"account_type\", \"transaction_type\", \"currency\", \"iban\", \"credit_card\"],\n \"internet\": [\"avatar_uri\", \"domain_suffix\", \"free_email\", \"example_email\", \"password\"],\n \"commerce\": [\"color\", \"department\", \"product_name\", \"price\", \"categories\", \"product_description\"],\n \"database\": [\"collation\", \"column\", \"engine\", \"type\"],\n \"system\": [\"mimeTypes\", \"directoryPaths\"],\n \"date\": [\"month\", \"weekday\"],\n \"vehicle\": [\"vehicle\", \"manufacturer\", \"model\", \"type\", \"fuel\", \"vin\", \"color\"],\n \"music\": [\"genre\"],\n \"title\": \"\",\n \"separator\": \"\"\n };\n\n // Create a Getter for all definitions.foo.bar properties\n Object.keys(_definitions).forEach(function(d){\n if (typeof self.definitions[d] === \"undefined\") {\n self.definitions[d] = {};\n }\n\n if (typeof _definitions[d] === \"string\") {\n self.definitions[d] = _definitions[d];\n return;\n }\n\n _definitions[d].forEach(function(p){\n Object.defineProperty(self.definitions[d], p, {\n get: function () {\n if (typeof self.locales[self.locale][d] === \"undefined\" || typeof self.locales[self.locale][d][p] === \"undefined\") {\n // certain localization sets contain less data then others.\n // in the case of a missing definition, use the default localeFallback to substitute the missing set data\n // throw new Error('unknown property ' + d + p)\n return self.locales[localeFallback][d][p];\n } else {\n // return localized data\n return self.locales[self.locale][d][p];\n }\n }\n });\n });\n });\n\n var Fake = require('./fake');\n self.fake = new Fake(self).fake;\n\n var Unique = require('./unique');\n self.unique = new Unique(self).unique;\n\n var Mersenne = require('./mersenne');\n self.mersenne = new Mersenne();\n\n var Random = require('./random');\n self.random = new Random(self);\n\n var Helpers = require('./helpers');\n self.helpers = new Helpers(self);\n\n var Name = require('./name');\n self.name = new Name(self);\n\n var Address = require('./address');\n self.address = new Address(self);\n\n var Animal = require('./animal');\n self.animal = new Animal(self);\n\n var Company = require('./company');\n self.company = new Company(self);\n\n var Finance = require('./finance');\n self.finance = new Finance(self);\n\n var Image = require('./image');\n self.image = new Image(self);\n\n var Lorem = require('./lorem');\n self.lorem = new Lorem(self);\n\n var Hacker = require('./hacker');\n self.hacker = new Hacker(self);\n\n var Internet = require('./internet');\n self.internet = new Internet(self);\n\n var Database = require('./database');\n self.database = new Database(self);\n\n var Phone = require('./phone_number');\n self.phone = new Phone(self);\n\n var _Date = require('./date');\n self.date = new _Date(self);\n\n var _Time = require('./time');\n self.time = new _Time(self);\n\n var Commerce = require('./commerce');\n self.commerce = new Commerce(self);\n\n var System = require('./system');\n self.system = new System(self);\n\n var Git = require('./git');\n self.git = new Git(self);\n\n var Vehicle = require('./vehicle');\n self.vehicle = new Vehicle(self);\n\n var Music = require('./music');\n self.music = new Music(self);\n\n var Datatype = require('./datatype');\n self.datatype = new Datatype(self);\n};\n\nFaker.prototype.setLocale = function (locale) {\n this.locale = locale;\n}\n\nFaker.prototype.seed = function(value) {\n var Random = require('./random');\n var Datatype = require('./datatype');\n this.seedValue = value;\n this.random = new Random(this, this.seedValue);\n this.datatype = new Datatype(this, this.seedValue);\n}\nmodule['exports'] = Faker;\n\n},{\"./address\":16,\"./animal\":17,\"./commerce\":18,\"./company\":19,\"./database\":20,\"./datatype\":21,\"./date\":22,\"./fake\":23,\"./finance\":24,\"./git\":25,\"./hacker\":26,\"./helpers\":27,\"./image\":29,\"./internet\":34,\"./lorem\":163,\"./mersenne\":164,\"./music\":165,\"./name\":166,\"./phone_number\":167,\"./random\":168,\"./system\":169,\"./time\":170,\"./unique\":171,\"./vehicle\":172}],34:[function(require,module,exports){\nvar random_ua = require('../vendor/user-agent');\n\n/**\n *\n * @namespace faker.internet\n */\nvar Internet = function (faker) {\n var self = this;\n /**\n * avatar\n *\n * @method faker.internet.avatar\n */\n self.avatar = function () {\n return 'https://cdn.fakercloud.com/avatars/' + faker.random.arrayElement(faker.definitions.internet.avatar_uri);\n };\n\n self.avatar.schema = {\n \"description\": \"Generates a URL for an avatar.\",\n \"sampleResults\": [\"https://cdn.fakercloud.com/avatars/sydlawrence_128.jpg\"]\n };\n\n /**\n * email\n *\n * @method faker.internet.email\n * @param {string} firstName\n * @param {string} lastName\n * @param {string} provider\n */\n self.email = function (firstName, lastName, provider) {\n provider = provider || faker.random.arrayElement(faker.definitions.internet.free_email);\n return faker.helpers.slugify(faker.internet.userName(firstName, lastName)) + \"@\" + provider;\n };\n\n self.email.schema = {\n \"description\": \"Generates a valid email address based on optional input criteria\",\n \"sampleResults\": [\"foo.bar@gmail.com\"],\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The first name of the user\"\n },\n \"lastName\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The last name of the user\"\n },\n \"provider\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The domain of the user\"\n }\n }\n };\n /**\n * exampleEmail\n *\n * @method faker.internet.exampleEmail\n * @param {string} firstName\n * @param {string} lastName\n */\n self.exampleEmail = function (firstName, lastName) {\n var provider = faker.random.arrayElement(faker.definitions.internet.example_email);\n return self.email(firstName, lastName, provider);\n };\n\n /**\n * userName\n *\n * @method faker.internet.userName\n * @param {string} firstName\n * @param {string} lastName\n */\n self.userName = function (firstName, lastName) {\n var result;\n firstName = firstName || faker.name.firstName();\n lastName = lastName || faker.name.lastName();\n switch (faker.datatype.number(2)) {\n case 0:\n result = firstName + faker.datatype.number(99);\n break;\n case 1:\n result = firstName + faker.random.arrayElement([\".\", \"_\"]) + lastName;\n break;\n case 2:\n result = firstName + faker.random.arrayElement([\".\", \"_\"]) + lastName + faker.datatype.number(99);\n break;\n }\n result = result.toString().replace(/'/g, \"\");\n result = result.replace(/ /g, \"\");\n return result;\n };\n\n self.userName.schema = {\n \"description\": \"Generates a username based on one of several patterns. The pattern is chosen randomly.\",\n \"sampleResults\": [\n \"Kirstin39\",\n \"Kirstin.Smith\",\n \"Kirstin.Smith39\",\n \"KirstinSmith\",\n \"KirstinSmith39\",\n ],\n \"properties\": {\n \"firstName\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The first name of the user\"\n },\n \"lastName\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"The last name of the user\"\n }\n }\n };\n\n /**\n * protocol\n *\n * @method faker.internet.protocol\n */\n self.protocol = function () {\n var protocols = ['http','https'];\n return faker.random.arrayElement(protocols);\n };\n\n self.protocol.schema = {\n \"description\": \"Randomly generates http or https\",\n \"sampleResults\": [\"https\", \"http\"]\n };\n\n /**\n * method\n *\n * @method faker.internet.httpMethod\n */\n self.httpMethod = function () {\n var httpMethods = ['GET','POST', 'PUT', 'DELETE', 'PATCH'];\n return faker.random.arrayElement(httpMethods);\n };\n\n self.httpMethod.schema = {\n \"description\": \"Randomly generates HTTP Methods (GET, POST, PUT, DELETE, PATCH)\",\n \"sampleResults\": [\"GET\",\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]\n };\n\n /**\n * url\n *\n * @method faker.internet.url\n */\n self.url = function () {\n return faker.internet.protocol() + '://' + faker.internet.domainName();\n };\n\n self.url.schema = {\n \"description\": \"Generates a random URL. The URL could be secure or insecure.\",\n \"sampleResults\": [\n \"http://rashawn.name\",\n \"https://rashawn.name\"\n ]\n };\n\n /**\n * domainName\n *\n * @method faker.internet.domainName\n */\n self.domainName = function () {\n return faker.internet.domainWord() + \".\" + faker.internet.domainSuffix();\n };\n\n self.domainName.schema = {\n \"description\": \"Generates a random domain name.\",\n \"sampleResults\": [\"marvin.org\"]\n };\n\n /**\n * domainSuffix\n *\n * @method faker.internet.domainSuffix\n */\n self.domainSuffix = function () {\n return faker.random.arrayElement(faker.definitions.internet.domain_suffix);\n };\n\n self.domainSuffix.schema = {\n \"description\": \"Generates a random domain suffix.\",\n \"sampleResults\": [\"net\"]\n };\n\n /**\n * domainWord\n *\n * @method faker.internet.domainWord\n */\n self.domainWord = function () {\n return faker.name.firstName().replace(/([\\\\~#&*{}/:<>?|\\\"'])/ig, '').toLowerCase();\n };\n\n self.domainWord.schema = {\n \"description\": \"Generates a random domain word.\",\n \"sampleResults\": [\"alyce\"]\n };\n\n /**\n * ip\n *\n * @method faker.internet.ip\n */\n self.ip = function () {\n var randNum = function () {\n return (faker.datatype.number(255)).toFixed(0);\n };\n\n var result = [];\n for (var i = 0; i < 4; i++) {\n result[i] = randNum();\n }\n\n return result.join(\".\");\n };\n\n self.ip.schema = {\n \"description\": \"Generates a random IP.\",\n \"sampleResults\": [\"97.238.241.11\"]\n };\n\n /**\n * ipv6\n *\n * @method faker.internet.ipv6\n */\n self.ipv6 = function () {\n var randHash = function () {\n var result = \"\";\n for (var i = 0; i < 4; i++) {\n result += (faker.random.arrayElement([\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"]));\n }\n return result\n };\n\n var result = [];\n for (var i = 0; i < 8; i++) {\n result[i] = randHash();\n }\n return result.join(\":\");\n };\n\n self.ipv6.schema = {\n \"description\": \"Generates a random IPv6 address.\",\n \"sampleResults\": [\"2001:0db8:6276:b1a7:5213:22f1:25df:c8a0\"]\n };\n\n /**\n * port\n * \n * @method faker.internet.port\n */\n self.port = function() {\n return faker.datatype.number({ min: 0, max: 65535 });\n };\n\n self.port.schema = {\n \"description\": \"Generates a random port number.\",\n \"sampleResults\": [\"4422\"]\n };\n\n /**\n * userAgent\n *\n * @method faker.internet.userAgent\n */\n self.userAgent = function () {\n return random_ua.generate(faker);\n };\n\n self.userAgent.schema = {\n \"description\": \"Generates a random user agent.\",\n \"sampleResults\": [\"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_5 rv:6.0; SL) AppleWebKit/532.0.1 (KHTML, like Gecko) Version/7.1.6 Safari/532.0.1\"]\n };\n\n /**\n * color\n *\n * @method faker.internet.color\n * @param {number} baseRed255\n * @param {number} baseGreen255\n * @param {number} baseBlue255\n */\n self.color = function (baseRed255, baseGreen255, baseBlue255) {\n baseRed255 = baseRed255 || 0;\n baseGreen255 = baseGreen255 || 0;\n baseBlue255 = baseBlue255 || 0;\n // based on awesome response : http://stackoverflow.com/questions/43044/algorithm-to-randomly-generate-an-aesthetically-pleasing-color-palette\n var red = Math.floor((faker.datatype.number(256) + baseRed255) / 2);\n var green = Math.floor((faker.datatype.number(256) + baseGreen255) / 2);\n var blue = Math.floor((faker.datatype.number(256) + baseBlue255) / 2);\n var redStr = red.toString(16);\n var greenStr = green.toString(16);\n var blueStr = blue.toString(16);\n return '#' +\n (redStr.length === 1 ? '0' : '') + redStr +\n (greenStr.length === 1 ? '0' : '') + greenStr +\n (blueStr.length === 1 ? '0': '') + blueStr;\n\n };\n\n self.color.schema = {\n \"description\": \"Generates a random hexadecimal color.\",\n \"sampleResults\": [\"#06267f\"],\n \"properties\": {\n \"baseRed255\": {\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"The red value. Valid values are 0 - 255.\"\n },\n \"baseGreen255\": {\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"The green value. Valid values are 0 - 255.\"\n },\n \"baseBlue255\": {\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"The blue value. Valid values are 0 - 255.\"\n }\n }\n };\n\n /**\n * mac\n *\n * @method faker.internet.mac\n * @param {string} sep\n */\n self.mac = function(sep){\n var i, \n mac = \"\",\n validSep = ':';\n\n // if the client passed in a different separator than `:`, \n // we will use it if it is in the list of acceptable separators (dash or no separator)\n if (['-', ''].indexOf(sep) !== -1) {\n validSep = sep;\n } \n\n for (i=0; i < 12; i++) {\n mac+= faker.datatype.number(15).toString(16);\n if (i%2==1 && i != 11) {\n mac+=validSep;\n }\n }\n return mac;\n };\n\n self.mac.schema = {\n \"description\": \"Generates a random mac address.\",\n \"sampleResults\": [\"78:06:cc:ae:b3:81\"]\n };\n\n /**\n * password\n *\n * @method faker.internet.password\n * @param {number} len\n * @param {boolean} memorable\n * @param {string} pattern\n * @param {string} prefix\n */\n self.password = function (len, memorable, pattern, prefix) {\n len = len || 15;\n if (typeof memorable === \"undefined\") {\n memorable = false;\n }\n /*\n * password-generator ( function )\n * Copyright(c) 2011-2013 Bermi Ferrer \n * MIT Licensed\n */\n var consonant, letter, vowel;\n letter = /[a-zA-Z]$/;\n vowel = /[aeiouAEIOU]$/;\n consonant = /[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]$/;\n var _password = function (length, memorable, pattern, prefix) {\n var char, n;\n if (length == null) {\n length = 10;\n }\n if (memorable == null) {\n memorable = true;\n }\n if (pattern == null) {\n pattern = /\\w/;\n }\n if (prefix == null) {\n prefix = '';\n }\n if (prefix.length >= length) {\n return prefix;\n }\n if (memorable) {\n if (prefix.match(consonant)) {\n pattern = vowel;\n } else {\n pattern = consonant;\n }\n }\n n = faker.datatype.number(94) + 33;\n char = String.fromCharCode(n);\n if (memorable) {\n char = char.toLowerCase();\n }\n if (!char.match(pattern)) {\n return _password(length, memorable, pattern, prefix);\n }\n return _password(length, memorable, pattern, \"\" + prefix + char);\n };\n return _password(len, memorable, pattern, prefix);\n }\n\n self.password.schema = {\n \"description\": \"Generates a random password.\",\n \"sampleResults\": [\n \"AM7zl6Mg\",\n \"susejofe\"\n ],\n \"properties\": {\n \"length\": {\n \"type\": \"number\",\n \"required\": false,\n \"description\": \"The number of characters in the password.\"\n },\n \"memorable\": {\n \"type\": \"boolean\",\n \"required\": false,\n \"description\": \"Whether a password should be easy to remember.\"\n },\n \"pattern\": {\n \"type\": \"regex\",\n \"required\": false,\n \"description\": \"A regex to match each character of the password against. This parameter will be negated if the memorable setting is turned on.\"\n },\n \"prefix\": {\n \"type\": \"string\",\n \"required\": false,\n \"description\": \"A value to prepend to the generated password. The prefix counts towards the length of the password.\"\n }\n }\n };\n\n};\n\n\nmodule[\"exports\"] = Internet;\n\n},{\"../vendor/user-agent\":176}],35:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#####\",\n \"####\",\n \"###\"\n];\n\n},{}],36:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{city_prefix} #{Name.first_name}#{city_suffix}\",\n \"#{city_prefix} #{Name.first_name}\",\n \"#{Name.first_name}#{city_suffix}\",\n \"#{Name.last_name}#{city_suffix}\"\n];\n\n},{}],37:[function(require,module,exports){\nmodule.exports = [\n \"Abilene\",\n \"Akron\",\n \"Alafaya\",\n \"Alameda\",\n \"Albany\",\n \"Albany\",\n \"Albany\",\n \"Albuquerque\",\n \"Alexandria\",\n \"Alexandria\",\n \"Alhambra\",\n \"Aliso Viejo\",\n \"Allen\",\n \"Allentown\",\n \"Aloha\",\n \"Alpharetta\",\n \"Altadena\",\n \"Altamonte Springs\",\n \"Altoona\",\n \"Amarillo\",\n \"Ames\",\n \"Anaheim\",\n \"Anchorage\",\n \"Anderson\",\n \"Ankeny\",\n \"Ann Arbor\",\n \"Annandale\",\n \"Antelope\",\n \"Antioch\",\n \"Apex\",\n \"Apopka\",\n \"Apple Valley\",\n \"Apple Valley\",\n \"Appleton\",\n \"Arcadia\",\n \"Arden-Arcade\",\n \"Arecibo\",\n \"Arlington\",\n \"Arlington\",\n \"Arlington\",\n \"Arlington Heights\",\n \"Arvada\",\n \"Ashburn\",\n \"Asheville\",\n \"Aspen Hill\",\n \"Atascocita\",\n \"Athens-Clarke County\",\n \"Atlanta\",\n \"Attleboro\",\n \"Auburn\",\n \"Auburn\",\n \"Augusta-Richmond County\",\n \"Aurora\",\n \"Aurora\",\n \"Austin\",\n \"Avondale\",\n \"Azusa\",\n \"Bakersfield\",\n \"Baldwin Park\",\n \"Baltimore\",\n \"Barnstable Town\",\n \"Bartlett\",\n \"Bartlett\",\n \"Baton Rouge\",\n \"Battle Creek\",\n \"Bayamon\",\n \"Bayonne\",\n \"Baytown\",\n \"Beaumont\",\n \"Beaumont\",\n \"Beavercreek\",\n \"Beaverton\",\n \"Bedford\",\n \"Bel Air South\",\n \"Bell Gardens\",\n \"Belleville\",\n \"Bellevue\",\n \"Bellevue\",\n \"Bellflower\",\n \"Bellingham\",\n \"Bend\",\n \"Bentonville\",\n \"Berkeley\",\n \"Berwyn\",\n \"Bethesda\",\n \"Bethlehem\",\n \"Billings\",\n \"Biloxi\",\n \"Binghamton\",\n \"Birmingham\",\n \"Bismarck\",\n \"Blacksburg\",\n \"Blaine\",\n \"Bloomington\",\n \"Bloomington\",\n \"Bloomington\",\n \"Blue Springs\",\n \"Boca Raton\",\n \"Boise City\",\n \"Bolingbrook\",\n \"Bonita Springs\",\n \"Bossier City\",\n \"Boston\",\n \"Bothell\",\n \"Boulder\",\n \"Bountiful\",\n \"Bowie\",\n \"Bowling Green\",\n \"Boynton Beach\",\n \"Bozeman\",\n \"Bradenton\",\n \"Brandon\",\n \"Brentwood\",\n \"Brentwood\",\n \"Bridgeport\",\n \"Bristol\",\n \"Brockton\",\n \"Broken Arrow\",\n \"Brookhaven\",\n \"Brookline\",\n \"Brooklyn Park\",\n \"Broomfield\",\n \"Brownsville\",\n \"Bryan\",\n \"Buckeye\",\n \"Buena Park\",\n \"Buffalo\",\n \"Buffalo Grove\",\n \"Burbank\",\n \"Burien\",\n \"Burke\",\n \"Burleson\",\n \"Burlington\",\n \"Burlington\",\n \"Burnsville\",\n \"Caguas\",\n \"Caldwell\",\n \"Camarillo\",\n \"Cambridge\",\n \"Camden\",\n \"Canton\",\n \"Cape Coral\",\n \"Carlsbad\",\n \"Carmel\",\n \"Carmichael\",\n \"Carolina\",\n \"Carrollton\",\n \"Carson\",\n \"Carson City\",\n \"Cary\",\n \"Casa Grande\",\n \"Casas Adobes\",\n \"Casper\",\n \"Castle Rock\",\n \"Castro Valley\",\n \"Catalina Foothills\",\n \"Cathedral City\",\n \"Catonsville\",\n \"Cedar Hill\",\n \"Cedar Park\",\n \"Cedar Rapids\",\n \"Centennial\",\n \"Centreville\",\n \"Ceres\",\n \"Cerritos\",\n \"Champaign\",\n \"Chandler\",\n \"Chapel Hill\",\n \"Charleston\",\n \"Charleston\",\n \"Charlotte\",\n \"Charlottesville\",\n \"Chattanooga\",\n \"Cheektowaga\",\n \"Chesapeake\",\n \"Chesterfield\",\n \"Cheyenne\",\n \"Chicago\",\n \"Chico\",\n \"Chicopee\",\n \"Chino\",\n \"Chino Hills\",\n \"Chula Vista\",\n \"Cicero\",\n \"Cincinnati\",\n \"Citrus Heights\",\n \"Clarksville\",\n \"Clearwater\",\n \"Cleveland\",\n \"Cleveland\",\n \"Cleveland Heights\",\n \"Clifton\",\n \"Clovis\",\n \"Coachella\",\n \"Coconut Creek\",\n \"Coeur d'Alene\",\n \"College Station\",\n \"Collierville\",\n \"Colorado Springs\",\n \"Colton\",\n \"Columbia\",\n \"Columbia\",\n \"Columbia\",\n \"Columbus\",\n \"Columbus\",\n \"Columbus\",\n \"Commerce City\",\n \"Compton\",\n \"Concord\",\n \"Concord\",\n \"Concord\",\n \"Conroe\",\n \"Conway\",\n \"Coon Rapids\",\n \"Coral Gables\",\n \"Coral Springs\",\n \"Corona\",\n \"Corpus Christi\",\n \"Corvallis\",\n \"Costa Mesa\",\n \"Council Bluffs\",\n \"Country Club\",\n \"Covina\",\n \"Cranston\",\n \"Cupertino\",\n \"Cutler Bay\",\n \"Cuyahoga Falls\",\n \"Cypress\",\n \"Dale City\",\n \"Dallas\",\n \"Daly City\",\n \"Danbury\",\n \"Danville\",\n \"Danville\",\n \"Davenport\",\n \"Davie\",\n \"Davis\",\n \"Dayton\",\n \"Daytona Beach\",\n \"DeKalb\",\n \"DeSoto\",\n \"Dearborn\",\n \"Dearborn Heights\",\n \"Decatur\",\n \"Decatur\",\n \"Deerfield Beach\",\n \"Delano\",\n \"Delray Beach\",\n \"Deltona\",\n \"Denton\",\n \"Denver\",\n \"Des Moines\",\n \"Des Plaines\",\n \"Detroit\",\n \"Diamond Bar\",\n \"Doral\",\n \"Dothan\",\n \"Downers Grove\",\n \"Downey\",\n \"Draper\",\n \"Dublin\",\n \"Dublin\",\n \"Dubuque\",\n \"Duluth\",\n \"Dundalk\",\n \"Dunwoody\",\n \"Durham\",\n \"Eagan\",\n \"East Hartford\",\n \"East Honolulu\",\n \"East Lansing\",\n \"East Los Angeles\",\n \"East Orange\",\n \"East Providence\",\n \"Eastvale\",\n \"Eau Claire\",\n \"Eden Prairie\",\n \"Edina\",\n \"Edinburg\",\n \"Edmond\",\n \"El Cajon\",\n \"El Centro\",\n \"El Dorado Hills\",\n \"El Monte\",\n \"El Paso\",\n \"Elgin\",\n \"Elizabeth\",\n \"Elk Grove\",\n \"Elkhart\",\n \"Ellicott City\",\n \"Elmhurst\",\n \"Elyria\",\n \"Encinitas\",\n \"Enid\",\n \"Enterprise\",\n \"Erie\",\n \"Escondido\",\n \"Euclid\",\n \"Eugene\",\n \"Euless\",\n \"Evanston\",\n \"Evansville\",\n \"Everett\",\n \"Everett\",\n \"Fairfield\",\n \"Fairfield\",\n \"Fall River\",\n \"Fargo\",\n \"Farmington\",\n \"Farmington Hills\",\n \"Fayetteville\",\n \"Fayetteville\",\n \"Federal Way\",\n \"Findlay\",\n \"Fishers\",\n \"Flagstaff\",\n \"Flint\",\n \"Florence-Graham\",\n \"Florin\",\n \"Florissant\",\n \"Flower Mound\",\n \"Folsom\",\n \"Fond du Lac\",\n \"Fontana\",\n \"Fort Collins\",\n \"Fort Lauderdale\",\n \"Fort Myers\",\n \"Fort Pierce\",\n \"Fort Smith\",\n \"Fort Wayne\",\n \"Fort Worth\",\n \"Fountain Valley\",\n \"Fountainebleau\",\n \"Framingham\",\n \"Franklin\",\n \"Frederick\",\n \"Freeport\",\n \"Fremont\",\n \"Fresno\",\n \"Frisco\",\n \"Fullerton\",\n \"Gainesville\",\n \"Gaithersburg\",\n \"Galveston\",\n \"Garden Grove\",\n \"Gardena\",\n \"Garland\",\n \"Gary\",\n \"Gastonia\",\n \"Georgetown\",\n \"Germantown\",\n \"Gilbert\",\n \"Gilroy\",\n \"Glen Burnie\",\n \"Glendale\",\n \"Glendale\",\n \"Glendora\",\n \"Glenview\",\n \"Goodyear\",\n \"Grand Forks\",\n \"Grand Island\",\n \"Grand Junction\",\n \"Grand Prairie\",\n \"Grand Rapids\",\n \"Grapevine\",\n \"Great Falls\",\n \"Greeley\",\n \"Green Bay\",\n \"Greensboro\",\n \"Greenville\",\n \"Greenville\",\n \"Greenwood\",\n \"Gresham\",\n \"Guaynabo\",\n \"Gulfport\",\n \"Hacienda Heights\",\n \"Hackensack\",\n \"Haltom City\",\n \"Hamilton\",\n \"Hammond\",\n \"Hampton\",\n \"Hanford\",\n \"Harlingen\",\n \"Harrisburg\",\n \"Harrisonburg\",\n \"Hartford\",\n \"Hattiesburg\",\n \"Haverhill\",\n \"Hawthorne\",\n \"Hayward\",\n \"Hemet\",\n \"Hempstead\",\n \"Henderson\",\n \"Hendersonville\",\n \"Hesperia\",\n \"Hialeah\",\n \"Hicksville\",\n \"High Point\",\n \"Highland\",\n \"Highlands Ranch\",\n \"Hillsboro\",\n \"Hilo\",\n \"Hoboken\",\n \"Hoffman Estates\",\n \"Hollywood\",\n \"Homestead\",\n \"Honolulu\",\n \"Hoover\",\n \"Houston\",\n \"Huntersville\",\n \"Huntington\",\n \"Huntington Beach\",\n \"Huntington Park\",\n \"Huntsville\",\n \"Hutchinson\",\n \"Idaho Falls\",\n \"Independence\",\n \"Indianapolis\",\n \"Indio\",\n \"Inglewood\",\n \"Iowa City\",\n \"Irondequoit\",\n \"Irvine\",\n \"Irving\",\n \"Jackson\",\n \"Jackson\",\n \"Jacksonville\",\n \"Jacksonville\",\n \"Janesville\",\n \"Jefferson City\",\n \"Jeffersonville\",\n \"Jersey City\",\n \"Johns Creek\",\n \"Johnson City\",\n \"Joliet\",\n \"Jonesboro\",\n \"Joplin\",\n \"Jupiter\",\n \"Jurupa Valley\",\n \"Kalamazoo\",\n \"Kannapolis\",\n \"Kansas City\",\n \"Kansas City\",\n \"Kearny\",\n \"Keller\",\n \"Kendale Lakes\",\n \"Kendall\",\n \"Kenner\",\n \"Kennewick\",\n \"Kenosha\",\n \"Kent\",\n \"Kentwood\",\n \"Kettering\",\n \"Killeen\",\n \"Kingsport\",\n \"Kirkland\",\n \"Kissimmee\",\n \"Knoxville\",\n \"Kokomo\",\n \"La Crosse\",\n \"La Habra\",\n \"La Mesa\",\n \"La Mirada\",\n \"Lacey\",\n \"Lafayette\",\n \"Lafayette\",\n \"Laguna Niguel\",\n \"Lake Charles\",\n \"Lake Elsinore\",\n \"Lake Forest\",\n \"Lake Havasu City\",\n \"Lake Ridge\",\n \"Lakeland\",\n \"Lakeville\",\n \"Lakewood\",\n \"Lakewood\",\n \"Lakewood\",\n \"Lakewood\",\n \"Lakewood\",\n \"Lancaster\",\n \"Lancaster\",\n \"Lansing\",\n \"Laredo\",\n \"Largo\",\n \"Las Cruces\",\n \"Las Vegas\",\n \"Lauderhill\",\n \"Lawrence\",\n \"Lawrence\",\n \"Lawrence\",\n \"Lawton\",\n \"Layton\",\n \"League City\",\n \"Lee's Summit\",\n \"Leesburg\",\n \"Lehi\",\n \"Lehigh Acres\",\n \"Lenexa\",\n \"Levittown\",\n \"Levittown\",\n \"Lewisville\",\n \"Lexington-Fayette\",\n \"Lincoln\",\n \"Lincoln\",\n \"Linden\",\n \"Little Rock\",\n \"Littleton\",\n \"Livermore\",\n \"Livonia\",\n \"Lodi\",\n \"Logan\",\n \"Lombard\",\n \"Lompoc\",\n \"Long Beach\",\n \"Longmont\",\n \"Longview\",\n \"Lorain\",\n \"Los Angeles\",\n \"Louisville/Jefferson County\",\n \"Loveland\",\n \"Lowell\",\n \"Lubbock\",\n \"Lynchburg\",\n \"Lynn\",\n \"Lynwood\",\n \"Macon-Bibb County\",\n \"Madera\",\n \"Madison\",\n \"Madison\",\n \"Malden\",\n \"Manchester\",\n \"Manhattan\",\n \"Mansfield\",\n \"Mansfield\",\n \"Manteca\",\n \"Maple Grove\",\n \"Margate\",\n \"Maricopa\",\n \"Marietta\",\n \"Marysville\",\n \"Mayaguez\",\n \"McAllen\",\n \"McKinney\",\n \"McLean\",\n \"Medford\",\n \"Medford\",\n \"Melbourne\",\n \"Memphis\",\n \"Menifee\",\n \"Mentor\",\n \"Merced\",\n \"Meriden\",\n \"Meridian\",\n \"Mesa\",\n \"Mesquite\",\n \"Metairie\",\n \"Methuen Town\",\n \"Miami\",\n \"Miami Beach\",\n \"Miami Gardens\",\n \"Middletown\",\n \"Middletown\",\n \"Midland\",\n \"Midland\",\n \"Midwest City\",\n \"Milford\",\n \"Millcreek\",\n \"Milpitas\",\n \"Milwaukee\",\n \"Minneapolis\",\n \"Minnetonka\",\n \"Minot\",\n \"Miramar\",\n \"Mishawaka\",\n \"Mission\",\n \"Mission Viejo\",\n \"Missoula\",\n \"Missouri City\",\n \"Mobile\",\n \"Modesto\",\n \"Moline\",\n \"Monroe\",\n \"Montebello\",\n \"Monterey Park\",\n \"Montgomery\",\n \"Moore\",\n \"Moreno Valley\",\n \"Morgan Hill\",\n \"Mount Pleasant\",\n \"Mount Prospect\",\n \"Mount Vernon\",\n \"Mountain View\",\n \"Muncie\",\n \"Murfreesboro\",\n \"Murray\",\n \"Murrieta\",\n \"Nampa\",\n \"Napa\",\n \"Naperville\",\n \"Nashua\",\n \"Nashville-Davidson\",\n \"National City\",\n \"New Bedford\",\n \"New Braunfels\",\n \"New Britain\",\n \"New Brunswick\",\n \"New Haven\",\n \"New Orleans\",\n \"New Rochelle\",\n \"New York\",\n \"Newark\",\n \"Newark\",\n \"Newark\",\n \"Newport Beach\",\n \"Newport News\",\n \"Newton\",\n \"Niagara Falls\",\n \"Noblesville\",\n \"Norfolk\",\n \"Normal\",\n \"Norman\",\n \"North Bethesda\",\n \"North Charleston\",\n \"North Highlands\",\n \"North Las Vegas\",\n \"North Lauderdale\",\n \"North Little Rock\",\n \"North Miami\",\n \"North Miami Beach\",\n \"North Port\",\n \"North Richland Hills\",\n \"Norwalk\",\n \"Norwalk\",\n \"Novato\",\n \"Novi\",\n \"O'Fallon\",\n \"Oak Lawn\",\n \"Oak Park\",\n \"Oakland\",\n \"Oakland Park\",\n \"Ocala\",\n \"Oceanside\",\n \"Odessa\",\n \"Ogden\",\n \"Oklahoma City\",\n \"Olathe\",\n \"Olympia\",\n \"Omaha\",\n \"Ontario\",\n \"Orange\",\n \"Orem\",\n \"Orland Park\",\n \"Orlando\",\n \"Oro Valley\",\n \"Oshkosh\",\n \"Overland Park\",\n \"Owensboro\",\n \"Oxnard\",\n \"Palatine\",\n \"Palm Bay\",\n \"Palm Beach Gardens\",\n \"Palm Coast\",\n \"Palm Desert\",\n \"Palm Harbor\",\n \"Palm Springs\",\n \"Palmdale\",\n \"Palo Alto\",\n \"Paradise\",\n \"Paramount\",\n \"Parker\",\n \"Parma\",\n \"Pasadena\",\n \"Pasadena\",\n \"Pasco\",\n \"Passaic\",\n \"Paterson\",\n \"Pawtucket\",\n \"Peabody\",\n \"Pearl City\",\n \"Pearland\",\n \"Pembroke Pines\",\n \"Pensacola\",\n \"Peoria\",\n \"Peoria\",\n \"Perris\",\n \"Perth Amboy\",\n \"Petaluma\",\n \"Pflugerville\",\n \"Pharr\",\n \"Philadelphia\",\n \"Phoenix\",\n \"Pico Rivera\",\n \"Pine Bluff\",\n \"Pine Hills\",\n \"Pinellas Park\",\n \"Pittsburg\",\n \"Pittsburgh\",\n \"Pittsfield\",\n \"Placentia\",\n \"Plainfield\",\n \"Plainfield\",\n \"Plano\",\n \"Plantation\",\n \"Pleasanton\",\n \"Plymouth\",\n \"Pocatello\",\n \"Poinciana\",\n \"Pomona\",\n \"Pompano Beach\",\n \"Ponce\",\n \"Pontiac\",\n \"Port Arthur\",\n \"Port Charlotte\",\n \"Port Orange\",\n \"Port St. Lucie\",\n \"Portage\",\n \"Porterville\",\n \"Portland\",\n \"Portland\",\n \"Portsmouth\",\n \"Potomac\",\n \"Poway\",\n \"Providence\",\n \"Provo\",\n \"Pueblo\",\n \"Quincy\",\n \"Racine\",\n \"Raleigh\",\n \"Rancho Cordova\",\n \"Rancho Cucamonga\",\n \"Rancho Palos Verdes\",\n \"Rancho Santa Margarita\",\n \"Rapid City\",\n \"Reading\",\n \"Redding\",\n \"Redlands\",\n \"Redmond\",\n \"Redondo Beach\",\n \"Redwood City\",\n \"Reno\",\n \"Renton\",\n \"Reston\",\n \"Revere\",\n \"Rialto\",\n \"Richardson\",\n \"Richland\",\n \"Richmond\",\n \"Richmond\",\n \"Rio Rancho\",\n \"Riverside\",\n \"Riverton\",\n \"Riverview\",\n \"Roanoke\",\n \"Rochester\",\n \"Rochester\",\n \"Rochester Hills\",\n \"Rock Hill\",\n \"Rockford\",\n \"Rocklin\",\n \"Rockville\",\n \"Rockwall\",\n \"Rocky Mount\",\n \"Rogers\",\n \"Rohnert Park\",\n \"Rosemead\",\n \"Roseville\",\n \"Roseville\",\n \"Roswell\",\n \"Roswell\",\n \"Round Rock\",\n \"Rowland Heights\",\n \"Rowlett\",\n \"Royal Oak\",\n \"Sacramento\",\n \"Saginaw\",\n \"Salem\",\n \"Salem\",\n \"Salina\",\n \"Salinas\",\n \"Salt Lake City\",\n \"Sammamish\",\n \"San Angelo\",\n \"San Antonio\",\n \"San Bernardino\",\n \"San Bruno\",\n \"San Buenaventura (Ventura)\",\n \"San Clemente\",\n \"San Diego\",\n \"San Francisco\",\n \"San Jacinto\",\n \"San Jose\",\n \"San Juan\",\n \"San Leandro\",\n \"San Luis Obispo\",\n \"San Marcos\",\n \"San Marcos\",\n \"San Mateo\",\n \"San Rafael\",\n \"San Ramon\",\n \"San Tan Valley\",\n \"Sandy\",\n \"Sandy Springs\",\n \"Sanford\",\n \"Santa Ana\",\n \"Santa Barbara\",\n \"Santa Clara\",\n \"Santa Clarita\",\n \"Santa Cruz\",\n \"Santa Fe\",\n \"Santa Maria\",\n \"Santa Monica\",\n \"Santa Rosa\",\n \"Santee\",\n \"Sarasota\",\n \"Savannah\",\n \"Sayreville\",\n \"Schaumburg\",\n \"Schenectady\",\n \"Scottsdale\",\n \"Scranton\",\n \"Seattle\",\n \"Severn\",\n \"Shawnee\",\n \"Sheboygan\",\n \"Shoreline\",\n \"Shreveport\",\n \"Sierra Vista\",\n \"Silver Spring\",\n \"Simi Valley\",\n \"Sioux City\",\n \"Sioux Falls\",\n \"Skokie\",\n \"Smyrna\",\n \"Smyrna\",\n \"Somerville\",\n \"South Bend\",\n \"South Gate\",\n \"South Hill\",\n \"South Jordan\",\n \"South San Francisco\",\n \"South Valley\",\n \"South Whittier\",\n \"Southaven\",\n \"Southfield\",\n \"Sparks\",\n \"Spokane\",\n \"Spokane Valley\",\n \"Spring\",\n \"Spring Hill\",\n \"Spring Valley\",\n \"Springdale\",\n \"Springfield\",\n \"Springfield\",\n \"Springfield\",\n \"Springfield\",\n \"Springfield\",\n \"St. Charles\",\n \"St. Clair Shores\",\n \"St. Cloud\",\n \"St. Cloud\",\n \"St. George\",\n \"St. Joseph\",\n \"St. Louis\",\n \"St. Louis Park\",\n \"St. Paul\",\n \"St. Peters\",\n \"St. Petersburg\",\n \"Stamford\",\n \"State College\",\n \"Sterling Heights\",\n \"Stillwater\",\n \"Stockton\",\n \"Stratford\",\n \"Strongsville\",\n \"Suffolk\",\n \"Sugar Land\",\n \"Summerville\",\n \"Sunnyvale\",\n \"Sunrise\",\n \"Sunrise Manor\",\n \"Surprise\",\n \"Syracuse\",\n \"Tacoma\",\n \"Tallahassee\",\n \"Tamarac\",\n \"Tamiami\",\n \"Tampa\",\n \"Taunton\",\n \"Taylor\",\n \"Taylorsville\",\n \"Temecula\",\n \"Tempe\",\n \"Temple\",\n \"Terre Haute\",\n \"Texas City\",\n \"The Hammocks\",\n \"The Villages\",\n \"The Woodlands\",\n \"Thornton\",\n \"Thousand Oaks\",\n \"Tigard\",\n \"Tinley Park\",\n \"Titusville\",\n \"Toledo\",\n \"Toms River\",\n \"Tonawanda\",\n \"Topeka\",\n \"Torrance\",\n \"Town 'n' Country\",\n \"Towson\",\n \"Tracy\",\n \"Trenton\",\n \"Troy\",\n \"Troy\",\n \"Trujillo Alto\",\n \"Tuckahoe\",\n \"Tucson\",\n \"Tulare\",\n \"Tulsa\",\n \"Turlock\",\n \"Tuscaloosa\",\n \"Tustin\",\n \"Twin Falls\",\n \"Tyler\",\n \"Union City\",\n \"Union City\",\n \"University\",\n \"Upland\",\n \"Urbana\",\n \"Urbandale\",\n \"Utica\",\n \"Vacaville\",\n \"Valdosta\",\n \"Vallejo\",\n \"Vancouver\",\n \"Victoria\",\n \"Victorville\",\n \"Vineland\",\n \"Virginia Beach\",\n \"Visalia\",\n \"Vista\",\n \"Waco\",\n \"Waipahu\",\n \"Waldorf\",\n \"Walnut Creek\",\n \"Waltham\",\n \"Warner Robins\",\n \"Warren\",\n \"Warwick\",\n \"Washington\",\n \"Waterbury\",\n \"Waterloo\",\n \"Watsonville\",\n \"Waukegan\",\n \"Waukesha\",\n \"Wauwatosa\",\n \"Wellington\",\n \"Wesley Chapel\",\n \"West Allis\",\n \"West Babylon\",\n \"West Covina\",\n \"West Des Moines\",\n \"West Hartford\",\n \"West Haven\",\n \"West Jordan\",\n \"West Lafayette\",\n \"West New York\",\n \"West Palm Beach\",\n \"West Sacramento\",\n \"West Seneca\",\n \"West Valley City\",\n \"Westfield\",\n \"Westland\",\n \"Westminster\",\n \"Westminster\",\n \"Weston\",\n \"Weymouth Town\",\n \"Wheaton\",\n \"Wheaton\",\n \"White Plains\",\n \"Whittier\",\n \"Wichita\",\n \"Wichita Falls\",\n \"Wilmington\",\n \"Wilmington\",\n \"Wilson\",\n \"Winston-Salem\",\n \"Woodbury\",\n \"Woodland\",\n \"Worcester\",\n \"Wylie\",\n \"Wyoming\",\n \"Yakima\",\n \"Yonkers\",\n \"Yorba Linda\",\n \"York\",\n \"Youngstown\",\n \"Yuba City\",\n \"Yucaipa\",\n \"Yuma\"\n];\n},{}],38:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"North\",\n \"East\",\n \"West\",\n \"South\",\n \"New\",\n \"Lake\",\n \"Port\"\n];\n\n},{}],39:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"town\",\n \"ton\",\n \"land\",\n \"ville\",\n \"berg\",\n \"burgh\",\n \"borough\",\n \"bury\",\n \"view\",\n \"port\",\n \"mouth\",\n \"stad\",\n \"furt\",\n \"chester\",\n \"mouth\",\n \"fort\",\n \"haven\",\n \"side\",\n \"shire\"\n];\n\n},{}],40:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Afghanistan\",\n \"Albania\",\n \"Algeria\",\n \"American Samoa\",\n \"Andorra\",\n \"Angola\",\n \"Anguilla\",\n \"Antarctica (the territory South of 60 deg S)\",\n \"Antigua and Barbuda\",\n \"Argentina\",\n \"Armenia\",\n \"Aruba\",\n \"Australia\",\n \"Austria\",\n \"Azerbaijan\",\n \"Bahamas\",\n \"Bahrain\",\n \"Bangladesh\",\n \"Barbados\",\n \"Belarus\",\n \"Belgium\",\n \"Belize\",\n \"Benin\",\n \"Bermuda\",\n \"Bhutan\",\n \"Bolivia\",\n \"Bosnia and Herzegovina\",\n \"Botswana\",\n \"Bouvet Island (Bouvetoya)\",\n \"Brazil\",\n \"British Indian Ocean Territory (Chagos Archipelago)\",\n \"Brunei Darussalam\",\n \"Bulgaria\",\n \"Burkina Faso\",\n \"Burundi\",\n \"Cambodia\",\n \"Cameroon\",\n \"Canada\",\n \"Cape Verde\",\n \"Cayman Islands\",\n \"Central African Republic\",\n \"Chad\",\n \"Chile\",\n \"China\",\n \"Christmas Island\",\n \"Cocos (Keeling) Islands\",\n \"Colombia\",\n \"Comoros\",\n \"Congo\",\n \"Cook Islands\",\n \"Costa Rica\",\n \"Cote d'Ivoire\",\n \"Croatia\",\n \"Cuba\",\n \"Cyprus\",\n \"Czech Republic\",\n \"Denmark\",\n \"Djibouti\",\n \"Dominica\",\n \"Dominican Republic\",\n \"Ecuador\",\n \"Egypt\",\n \"El Salvador\",\n \"Equatorial Guinea\",\n \"Eritrea\",\n \"Estonia\",\n \"Ethiopia\",\n \"Faroe Islands\",\n \"Falkland Islands (Malvinas)\",\n \"Fiji\",\n \"Finland\",\n \"France\",\n \"French Guiana\",\n \"French Polynesia\",\n \"French Southern Territories\",\n \"Gabon\",\n \"Gambia\",\n \"Georgia\",\n \"Germany\",\n \"Ghana\",\n \"Gibraltar\",\n \"Greece\",\n \"Greenland\",\n \"Grenada\",\n \"Guadeloupe\",\n \"Guam\",\n \"Guatemala\",\n \"Guernsey\",\n \"Guinea\",\n \"Guinea-Bissau\",\n \"Guyana\",\n \"Haiti\",\n \"Heard Island and McDonald Islands\",\n \"Holy See (Vatican City State)\",\n \"Honduras\",\n \"Hong Kong\",\n \"Hungary\",\n \"Iceland\",\n \"India\",\n \"Indonesia\",\n \"Iran\",\n \"Iraq\",\n \"Ireland\",\n \"Isle of Man\",\n \"Israel\",\n \"Italy\",\n \"Jamaica\",\n \"Japan\",\n \"Jersey\",\n \"Jordan\",\n \"Kazakhstan\",\n \"Kenya\",\n \"Kiribati\",\n \"Democratic People's Republic of Korea\",\n \"Republic of Korea\",\n \"Kuwait\",\n \"Kyrgyz Republic\",\n \"Lao People's Democratic Republic\",\n \"Latvia\",\n \"Lebanon\",\n \"Lesotho\",\n \"Liberia\",\n \"Libyan Arab Jamahiriya\",\n \"Liechtenstein\",\n \"Lithuania\",\n \"Luxembourg\",\n \"Macao\",\n \"Macedonia\",\n \"Madagascar\",\n \"Malawi\",\n \"Malaysia\",\n \"Maldives\",\n \"Mali\",\n \"Malta\",\n \"Marshall Islands\",\n \"Martinique\",\n \"Mauritania\",\n \"Mauritius\",\n \"Mayotte\",\n \"Mexico\",\n \"Micronesia\",\n \"Moldova\",\n \"Monaco\",\n \"Mongolia\",\n \"Montenegro\",\n \"Montserrat\",\n \"Morocco\",\n \"Mozambique\",\n \"Myanmar\",\n \"Namibia\",\n \"Nauru\",\n \"Nepal\",\n \"Netherlands Antilles\",\n \"Netherlands\",\n \"New Caledonia\",\n \"New Zealand\",\n \"Nicaragua\",\n \"Niger\",\n \"Nigeria\",\n \"Niue\",\n \"Norfolk Island\",\n \"Northern Mariana Islands\",\n \"Norway\",\n \"Oman\",\n \"Pakistan\",\n \"Palau\",\n \"Palestinian Territory\",\n \"Panama\",\n \"Papua New Guinea\",\n \"Paraguay\",\n \"Peru\",\n \"Philippines\",\n \"Pitcairn Islands\",\n \"Poland\",\n \"Portugal\",\n \"Puerto Rico\",\n \"Qatar\",\n \"Reunion\",\n \"Romania\",\n \"Russian Federation\",\n \"Rwanda\",\n \"Saint Barthelemy\",\n \"Saint Helena\",\n \"Saint Kitts and Nevis\",\n \"Saint Lucia\",\n \"Saint Martin\",\n \"Saint Pierre and Miquelon\",\n \"Saint Vincent and the Grenadines\",\n \"Samoa\",\n \"San Marino\",\n \"Sao Tome and Principe\",\n \"Saudi Arabia\",\n \"Senegal\",\n \"Serbia\",\n \"Seychelles\",\n \"Sierra Leone\",\n \"Singapore\",\n \"Slovakia (Slovak Republic)\",\n \"Slovenia\",\n \"Solomon Islands\",\n \"Somalia\",\n \"South Africa\",\n \"South Georgia and the South Sandwich Islands\",\n \"Spain\",\n \"Sri Lanka\",\n \"Sudan\",\n \"Suriname\",\n \"Svalbard & Jan Mayen Islands\",\n \"Swaziland\",\n \"Sweden\",\n \"Switzerland\",\n \"Syrian Arab Republic\",\n \"Taiwan\",\n \"Tajikistan\",\n \"Tanzania\",\n \"Thailand\",\n \"Timor-Leste\",\n \"Togo\",\n \"Tokelau\",\n \"Tonga\",\n \"Trinidad and Tobago\",\n \"Tunisia\",\n \"Turkey\",\n \"Turkmenistan\",\n \"Turks and Caicos Islands\",\n \"Tuvalu\",\n \"Uganda\",\n \"Ukraine\",\n \"United Arab Emirates\",\n \"United Kingdom\",\n \"United States of America\",\n \"United States Minor Outlying Islands\",\n \"Uruguay\",\n \"Uzbekistan\",\n \"Vanuatu\",\n \"Venezuela\",\n \"Vietnam\",\n \"Virgin Islands, British\",\n \"Virgin Islands, U.S.\",\n \"Wallis and Futuna\",\n \"Western Sahara\",\n \"Yemen\",\n \"Zambia\",\n \"Zimbabwe\"\n];\n\n},{}],41:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BL\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CU\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IR\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KP\",\n \"KR\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MF\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SD\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"SS\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SY\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\"\n];\n\n},{}],42:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"BGD\",\n \"BEL\",\n \"BFA\",\n \"BGR\",\n \"BIH\",\n \"BRB\",\n \"WLF\",\n \"BLM\",\n \"BMU\",\n \"BRN\",\n \"BOL\",\n \"BHR\",\n \"BDI\",\n \"BEN\",\n \"BTN\",\n \"JAM\",\n \"BVT\",\n \"BWA\",\n \"WSM\",\n \"BES\",\n \"BRA\",\n \"BHS\",\n \"JEY\",\n \"BLR\",\n \"BLZ\",\n \"RUS\",\n \"RWA\",\n \"SRB\",\n \"TLS\",\n \"REU\",\n \"TKM\",\n \"TJK\",\n \"ROU\",\n \"TKL\",\n \"GNB\",\n \"GUM\",\n \"GTM\",\n \"SGS\",\n \"GRC\",\n \"GNQ\",\n \"GLP\",\n \"JPN\",\n \"GUY\",\n \"GGY\",\n \"GUF\",\n \"GEO\",\n \"GRD\",\n \"GBR\",\n \"GAB\",\n \"SLV\",\n \"GIN\",\n \"GMB\",\n \"GRL\",\n \"GIB\",\n \"GHA\",\n \"OMN\",\n \"TUN\",\n \"JOR\",\n \"HRV\",\n \"HTI\",\n \"HUN\",\n \"HKG\",\n \"HND\",\n \"HMD\",\n \"VEN\",\n \"PRI\",\n \"PSE\",\n \"PLW\",\n \"PRT\",\n \"SJM\",\n \"PRY\",\n \"IRQ\",\n \"PAN\",\n \"PYF\",\n \"PNG\",\n \"PER\",\n \"PAK\",\n \"PHL\",\n \"PCN\",\n \"POL\",\n \"SPM\",\n \"ZMB\",\n \"ESH\",\n \"EST\",\n \"EGY\",\n \"ZAF\",\n \"ECU\",\n \"ITA\",\n \"VNM\",\n \"SLB\",\n \"ETH\",\n \"SOM\",\n \"ZWE\",\n \"SAU\",\n \"ESP\",\n \"ERI\",\n \"MNE\",\n \"MDA\",\n \"MDG\",\n \"MAF\",\n \"MAR\",\n \"MCO\",\n \"UZB\",\n \"MMR\",\n \"MLI\",\n \"MAC\",\n \"MNG\",\n \"MHL\",\n \"MKD\",\n \"MUS\",\n \"MLT\",\n \"MWI\",\n \"MDV\",\n \"MTQ\",\n \"MNP\",\n \"MSR\",\n \"MRT\",\n \"IMN\",\n \"UGA\",\n \"TZA\",\n \"MYS\",\n \"MEX\",\n \"ISR\",\n \"FRA\",\n \"IOT\",\n \"SHN\",\n \"FIN\",\n \"FJI\",\n \"FLK\",\n \"FSM\",\n \"FRO\",\n \"NIC\",\n \"NLD\",\n \"NOR\",\n \"NAM\",\n \"VUT\",\n \"NCL\",\n \"NER\",\n \"NFK\",\n \"NGA\",\n \"NZL\",\n \"NPL\",\n \"NRU\",\n \"NIU\",\n \"COK\",\n \"XKX\",\n \"CIV\",\n \"CHE\",\n \"COL\",\n \"CHN\",\n \"CMR\",\n \"CHL\",\n \"CCK\",\n \"CAN\",\n \"COG\",\n \"CAF\",\n \"COD\",\n \"CZE\",\n \"CYP\",\n \"CXR\",\n \"CRI\",\n \"CUW\",\n \"CPV\",\n \"CUB\",\n \"SWZ\",\n \"SYR\",\n \"SXM\",\n \"KGZ\",\n \"KEN\",\n \"SSD\",\n \"SUR\",\n \"KIR\",\n \"KHM\",\n \"KNA\",\n \"COM\",\n \"STP\",\n \"SVK\",\n \"KOR\",\n \"SVN\",\n \"PRK\",\n \"KWT\",\n \"SEN\",\n \"SMR\",\n \"SLE\",\n \"SYC\",\n \"KAZ\",\n \"CYM\",\n \"SGP\",\n \"SWE\",\n \"SDN\",\n \"DOM\",\n \"DMA\",\n \"DJI\",\n \"DNK\",\n \"VGB\",\n \"DEU\",\n \"YEM\",\n \"DZA\",\n \"USA\",\n \"URY\",\n \"MYT\",\n \"UMI\",\n \"LBN\",\n \"LCA\",\n \"LAO\",\n \"TUV\",\n \"TWN\",\n \"TTO\",\n \"TUR\",\n \"LKA\",\n \"LIE\",\n \"LVA\",\n \"TON\",\n \"LTU\",\n \"LUX\",\n \"LBR\",\n \"LSO\",\n \"THA\",\n \"ATF\",\n \"TGO\",\n \"TCD\",\n \"TCA\",\n \"LBY\",\n \"VAT\",\n \"VCT\",\n \"ARE\",\n \"AND\",\n \"ATG\",\n \"AFG\",\n \"AIA\",\n \"VIR\",\n \"ISL\",\n \"IRN\",\n \"ARM\",\n \"ALB\",\n \"AGO\",\n \"ATA\",\n \"ASM\",\n \"ARG\",\n \"AUS\",\n \"AUT\",\n \"ABW\",\n \"IND\",\n \"ALA\",\n \"AZE\",\n \"IRL\",\n \"IDN\",\n \"UKR\",\n \"QAT\",\n \"MOZ\"\n];\n},{}],43:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Avon\",\n \"Bedfordshire\",\n \"Berkshire\",\n \"Borders\",\n \"Buckinghamshire\",\n \"Cambridgeshire\"\n];\n\n},{}],44:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"United States of America\"\n];\n\n},{}],45:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"North\",\n \"East\",\n \"South\",\n \"West\",\n \"Northeast\",\n \"Northwest\",\n \"Southeast\",\n \"Southwest\"\n];\n\n},{}],46:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"N\",\n \"E\",\n \"S\",\n \"W\",\n \"NE\",\n \"NW\",\n \"SE\",\n \"SW\"\n];\n\n},{}],47:[function(require,module,exports){\nvar address = {};\nmodule['exports'] = address;\naddress.city_prefix = require(\"./city_prefix\");\naddress.city_suffix = require(\"./city_suffix\");\naddress.city_name = require(\"./city_name\");\naddress.county = require(\"./county\");\naddress.country = require(\"./country\");\naddress.country_code = require(\"./country_code\");\naddress.country_code_alpha_3 = require(\"./country_code_alpha_3\");\naddress.building_number = require(\"./building_number\");\naddress.street_suffix = require(\"./street_suffix\");\naddress.secondary_address = require(\"./secondary_address\");\naddress.postcode = require(\"./postcode\");\naddress.postcode_by_state = require(\"./postcode_by_state\");\naddress.state = require(\"./state\");\naddress.state_abbr = require(\"./state_abbr\");\naddress.time_zone = require(\"./time_zone\");\naddress.city = require(\"./city\");\naddress.street_name = require(\"./street_name\");\naddress.street_address = require(\"./street_address\");\naddress.default_country = require(\"./default_country\");\naddress.direction = require(\"./direction\");\naddress.direction_abbr = require(\"./direction_abbr\");\n\n},{\"./building_number\":35,\"./city\":36,\"./city_name\":37,\"./city_prefix\":38,\"./city_suffix\":39,\"./country\":40,\"./country_code\":41,\"./country_code_alpha_3\":42,\"./county\":43,\"./default_country\":44,\"./direction\":45,\"./direction_abbr\":46,\"./postcode\":48,\"./postcode_by_state\":49,\"./secondary_address\":50,\"./state\":51,\"./state_abbr\":52,\"./street_address\":53,\"./street_name\":54,\"./street_suffix\":55,\"./time_zone\":56}],48:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#####\",\n \"#####-####\"\n];\n\n},{}],49:[function(require,module,exports){\narguments[4][48][0].apply(exports,arguments)\n},{\"dup\":48}],50:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Apt. ###\",\n \"Suite ###\"\n];\n\n},{}],51:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Alabama\",\n \"Alaska\",\n \"Arizona\",\n \"Arkansas\",\n \"California\",\n \"Colorado\",\n \"Connecticut\",\n \"Delaware\",\n \"Florida\",\n \"Georgia\",\n \"Hawaii\",\n \"Idaho\",\n \"Illinois\",\n \"Indiana\",\n \"Iowa\",\n \"Kansas\",\n \"Kentucky\",\n \"Louisiana\",\n \"Maine\",\n \"Maryland\",\n \"Massachusetts\",\n \"Michigan\",\n \"Minnesota\",\n \"Mississippi\",\n \"Missouri\",\n \"Montana\",\n \"Nebraska\",\n \"Nevada\",\n \"New Hampshire\",\n \"New Jersey\",\n \"New Mexico\",\n \"New York\",\n \"North Carolina\",\n \"North Dakota\",\n \"Ohio\",\n \"Oklahoma\",\n \"Oregon\",\n \"Pennsylvania\",\n \"Rhode Island\",\n \"South Carolina\",\n \"South Dakota\",\n \"Tennessee\",\n \"Texas\",\n \"Utah\",\n \"Vermont\",\n \"Virginia\",\n \"Washington\",\n \"West Virginia\",\n \"Wisconsin\",\n \"Wyoming\"\n];\n\n},{}],52:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\"\n];\n\n},{}],53:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{building_number} #{street_name}\"\n];\n\n},{}],54:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{Name.first_name} #{street_suffix}\",\n \"#{Name.last_name} #{street_suffix}\"\n];\n\n},{}],55:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Alley\",\n \"Avenue\",\n \"Branch\",\n \"Bridge\",\n \"Brook\",\n \"Brooks\",\n \"Burg\",\n \"Burgs\",\n \"Bypass\",\n \"Camp\",\n \"Canyon\",\n \"Cape\",\n \"Causeway\",\n \"Center\",\n \"Centers\",\n \"Circle\",\n \"Circles\",\n \"Cliff\",\n \"Cliffs\",\n \"Club\",\n \"Common\",\n \"Corner\",\n \"Corners\",\n \"Course\",\n \"Court\",\n \"Courts\",\n \"Cove\",\n \"Coves\",\n \"Creek\",\n \"Crescent\",\n \"Crest\",\n \"Crossing\",\n \"Crossroad\",\n \"Curve\",\n \"Dale\",\n \"Dam\",\n \"Divide\",\n \"Drive\",\n \"Drive\",\n \"Drives\",\n \"Estate\",\n \"Estates\",\n \"Expressway\",\n \"Extension\",\n \"Extensions\",\n \"Fall\",\n \"Falls\",\n \"Ferry\",\n \"Field\",\n \"Fields\",\n \"Flat\",\n \"Flats\",\n \"Ford\",\n \"Fords\",\n \"Forest\",\n \"Forge\",\n \"Forges\",\n \"Fork\",\n \"Forks\",\n \"Fort\",\n \"Freeway\",\n \"Garden\",\n \"Gardens\",\n \"Gateway\",\n \"Glen\",\n \"Glens\",\n \"Green\",\n \"Greens\",\n \"Grove\",\n \"Groves\",\n \"Harbor\",\n \"Harbors\",\n \"Haven\",\n \"Heights\",\n \"Highway\",\n \"Hill\",\n \"Hills\",\n \"Hollow\",\n \"Inlet\",\n \"Inlet\",\n \"Island\",\n \"Island\",\n \"Islands\",\n \"Islands\",\n \"Isle\",\n \"Isle\",\n \"Junction\",\n \"Junctions\",\n \"Key\",\n \"Keys\",\n \"Knoll\",\n \"Knolls\",\n \"Lake\",\n \"Lakes\",\n \"Land\",\n \"Landing\",\n \"Lane\",\n \"Light\",\n \"Lights\",\n \"Loaf\",\n \"Lock\",\n \"Locks\",\n \"Locks\",\n \"Lodge\",\n \"Lodge\",\n \"Loop\",\n \"Mall\",\n \"Manor\",\n \"Manors\",\n \"Meadow\",\n \"Meadows\",\n \"Mews\",\n \"Mill\",\n \"Mills\",\n \"Mission\",\n \"Mission\",\n \"Motorway\",\n \"Mount\",\n \"Mountain\",\n \"Mountain\",\n \"Mountains\",\n \"Mountains\",\n \"Neck\",\n \"Orchard\",\n \"Oval\",\n \"Overpass\",\n \"Park\",\n \"Parks\",\n \"Parkway\",\n \"Parkways\",\n \"Pass\",\n \"Passage\",\n \"Path\",\n \"Pike\",\n \"Pine\",\n \"Pines\",\n \"Place\",\n \"Plain\",\n \"Plains\",\n \"Plains\",\n \"Plaza\",\n \"Plaza\",\n \"Point\",\n \"Points\",\n \"Port\",\n \"Port\",\n \"Ports\",\n \"Ports\",\n \"Prairie\",\n \"Prairie\",\n \"Radial\",\n \"Ramp\",\n \"Ranch\",\n \"Rapid\",\n \"Rapids\",\n \"Rest\",\n \"Ridge\",\n \"Ridges\",\n \"River\",\n \"Road\",\n \"Road\",\n \"Roads\",\n \"Roads\",\n \"Route\",\n \"Row\",\n \"Rue\",\n \"Run\",\n \"Shoal\",\n \"Shoals\",\n \"Shore\",\n \"Shores\",\n \"Skyway\",\n \"Spring\",\n \"Springs\",\n \"Springs\",\n \"Spur\",\n \"Spurs\",\n \"Square\",\n \"Square\",\n \"Squares\",\n \"Squares\",\n \"Station\",\n \"Station\",\n \"Stravenue\",\n \"Stravenue\",\n \"Stream\",\n \"Stream\",\n \"Street\",\n \"Street\",\n \"Streets\",\n \"Summit\",\n \"Summit\",\n \"Terrace\",\n \"Throughway\",\n \"Trace\",\n \"Track\",\n \"Trafficway\",\n \"Trail\",\n \"Trail\",\n \"Tunnel\",\n \"Tunnel\",\n \"Turnpike\",\n \"Turnpike\",\n \"Underpass\",\n \"Union\",\n \"Unions\",\n \"Valley\",\n \"Valleys\",\n \"Via\",\n \"Viaduct\",\n \"View\",\n \"Views\",\n \"Village\",\n \"Village\",\n \"Villages\",\n \"Ville\",\n \"Vista\",\n \"Vista\",\n \"Walk\",\n \"Walks\",\n \"Wall\",\n \"Way\",\n \"Ways\",\n \"Well\",\n \"Wells\"\n];\n\n},{}],56:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Pacific/Midway\",\n \"Pacific/Pago_Pago\",\n \"Pacific/Honolulu\",\n \"America/Juneau\",\n \"America/Los_Angeles\",\n \"America/Tijuana\",\n \"America/Denver\",\n \"America/Phoenix\",\n \"America/Chihuahua\",\n \"America/Mazatlan\",\n \"America/Chicago\",\n \"America/Regina\",\n \"America/Mexico_City\",\n \"America/Mexico_City\",\n \"America/Monterrey\",\n \"America/Guatemala\",\n \"America/New_York\",\n \"America/Indiana/Indianapolis\",\n \"America/Bogota\",\n \"America/Lima\",\n \"America/Lima\",\n \"America/Halifax\",\n \"America/Caracas\",\n \"America/La_Paz\",\n \"America/Santiago\",\n \"America/St_Johns\",\n \"America/Sao_Paulo\",\n \"America/Argentina/Buenos_Aires\",\n \"America/Guyana\",\n \"America/Godthab\",\n \"Atlantic/South_Georgia\",\n \"Atlantic/Azores\",\n \"Atlantic/Cape_Verde\",\n \"Europe/Dublin\",\n \"Europe/London\",\n \"Europe/Lisbon\",\n \"Europe/London\",\n \"Africa/Casablanca\",\n \"Africa/Monrovia\",\n \"Etc/UTC\",\n \"Europe/Belgrade\",\n \"Europe/Bratislava\",\n \"Europe/Budapest\",\n \"Europe/Ljubljana\",\n \"Europe/Prague\",\n \"Europe/Sarajevo\",\n \"Europe/Skopje\",\n \"Europe/Warsaw\",\n \"Europe/Zagreb\",\n \"Europe/Brussels\",\n \"Europe/Copenhagen\",\n \"Europe/Madrid\",\n \"Europe/Paris\",\n \"Europe/Amsterdam\",\n \"Europe/Berlin\",\n \"Europe/Berlin\",\n \"Europe/Rome\",\n \"Europe/Stockholm\",\n \"Europe/Vienna\",\n \"Africa/Algiers\",\n \"Europe/Bucharest\",\n \"Africa/Cairo\",\n \"Europe/Helsinki\",\n \"Europe/Kiev\",\n \"Europe/Riga\",\n \"Europe/Sofia\",\n \"Europe/Tallinn\",\n \"Europe/Vilnius\",\n \"Europe/Athens\",\n \"Europe/Istanbul\",\n \"Europe/Minsk\",\n \"Asia/Jerusalem\",\n \"Africa/Harare\",\n \"Africa/Johannesburg\",\n \"Europe/Moscow\",\n \"Europe/Moscow\",\n \"Europe/Moscow\",\n \"Asia/Kuwait\",\n \"Asia/Riyadh\",\n \"Africa/Nairobi\",\n \"Asia/Baghdad\",\n \"Asia/Tehran\",\n \"Asia/Muscat\",\n \"Asia/Muscat\",\n \"Asia/Baku\",\n \"Asia/Tbilisi\",\n \"Asia/Yerevan\",\n \"Asia/Kabul\",\n \"Asia/Yekaterinburg\",\n \"Asia/Karachi\",\n \"Asia/Karachi\",\n \"Asia/Tashkent\",\n \"Asia/Kolkata\",\n \"Asia/Kolkata\",\n \"Asia/Kolkata\",\n \"Asia/Kolkata\",\n \"Asia/Kathmandu\",\n \"Asia/Dhaka\",\n \"Asia/Dhaka\",\n \"Asia/Colombo\",\n \"Asia/Almaty\",\n \"Asia/Novosibirsk\",\n \"Asia/Rangoon\",\n \"Asia/Bangkok\",\n \"Asia/Bangkok\",\n \"Asia/Jakarta\",\n \"Asia/Krasnoyarsk\",\n \"Asia/Shanghai\",\n \"Asia/Chongqing\",\n \"Asia/Hong_Kong\",\n \"Asia/Urumqi\",\n \"Asia/Kuala_Lumpur\",\n \"Asia/Singapore\",\n \"Asia/Taipei\",\n \"Australia/Perth\",\n \"Asia/Irkutsk\",\n \"Asia/Ulaanbaatar\",\n \"Asia/Seoul\",\n \"Asia/Tokyo\",\n \"Asia/Tokyo\",\n \"Asia/Tokyo\",\n \"Asia/Yakutsk\",\n \"Australia/Darwin\",\n \"Australia/Adelaide\",\n \"Australia/Melbourne\",\n \"Australia/Melbourne\",\n \"Australia/Sydney\",\n \"Australia/Brisbane\",\n \"Australia/Hobart\",\n \"Asia/Vladivostok\",\n \"Pacific/Guam\",\n \"Pacific/Port_Moresby\",\n \"Asia/Magadan\",\n \"Asia/Magadan\",\n \"Pacific/Noumea\",\n \"Pacific/Fiji\",\n \"Asia/Kamchatka\",\n \"Pacific/Majuro\",\n \"Pacific/Auckland\",\n \"Pacific/Auckland\",\n \"Pacific/Tongatapu\",\n \"Pacific/Fakaofo\",\n \"Pacific/Apia\"\n];\n\n},{}],57:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Giant panda\",\n \"Spectacled bear\",\n \"Sun bear\",\n \"Sloth bear\",\n \"American black bear\",\n \"Asian black bear\",\n \"Brown bear\",\n \"Polar bear\"\n]\n},{}],58:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Red-throated Loon\",\n \"Arctic Loon\",\n \"Pacific Loon\",\n \"Common Loon\",\n \"Yellow-billed Loon\",\n \"Least Grebe\",\n \"Pied-billed Grebe\",\n \"Horned Grebe\",\n \"Red-necked Grebe\",\n \"Eared Grebe\",\n \"Western Grebe\",\n \"Clark's Grebe\",\n \"Yellow-nosed Albatross\",\n \"Shy Albatross\",\n \"Black-browed Albatross\",\n \"Wandering Albatross\",\n \"Laysan Albatross\",\n \"Black-footed Albatross\",\n \"Short-tailed Albatross\",\n \"Northern Fulmar\",\n \"Herald Petrel\",\n \"Murphy's Petrel\",\n \"Mottled Petrel\",\n \"Black-capped Petrel\",\n \"Cook's Petrel\",\n \"Stejneger's Petrel\",\n \"White-chinned Petrel\",\n \"Streaked Shearwater\",\n \"Cory's Shearwater\",\n \"Pink-footed Shearwater\",\n \"Flesh-footed Shearwater\",\n \"Greater Shearwater\",\n \"Wedge-tailed Shearwater\",\n \"Buller's Shearwater\",\n \"Sooty Shearwater\",\n \"Short-tailed Shearwater\",\n \"Manx Shearwater\",\n \"Black-vented Shearwater\",\n \"Audubon's Shearwater\",\n \"Little Shearwater\",\n \"Wilson's Storm-Petrel\",\n \"White-faced Storm-Petrel\",\n \"European Storm-Petrel\",\n \"Fork-tailed Storm-Petrel\",\n \"Leach's Storm-Petrel\",\n \"Ashy Storm-Petrel\",\n \"Band-rumped Storm-Petrel\",\n \"Wedge-rumped Storm-Petrel\",\n \"Black Storm-Petrel\",\n \"Least Storm-Petrel\",\n \"White-tailed Tropicbird\",\n \"Red-billed Tropicbird\",\n \"Red-tailed Tropicbird\",\n \"Masked Booby\",\n \"Blue-footed Booby\",\n \"Brown Booby\",\n \"Red-footed Booby\",\n \"Northern Gannet\",\n \"American White Pelican\",\n \"Brown Pelican\",\n \"Brandt's Cormorant\",\n \"Neotropic Cormorant\",\n \"Double-crested Cormorant\",\n \"Great Cormorant\",\n \"Red-faced Cormorant\",\n \"Pelagic Cormorant\",\n \"Anhinga\",\n \"Magnificent Frigatebird\",\n \"Great Frigatebird\",\n \"Lesser Frigatebird\",\n \"American Bittern\",\n \"Yellow Bittern\",\n \"Least Bittern\",\n \"Great Blue Heron\",\n \"Great Egret\",\n \"Chinese Egret\",\n \"Little Egret\",\n \"Western Reef-Heron\",\n \"Snowy Egret\",\n \"Little Blue Heron\",\n \"Tricolored Heron\",\n \"Reddish Egret\",\n \"Cattle Egret\",\n \"Green Heron\",\n \"Black-crowned Night-Heron\",\n \"Yellow-crowned Night-Heron\",\n \"White Ibis\",\n \"Scarlet Ibis\",\n \"Glossy Ibis\",\n \"White-faced Ibis\",\n \"Roseate Spoonbill\",\n \"Jabiru\",\n \"Wood Stork\",\n \"Black Vulture\",\n \"Turkey Vulture\",\n \"California Condor\",\n \"Greater Flamingo\",\n \"Black-bellied Whistling-Duck\",\n \"Fulvous Whistling-Duck\",\n \"Bean Goose\",\n \"Pink-footed Goose\",\n \"Greater White-fronted Goose\",\n \"Lesser White-fronted Goose\",\n \"Emperor Goose\",\n \"Snow Goose\",\n \"Ross's Goose\",\n \"Canada Goose\",\n \"Brant\",\n \"Barnacle Goose\",\n \"Mute Swan\",\n \"Trumpeter Swan\",\n \"Tundra Swan\",\n \"Whooper Swan\",\n \"Muscovy Duck\",\n \"Wood Duck\",\n \"Gadwall\",\n \"Falcated Duck\",\n \"Eurasian Wigeon\",\n \"American Wigeon\",\n \"American Black Duck\",\n \"Mallard\",\n \"Mottled Duck\",\n \"Spot-billed Duck\",\n \"Blue-winged Teal\",\n \"Cinnamon Teal\",\n \"Northern Shoveler\",\n \"White-cheeked Pintail\",\n \"Northern Pintail\",\n \"Garganey\",\n \"Baikal Teal\",\n \"Green-winged Teal\",\n \"Canvasback\",\n \"Redhead\",\n \"Common Pochard\",\n \"Ring-necked Duck\",\n \"Tufted Duck\",\n \"Greater Scaup\",\n \"Lesser Scaup\",\n \"Steller's Eider\",\n \"Spectacled Eider\",\n \"King Eider\",\n \"Common Eider\",\n \"Harlequin Duck\",\n \"Labrador Duck\",\n \"Surf Scoter\",\n \"White-winged Scoter\",\n \"Black Scoter\",\n \"Oldsquaw\",\n \"Bufflehead\",\n \"Common Goldeneye\",\n \"Barrow's Goldeneye\",\n \"Smew\",\n \"Hooded Merganser\",\n \"Common Merganser\",\n \"Red-breasted Merganser\",\n \"Masked Duck\",\n \"Ruddy Duck\",\n \"Osprey\",\n \"Hook-billed Kite\",\n \"Swallow-tailed Kite\",\n \"White-tailed Kite\",\n \"Snail Kite\",\n \"Mississippi Kite\",\n \"Bald Eagle\",\n \"White-tailed Eagle\",\n \"Steller's Sea-Eagle\",\n \"Northern Harrier\",\n \"Sharp-shinned Hawk\",\n \"Cooper's Hawk\",\n \"Northern Goshawk\",\n \"Crane Hawk\",\n \"Gray Hawk\",\n \"Common Black-Hawk\",\n \"Harris's Hawk\",\n \"Roadside Hawk\",\n \"Red-shouldered Hawk\",\n \"Broad-winged Hawk\",\n \"Short-tailed Hawk\",\n \"Swainson's Hawk\",\n \"White-tailed Hawk\",\n \"Zone-tailed Hawk\",\n \"Red-tailed Hawk\",\n \"Ferruginous Hawk\",\n \"Rough-legged Hawk\",\n \"Golden Eagle\",\n \"Collared Forest-Falcon\",\n \"Crested Caracara\",\n \"Eurasian Kestrel\",\n \"American Kestrel\",\n \"Merlin\",\n \"Eurasian Hobby\",\n \"Aplomado Falcon\",\n \"Gyrfalcon\",\n \"Peregrine Falcon\",\n \"Prairie Falcon\",\n \"Plain Chachalaca\",\n \"Chukar\",\n \"Himalayan Snowcock\",\n \"Gray Partridge\",\n \"Ring-necked Pheasant\",\n \"Ruffed Grouse\",\n \"Sage Grouse\",\n \"Spruce Grouse\",\n \"Willow Ptarmigan\",\n \"Rock Ptarmigan\",\n \"White-tailed Ptarmigan\",\n \"Blue Grouse\",\n \"Sharp-tailed Grouse\",\n \"Greater Prairie-chicken\",\n \"Lesser Prairie-chicken\",\n \"Wild Turkey\",\n \"Mountain Quail\",\n \"Scaled Quail\",\n \"California Quail\",\n \"Gambel's Quail\",\n \"Northern Bobwhite\",\n \"Montezuma Quail\",\n \"Yellow Rail\",\n \"Black Rail\",\n \"Corn Crake\",\n \"Clapper Rail\",\n \"King Rail\",\n \"Virginia Rail\",\n \"Sora\",\n \"Paint-billed Crake\",\n \"Spotted Rail\",\n \"Purple Gallinule\",\n \"Azure Gallinule\",\n \"Common Moorhen\",\n \"Eurasian Coot\",\n \"American Coot\",\n \"Limpkin\",\n \"Sandhill Crane\",\n \"Common Crane\",\n \"Whooping Crane\",\n \"Double-striped Thick-knee\",\n \"Northern Lapwing\",\n \"Black-bellied Plover\",\n \"European Golden-Plover\",\n \"American Golden-Plover\",\n \"Pacific Golden-Plover\",\n \"Mongolian Plover\",\n \"Collared Plover\",\n \"Snowy Plover\",\n \"Wilson's Plover\",\n \"Common Ringed Plover\",\n \"Semipalmated Plover\",\n \"Piping Plover\",\n \"Little Ringed Plover\",\n \"Killdeer\",\n \"Mountain Plover\",\n \"Eurasian Dotterel\",\n \"Eurasian Oystercatcher\",\n \"American Oystercatcher\",\n \"Black Oystercatcher\",\n \"Black-winged Stilt\",\n \"Black-necked Stilt\",\n \"American Avocet\",\n \"Northern Jacana\",\n \"Common Greenshank\",\n \"Greater Yellowlegs\",\n \"Lesser Yellowlegs\",\n \"Marsh Sandpiper\",\n \"Spotted Redshank\",\n \"Wood Sandpiper\",\n \"Green Sandpiper\",\n \"Solitary Sandpiper\",\n \"Willet\",\n \"Wandering Tattler\",\n \"Gray-tailed Tattler\",\n \"Common Sandpiper\",\n \"Spotted Sandpiper\",\n \"Terek Sandpiper\",\n \"Upland Sandpiper\",\n \"Little Curlew\",\n \"Eskimo Curlew\",\n \"Whimbrel\",\n \"Bristle-thighed Curlew\",\n \"Far Eastern Curlew\",\n \"Slender-billed Curlew\",\n \"Eurasian Curlew\",\n \"Long-billed Curlew\",\n \"Black-tailed Godwit\",\n \"Hudsonian Godwit\",\n \"Bar-tailed Godwit\",\n \"Marbled Godwit\",\n \"Ruddy Turnstone\",\n \"Black Turnstone\",\n \"Surfbird\",\n \"Great Knot\",\n \"Red Knot\",\n \"Sanderling\",\n \"Semipalmated Sandpiper\",\n \"Western Sandpiper\",\n \"Red-necked Stint\",\n \"Little Stint\",\n \"Temminck's Stint\",\n \"Long-toed Stint\",\n \"Least Sandpiper\",\n \"White-rumped Sandpiper\",\n \"Baird's Sandpiper\",\n \"Pectoral Sandpiper\",\n \"Sharp-tailed Sandpiper\",\n \"Purple Sandpiper\",\n \"Rock Sandpiper\",\n \"Dunlin\",\n \"Curlew Sandpiper\",\n \"Stilt Sandpiper\",\n \"Spoonbill Sandpiper\",\n \"Broad-billed Sandpiper\",\n \"Buff-breasted Sandpiper\",\n \"Ruff\",\n \"Short-billed Dowitcher\",\n \"Long-billed Dowitcher\",\n \"Jack Snipe\",\n \"Common Snipe\",\n \"Pin-tailed Snipe\",\n \"Eurasian Woodcock\",\n \"American Woodcock\",\n \"Wilson's Phalarope\",\n \"Red-necked Phalarope\",\n \"Red Phalarope\",\n \"Oriental Pratincole\",\n \"Great Skua\",\n \"South Polar Skua\",\n \"Pomarine Jaeger\",\n \"Parasitic Jaeger\",\n \"Long-tailed Jaeger\",\n \"Laughing Gull\",\n \"Franklin's Gull\",\n \"Little Gull\",\n \"Black-headed Gull\",\n \"Bonaparte's Gull\",\n \"Heermann's Gull\",\n \"Band-tailed Gull\",\n \"Black-tailed Gull\",\n \"Mew Gull\",\n \"Ring-billed Gull\",\n \"California Gull\",\n \"Herring Gull\",\n \"Yellow-legged Gull\",\n \"Thayer's Gull\",\n \"Iceland Gull\",\n \"Lesser Black-backed Gull\",\n \"Slaty-backed Gull\",\n \"Yellow-footed Gull\",\n \"Western Gull\",\n \"Glaucous-winged Gull\",\n \"Glaucous Gull\",\n \"Great Black-backed Gull\",\n \"Sabine's Gull\",\n \"Black-legged Kittiwake\",\n \"Red-legged Kittiwake\",\n \"Ross's Gull\",\n \"Ivory Gull\",\n \"Gull-billed Tern\",\n \"Caspian Tern\",\n \"Royal Tern\",\n \"Elegant Tern\",\n \"Sandwich Tern\",\n \"Roseate Tern\",\n \"Common Tern\",\n \"Arctic Tern\",\n \"Forster's Tern\",\n \"Least Tern\",\n \"Aleutian Tern\",\n \"Bridled Tern\",\n \"Sooty Tern\",\n \"Large-billed Tern\",\n \"White-winged Tern\",\n \"Whiskered Tern\",\n \"Black Tern\",\n \"Brown Noddy\",\n \"Black Noddy\",\n \"Black Skimmer\",\n \"Dovekie\",\n \"Common Murre\",\n \"Thick-billed Murre\",\n \"Razorbill\",\n \"Great Auk\",\n \"Black Guillemot\",\n \"Pigeon Guillemot\",\n \"Long-billed Murrelet\",\n \"Marbled Murrelet\",\n \"Kittlitz's Murrelet\",\n \"Xantus's Murrelet\",\n \"Craveri's Murrelet\",\n \"Ancient Murrelet\",\n \"Cassin's Auklet\",\n \"Parakeet Auklet\",\n \"Least Auklet\",\n \"Whiskered Auklet\",\n \"Crested Auklet\",\n \"Rhinoceros Auklet\",\n \"Atlantic Puffin\",\n \"Horned Puffin\",\n \"Tufted Puffin\",\n \"Rock Dove\",\n \"Scaly-naped Pigeon\",\n \"White-crowned Pigeon\",\n \"Red-billed Pigeon\",\n \"Band-tailed Pigeon\",\n \"Oriental Turtle-Dove\",\n \"European Turtle-Dove\",\n \"Eurasian Collared-Dove\",\n \"Spotted Dove\",\n \"White-winged Dove\",\n \"Zenaida Dove\",\n \"Mourning Dove\",\n \"Passenger Pigeon\",\n \"Inca Dove\",\n \"Common Ground-Dove\",\n \"Ruddy Ground-Dove\",\n \"White-tipped Dove\",\n \"Key West Quail-Dove\",\n \"Ruddy Quail-Dove\",\n \"Budgerigar\",\n \"Monk Parakeet\",\n \"Carolina Parakeet\",\n \"Thick-billed Parrot\",\n \"White-winged Parakeet\",\n \"Red-crowned Parrot\",\n \"Common Cuckoo\",\n \"Oriental Cuckoo\",\n \"Black-billed Cuckoo\",\n \"Yellow-billed Cuckoo\",\n \"Mangrove Cuckoo\",\n \"Greater Roadrunner\",\n \"Smooth-billed Ani\",\n \"Groove-billed Ani\",\n \"Barn Owl\",\n \"Flammulated Owl\",\n \"Oriental Scops-Owl\",\n \"Western Screech-Owl\",\n \"Eastern Screech-Owl\",\n \"Whiskered Screech-Owl\",\n \"Great Horned Owl\",\n \"Snowy Owl\",\n \"Northern Hawk Owl\",\n \"Northern Pygmy-Owl\",\n \"Ferruginous Pygmy-Owl\",\n \"Elf Owl\",\n \"Burrowing Owl\",\n \"Mottled Owl\",\n \"Spotted Owl\",\n \"Barred Owl\",\n \"Great Gray Owl\",\n \"Long-eared Owl\",\n \"Short-eared Owl\",\n \"Boreal Owl\",\n \"Northern Saw-whet Owl\",\n \"Lesser Nighthawk\",\n \"Common Nighthawk\",\n \"Antillean Nighthawk\",\n \"Common Pauraque\",\n \"Common Poorwill\",\n \"Chuck-will's-widow\",\n \"Buff-collared Nightjar\",\n \"Whip-poor-will\",\n \"Jungle Nightjar\",\n \"Black Swift\",\n \"White-collared Swift\",\n \"Chimney Swift\",\n \"Vaux's Swift\",\n \"White-throated Needletail\",\n \"Common Swift\",\n \"Fork-tailed Swift\",\n \"White-throated Swift\",\n \"Antillean Palm Swift\",\n \"Green Violet-ear\",\n \"Green-breasted Mango\",\n \"Broad-billed Hummingbird\",\n \"White-eared Hummingbird\",\n \"Xantus's Hummingbird\",\n \"Berylline Hummingbird\",\n \"Buff-bellied Hummingbird\",\n \"Cinnamon Hummingbird\",\n \"Violet-crowned Hummingbird\",\n \"Blue-throated Hummingbird\",\n \"Magnificent Hummingbird\",\n \"Plain-capped Starthroat\",\n \"Bahama Woodstar\",\n \"Lucifer Hummingbird\",\n \"Ruby-throated Hummingbird\",\n \"Black-chinned Hummingbird\",\n \"Anna's Hummingbird\",\n \"Costa's Hummingbird\",\n \"Calliope Hummingbird\",\n \"Bumblebee Hummingbird\",\n \"Broad-tailed Hummingbird\",\n \"Rufous Hummingbird\",\n \"Allen's Hummingbird\",\n \"Elegant Trogon\",\n \"Eared Trogon\",\n \"Hoopoe\",\n \"Ringed Kingfisher\",\n \"Belted Kingfisher\",\n \"Green Kingfisher\",\n \"Eurasian Wryneck\",\n \"Lewis's Woodpecker\",\n \"Red-headed Woodpecker\",\n \"Acorn Woodpecker\",\n \"Gila Woodpecker\",\n \"Golden-fronted Woodpecker\",\n \"Red-bellied Woodpecker\",\n \"Williamson's Sapsucker\",\n \"Yellow-bellied Sapsucker\",\n \"Red-naped Sapsucker\",\n \"Red-breasted Sapsucker\",\n \"Great Spotted Woodpecker\",\n \"Ladder-backed Woodpecker\",\n \"Nuttall's Woodpecker\",\n \"Downy Woodpecker\",\n \"Hairy Woodpecker\",\n \"Strickland's Woodpecker\",\n \"Red-cockaded Woodpecker\",\n \"White-headed Woodpecker\",\n \"Three-toed Woodpecker\",\n \"Black-backed Woodpecker\",\n \"Northern Flicker\",\n \"Gilded Flicker\",\n \"Pileated Woodpecker\",\n \"Ivory-billed Woodpecker\",\n \"Northern Beardless-Tyrannulet\",\n \"Greenish Elaenia\",\n \"Caribbean Elaenia\",\n \"Tufted Flycatcher\",\n \"Olive-sided Flycatcher\",\n \"Greater Pewee\",\n \"Western Wood-Pewee\",\n \"Eastern Wood-Pewee\",\n \"Yellow-bellied Flycatcher\",\n \"Acadian Flycatcher\",\n \"Alder Flycatcher\",\n \"Willow Flycatcher\",\n \"Least Flycatcher\",\n \"Hammond's Flycatcher\",\n \"Dusky Flycatcher\",\n \"Gray Flycatcher\",\n \"Pacific-slope Flycatcher\",\n \"Cordilleran Flycatcher\",\n \"Buff-breasted Flycatcher\",\n \"Black Phoebe\",\n \"Eastern Phoebe\",\n \"Say's Phoebe\",\n \"Vermilion Flycatcher\",\n \"Dusky-capped Flycatcher\",\n \"Ash-throated Flycatcher\",\n \"Nutting's Flycatcher\",\n \"Great Crested Flycatcher\",\n \"Brown-crested Flycatcher\",\n \"La Sagra's Flycatcher\",\n \"Great Kiskadee\",\n \"Sulphur-bellied Flycatcher\",\n \"Variegated Flycatcher\",\n \"Tropical Kingbird\",\n \"Couch's Kingbird\",\n \"Cassin's Kingbird\",\n \"Thick-billed Kingbird\",\n \"Western Kingbird\",\n \"Eastern Kingbird\",\n \"Gray Kingbird\",\n \"Loggerhead Kingbird\",\n \"Scissor-tailed Flycatcher\",\n \"Fork-tailed Flycatcher\",\n \"Rose-throated Becard\",\n \"Masked Tityra\",\n \"Brown Shrike\",\n \"Loggerhead Shrike\",\n \"Northern Shrike\",\n \"White-eyed Vireo\",\n \"Thick-billed Vireo\",\n \"Bell's Vireo\",\n \"Black-capped Vireo\",\n \"Gray Vireo\",\n \"Yellow-throated Vireo\",\n \"Plumbeous Vireo\",\n \"Cassin's Vireo\",\n \"Blue-headed Vireo\",\n \"Hutton's Vireo\",\n \"Warbling Vireo\",\n \"Philadelphia Vireo\",\n \"Red-eyed Vireo\",\n \"Yellow-green Vireo\",\n \"Black-whiskered Vireo\",\n \"Yucatan Vireo\",\n \"Gray Jay\",\n \"Steller's Jay\",\n \"Blue Jay\",\n \"Green Jay\",\n \"Brown Jay\",\n \"Florida Scrub-Jay\",\n \"Island Scrub-Jay\",\n \"Western Scrub-Jay\",\n \"Mexican Jay\",\n \"Pinyon Jay\",\n \"Clark's Nutcracker\",\n \"Black-billed Magpie\",\n \"Yellow-billed Magpie\",\n \"Eurasian Jackdaw\",\n \"American Crow\",\n \"Northwestern Crow\",\n \"Tamaulipas Crow\",\n \"Fish Crow\",\n \"Chihuahuan Raven\",\n \"Common Raven\",\n \"Sky Lark\",\n \"Horned Lark\",\n \"Purple Martin\",\n \"Cuban Martin\",\n \"Gray-breasted Martin\",\n \"Southern Martin\",\n \"Brown-chested Martin\",\n \"Tree Swallow\",\n \"Violet-green Swallow\",\n \"Bahama Swallow\",\n \"Northern Rough-winged Swallow\",\n \"Bank Swallow\",\n \"Cliff Swallow\",\n \"Cave Swallow\",\n \"Barn Swallow\",\n \"Common House-Martin\",\n \"Carolina Chickadee\",\n \"Black-capped Chickadee\",\n \"Mountain Chickadee\",\n \"Mexican Chickadee\",\n \"Chestnut-backed Chickadee\",\n \"Boreal Chickadee\",\n \"Gray-headed Chickadee\",\n \"Bridled Titmouse\",\n \"Oak Titmouse\",\n \"Juniper Titmouse\",\n \"Tufted Titmouse\",\n \"Verdin\",\n \"Bushtit\",\n \"Red-breasted Nuthatch\",\n \"White-breasted Nuthatch\",\n \"Pygmy Nuthatch\",\n \"Brown-headed Nuthatch\",\n \"Brown Creeper\",\n \"Cactus Wren\",\n \"Rock Wren\",\n \"Canyon Wren\",\n \"Carolina Wren\",\n \"Bewick's Wren\",\n \"House Wren\",\n \"Winter Wren\",\n \"Sedge Wren\",\n \"Marsh Wren\",\n \"American Dipper\",\n \"Red-whiskered Bulbul\",\n \"Golden-crowned Kinglet\",\n \"Ruby-crowned Kinglet\",\n \"Middendorff's Grasshopper-Warbler\",\n \"Lanceolated Warbler\",\n \"Wood Warbler\",\n \"Dusky Warbler\",\n \"Arctic Warbler\",\n \"Blue-gray Gnatcatcher\",\n \"California Gnatcatcher\",\n \"Black-tailed Gnatcatcher\",\n \"Black-capped Gnatcatcher\",\n \"Narcissus Flycatcher\",\n \"Mugimaki Flycatcher\",\n \"Red-breasted Flycatcher\",\n \"Siberian Flycatcher\",\n \"Gray-spotted Flycatcher\",\n \"Asian Brown Flycatcher\",\n \"Siberian Rubythroat\",\n \"Bluethroat\",\n \"Siberian Blue Robin\",\n \"Red-flanked Bluetail\",\n \"Northern Wheatear\",\n \"Stonechat\",\n \"Eastern Bluebird\",\n \"Western Bluebird\",\n \"Mountain Bluebird\",\n \"Townsend's Solitaire\",\n \"Veery\",\n \"Gray-cheeked Thrush\",\n \"Bicknell's Thrush\",\n \"Swainson's Thrush\",\n \"Hermit Thrush\",\n \"Wood Thrush\",\n \"Eurasian Blackbird\",\n \"Eyebrowed Thrush\",\n \"Dusky Thrush\",\n \"Fieldfare\",\n \"Redwing\",\n \"Clay-colored Robin\",\n \"White-throated Robin\",\n \"Rufous-backed Robin\",\n \"American Robin\",\n \"Varied Thrush\",\n \"Aztec Thrush\",\n \"Wrentit\",\n \"Gray Catbird\",\n \"Black Catbird\",\n \"Northern Mockingbird\",\n \"Bahama Mockingbird\",\n \"Sage Thrasher\",\n \"Brown Thrasher\",\n \"Long-billed Thrasher\",\n \"Bendire's Thrasher\",\n \"Curve-billed Thrasher\",\n \"California Thrasher\",\n \"Crissal Thrasher\",\n \"Le Conte's Thrasher\",\n \"Blue Mockingbird\",\n \"European Starling\",\n \"Crested Myna\",\n \"Siberian Accentor\",\n \"Yellow Wagtail\",\n \"Citrine Wagtail\",\n \"Gray Wagtail\",\n \"White Wagtail\",\n \"Black-backed Wagtail\",\n \"Tree Pipit\",\n \"Olive-backed Pipit\",\n \"Pechora Pipit\",\n \"Red-throated Pipit\",\n \"American Pipit\",\n \"Sprague's Pipit\",\n \"Bohemian Waxwing\",\n \"Cedar Waxwing\",\n \"Gray Silky-flycatcher\",\n \"Phainopepla\",\n \"Olive Warbler\",\n \"Bachman's Warbler\",\n \"Blue-winged Warbler\",\n \"Golden-winged Warbler\",\n \"Tennessee Warbler\",\n \"Orange-crowned Warbler\",\n \"Nashville Warbler\",\n \"Virginia's Warbler\",\n \"Colima Warbler\",\n \"Lucy's Warbler\",\n \"Crescent-chested Warbler\",\n \"Northern Parula\",\n \"Tropical Parula\",\n \"Yellow Warbler\",\n \"Chestnut-sided Warbler\",\n \"Magnolia Warbler\",\n \"Cape May Warbler\",\n \"Black-throated Blue Warbler\",\n \"Yellow-rumped Warbler\",\n \"Black-throated Gray Warbler\",\n \"Golden-cheeked Warbler\",\n \"Black-throated Green Warbler\",\n \"Townsend's Warbler\",\n \"Hermit Warbler\",\n \"Blackburnian Warbler\",\n \"Yellow-throated Warbler\",\n \"Grace's Warbler\",\n \"Pine Warbler\",\n \"Kirtland's Warbler\",\n \"Prairie Warbler\",\n \"Palm Warbler\",\n \"Bay-breasted Warbler\",\n \"Blackpoll Warbler\",\n \"Cerulean Warbler\",\n \"Black-and-white Warbler\",\n \"American Redstart\",\n \"Prothonotary Warbler\",\n \"Worm-eating Warbler\",\n \"Swainson's Warbler\",\n \"Ovenbird\",\n \"Northern Waterthrush\",\n \"Louisiana Waterthrush\",\n \"Kentucky Warbler\",\n \"Connecticut Warbler\",\n \"Mourning Warbler\",\n \"MacGillivray's Warbler\",\n \"Common Yellowthroat\",\n \"Gray-crowned Yellowthroat\",\n \"Hooded Warbler\",\n \"Wilson's Warbler\",\n \"Canada Warbler\",\n \"Red-faced Warbler\",\n \"Painted Redstart\",\n \"Slate-throated Redstart\",\n \"Fan-tailed Warbler\",\n \"Golden-crowned Warbler\",\n \"Rufous-capped Warbler\",\n \"Yellow-breasted Chat\",\n \"Bananaquit\",\n \"Hepatic Tanager\",\n \"Summer Tanager\",\n \"Scarlet Tanager\",\n \"Western Tanager\",\n \"Flame-colored Tanager\",\n \"Stripe-headed Tanager\",\n \"White-collared Seedeater\",\n \"Yellow-faced Grassquit\",\n \"Black-faced Grassquit\",\n \"Olive Sparrow\",\n \"Green-tailed Towhee\",\n \"Spotted Towhee\",\n \"Eastern Towhee\",\n \"Canyon Towhee\",\n \"California Towhee\",\n \"Abert's Towhee\",\n \"Rufous-winged Sparrow\",\n \"Cassin's Sparrow\",\n \"Bachman's Sparrow\",\n \"Botteri's Sparrow\",\n \"Rufous-crowned Sparrow\",\n \"Five-striped Sparrow\",\n \"American Tree Sparrow\",\n \"Chipping Sparrow\",\n \"Clay-colored Sparrow\",\n \"Brewer's Sparrow\",\n \"Field Sparrow\",\n \"Worthen's Sparrow\",\n \"Black-chinned Sparrow\",\n \"Vesper Sparrow\",\n \"Lark Sparrow\",\n \"Black-throated Sparrow\",\n \"Sage Sparrow\",\n \"Lark Bunting\",\n \"Savannah Sparrow\",\n \"Grasshopper Sparrow\",\n \"Baird's Sparrow\",\n \"Henslow's Sparrow\",\n \"Le Conte's Sparrow\",\n \"Nelson's Sharp-tailed Sparrow\",\n \"Saltmarsh Sharp-tailed Sparrow\",\n \"Seaside Sparrow\",\n \"Fox Sparrow\",\n \"Song Sparrow\",\n \"Lincoln's Sparrow\",\n \"Swamp Sparrow\",\n \"White-throated Sparrow\",\n \"Harris's Sparrow\",\n \"White-crowned Sparrow\",\n \"Golden-crowned Sparrow\",\n \"Dark-eyed Junco\",\n \"Yellow-eyed Junco\",\n \"McCown's Longspur\",\n \"Lapland Longspur\",\n \"Smith's Longspur\",\n \"Chestnut-collared Longspur\",\n \"Pine Bunting\",\n \"Little Bunting\",\n \"Rustic Bunting\",\n \"Yellow-breasted Bunting\",\n \"Gray Bunting\",\n \"Pallas's Bunting\",\n \"Reed Bunting\",\n \"Snow Bunting\",\n \"McKay's Bunting\",\n \"Crimson-collared Grosbeak\",\n \"Northern Cardinal\",\n \"Pyrrhuloxia\",\n \"Yellow Grosbeak\",\n \"Rose-breasted Grosbeak\",\n \"Black-headed Grosbeak\",\n \"Blue Bunting\",\n \"Blue Grosbeak\",\n \"Lazuli Bunting\",\n \"Indigo Bunting\",\n \"Varied Bunting\",\n \"Painted Bunting\",\n \"Dickcissel\",\n \"Bobolink\",\n \"Red-winged Blackbird\",\n \"Tricolored Blackbird\",\n \"Tawny-shouldered Blackbird\",\n \"Eastern Meadowlark\",\n \"Western Meadowlark\",\n \"Yellow-headed Blackbird\",\n \"Rusty Blackbird\",\n \"Brewer's Blackbird\",\n \"Common Grackle\",\n \"Boat-tailed Grackle\",\n \"Great-tailed Grackle\",\n \"Shiny Cowbird\",\n \"Bronzed Cowbird\",\n \"Brown-headed Cowbird\",\n \"Black-vented Oriole\",\n \"Orchard Oriole\",\n \"Hooded Oriole\",\n \"Streak-backed Oriole\",\n \"Spot-breasted Oriole\",\n \"Altamira Oriole\",\n \"Audubon's Oriole\",\n \"Baltimore Oriole\",\n \"Bullock's Oriole\",\n \"Scott's Oriole\",\n \"Common Chaffinch\",\n \"Brambling\",\n \"Gray-crowned Rosy-Finch\",\n \"Black Rosy-Finch\",\n \"Brown-capped Rosy-Finch\",\n \"Pine Grosbeak\",\n \"Common Rosefinch\",\n \"Purple Finch\",\n \"Cassin's Finch\",\n \"House Finch\",\n \"Red Crossbill\",\n \"White-winged Crossbill\",\n \"Common Redpoll\",\n \"Hoary Redpoll\",\n \"Eurasian Siskin\",\n \"Pine Siskin\",\n \"Lesser Goldfinch\",\n \"Lawrence's Goldfinch\",\n \"American Goldfinch\",\n \"Oriental Greenfinch\",\n \"Eurasian Bullfinch\",\n \"Evening Grosbeak\",\n \"Hawfinch\",\n \"House Sparrow\",\n \"Eurasian Tree Sparrow\"\n]\n},{}],59:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Abyssinian\",\n \"American Bobtail\",\n \"American Curl\",\n \"American Shorthair\",\n \"American Wirehair\",\n \"Balinese\",\n \"Bengal\",\n \"Birman\",\n \"Bombay\",\n \"British Shorthair\",\n \"Burmese\",\n \"Chartreux\",\n \"Chausie\",\n \"Cornish Rex\",\n \"Devon Rex\",\n \"Donskoy\",\n \"Egyptian Mau\",\n \"Exotic Shorthair\",\n \"Havana\",\n \"Highlander\",\n \"Himalayan\",\n \"Japanese Bobtail\",\n \"Korat\",\n \"Kurilian Bobtail\",\n \"LaPerm\",\n \"Maine Coon\",\n \"Manx\",\n \"Minskin\",\n \"Munchkin\",\n \"Nebelung\",\n \"Norwegian Forest Cat\",\n \"Ocicat\",\n \"Ojos Azules\",\n \"Oriental\",\n \"Persian\",\n \"Peterbald\",\n \"Pixiebob\",\n \"Ragdoll\",\n \"Russian Blue\",\n \"Savannah\",\n \"Scottish Fold\",\n \"Selkirk Rex\",\n \"Serengeti\",\n \"Siberian\",\n \"Siamese\",\n \"Singapura\",\n \"Snowshoe\",\n \"Sokoke\",\n \"Somali\",\n \"Sphynx\",\n \"Thai\",\n \"Tonkinese\",\n \"Toyger\",\n \"Turkish Angora\",\n \"Turkish Van\"\n]\n},{}],60:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Blue Whale\",\n \"Fin Whale\",\n \"Sei Whale\",\n \"Sperm Whale\",\n \"Bryde’s whale\",\n \"Omura’s whale\",\n \"Humpback whale\",\n \"Long-Beaked Common Dolphin\",\n \"Short-Beaked Common Dolphin\",\n \"Bottlenose Dolphin\",\n \"Indo-Pacific Bottlenose Dolphin\",\n \"Northern Rightwhale Dolphin\",\n \"Southern Rightwhale Dolphin\",\n \"Tucuxi\",\n \"Costero\",\n \"Indo-Pacific Hump-backed Dolphin\",\n \"Chinese White Dolphin\",\n \"Atlantic Humpbacked Dolphin\",\n \"Atlantic Spotted Dolphin\",\n \"Clymene Dolphin\",\n \"Pantropical Spotted Dolphin\",\n \"Spinner Dolphin\",\n \"Striped Dolphin\",\n \"Rough-Toothed Dolphin\",\n \"Chilean Dolphin\",\n \"Commerson’s Dolphin\",\n \"Heaviside’s Dolphin\",\n \"Hector’s Dolphin\",\n \"Risso’s Dolphin\",\n \"Fraser’s Dolphin\",\n \"Atlantic White-Sided Dolphin\",\n \"Dusky Dolphin\",\n \"Hourglass Dolphin\",\n \"Pacific White-Sided Dolphin\",\n \"Peale’s Dolphin\",\n \"White-Beaked Dolphin\",\n \"Australian Snubfin Dolphin\",\n \"Irrawaddy Dolphin\",\n \"Melon-headed Whale\",\n \"Killer Whale (Orca)\",\n \"Pygmy Killer Whale\",\n \"False Killer Whale\",\n \"Long-finned Pilot Whale\",\n \"Short-finned Pilot Whale\",\n \"Guiana Dolphin\",\n \"Burrunan Dolphin\",\n \"Australian humpback Dolphin\",\n \"Amazon River Dolphin\",\n \"Chinese River Dolphin\",\n \"Ganges River Dolphin\",\n \"La Plata Dolphin\",\n \"Southern Bottlenose Whale\",\n \"Longman's Beaked Whale\",\n \"Arnoux's Beaked Whale\"\n]\n},{}],61:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Aberdeen Angus\",\n \"Abergele\",\n \"Abigar\",\n \"Abondance\",\n \"Abyssinian Shorthorned Zebu\",\n \"Aceh\",\n \"Achham\",\n \"Adamawa\",\n \"Adaptaur\",\n \"Afar\",\n \"Africangus\",\n \"Afrikaner\",\n \"Agerolese\",\n \"Alambadi\",\n \"Alatau\",\n \"Albanian\",\n \"Albera\",\n \"Alderney\",\n \"Alentejana\",\n \"Aleutian wild cattle\",\n \"Aliad Dinka\",\n \"Alistana-Sanabresa\",\n \"Allmogekor\",\n \"Alur\",\n \"American\",\n \"American Angus\",\n \"American Beef Friesian\",\n \"American Brown Swiss\",\n \"American Milking Devon\",\n \"American White Park\",\n \"Amerifax\",\n \"Amrit Mahal\",\n \"Amsterdam Island cattle\",\n \"Anatolian Black\",\n \"Andalusian Black\",\n \"Andalusian Blond\",\n \"Andalusian Grey\",\n \"Angeln\",\n \"Angoni\",\n \"Ankina\",\n \"Ankole\",\n \"Ankole-Watusi\",\n \"Aracena\",\n \"Arado\",\n \"Argentine Criollo\",\n \"Argentine Friesian\",\n \"Armorican\",\n \"Arouquesa\",\n \"Arsi\",\n \"Asturian Mountain\",\n \"Asturian Valley\",\n \"Aubrac\",\n \"Aulie-Ata\",\n \"Aure et Saint-Girons\",\n \"Australian Braford\",\n \"Australian Brangus\",\n \"Australian Charbray\",\n \"Australian Friesian Sahiwal\",\n \"Australian Lowline\",\n \"Australian Milking Zebu\",\n \"Australian Shorthorn\",\n \"Austrian Simmental\",\n \"Austrian Yellow\",\n \"Avétonou\",\n \"Avileña-Negra Ibérica\",\n \"Aweil Dinka\",\n \"Ayrshire\",\n \"Azaouak\",\n \"Azebuado\",\n \"Azerbaijan Zebu\",\n \"Azores\",\n \"Bedit\",\n \"Breed\",\n \"Bachaur cattle\",\n \"Baherie cattle\",\n \"Bakosi cattle\",\n \"Balancer\",\n \"Baoule\",\n \"Bargur cattle\",\n \"Barrosã\",\n \"Barzona\",\n \"Bazadaise\",\n \"Beef Freisian\",\n \"Beefalo\",\n \"Beefmaker\",\n \"Beefmaster\",\n \"Begayt\",\n \"Belgian Blue\",\n \"Belgian Red\",\n \"Belgian Red Pied\",\n \"Belgian White-and-Red\",\n \"Belmont Red\",\n \"Belted Galloway\",\n \"Bernese\",\n \"Berrenda cattle\",\n \"Betizu\",\n \"Bianca Modenese\",\n \"Blaarkop\",\n \"Black Angus\",\n \"Black Baldy\",\n \"Black Hereford\",\n \"Blanca Cacereña\",\n \"Blanco Orejinegro BON\",\n \"Blonde d'Aquitaine\",\n \"Blue Albion\",\n \"Blue Grey\",\n \"Bohuskulla\",\n \"Bonsmara\",\n \"Boran\",\n \"Boškarin\",\n \"Braford\",\n \"Brahman\",\n \"Brahmousin\",\n \"Brangus\",\n \"Braunvieh\",\n \"Brava\",\n \"British White\",\n \"British Friesian\",\n \"Brown Carpathian\",\n \"Brown Caucasian\",\n \"Brown Swiss\",\n \"Bue Lingo\",\n \"Burlina\",\n \"Buša cattle\",\n \"Butana cattle\",\n \"Bushuyev\",\n \"Cedit\",\n \"Breed\",\n \"Cachena\",\n \"Caldelana\",\n \"Camargue\",\n \"Campbell Island cattle\",\n \"Canadian Speckle Park\",\n \"Canadienne\",\n \"Canaria\",\n \"Canchim\",\n \"Caracu\",\n \"Cárdena Andaluza\",\n \"Carinthian Blondvieh\",\n \"Carora\",\n \"Charbray\",\n \"Charolais\",\n \"Chateaubriand\",\n \"Chiangus\",\n \"Chianina\",\n \"Chillingham cattle\",\n \"Chinese Black Pied\",\n \"Cholistani\",\n \"Coloursided White Back\",\n \"Commercial\",\n \"Corriente\",\n \"Corsican cattle\",\n \"Costeño con Cuernos\",\n \"Crioulo Lageano\",\n \"Dedit\",\n \"Breed\",\n \"Dajal\",\n \"Dangi cattle\",\n \"Danish Black-Pied\",\n \"Danish Jersey\",\n \"Danish Red\",\n \"Deep Red cattle\",\n \"Deoni\",\n \"Devon\",\n \"Dexter cattle\",\n \"Dhanni\",\n \"Doayo cattle\",\n \"Doela\",\n \"Drakensberger\",\n \"Dølafe\",\n \"Droughtmaster\",\n \"Dulong'\",\n \"Dutch Belted\",\n \"Dutch Friesian\",\n \"Dwarf Lulu\",\n \"Eedit\",\n \"Breed\",\n \"East Anatolian Red\",\n \"Eastern Finncattle\",\n \"Eastern Red Polled\",\n \"Enderby Island cattle\",\n \"English Longhorn\",\n \"Ennstaler Bergscheck\",\n \"Estonian Holstein\",\n \"Estonian Native\",\n \"Estonian Red cattle\",\n \"Évolène cattle\",\n \"Fedit\",\n \"Breed\",\n \"Fēng Cattle\",\n \"Finnish Ayrshire\",\n \"Finncattle\",\n \"Finnish Holstein-Friesian\",\n \"Fjäll\",\n \"Fleckvieh\",\n \"Florida Cracker cattle\",\n \"Fogera\",\n \"French Simmental\",\n \"Fribourgeoise\",\n \"Friesian Red and White\",\n \"Fulani Sudanese\",\n \"Gedit\",\n \"Breed\",\n \"Galician Blond\",\n \"Galloway cattle\",\n \"Gangatiri\",\n \"Gaolao\",\n \"Garvonesa\",\n \"Gascon cattle\",\n \"Gelbvieh\",\n \"Georgian Mountain cattle\",\n \"German Angus\",\n \"German Black Pied cattle\",\n \"German Black Pied Dairy\",\n \"German Red Pied\",\n \"Gir\",\n \"Glan cattle\",\n \"Gloucester\",\n \"Gobra\",\n \"Greek Shorthorn\",\n \"Greek Steppe\",\n \"Greyman cattle\",\n \"Gudali\",\n \"Guernsey cattle\",\n \"Guzerá\",\n \"Hedit\",\n \"Breed\",\n \"Hallikar4\",\n \"Hanwoo\",\n \"Hariana cattle\",\n \"Hartón del Valle\",\n \"Harzer Rotvieh\",\n \"Hays Converter\",\n \"Heck cattle\",\n \"Hereford\",\n \"Herens\",\n \"Hybridmaster\",\n \"Highland cattle\",\n \"Hinterwald\",\n \"Holando-Argentino\",\n \"Holstein Friesian cattle\",\n \"Horro\",\n \"Huáng Cattle\",\n \"Hungarian Grey\",\n \"Iedit\",\n \"Breed\",\n \"Iberian cattle\",\n \"Icelandic\",\n \"Illawarra cattle\",\n \"Improved Red and White\",\n \"Indo-Brazilian\",\n \"Irish Moiled\",\n \"Israeli Holstein\",\n \"Israeli Red\",\n \"Istoben cattle\",\n \"Istrian cattle\",\n \"Jedit\",\n \"Breed\",\n \"Jamaica Black\",\n \"Jamaica Hope\",\n \"Jamaica Red\",\n \"Japanese Brown\",\n \"Jarmelista\",\n \"Javari cattle\",\n \"Jersey cattle\",\n \"Jutland cattle\",\n \"Kedit\",\n \"Breed\",\n \"Kabin Buri cattle\",\n \"Kalmyk cattle\",\n \"Kangayam\",\n \"Kankrej\",\n \"Kamphaeng Saen cattle\",\n \"Karan Swiss\",\n \"Kasaragod Dwarf cattle\",\n \"Kathiawadi\",\n \"Kazakh Whiteheaded\",\n \"Kenana cattle\",\n \"Kenkatha cattle\",\n \"Kerry cattle\",\n \"Kherigarh\",\n \"Khillari cattle\",\n \"Kholomogory\",\n \"Korat Wagyu\",\n \"Kostroma cattle\",\n \"Krishna Valley cattle\",\n \"Kuri\",\n \"Kurgan cattle\",\n \"Ledit\",\n \"Breed\",\n \"La Reina cattle\",\n \"Lakenvelder cattle\",\n \"Lampurger\",\n \"Latvian Blue\",\n \"Latvian Brown\",\n \"Latvian Danish Red\",\n \"Lebedyn\",\n \"Levantina\",\n \"Limia cattle\",\n \"Limousin\",\n \"Limpurger\",\n \"Lincoln Red\",\n \"Lineback\",\n \"Lithuanian Black-and-White\",\n \"Lithuanian Light Grey\",\n \"Lithuanian Red\",\n \"Lithuanian White-Backed\",\n \"Lohani cattle\",\n \"Lourdais\",\n \"Lucerna cattle\",\n \"Luing\",\n \"Medit\",\n \"Breed\",\n \"Madagascar Zebu\",\n \"Madura\",\n \"Maine-Anjou\",\n \"Malnad Gidda\",\n \"Malvi\",\n \"Mandalong Special\",\n \"Mantequera Leonesa\",\n \"Maramureş Brown\",\n \"Marchigiana\",\n \"Maremmana\",\n \"Marinhoa\",\n \"Maronesa\",\n \"Masai\",\n \"Mashona\",\n \"Menorquina\",\n \"Mertolenga\",\n \"Meuse-Rhine-Issel\",\n \"Mewati\",\n \"Milking Shorthorn\",\n \"Minhota\",\n \"Mirandesa\",\n \"Mirkadim\",\n \"Mocăniţă\",\n \"Mollie\",\n \"Monchina\",\n \"Mongolian\",\n \"Montbéliarde\",\n \"Morucha\",\n \"Muturu\",\n \"Murboden\",\n \"Murnau-Werdenfels\",\n \"Murray Grey\",\n \"Nedit\",\n \"Breed\",\n \"Nagori\",\n \"N'Dama\",\n \"Negra Andaluza\",\n \"Nelore\",\n \"Nguni\",\n \"Nimari\",\n \"Normande\",\n \"North Bengal Grey\",\n \"Northern Finncattle\",\n \"Northern Shorthorn\",\n \"Norwegian Red\",\n \"Oedit]\",\n \"Breed\",\n \"Ongole\",\n \"Original Simmental\",\n \"Pedit\",\n \"Breed\",\n \"Pajuna\",\n \"Palmera\",\n \"Pantaneiro\",\n \"Parda Alpina\",\n \"Parthenaise\",\n \"Pasiega\",\n \"Pembroke\",\n \"Philippine Native\",\n \"Pie Rouge des Plaines\",\n \"Piedmontese cattle\",\n \"Pineywoods\",\n \"Pinzgauer\",\n \"Pirenaica\",\n \"Podolac\",\n \"Podolica\",\n \"Polish Black-and-White\",\n \"Polish Red\",\n \"Polled Hereford\",\n \"Poll Shorthorn\",\n \"Polled Shorthorn\",\n \"Ponwar\",\n \"Preta\",\n \"Punganur\",\n \"Pulikulam\",\n \"Pustertaler Sprinzen\",\n \"Qedit\",\n \"Breed\",\n \"Qinchaun\",\n \"Queensland Miniature Boran\",\n \"Redit\",\n \"Breed\",\n \"Ramo Grande\",\n \"Randall\",\n \"Raramuri Criollo\",\n \"Rathi\",\n \"Rätisches Grauvieh\",\n \"Raya\",\n \"Red Angus\",\n \"Red Brangus\",\n \"Red Chittagong\",\n \"Red Fulani\",\n \"Red Gorbatov\",\n \"Red Holstein\",\n \"Red Kandhari\",\n \"Red Mingrelian\",\n \"Red Poll\",\n \"Red Polled Østland\",\n \"Red Sindhi\",\n \"Retinta\",\n \"Riggit Galloway\",\n \"Ringamåla\",\n \"Rohjan\",\n \"Romagnola\",\n \"Romanian Bălţata\",\n \"Romanian Steppe Gray\",\n \"Romosinuano\",\n \"Russian Black Pied\",\n \"RX3\",\n \"Sedit\",\n \"Breed\",\n \"Sahiwal\",\n \"Salers\",\n \"Salorn\",\n \"Sanga\",\n \"Sanhe\",\n \"Santa Cruz\",\n \"Santa Gertrudis\",\n \"Sayaguesa\",\n \"Schwyz\",\n \"Selembu\",\n \"Senepol\",\n \"Serbian Pied\",\n \"Serbian Steppe\",\n \"Sheko\",\n \"Shetland\",\n \"Shorthorn\",\n \"Siboney de Cuba\",\n \"Simbrah\",\n \"Simford\",\n \"Simmental\",\n \"Siri\",\n \"South Devon\",\n \"Spanish Fighting Bull\",\n \"Speckle Park\",\n \"Square Meater\",\n \"Sussex\",\n \"Swedish Friesian\",\n \"Swedish Polled\",\n \"Swedish Red Pied\",\n \"Swedish Red Polled\",\n \"Swedish Red-and-White\",\n \"Tedit\",\n \"Breed\",\n \"Tabapuã\",\n \"Tarentaise\",\n \"Tasmanian Grey\",\n \"Tauros\",\n \"Telemark\",\n \"Texas Longhorn\",\n \"Texon\",\n \"Thai Black\",\n \"Thai Fighting Bull\",\n \"Thai Friesian\",\n \"Thai Milking Zebu\",\n \"Tharparkar\",\n \"Tswana\",\n \"Tudanca\",\n \"Tuli\",\n \"Tulim\",\n \"Turkish Grey Steppe\",\n \"Tux-Zillertal\",\n \"Tyrol Grey\",\n \"Uedit\",\n \"Breed\",\n \"Umblachery\",\n \"Ukrainian Grey\",\n \"Vedit\",\n \"Breed\",\n \"Valdostana Castana\",\n \"Valdostana Pezzata Nera\",\n \"Valdostana Pezzata Rossa\",\n \"Väneko\",\n \"Vaynol\",\n \"Vechur8\",\n \"Vestland Fjord\",\n \"Vestland Red Polled\",\n \"Vianesa\",\n \"Volinian Beef\",\n \"Vorderwald\",\n \"Vosgienne\",\n \"Wedit\",\n \"Breed\",\n \"Wagyu\",\n \"Waguli\",\n \"Wangus\",\n \"Welsh Black\",\n \"Western Finncattle\",\n \"White Cáceres\",\n \"White Fulani\",\n \"White Lamphun\",\n \"White Park\",\n \"Whitebred Shorthorn\",\n \"Xedit\",\n \"Breed\",\n \"Xingjiang Brown\",\n \"Yedit\",\n \"Breed\",\n \"Yakutian\",\n \"Yanbian\",\n \"Yanhuang\",\n \"Yurino\",\n \"Zedit\",\n \"Breed\",\n \"Żubroń\",\n \"Zebu\"\n]\n},{}],62:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Alligator mississippiensis\",\n \"Chinese Alligator\",\n \"Black Caiman\",\n \"Broad-snouted Caiman\",\n \"Spectacled Caiman\",\n \"Yacare Caiman\",\n \"Cuvier’s Dwarf Caiman\",\n \"Schneider’s Smooth-fronted Caiman\",\n \"African Slender-snouted Crocodile\",\n \"American Crocodile\",\n \"Australian Freshwater Crocodile\",\n \"Cuban Crocodile\",\n \"Dwarf Crocodile\",\n \"Morelet’s Crocodile\",\n \"Mugger Crocodile\",\n \"New Guinea Freshwater Crocodile\",\n \"Nile Crocodile\",\n \"West African Crocodile\",\n \"Orinoco Crocodile\",\n \"Philippine Crocodile\",\n \"Saltwater Crocodile\",\n \"Siamese Crocodile\",\n \"Gharial\",\n \"Tomistoma\"\n]\n},{}],63:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Affenpinscher\",\n \"Afghan Hound\",\n \"Aidi\",\n \"Airedale Terrier\",\n \"Akbash\",\n \"Akita\",\n \"Alano Español\",\n \"Alapaha Blue Blood Bulldog\",\n \"Alaskan Husky\",\n \"Alaskan Klee Kai\",\n \"Alaskan Malamute\",\n \"Alopekis\",\n \"Alpine Dachsbracke\",\n \"American Bulldog\",\n \"American Bully\",\n \"American Cocker Spaniel\",\n \"American English Coonhound\",\n \"American Foxhound\",\n \"American Hairless Terrier\",\n \"American Pit Bull Terrier\",\n \"American Staffordshire Terrier\",\n \"American Water Spaniel\",\n \"Andalusian Hound\",\n \"Anglo-Français de Petite Vénerie\",\n \"Appenzeller Sennenhund\",\n \"Ariegeois\",\n \"Armant\",\n \"Armenian Gampr dog\",\n \"Artois Hound\",\n \"Australian Cattle Dog\",\n \"Australian Kelpie\",\n \"Australian Shepherd\",\n \"Australian Stumpy Tail Cattle Dog\",\n \"Australian Terrier\",\n \"Austrian Black and Tan Hound\",\n \"Austrian Pinscher\",\n \"Azawakh\",\n \"Bakharwal dog\",\n \"Banjara Hound\",\n \"Barbado da Terceira\",\n \"Barbet\",\n \"Basenji\",\n \"Basque Shepherd Dog\",\n \"Basset Artésien Normand\",\n \"Basset Bleu de Gascogne\",\n \"Basset Fauve de Bretagne\",\n \"Basset Hound\",\n \"Bavarian Mountain Hound\",\n \"Beagle\",\n \"Beagle-Harrier\",\n \"Belgian Shepherd\",\n \"Bearded Collie\",\n \"Beauceron\",\n \"Bedlington Terrier\",\n \"Bergamasco Shepherd\",\n \"Berger Picard\",\n \"Bernese Mountain Dog\",\n \"Bhotia\",\n \"Bichon Frisé\",\n \"Billy\",\n \"Black and Tan Coonhound\",\n \"Black Norwegian Elkhound\",\n \"Black Russian Terrier\",\n \"Black Mouth Cur\",\n \"Bloodhound\",\n \"Blue Lacy\",\n \"Blue Picardy Spaniel\",\n \"Bluetick Coonhound\",\n \"Boerboel\",\n \"Bohemian Shepherd\",\n \"Bolognese\",\n \"Border Collie\",\n \"Border Terrier\",\n \"Borzoi\",\n 'Bosnian Coarse-haired Hound',\n \"Boston Terrier\",\n \"Bouvier des Ardennes\",\n \"Bouvier des Flandres\",\n \"Boxer\",\n \"Boykin Spaniel\",\n \"Bracco Italiano\",\n \"Braque d'Auvergne\",\n \"Braque de l'Ariège\",\n \"Braque du Bourbonnais\",\n \"Braque Francais\",\n \"Braque Saint-Germain\",\n \"Briard\",\n \"Briquet Griffon Vendéen\",\n \"Brittany\",\n \"Broholmer\",\n \"Bruno Jura Hound\",\n \"Brussels Griffon\",\n \"Bucovina Shepherd Dog\",\n \"Bull Arab\",\n \"Bull Terrier\",\n \"Bulldog\",\n \"Bullmastiff\",\n \"Bully Kutta\",\n 'Burgos Pointer',\n \"Cairn Terrier\",\n \"Campeiro Bulldog\",\n \"Canaan Dog\",\n \"Canadian Eskimo Dog\",\n \"Cane Corso\",\n \"Cane di Oropa\",\n \"Cane Paratore\",\n \"Cantabrian Water Dog\",\n \"Can de Chira\",\n \"Cão da Serra de Aires\",\n \"Cão de Castro Laboreiro\",\n \"Cão de Gado Transmontano\",\n \"Cão Fila de São Miguel\",\n \"Cardigan Welsh Corgi\",\n \"Carea Castellano Manchego\",\n \"Carolina Dog\",\n \"Carpathian Shepherd Dog\",\n \"Catahoula Leopard Dog\",\n \"Catalan Sheepdog\",\n \"Caucasian Shepherd Dog\",\n \"Cavalier King Charles Spaniel\",\n \"Central Asian Shepherd Dog\",\n \"Cesky Fousek\",\n \"Cesky Terrier\",\n \"Chesapeake Bay Retriever\",\n \"Chien Français Blanc et Noir\",\n \"Chien Français Blanc et Orange\",\n \"Chien Français Tricolore\",\n \"Chihuahua\",\n \"Chilean Terrier\",\n \"Chinese Chongqing Dog\",\n \"Chinese Crested Dog\",\n \"Chinook\",\n \"Chippiparai\",\n \"Chongqing dog\",\n \"Chortai\",\n \"Chow Chow\",\n \"Cimarrón Uruguayo\",\n \"Cirneco dell'Etna\",\n \"Clumber Spaniel\",\n \"Colombian fino hound\",\n \"Coton de Tulear\",\n \"Cretan Hound\",\n \"Croatian Sheepdog\",\n \"Curly-Coated Retriever\",\n \"Cursinu\",\n \"Czechoslovakian Wolfdog\",\n \"Dachshund\",\n \"Dalmatian\",\n \"Dandie Dinmont Terrier\",\n \"Danish-Swedish Farmdog\",\n \"Denmark Feist\",\n \"Dingo\" ,\n \"Doberman Pinscher\",\n \"Dogo Argentino\",\n \"Dogo Guatemalteco\",\n \"Dogo Sardesco\",\n \"Dogue Brasileiro\",\n \"Dogue de Bordeaux\",\n \"Drentse Patrijshond\",\n \"Drever\",\n \"Dunker\",\n \"Dutch Shepherd\",\n \"Dutch Smoushond\",\n \"East Siberian Laika\",\n \"East European Shepherd\",\n \"English Cocker Spaniel\",\n \"English Foxhound\",\n \"English Mastiff\",\n \"English Setter\",\n \"English Shepherd\",\n \"English Springer Spaniel\",\n \"English Toy Terrier\",\n \"Entlebucher Mountain Dog\",\n \"Estonian Hound\",\n \"Estrela Mountain Dog\",\n \"Eurasier\",\n \"Field Spaniel\",\n \"Fila Brasileiro\",\n \"Finnish Hound\",\n \"Finnish Lapphund\",\n \"Finnish Spitz\",\n \"Flat-Coated Retriever\",\n \"French Bulldog\",\n \"French Spaniel\",\n \"Galgo Español\",\n \"Galician Shepherd Dog\",\n \"Garafian Shepherd\",\n \"Gascon Saintongeois\",\n \"Georgian Shepherd\",\n \"German Hound\",\n \"German Longhaired Pointer\",\n \"German Pinscher\",\n \"German Roughhaired Pointer\",\n \"German Shepherd Dog\",\n \"German Shorthaired Pointer\",\n \"German Spaniel\",\n \"German Spitz\",\n \"German Wirehaired Pointer\",\n \"Giant Schnauzer\",\n \"Glen of Imaal Terrier\",\n \"Golden Retriever\",\n \"Gończy Polski\",\n \"Gordon Setter\",\n \"Grand Anglo-Français Blanc et Noir\",\n \"Grand Anglo-Français Blanc et Orange\",\n \"Grand Anglo-Français Tricolore\",\n \"Grand Basset Griffon Vendéen\",\n \"Grand Bleu de Gascogne\",\n \"Grand Griffon Vendéen\",\n \"Great Dane\",\n \"Greater Swiss Mountain Dog\",\n \"Greek Harehound\",\n \"Greek Shepherd\",\n \"Greenland Dog\",\n \"Greyhound\",\n \"Griffon Bleu de Gascogne\",\n \"Griffon Fauve de Bretagne\",\n \"Griffon Nivernais\",\n \"Gull Dong\",\n \"Gull Terrier\",\n \"Hällefors Elkhound\",\n \"Hamiltonstövare\",\n \"Hanover Hound\",\n \"Harrier\",\n \"Havanese\",\n \"Hierran Wolfdog\",\n \"Hokkaido\",\n \"Hovawart\",\n \"Huntaway\",\n \"Hygen Hound\",\n \"Ibizan Hound\",\n \"Icelandic Sheepdog\",\n \"Indian pariah dog\",\n \"Indian Spitz\",\n \"Irish Red and White Setter\",\n \"Irish Setter\",\n \"Irish Terrier\",\n \"Irish Water Spaniel\",\n \"Irish Wolfhound\",\n \"Istrian Coarse-haired Hound\",\n \"Istrian Shorthaired Hound\",\n \"Italian Greyhound\",\n \"Jack Russell Terrier\",\n \"Jagdterrier\",\n \"Japanese Chin\",\n \"Japanese Spitz\",\n \"Japanese Terrier\",\n \"Jindo\",\n \"Jonangi\",\n \"Kai Ken\",\n \"Kaikadi\",\n \"Kangal Shepherd Dog\",\n \"Kanni\",\n \"Karakachan dog\",\n \"Karelian Bear Dog\",\n \"Kars\",\n \"Karst Shepherd\",\n \"Keeshond\",\n \"Kerry Beagle\",\n \"Kerry Blue Terrier\",\n \"King Charles Spaniel\",\n \"King Shepherd\",\n \"Kintamani\",\n \"Kishu\",\n \"Kokoni\",\n \"Kombai\",\n \"Komondor\",\n \"Kooikerhondje\",\n \"Koolie\",\n \"Koyun dog\",\n \"Kromfohrländer\",\n \"Kuchi\",\n \"Kuvasz\",\n \"Labrador Retriever\",\n \"Lagotto Romagnolo\",\n \"Lakeland Terrier\",\n \"Lancashire Heeler\",\n \"Landseer\",\n \"Lapponian Herder\",\n \"Large Münsterländer\",\n \"Leonberger\",\n \"Levriero Sardo\",\n \"Lhasa Apso\",\n \"Lithuanian Hound\",\n \"Löwchen\",\n \"Lupo Italiano\",\n \"Mackenzie River Husky\",\n \"Magyar agár\",\n \"Mahratta Greyhound\",\n \"Maltese\",\n \"Manchester Terrier\",\n \"Maremmano-Abruzzese Sheepdog\",\n \"McNab dog\",\n \"Miniature American Shepherd\",\n \"Miniature Bull Terrier\",\n \"Miniature Fox Terrier\",\n \"Miniature Pinscher\",\n \"Miniature Schnauzer\",\n \"Molossus of Epirus\",\n \"Montenegrin Mountain Hound\",\n \"Mountain Cur\",\n \"Mountain Feist\",\n \"Mucuchies\",\n \"Mudhol Hound\",\n \"Mudi\",\n \"Neapolitan Mastiff\",\n \"New Guinea Singing Dog\",\n \"New Zealand Heading Dog\",\n \"Newfoundland\",\n \"Norfolk Terrier\",\n \"Norrbottenspets\",\n \"Northern Inuit Dog\",\n \"Norwegian Buhund\",\n \"Norwegian Elkhound\",\n \"Norwegian Lundehund\",\n \"Norwich Terrier\",\n \"Nova Scotia Duck Tolling Retriever\",\n \"Old Croatian Sighthound\",\n \"Old Danish Pointer\",\n \"Old English Sheepdog\",\n \"Old English Terrier\",\n \"Olde English Bulldogge\",\n \"Otterhound\",\n \"Pachon Navarro\",\n \"Pampas Deerhound\",\n \"Paisley Terrier\",\n \"Papillon\",\n \"Parson Russell Terrier\",\n \"Pastore della Lessinia e del Lagorai\",\n \"Patagonian Sheepdog\",\n \"Patterdale Terrier\",\n \"Pekingese\",\n \"Pembroke Welsh Corgi\",\n \"Perro Majorero\",\n \"Perro de Pastor Mallorquin\",\n \"Perro de Presa Canario\",\n \"Perro de Presa Mallorquin\",\n \"Peruvian Inca Orchid\",\n \"Petit Basset Griffon Vendéen\",\n \"Petit Bleu de Gascogne\",\n \"Phalène\",\n \"Pharaoh Hound\",\n \"Phu Quoc Ridgeback\",\n \"Picardy Spaniel\",\n \"Plummer Terrier\",\n \"Plott Hound\",\n \"Podenco Canario\",\n \"Podenco Valenciano\",\n \"Pointer\",\n \"Poitevin\",\n \"Polish Greyhound\",\n \"Polish Hound\",\n \"Polish Lowland Sheepdog\",\n \"Polish Tatra Sheepdog\",\n \"Pomeranian\",\n \"Pont-Audemer Spaniel\",\n \"Poodle\",\n \"Porcelaine\",\n \"Portuguese Podengo\",\n \"Portuguese Pointer\",\n \"Portuguese Water Dog\",\n \"Posavac Hound\",\n \"Pražský Krysařík\",\n \"Pshdar Dog\",\n \"Pudelpointer\",\n \"Pug\",\n \"Puli\",\n \"Pumi\",\n \"Pungsan Dog\",\n \"Pyrenean Mastiff\",\n \"Pyrenean Mountain Dog\",\n \"Pyrenean Sheepdog\",\n \"Rafeiro do Alentejo\",\n \"Rajapalayam\",\n \"Rampur Greyhound\",\n \"Rat Terrier\",\n \"Ratonero Bodeguero Andaluz\",\n \"Ratonero Mallorquin\",\n \"Ratonero Murciano de Huerta\",\n \"Ratonero Valenciano\",\n \"Redbone Coonhound\",\n \"Rhodesian Ridgeback\",\n \"Romanian Mioritic Shepherd Dog\",\n \"Romanian Raven Shepherd Dog\",\n \"Rottweiler\",\n \"Rough Collie\",\n \"Russian Spaniel\",\n \"Russian Toy\",\n \"Russo-European Laika\",\n \"Saarloos Wolfdog\",\n \"Sabueso Español\",\n \"Saint Bernard\",\n \"Saint Hubert Jura Hound\",\n \"Saint-Usuge Spaniel\",\n \"Saluki\",\n \"Samoyed\",\n \"Sapsali\",\n \"Sarabi dog\",\n \"Šarplaninac\",\n \"Schapendoes\",\n \"Schillerstövare\",\n \"Schipperke\",\n \"Schweizer Laufhund\",\n \"Schweizerischer Niederlaufhund\",\n \"Scottish Deerhound\",\n \"Scottish Terrier\",\n \"Sealyham Terrier\",\n \"Segugio dell'Appennino\",\n \"Segugio Italiano\",\n \"Segugio Maremmano\",\n \"Seppala Siberian Sleddog\",\n \"Serbian Hound\",\n \"Serbian Tricolour Hound\",\n \"Serrano Bulldog\",\n \"Shar Pei\",\n \"Shetland Sheepdog\",\n \"Shiba Inu\",\n \"Shih Tzu\",\n \"Shikoku\",\n \"Shiloh Shepherd\",\n \"Siberian Husky\",\n \"Silken Windhound\",\n \"Silky Terrier\",\n \"Sinhala Hound\",\n \"Skye Terrier\",\n \"Sloughi\",\n \"Slovakian Wirehaired Pointer\",\n \"Slovenský Cuvac\",\n \"Slovenský Kopov\",\n \"Smalandstövare\",\n \"Small Greek domestic dog\",\n \"Small Münsterländer\",\n \"Smooth Collie\",\n \"Smooth Fox Terrier\",\n \"Soft-Coated Wheaten Terrier\",\n \"South Russian Ovcharka\",\n \"Spanish Mastiff\",\n \"Spanish Water Dog\",\n \"Spinone Italiano\",\n \"Sporting Lucas Terrier\",\n \"Sardinian Shepherd Dog\",\n \"Stabyhoun\",\n \"Staffordshire Bull Terrier\",\n \"Standard Schnauzer\",\n \"Stephens Stock\",\n \"Styrian Coarse-haired Hound\",\n \"Sussex Spaniel\",\n \"Swedish Elkhound\",\n \"Swedish Lapphund\",\n \"Swedish Vallhund\",\n \"Swedish White Elkhound\",\n \"Taigan\",\n \"Taiwan Dog\",\n \"Tamaskan Dog\",\n \"Teddy Roosevelt Terrier\",\n \"Telomian\",\n \"Tenterfield Terrier\",\n \"Terrier Brasileiro\",\n \"Thai Bangkaew Dog\",\n \"Thai Ridgeback\",\n \"Tibetan Mastiff\",\n \"Tibetan Spaniel\",\n \"Tibetan Terrier\",\n \"Tornjak\",\n \"Tosa\",\n \"Toy Fox Terrier\",\n \"Toy Manchester Terrier\",\n \"Transylvanian Hound\",\n \"Treeing Cur\",\n \"Treeing Feist\",\n \"Treeing Tennessee Brindle\",\n \"Treeing Walker Coonhound\",\n \"Trigg Hound\",\n \"Tyrolean Hound\",\n \"Vikhan\",\n \"Villano de Las Encartaciones\",\n \"Villanuco de Las Encartaciones\",\n \"Vizsla\",\n \"Volpino Italiano\",\n \"Weimaraner\",\n \"Welsh Sheepdog\",\n \"Welsh Springer Spaniel\",\n \"Welsh Terrier\",\n \"West Highland White Terrier\",\n \"West Siberian Laika\",\n \"Westphalian Dachsbracke\",\n \"Wetterhoun\",\n \"Whippet\",\n \"White Shepherd\",\n \"White Swiss Shepherd Dog\",\n \"Wire Fox Terrier\",\n \"Wirehaired Pointing Griffon\",\n \"Wirehaired Vizsla\",\n \"Xiasi Dog\",\n \"Xoloitzcuintli\",\n \"Yakutian Laika\",\n \"Yorkshire Terrier\",\n];\n\n},{}],64:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Grass carp\",\n \"Peruvian anchoveta\",\n \"Silver carp\",\n \"Common carp\",\n \"Asari,\",\n \"Japanese littleneck,\",\n \"Filipino Venus,\",\n \"Japanese cockle,\",\n \"Alaska pollock\",\n \"Nile tilapia\",\n \"Whiteleg shrimp\",\n \"Bighead carp\",\n \"Skipjack tuna\",\n \"Catla\",\n \"Crucian carp\",\n \"Atlantic salmon\",\n \"Atlantic herring\",\n \"Chub mackerel\",\n \"Rohu\",\n \"Yellowfin tuna\",\n \"Japanese anchovy\",\n \"Largehead hairtail\",\n \"Atlantic cod\",\n \"European pilchard\",\n \"Capelin\",\n \"Jumbo flying squid\",\n \"Milkfish\",\n \"Atlantic mackerel\",\n \"Rainbow trout\",\n \"Araucanian herring\",\n \"Wuchang bream\",\n \"Gulf menhaden\",\n \"Indian oil sardine\",\n \"Black carp\",\n \"European anchovy\",\n \"Northern snakehead\",\n \"Pacific cod\",\n \"Pacific saury\",\n \"Pacific herring\",\n \"Bigeye tuna\",\n \"Chilean jack mackerel\",\n \"Yellow croaker\",\n \"Haddock\",\n \"Gazami crab\",\n \"Amur catfish\",\n \"Japanese common catfish\",\n \"European sprat\",\n \"Pink salmon\",\n \"Mrigal carp\",\n \"Channel catfish\",\n \"Blood cockle\",\n \"Blue whiting\",\n \"Hilsa shad\",\n \"Daggertooth pike conger\",\n \"California pilchard\",\n \"Cape horse mackerel\",\n \"Pacific anchoveta\",\n \"Japanese flying squid\",\n \"Pollock\",\n \"Chinese softshell turtle\",\n \"Kawakawa\",\n \"Indian mackerel\",\n \"Asian swamp eel\",\n \"Argentine hake\",\n \"Short mackerel\",\n \"Southern rough shrimp\",\n \"Southern African anchovy\",\n \"Pond loach\",\n \"Iridescent shark\",\n \"Mandarin fish\",\n \"Chinese perch\",\n \"Nile perch\",\n \"Round sardinella\",\n \"Japanese pilchard\",\n \"Bombay-duck\",\n \"Yellowhead catfish\",\n \"Korean bullhead\",\n \"Narrow-barred Spanish mackerel\",\n \"Albacore\",\n \"Madeiran sardinella\",\n \"Bonga shad\",\n \"Silver cyprinid\",\n \"Nile tilapia\",\n \"Longtail tuna\",\n \"Atlantic menhaden\",\n \"North Pacific hake\",\n \"Atlantic horse mackerel\",\n \"Japanese jack mackerel\",\n \"Pacific thread herring\",\n \"Bigeye scad\",\n \"Yellowstripe scad\",\n \"Chum salmon\",\n \"Blue swimming crab\",\n \"Pacific sand lance\",\n \"Pacific sandlance\",\n \"Goldstripe sardinella\"\n]\n},{}],65:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"American Albino\",\n \"Abaco Barb\",\n \"Abtenauer\",\n \"Abyssinian\",\n \"Aegidienberger\",\n \"Akhal-Teke\",\n \"Albanian Horse\",\n \"Altai Horse\",\n \"Altèr Real\",\n \"American Cream Draft\",\n \"American Indian Horse\",\n \"American Paint Horse\",\n \"American Quarter Horse\",\n \"American Saddlebred\",\n \"American Warmblood\",\n \"Andalusian Horse\",\n \"Andravida Horse\",\n \"Anglo-Arabian\",\n \"Anglo-Arabo-Sardo\",\n \"Anglo-Kabarda\",\n \"Appaloosa\",\n \"AraAppaloosa\",\n \"Arabian Horse\",\n \"Ardennes Horse\",\n \"Arenberg-Nordkirchen\",\n \"Argentine Criollo\",\n \"Asian wild Horse\",\n \"Assateague Horse\",\n \"Asturcón\",\n \"Augeron\",\n \"Australian Brumby\",\n \"Australian Draught Horse\",\n \"Australian Stock Horse\",\n \"Austrian Warmblood\",\n \"Auvergne Horse\",\n \"Auxois\",\n \"Azerbaijan Horse\",\n \"Azteca Horse\",\n \"Baise Horse\",\n \"Bale\",\n \"Balearic Horse\",\n \"Balikun Horse\",\n \"Baluchi Horse\",\n \"Banker Horse\",\n \"Barb Horse\",\n \"Bardigiano\",\n \"Bashkir Curly\",\n \"Basque Mountain Horse\",\n \"Bavarian Warmblood\",\n \"Belgian Half-blood\",\n \"Belgian Horse\",\n \"Belgian Warmblood \",\n \"Bhutia Horse\",\n \"Black Forest Horse\",\n \"Blazer Horse\",\n \"Boerperd\",\n \"Borana\",\n \"Boulonnais Horse\",\n \"Brabant\",\n \"Brandenburger\",\n \"Brazilian Sport Horse\",\n \"Breton Horse\",\n \"Brumby\",\n \"Budyonny Horse\",\n \"Burguete Horse\",\n \"Burmese Horse\",\n \"Byelorussian Harness Horse\",\n \"Calabrese Horse\",\n \"Camargue Horse\",\n \"Camarillo White Horse\",\n \"Campeiro\",\n \"Campolina\",\n \"Canadian Horse\",\n \"Canadian Pacer\",\n \"Carolina Marsh Tacky\",\n \"Carthusian Horse\",\n \"Caspian Horse\",\n \"Castilian Horse\",\n \"Castillonnais\",\n \"Catria Horse\",\n \"Cavallo Romano della Maremma Laziale\",\n \"Cerbat Mustang\",\n \"Chickasaw Horse\",\n \"Chilean Corralero\",\n \"Choctaw Horse\",\n \"Cleveland Bay\",\n \"Clydesdale Horse\",\n \"Cob\",\n \"Coldblood Trotter\",\n \"Colonial Spanish Horse\",\n \"Colorado Ranger\",\n \"Comtois Horse\",\n \"Corsican Horse\",\n \"Costa Rican Saddle Horse\",\n \"Cretan Horse\",\n \"Criollo Horse\",\n \"Croatian Coldblood\",\n \"Cuban Criollo\",\n \"Cumberland Island Horse\",\n \"Curly Horse\",\n \"Czech Warmblood\",\n \"Daliboz\",\n \"Danish Warmblood\",\n \"Danube Delta Horse\",\n \"Dole Gudbrandsdal\",\n \"Don\",\n \"Dongola Horse\",\n \"Draft Trotter\",\n \"Dutch Harness Horse\",\n \"Dutch Heavy Draft\",\n \"Dutch Warmblood\",\n \"Dzungarian Horse\",\n \"East Bulgarian\",\n \"East Friesian Horse\",\n \"Estonian Draft\",\n \"Estonian Horse\",\n \"Falabella\",\n \"Faroese\",\n \"Finnhorse\",\n \"Fjord Horse\",\n \"Fleuve\",\n \"Florida Cracker Horse\",\n \"Foutanké\",\n \"Frederiksborg Horse\",\n \"Freiberger\",\n \"French Trotter\",\n \"Friesian Cross\",\n \"Friesian Horse\",\n \"Friesian Sporthorse\",\n \"Furioso-North Star\",\n \"Galiceño\",\n \"Galician Pony\",\n \"Gelderland Horse\",\n \"Georgian Grande Horse\",\n \"German Warmblood\",\n \"Giara Horse\",\n \"Gidran\",\n \"Groningen Horse\",\n \"Gypsy Horse\",\n \"Hackney Horse\",\n \"Haflinger\",\n \"Hanoverian Horse\",\n \"Heck Horse\",\n \"Heihe Horse\",\n \"Henson Horse\",\n \"Hequ Horse\",\n \"Hirzai\",\n \"Hispano-Bretón\",\n \"Holsteiner Horse\",\n \"Horro\",\n \"Hungarian Warmblood\",\n \"Icelandic Horse\",\n \"Iomud\",\n \"Irish Draught\",\n \"Irish Sport Horse sometimes called Irish Hunter\",\n \"Italian Heavy Draft\",\n \"Italian Trotter\",\n \"Jaca Navarra\",\n \"Jeju Horse\",\n \"Jutland Horse\",\n \"Kabarda Horse\",\n \"Kafa\",\n \"Kaimanawa Horses\",\n \"Kalmyk Horse\",\n \"Karabair\",\n \"Karabakh Horse\",\n \"Karachai Horse\",\n \"Karossier\",\n \"Kathiawari\",\n \"Kazakh Horse\",\n \"Kentucky Mountain Saddle Horse\",\n \"Kiger Mustang\",\n \"Kinsky Horse\",\n \"Kisber Felver\",\n \"Kiso Horse\",\n \"Kladruber\",\n \"Knabstrupper\",\n \"Konik\",\n \"Kundudo\",\n \"Kustanair\",\n \"Kyrgyz Horse\",\n \"Latvian Horse\",\n \"Lipizzan\",\n \"Lithuanian Heavy Draught\",\n \"Lokai\",\n \"Losino Horse\",\n \"Lusitano\",\n \"Lyngshest\",\n \"M'Bayar\",\n \"M'Par\",\n \"Mallorquín\",\n \"Malopolski\",\n \"Mangalarga\",\n \"Mangalarga Marchador\",\n \"Maremmano\",\n \"Marismeño Horse\",\n \"Marsh Tacky\",\n \"Marwari Horse\",\n \"Mecklenburger\",\n \"Međimurje Horse\",\n \"Menorquín\",\n \"Mérens Horse\",\n \"Messara Horse\",\n \"Metis Trotter\",\n \"Mezőhegyesi Sport Horse\",\n \"Miniature Horse\",\n \"Misaki Horse\",\n \"Missouri Fox Trotter\",\n \"Monchina\",\n \"Mongolian Horse\",\n \"Mongolian Wild Horse\",\n \"Monterufolino\",\n \"Morab\",\n \"Morgan Horse\",\n \"Mountain Pleasure Horse\",\n \"Moyle Horse\",\n \"Murakoz Horse\",\n \"Murgese\",\n \"Mustang Horse\",\n \"Namib Desert Horse\",\n \"Nangchen Horse\",\n \"National Show Horse\",\n \"Nez Perce Horse\",\n \"Nivernais Horse\",\n \"Nokota Horse\",\n \"Noma\",\n \"Nonius Horse\",\n \"Nooitgedachter\",\n \"Nordlandshest\",\n \"Noriker Horse\",\n \"Norman Cob\",\n \"North American Single-Footer Horse\",\n \"North Swedish Horse\",\n \"Norwegian Coldblood Trotter\",\n \"Norwegian Fjord\",\n \"Novokirghiz\",\n \"Oberlander Horse\",\n \"Ogaden\",\n \"Oldenburg Horse\",\n \"Orlov trotter\",\n \"Ostfriesen\",\n \"Paint\",\n \"Pampa Horse\",\n \"Paso Fino\",\n \"Pentro Horse\",\n \"Percheron\",\n \"Persano Horse\",\n \"Peruvian Paso\",\n \"Pintabian\",\n \"Pleven Horse\",\n \"Poitevin Horse\",\n \"Posavac Horse\",\n \"Pottok\",\n \"Pryor Mountain Mustang\",\n \"Przewalski's Horse\",\n \"Pura Raza Española\",\n \"Purosangue Orientale\",\n \"Qatgani\",\n \"Quarab\",\n \"Quarter Horse\",\n \"Racking Horse\",\n \"Retuerta Horse\",\n \"Rhenish German Coldblood\",\n \"Rhinelander Horse\",\n \"Riwoche Horse\",\n \"Rocky Mountain Horse\",\n \"Romanian Sporthorse\",\n \"Rottaler\",\n \"Russian Don\",\n \"Russian Heavy Draft\",\n \"Russian Trotter\",\n \"Saddlebred\",\n \"Salerno Horse\",\n \"Samolaco Horse\",\n \"San Fratello Horse\",\n \"Sarcidano Horse\",\n \"Sardinian Anglo-Arab\",\n \"Schleswig Coldblood\",\n \"Schwarzwälder Kaltblut\",\n \"Selale\",\n \"Sella Italiano\",\n \"Selle Français\",\n \"Shagya Arabian\",\n \"Shan Horse\",\n \"Shire Horse\",\n \"Siciliano Indigeno\",\n \"Silesian Horse\",\n \"Sokolsky Horse\",\n \"Sorraia\",\n \"South German Coldblood\",\n \"Soviet Heavy Draft\",\n \"Spanish Anglo-Arab\",\n \"Spanish Barb\",\n \"Spanish Jennet Horse\",\n \"Spanish Mustang\",\n \"Spanish Tarpan\",\n \"Spanish-Norman Horse\",\n \"Spiti Horse\",\n \"Spotted Saddle Horse\",\n \"Standardbred Horse\",\n \"Suffolk Punch\",\n \"Swedish Ardennes\",\n \"Swedish coldblood trotter\",\n \"Swedish Warmblood\",\n \"Swiss Warmblood\",\n \"Taishū Horse\",\n \"Takhi\",\n \"Tawleed\",\n \"Tchernomor\",\n \"Tennessee Walking Horse\",\n \"Tersk Horse\",\n \"Thoroughbred\",\n \"Tiger Horse\",\n \"Tinker Horse\",\n \"Tolfetano\",\n \"Tori Horse\",\n \"Trait Du Nord\",\n \"Trakehner\",\n \"Tsushima\",\n \"Tuigpaard\",\n \"Ukrainian Riding Horse\",\n \"Unmol Horse\",\n \"Uzunyayla\",\n \"Ventasso Horse\",\n \"Virginia Highlander\",\n \"Vlaamperd\",\n \"Vladimir Heavy Draft\",\n \"Vyatka\",\n \"Waler\",\n \"Waler Horse\",\n \"Walkaloosa\",\n \"Warlander\",\n \"Warmblood\",\n \"Welsh Cob\",\n \"Westphalian Horse\",\n \"Wielkopolski\",\n \"Württemberger\",\n \"Xilingol Horse\",\n \"Yakutian Horse\",\n \"Yili Horse\",\n \"Yonaguni Horse\",\n \"Zaniskari\",\n \"Žemaitukas\",\n \"Zhemaichu\",\n \"Zweibrücker\"\n]\n},{}],66:[function(require,module,exports){\nvar animal = {};\nmodule['exports'] = animal;\nanimal.dog = require(\"./dog\");\nanimal.cat = require(\"./cat\");\nanimal.snake = require(\"./snake\");\nanimal.horse = require(\"./horse\");\nanimal.cetacean = require(\"./cetacean\");\nanimal.rabbit = require(\"./rabbit\");\nanimal.insect = require(\"./insect\");\nanimal.bear = require(\"./bear\");\nanimal.lion = require(\"./lion\");\nanimal.cow = require(\"./cow\");\nanimal.bird = require(\"./bird\");\nanimal.fish = require(\"./fish\");\nanimal.crocodilia = require(\"./crocodilia\");\nanimal.type = require(\"./type\");\n},{\"./bear\":57,\"./bird\":58,\"./cat\":59,\"./cetacean\":60,\"./cow\":61,\"./crocodilia\":62,\"./dog\":63,\"./fish\":64,\"./horse\":65,\"./insect\":67,\"./lion\":68,\"./rabbit\":69,\"./snake\":70,\"./type\":71}],67:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Acacia-ants\",\n \"Acorn-plum gall\",\n \"Aerial yellowjacket\",\n \"Africanized honey bee\",\n \"Allegheny mound ant\",\n \"Almond stone wasp\",\n \"Ant\",\n \"Arboreal ant\",\n \"Argentine ant\",\n \"Asian paper wasp\",\n \"Baldfaced hornet\",\n \"Bee\",\n \"Bigheaded ant\",\n \"Black and yellow mud dauber\",\n \"Black carpenter ant\",\n \"Black imported fire ant\",\n \"Blue horntail woodwasp\",\n \"Blue orchard bee\",\n \"Braconid wasp\",\n \"Bumble bee\",\n \"Carpenter ant\",\n \"Carpenter wasp\",\n \"Chalcid wasp\",\n \"Cicada killer\",\n \"Citrus blackfly parasitoid\",\n \"Common paper wasp\",\n \"Crazy ant\",\n \"Cuckoo wasp\",\n \"Cynipid gall wasp\",\n \"Eastern Carpenter bee\",\n \"Eastern yellowjacket\",\n \"Elm sawfly\",\n \"Encyrtid wasp\",\n \"Erythrina gall wasp\",\n \"Eulophid wasp\",\n \"European hornet\",\n \"European imported fire ant\",\n \"False honey ant\",\n \"Fire ant\",\n \"Forest bachac\",\n \"Forest yellowjacket\",\n \"German yellowjacket\",\n \"Ghost ant\",\n \"Giant ichneumon wasp\",\n \"Giant resin bee\",\n \"Giant wood wasp\",\n \"Golden northern bumble bee\",\n \"Golden paper wasp\",\n \"Gouty oak gall\",\n \"Grass Carrying Wasp\",\n \"Great black wasp\",\n \"Great golden digger wasp\",\n \"Hackberry nipple gall parasitoid\",\n \"Honey bee\",\n \"Horned oak gall\",\n \"Horse guard wasp\",\n \"Horse guard wasp\",\n \"Hunting wasp\",\n \"Ichneumonid wasp\",\n \"Keyhole wasp\",\n \"Knopper gall\",\n \"Large garden bumble bee\",\n \"Large oak-apple gall\",\n \"Leafcutting bee\",\n \"Little fire ant\",\n \"Little yellow ant\",\n \"Long-horned bees\",\n \"Long-legged ant\",\n \"Macao paper wasp\",\n \"Mallow bee\",\n \"Marble gall\",\n \"Mossyrose gall wasp\",\n \"Mud-daubers\",\n \"Multiflora rose seed chalcid\",\n \"Oak apple gall wasp\",\n \"Oak rough bulletgall wasp\",\n \"Oak saucer gall\",\n \"Oak shoot sawfly\",\n \"Odorous house ant\",\n \"Orange-tailed bumble bee\",\n \"Orangetailed potter wasp\",\n \"Oriental chestnut gall wasp\",\n \"Paper wasp\",\n \"Pavement ant\",\n \"Pigeon tremex\",\n \"Pip gall wasp\",\n \"Prairie yellowjacket\",\n \"Pteromalid wasp\",\n \"Pyramid ant\",\n \"Raspberry Horntail\",\n \"Red ant\",\n \"Red carpenter ant\",\n \"Red harvester ant\",\n \"Red imported fire ant\",\n \"Red wasp\",\n \"Red wood ant\",\n \"Red-tailed wasp\",\n \"Reddish carpenter ant\",\n \"Rough harvester ant\",\n \"Sawfly parasitic wasp\",\n \"Scale parasitoid\",\n \"Silky ant\",\n \"Sirex woodwasp\",\n \"Siricid woodwasp\",\n \"Smaller yellow ant\",\n \"Southeastern blueberry bee\",\n \"Southern fire ant\",\n \"Southern yellowjacket\",\n \"Sphecid wasp\",\n \"Stony gall\",\n \"Sweat bee\",\n \"Texas leafcutting ant\",\n \"Tiphiid wasp\",\n \"Torymid wasp\",\n \"Tramp ant\",\n \"Valentine ant\",\n \"Velvet ant\",\n \"Vespid wasp\",\n \"Weevil parasitoid\",\n \"Western harvester ant\",\n \"Western paper wasp\",\n \"Western thatching ant\",\n \"Western yellowjacket\",\n \"White-horned horntail\",\n \"Willow shoot sawfly\",\n \"Woodwasp\",\n \"Wool sower gall maker\",\n \"Yellow and black potter wasp\",\n \"Yellow Crazy Ant\",\n \"Yellow-horned horntail\"\n]\n},{}],68:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Asiatic Lion\",\n \"Barbary Lion\",\n \"West African Lion\",\n \"Northeast Congo Lion\",\n \"Masai Lion\",\n \"Transvaal lion\",\n \"Cape lion\"\n]\n},{}],69:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"American\",\n \"American Chinchilla\",\n \"American Fuzzy Lop\",\n \"American Sable\",\n \"Argente Brun\",\n \"Belgian Hare\",\n \"Beveren\",\n \"Blanc de Hotot\",\n \"Britannia Petite\",\n \"Californian\",\n \"Champagne D’Argent\",\n \"Checkered Giant\",\n \"Cinnamon\",\n \"Crème D’Argent\",\n \"Dutch\",\n \"Dwarf Hotot\",\n \"English Angora\",\n \"English Lop\",\n \"English Spot\",\n \"Flemish Giant\",\n \"Florida White\",\n \"French Angora\",\n \"French Lop\",\n \"Giant Angora\",\n \"Giant Chinchilla\",\n \"Harlequin\",\n \"Havana\",\n \"Himalayan\",\n \"Holland Lop\",\n \"Jersey Wooly\",\n \"Lilac\",\n \"Lionhead\",\n \"Mini Lop\",\n \"Mini Rex\",\n \"Mini Satin\",\n \"Netherland Dwarf\",\n \"New Zealand\",\n \"Palomino\",\n \"Polish\",\n \"Rex\",\n \"Rhinelander\",\n \"Satin\",\n \"Satin Angora\",\n \"Silver\",\n \"Silver Fox\",\n \"Silver Marten\",\n \"Standard Chinchilla\",\n \"Tan\",\n \"Thrianta\"\n]\n},{}],70:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Viper Adder\",\n \"Common adder\",\n \"Death Adder\",\n \"Desert death adder\",\n \"Horned adder\",\n \"Long-nosed adder\",\n \"Many-horned adder\",\n \"Mountain adder\",\n \"Mud adder\",\n \"Namaqua dwarf adder\",\n \"Nightingale adder\",\n \"Peringuey's adder\",\n \"Puff adder\",\n \"African puff adder\",\n \"Rhombic night adder\",\n \"Sand adder\",\n \"Dwarf sand adder\",\n \"Namib dwarf sand adder\",\n \"Water adder\",\n \"Aesculapian snake\",\n \"Anaconda\",\n \"Bolivian anaconda\",\n \"De Schauensee's anaconda\",\n \"Green anaconda\",\n \"Yellow anaconda\",\n \"Arafura file snake\",\n \"Asp\",\n \"European asp\",\n \"Egyptian asp\",\n \"African beaked snake\",\n \"Ball Python\",\n \"Bird snake\",\n \"Black-headed snake\",\n \"Mexican black kingsnake\",\n \"Black rat snake\",\n \"Black snake\",\n \"Red-bellied black snake\",\n \"Blind snake\",\n \"Brahminy blind snake\",\n \"Texas blind snake\",\n \"Western blind snake\",\n \"Boa\",\n \"Abaco Island boa\",\n \"Amazon tree boa\",\n \"Boa constrictor\",\n \"Cuban boa\",\n \"Dumeril's boa\",\n \"Dwarf boa\",\n \"Emerald tree boa\",\n \"Hogg Island boa\",\n \"Jamaican boa\",\n \"Madagascar ground boa\",\n \"Madagascar tree boa\",\n \"Puerto Rican boa\",\n \"Rainbow boa\",\n \"Red-tailed boa\",\n \"Rosy boa\",\n \"Rubber boa\",\n \"Sand boa\",\n \"Tree boa\",\n \"Boiga\",\n \"Boomslang\",\n \"Brown snake\",\n \"Eastern brown snake\",\n \"Bull snake\",\n \"Bushmaster\",\n \"Dwarf beaked snake\",\n \"Rufous beaked snake\",\n \"Canebrake\",\n \"Cantil\",\n \"Cascabel\",\n \"Cat-eyed snake\",\n \"Banded cat-eyed snake\",\n \"Green cat-eyed snake\",\n \"Cat snake\",\n \"Andaman cat snake\",\n \"Beddome's cat snake\",\n \"Dog-toothed cat snake\",\n \"Forsten's cat snake\",\n \"Gold-ringed cat snake\",\n \"Gray cat snake\",\n \"Many-spotted cat snake\",\n \"Tawny cat snake\",\n \"Chicken snake\",\n \"Coachwhip snake\",\n \"Cobra\",\n \"Andaman cobra\",\n \"Arabian cobra\",\n \"Asian cobra\",\n \"Banded water cobra\",\n \"Black-necked cobra\",\n \"Black-necked spitting cobra\",\n \"Black tree cobra\",\n \"Burrowing cobra\",\n \"Cape cobra\",\n \"Caspian cobra\",\n \"Congo water cobra\",\n \"Common cobra\",\n \"Eastern water cobra\",\n \"Egyptian cobra\",\n \"Equatorial spitting cobra\",\n \"False cobra\",\n \"False water cobra\",\n \"Forest cobra\",\n \"Gold tree cobra\",\n \"Indian cobra\",\n \"Indochinese spitting cobra\",\n \"Javan spitting cobra\",\n \"King cobra\",\n \"Mandalay cobra\",\n \"Mozambique spitting cobra\",\n \"North Philippine cobra\",\n \"Nubian spitting cobra\",\n \"Philippine cobra\",\n \"Red spitting cobra\",\n \"Rinkhals cobra\",\n \"Shield-nosed cobra\",\n \"Sinai desert cobra\",\n \"Southern Indonesian spitting cobra\",\n \"Southern Philippine cobra\",\n \"Southwestern black spitting cobra\",\n \"Snouted cobra\",\n \"Spectacled cobra\",\n \"Spitting cobra\",\n \"Storm water cobra\",\n \"Thai cobra\",\n \"Taiwan cobra\",\n \"Zebra spitting cobra\",\n \"Collett's snake\",\n \"Congo snake\",\n \"Copperhead\",\n \"American copperhead\",\n \"Australian copperhead\",\n \"Coral snake\",\n \"Arizona coral snake\",\n \"Beddome's coral snake\",\n \"Brazilian coral snake\",\n \"Cape coral snake\",\n \"Harlequin coral snake\",\n \"High Woods coral snake\",\n \"Malayan long-glanded coral snake\",\n \"Texas Coral Snake\",\n \"Western coral snake\",\n \"Corn snake\",\n \"South eastern corn snake\",\n \"Cottonmouth\",\n \"Crowned snake\",\n \"Cuban wood snake\",\n \"Eastern hognose snake\",\n \"Egg-eater\",\n \"Eastern coral snake\",\n \"Fer-de-lance\",\n \"Fierce snake\",\n \"Fishing snake\",\n \"Flying snake\",\n \"Golden tree snake\",\n \"Indian flying snake\",\n \"Moluccan flying snake\",\n \"Ornate flying snake\",\n \"Paradise flying snake\",\n \"Twin-Barred tree snake\",\n \"Banded Flying Snake\",\n \"Fox snake, three species of Pantherophis\",\n \"Forest flame snake\",\n \"Garter snake\",\n \"Checkered garter snake\",\n \"Common garter snake\",\n \"San Francisco garter snake\",\n \"Texas garter snake\",\n \"Cape gopher snake\",\n \"Grass snake\",\n \"Green snake\",\n \"Rough green snake\",\n \"Smooth green snake\",\n \"Ground snake\",\n \"Common ground snake\",\n \"Three-lined ground snake\",\n \"Western ground snake\",\n \"Habu\",\n \"Hognose snake\",\n \"Blonde hognose snake\",\n \"Dusty hognose snake\",\n \"Eastern hognose snake\",\n \"Jan's hognose snake\",\n \"Giant Malagasy hognose snake\",\n \"Mexican hognose snake\",\n \"South American hognose snake\",\n \"Hundred pacer\",\n \"Ikaheka snake\",\n \"Indigo snake\",\n \"Jamaican Tree Snake\",\n \"Keelback\",\n \"Asian keelback\",\n \"Assam keelback\",\n \"Black-striped keelback\",\n \"Buff striped keelback\",\n \"Burmese keelback\",\n \"Checkered keelback\",\n \"Common keelback\",\n \"Hill keelback\",\n \"Himalayan keelback\",\n \"Khasi Hills keelback\",\n \"Modest keelback\",\n \"Nicobar Island keelback\",\n \"Nilgiri keelback\",\n \"Orange-collared keelback\",\n \"Red-necked keelback\",\n \"Sikkim keelback\",\n \"Speckle-bellied keelback\",\n \"White-lipped keelback\",\n \"Wynaad keelback\",\n \"Yunnan keelback\",\n \"King brown\",\n \"King cobra\",\n \"King snake\",\n \"California kingsnake\",\n \"Desert kingsnake\",\n \"Grey-banded kingsnake\",\n \"North eastern king snake\",\n \"Prairie kingsnake\",\n \"Scarlet kingsnake\",\n \"Speckled kingsnake\",\n \"Krait\",\n \"Banded krait\",\n \"Blue krait\",\n \"Black krait\",\n \"Burmese krait\",\n \"Ceylon krait\",\n \"Indian krait\",\n \"Lesser black krait\",\n \"Malayan krait\",\n \"Many-banded krait\",\n \"Northeastern hill krait\",\n \"Red-headed krait\",\n \"Sind krait\",\n \"Large shield snake\",\n \"Lancehead\",\n \"Common lancehead\",\n \"Lora\",\n \"Grey Lora\",\n \"Lyre snake\",\n \"Baja California lyresnake\",\n \"Central American lyre snake\",\n \"Texas lyre snake\",\n \"Eastern lyre snake\",\n \"Machete savane\",\n \"Mamba\",\n \"Black mamba\",\n \"Green mamba\",\n \"Eastern green mamba\",\n \"Western green mamba\",\n \"Mamushi\",\n \"Mangrove snake\",\n \"Milk snake\",\n \"Moccasin snake\",\n \"Montpellier snake\",\n \"Mud snake\",\n \"Eastern mud snake\",\n \"Western mud snake\",\n \"Mussurana\",\n \"Night snake\",\n \"Cat-eyed night snake\",\n \"Texas night snake\",\n \"Nichell snake\",\n \"Narrowhead Garter Snake\",\n \"Nose-horned viper\",\n \"Rhinoceros viper\",\n \"Vipera ammodytes\",\n \"Parrot snake\",\n \"Mexican parrot snake\",\n \"Patchnose snake\",\n \"Perrotet's shieldtail snake\",\n \"Pine snake\",\n \"Pipe snake\",\n \"Asian pipe snake\",\n \"Dwarf pipe snake\",\n \"Red-tailed pipe snake\",\n \"Python\",\n \"African rock python\",\n \"Amethystine python\",\n \"Angolan python\",\n \"Australian scrub python\",\n \"Ball python\",\n \"Bismarck ringed python\",\n \"Black headed python\",\n \"Blood python\",\n \"Boelen python\",\n \"Borneo short-tailed python\",\n \"Bredl's python\",\n \"Brown water python\",\n \"Burmese python\",\n \"Calabar python\",\n \"Western carpet python\",\n \"Centralian carpet python\",\n \"Coastal carpet python\",\n \"Inland carpet python\",\n \"Jungle carpet python\",\n \"New Guinea carpet python\",\n \"Northwestern carpet python\",\n \"Southwestern carpet python\",\n \"Children's python\",\n \"Dauan Island water python\",\n \"Desert woma python\",\n \"Diamond python\",\n \"Flinders python\",\n \"Green tree python\",\n \"Halmahera python\",\n \"Indian python\",\n \"Indonesian water python\",\n \"Macklot's python\",\n \"Mollucan python\",\n \"Oenpelli python\",\n \"Olive python\",\n \"Papuan python\",\n \"Pygmy python\",\n \"Red blood python\",\n \"Reticulated python\",\n \"Kayaudi dwarf reticulated python\",\n \"Selayer reticulated python\",\n \"Rough-scaled python\",\n \"Royal python\",\n \"Savu python\",\n \"Spotted python\",\n \"Stimson's python\",\n \"Sumatran short-tailed python\",\n \"Tanimbar python\",\n \"Timor python\",\n \"Wetar Island python\",\n \"White-lipped python\",\n \"Brown white-lipped python\",\n \"Northern white-lipped python\",\n \"Southern white-lipped python\",\n \"Woma python\",\n \"Western woma python\",\n \"Queen snake\",\n \"Racer\",\n \"Bimini racer\",\n \"Buttermilk racer\",\n \"Eastern racer\",\n \"Eastern yellowbelly sad racer\",\n \"Mexican racer\",\n \"Southern black racer\",\n \"Tan racer\",\n \"West Indian racer\",\n \"Raddysnake\",\n \"Southwestern blackhead snake\",\n \"Rat snake\",\n \"Baird's rat snake\",\n \"Beauty rat snake\",\n \"Great Plains rat snake\",\n \"Green rat snake\",\n \"Japanese forest rat snake\",\n \"Japanese rat snake\",\n \"King rat snake\",\n \"Mandarin rat snake\",\n \"Persian rat snake\",\n \"Red-backed rat snake\",\n \"Twin-spotted rat snake\",\n \"Yellow-striped rat snake\",\n \"Manchurian Black Water Snake\",\n \"Rattlesnake\",\n \"Arizona black rattlesnake\",\n \"Aruba rattlesnake\",\n \"Chihuahuan ridge-nosed rattlesnake\",\n \"Coronado Island rattlesnake\",\n \"Durango rock rattlesnake\",\n \"Dusky pigmy rattlesnake\",\n \"Eastern diamondback rattlesnake\",\n \"Grand Canyon rattlesnake\",\n \"Great Basin rattlesnake\",\n \"Hopi rattlesnake\",\n \"Lance-headed rattlesnake\",\n \"Long-tailed rattlesnake\",\n \"Massasauga rattlesnake\",\n \"Mexican green rattlesnake\",\n \"Mexican west coast rattlesnake\",\n \"Midget faded rattlesnake\",\n \"Mojave rattlesnake\",\n \"Northern black-tailed rattlesnake\",\n \"Oaxacan small-headed rattlesnake\",\n \"Rattler\",\n \"Red diamond rattlesnake\",\n \"Southern Pacific rattlesnake\",\n \"Southwestern speckled rattlesnake\",\n \"Tancitaran dusky rattlesnake\",\n \"Tiger rattlesnake\",\n \"Timber rattlesnake\",\n \"Tropical rattlesnake\",\n \"Twin-spotted rattlesnake\",\n \"Uracoan rattlesnake\",\n \"Western diamondback rattlesnake\",\n \"Ribbon snake\",\n \"Rinkhals\",\n \"River jack\",\n \"Sea snake\",\n \"Annulated sea snake\",\n \"Beaked sea snake\",\n \"Dubois's sea snake\",\n \"Hardwicke's sea snake\",\n \"Hook Nosed Sea Snake\",\n \"Olive sea snake\",\n \"Pelagic sea snake\",\n \"Stoke's sea snake\",\n \"Yellow-banded sea snake\",\n \"Yellow-bellied sea snake\",\n \"Yellow-lipped sea snake\",\n \"Shield-tailed snake\",\n \"Sidewinder\",\n \"Colorado desert sidewinder\",\n \"Mojave desert sidewinder\",\n \"Sonoran sidewinder\",\n \"Small-eyed snake\",\n \"Smooth snake\",\n \"Brazilian smooth snake\",\n \"European smooth snake\",\n \"Stiletto snake\",\n \"Striped snake\",\n \"Japanese striped snake\",\n \"Sunbeam snake\",\n \"Taipan\",\n \"Central ranges taipan\",\n \"Coastal taipan\",\n \"Inland taipan\",\n \"Paupan taipan\",\n \"Tentacled snake\",\n \"Tic polonga\",\n \"Tiger snake\",\n \"Chappell Island tiger snake\",\n \"Common tiger snake\",\n \"Down's tiger snake\",\n \"Eastern tiger snake\",\n \"King Island tiger snake\",\n \"Krefft's tiger snake\",\n \"Peninsula tiger snake\",\n \"Tasmanian tiger snake\",\n \"Western tiger snake\",\n \"Tigre snake\",\n \"Tree snake\",\n \"Blanding's tree snake\",\n \"Blunt-headed tree snake\",\n \"Brown tree snake\",\n \"Long-nosed tree snake\",\n \"Many-banded tree snake\",\n \"Northern tree snake\",\n \"Trinket snake\",\n \"Black-banded trinket snake\",\n \"Twig snake\",\n \"African twig snake\",\n \"Twin Headed King Snake\",\n \"Titanboa\",\n \"Urutu\",\n \"Vine snake\",\n \"Asian Vine Snake, Whip Snake\",\n \"American Vine Snake\",\n \"Mexican vine snake\",\n \"Viper\",\n \"Asp viper\",\n \"Bamboo viper\",\n \"Bluntnose viper\",\n \"Brazilian mud Viper\",\n \"Burrowing viper\",\n \"Bush viper\",\n \"Great Lakes bush viper\",\n \"Hairy bush viper\",\n \"Nitsche's bush viper\",\n \"Rough-scaled bush viper\",\n \"Spiny bush viper\",\n \"Carpet viper\",\n \"Crossed viper\",\n \"Cyclades blunt-nosed viper\",\n \"Eyelash viper\",\n \"False horned viper\",\n \"Fea's viper\",\n \"Fifty pacer\",\n \"Gaboon viper\",\n \"Hognosed viper\",\n \"Horned desert viper\",\n \"Horned viper\",\n \"Jumping viper\",\n \"Kaznakov's viper\",\n \"Leaf-nosed viper\",\n \"Leaf viper\",\n \"Levant viper\",\n \"Long-nosed viper\",\n \"McMahon's viper\",\n \"Mole viper\",\n \"Nose-horned viper\",\n \"Rhinoceros viper\",\n \"Vipera ammodytes\",\n \"Palestine viper\",\n \"Pallas' viper\",\n \"Palm viper\",\n \"Amazonian palm viper\",\n \"Black-speckled palm-pitviper\",\n \"Eyelash palm-pitviper\",\n \"Green palm viper\",\n \"Mexican palm-pitviper\",\n \"Guatemalan palm viper\",\n \"Honduran palm viper\",\n \"Siamese palm viper\",\n \"Side-striped palm-pitviper\",\n \"Yellow-lined palm viper\",\n \"Pit viper\",\n \"Banded pitviper\",\n \"Bamboo pitviper\",\n \"Barbour's pit viper\",\n \"Black-tailed horned pit viper\",\n \"Bornean pitviper\",\n \"Brongersma's pitviper\",\n \"Brown spotted pitviper[4]\",\n \"Cantor's pitviper\",\n \"Elegant pitviper\",\n \"Eyelash pit viper\",\n \"Fan-Si-Pan horned pitviper\",\n \"Flat-nosed pitviper\",\n \"Godman's pit viper\",\n \"Green tree pit viper\",\n \"Habu pit viper\",\n \"Hagen's pitviper\",\n \"Horseshoe pitviper\",\n \"Jerdon's pitviper\",\n \"Kanburian pit viper\",\n \"Kaulback's lance-headed pitviper\",\n \"Kham Plateau pitviper\",\n \"Large-eyed pitviper\",\n \"Malabar rock pitviper\",\n \"Malayan pit viper\",\n \"Mangrove pit viper\",\n \"Mangshan pitviper\",\n \"Motuo bamboo pitviper\",\n \"Nicobar bamboo pitviper\",\n \"Philippine pitviper\",\n \"Pointed-scaled pit viper[5]\",\n \"Red-tailed bamboo pitviper\",\n \"Schultze's pitviper\",\n \"Stejneger's bamboo pitviper\",\n \"Sri Lankan pit viper\",\n \"Temple pit viper\",\n \"Tibetan bamboo pitviper\",\n \"Tiger pit viper\",\n \"Undulated pit viper\",\n \"Wagler's pit viper\",\n \"Wirot's pit viper\",\n \"Portuguese viper\",\n \"Saw-scaled viper\",\n \"Schlegel's viper\",\n \"Sedge viper\",\n \"Sharp-nosed viper\",\n \"Snorkel viper\",\n \"Temple viper\",\n \"Tree viper\",\n \"Chinese tree viper\",\n \"Guatemalan tree viper\",\n \"Hutton's tree viper\",\n \"Indian tree viper\",\n \"Large-scaled tree viper\",\n \"Malcolm's tree viper\",\n \"Nitsche's tree viper\",\n \"Pope's tree viper\",\n \"Rough-scaled tree viper\",\n \"Rungwe tree viper\",\n \"Sumatran tree viper\",\n \"White-lipped tree viper\",\n \"Ursini's viper\",\n \"Western hog-nosed viper\",\n \"Wart snake\",\n \"Water moccasin\",\n \"Water snake\",\n \"Bocourt's water snake\",\n \"Northern water snake\",\n \"Whip snake\",\n \"Long-nosed whip snake\",\n \"Wolf snake\",\n \"African wolf snake\",\n \"Barred wolf snake\",\n \"Worm snake\",\n \"Common worm snake\",\n \"Longnosed worm snake\",\n \"Wutu\",\n \"Yarara\",\n \"Zebra snake\"\n]\n},{}],71:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"dog\",\n \"cat\", \n \"snake\", \n \"bear\", \n \"lion\", \n \"cetacean\", \n \"insect\", \n \"crocodilia\", \n \"cow\", \n \"bird\", \n \"fish\", \n \"rabbit\", \n \"horse\"\n]\n},{}],72:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{Name.name}\",\n \"#{Company.name}\"\n];\n\n},{}],73:[function(require,module,exports){\nvar app = {};\nmodule['exports'] = app;\napp.name = require(\"./name\");\napp.version = require(\"./version\");\napp.author = require(\"./author\");\n\n},{\"./author\":72,\"./name\":74,\"./version\":75}],74:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Redhold\",\n \"Treeflex\",\n \"Trippledex\",\n \"Kanlam\",\n \"Bigtax\",\n \"Daltfresh\",\n \"Toughjoyfax\",\n \"Mat Lam Tam\",\n \"Otcom\",\n \"Tres-Zap\",\n \"Y-Solowarm\",\n \"Tresom\",\n \"Voltsillam\",\n \"Biodex\",\n \"Greenlam\",\n \"Viva\",\n \"Matsoft\",\n \"Temp\",\n \"Zoolab\",\n \"Subin\",\n \"Rank\",\n \"Job\",\n \"Stringtough\",\n \"Tin\",\n \"It\",\n \"Home Ing\",\n \"Zamit\",\n \"Sonsing\",\n \"Konklab\",\n \"Alpha\",\n \"Latlux\",\n \"Voyatouch\",\n \"Alphazap\",\n \"Holdlamis\",\n \"Zaam-Dox\",\n \"Sub-Ex\",\n \"Quo Lux\",\n \"Bamity\",\n \"Ventosanzap\",\n \"Lotstring\",\n \"Hatity\",\n \"Tempsoft\",\n \"Overhold\",\n \"Fixflex\",\n \"Konklux\",\n \"Zontrax\",\n \"Tampflex\",\n \"Span\",\n \"Namfix\",\n \"Transcof\",\n \"Stim\",\n \"Fix San\",\n \"Sonair\",\n \"Stronghold\",\n \"Fintone\",\n \"Y-find\",\n \"Opela\",\n \"Lotlux\",\n \"Ronstring\",\n \"Zathin\",\n \"Duobam\",\n \"Keylex\"\n];\n\n},{}],75:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"0.#.#\",\n \"0.##\",\n \"#.##\",\n \"#.#\",\n \"#.#.#\"\n];\n\n},{}],76:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"2011-10-12\",\n \"2012-11-12\",\n \"2015-11-11\",\n \"2013-9-12\"\n];\n\n},{}],77:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"1234-2121-1221-1211\",\n \"1212-1221-1121-1234\",\n \"1211-1221-1234-2201\",\n \"1228-1221-1221-1431\"\n];\n\n},{}],78:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"visa\",\n \"mastercard\",\n \"americanexpress\",\n \"discover\"\n];\n\n},{}],79:[function(require,module,exports){\nvar business = {};\nmodule['exports'] = business;\nbusiness.credit_card_numbers = require(\"./credit_card_numbers\");\nbusiness.credit_card_expiry_dates = require(\"./credit_card_expiry_dates\");\nbusiness.credit_card_types = require(\"./credit_card_types\");\n\n},{\"./credit_card_expiry_dates\":76,\"./credit_card_numbers\":77,\"./credit_card_types\":78}],80:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"###-###-####\",\n \"(###) ###-####\",\n \"1-###-###-####\",\n \"###.###.####\"\n];\n\n},{}],81:[function(require,module,exports){\nvar cell_phone = {};\nmodule['exports'] = cell_phone;\ncell_phone.formats = require(\"./formats\");\n\n},{\"./formats\":80}],82:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"red\",\n \"green\",\n \"blue\",\n \"yellow\",\n \"purple\",\n \"mint green\",\n \"teal\",\n \"white\",\n \"black\",\n \"orange\",\n \"pink\",\n \"grey\",\n \"maroon\",\n \"violet\",\n \"turquoise\",\n \"tan\",\n \"sky blue\",\n \"salmon\",\n \"plum\",\n \"orchid\",\n \"olive\",\n \"magenta\",\n \"lime\",\n \"ivory\",\n \"indigo\",\n \"gold\",\n \"fuchsia\",\n \"cyan\",\n \"azure\",\n \"lavender\",\n \"silver\"\n];\n\n},{}],83:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Books\",\n \"Movies\",\n \"Music\",\n \"Games\",\n \"Electronics\",\n \"Computers\",\n \"Home\",\n \"Garden\",\n \"Tools\",\n \"Grocery\",\n \"Health\",\n \"Beauty\",\n \"Toys\",\n \"Kids\",\n \"Baby\",\n \"Clothing\",\n \"Shoes\",\n \"Jewelery\",\n \"Sports\",\n \"Outdoors\",\n \"Automotive\",\n \"Industrial\"\n];\n\n},{}],84:[function(require,module,exports){\nvar commerce = {};\nmodule['exports'] = commerce;\ncommerce.color = require(\"./color\");\ncommerce.department = require(\"./department\");\ncommerce.product_name = require(\"./product_name\");\ncommerce.product_description = require(\"./product_description\");\n\n},{\"./color\":82,\"./department\":83,\"./product_description\":85,\"./product_name\":86}],85:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Ergonomic executive chair upholstered in bonded black leather and PVC padded seat and back for all-day comfort and support\",\n \"The automobile layout consists of a front-engine design, with transaxle-type transmissions mounted at the rear of the engine and four wheel drive\",\n \"New ABC 13 9370, 13.3, 5th Gen CoreA5-8250U, 8GB RAM, 256GB SSD, power UHD Graphics, OS 10 Home, OS Office A & J 2016\",\n \"The slim & simple Maple Gaming Keyboard from Dev Byte comes with a sleek body and 7- Color RGB LED Back-lighting for smart functionality\",\n \"The Apollotech B340 is an affordable wireless mouse with reliable connectivity, 12 months battery life and modern design\",\n \"The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J\",\n \"The Football Is Good For Training And Recreational Purposes\",\n \"Carbonite web goalkeeper gloves are ergonomically designed to give easy fit\",\n \"Boston's most advanced compression wear technology increases muscle oxygenation, stabilizes active muscles\",\n \"New range of formal shirts are designed keeping you in mind. With fits and styling that will make you stand apart\",\n \"The beautiful range of Apple Naturalé that has an exciting mix of natural ingredients. With the Goodness of 100% Natural Ingredients\",\n \"Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals\"\n];\n},{}],86:[function(require,module,exports){\nmodule[\"exports\"] = {\n \"adjective\": [\n \"Small\",\n \"Ergonomic\",\n \"Rustic\",\n \"Intelligent\",\n \"Gorgeous\",\n \"Incredible\",\n \"Fantastic\",\n \"Practical\",\n \"Sleek\",\n \"Awesome\",\n \"Generic\",\n \"Handcrafted\",\n \"Handmade\",\n \"Licensed\",\n \"Refined\",\n \"Unbranded\",\n \"Tasty\"\n ],\n \"material\": [\n \"Steel\",\n \"Wooden\",\n \"Concrete\",\n \"Plastic\",\n \"Cotton\",\n \"Granite\",\n \"Rubber\",\n \"Metal\",\n \"Soft\",\n \"Fresh\",\n \"Frozen\"\n ],\n \"product\": [\n \"Chair\",\n \"Car\",\n \"Computer\",\n \"Keyboard\",\n \"Mouse\",\n \"Bike\",\n \"Ball\",\n \"Gloves\",\n \"Pants\",\n \"Shirt\",\n \"Table\",\n \"Shoes\",\n \"Hat\",\n \"Towels\",\n \"Soap\",\n \"Tuna\",\n \"Chicken\",\n \"Fish\",\n \"Cheese\",\n \"Bacon\",\n \"Pizza\",\n \"Salad\",\n \"Sausages\",\n \"Chips\"\n ]\n};\n\n},{}],87:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Adaptive\",\n \"Advanced\",\n \"Ameliorated\",\n \"Assimilated\",\n \"Automated\",\n \"Balanced\",\n \"Business-focused\",\n \"Centralized\",\n \"Cloned\",\n \"Compatible\",\n \"Configurable\",\n \"Cross-group\",\n \"Cross-platform\",\n \"Customer-focused\",\n \"Customizable\",\n \"Decentralized\",\n \"De-engineered\",\n \"Devolved\",\n \"Digitized\",\n \"Distributed\",\n \"Diverse\",\n \"Down-sized\",\n \"Enhanced\",\n \"Enterprise-wide\",\n \"Ergonomic\",\n \"Exclusive\",\n \"Expanded\",\n \"Extended\",\n \"Face to face\",\n \"Focused\",\n \"Front-line\",\n \"Fully-configurable\",\n \"Function-based\",\n \"Fundamental\",\n \"Future-proofed\",\n \"Grass-roots\",\n \"Horizontal\",\n \"Implemented\",\n \"Innovative\",\n \"Integrated\",\n \"Intuitive\",\n \"Inverse\",\n \"Managed\",\n \"Mandatory\",\n \"Monitored\",\n \"Multi-channelled\",\n \"Multi-lateral\",\n \"Multi-layered\",\n \"Multi-tiered\",\n \"Networked\",\n \"Object-based\",\n \"Open-architected\",\n \"Open-source\",\n \"Operative\",\n \"Optimized\",\n \"Optional\",\n \"Organic\",\n \"Organized\",\n \"Persevering\",\n \"Persistent\",\n \"Phased\",\n \"Polarised\",\n \"Pre-emptive\",\n \"Proactive\",\n \"Profit-focused\",\n \"Profound\",\n \"Programmable\",\n \"Progressive\",\n \"Public-key\",\n \"Quality-focused\",\n \"Reactive\",\n \"Realigned\",\n \"Re-contextualized\",\n \"Re-engineered\",\n \"Reduced\",\n \"Reverse-engineered\",\n \"Right-sized\",\n \"Robust\",\n \"Seamless\",\n \"Secured\",\n \"Self-enabling\",\n \"Sharable\",\n \"Stand-alone\",\n \"Streamlined\",\n \"Switchable\",\n \"Synchronised\",\n \"Synergistic\",\n \"Synergized\",\n \"Team-oriented\",\n \"Total\",\n \"Triple-buffered\",\n \"Universal\",\n \"Up-sized\",\n \"Upgradable\",\n \"User-centric\",\n \"User-friendly\",\n \"Versatile\",\n \"Virtual\",\n \"Visionary\",\n \"Vision-oriented\"\n];\n\n},{}],88:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"clicks-and-mortar\",\n \"value-added\",\n \"vertical\",\n \"proactive\",\n \"robust\",\n \"revolutionary\",\n \"scalable\",\n \"leading-edge\",\n \"innovative\",\n \"intuitive\",\n \"strategic\",\n \"e-business\",\n \"mission-critical\",\n \"sticky\",\n \"one-to-one\",\n \"24/7\",\n \"end-to-end\",\n \"global\",\n \"B2B\",\n \"B2C\",\n \"granular\",\n \"frictionless\",\n \"virtual\",\n \"viral\",\n \"dynamic\",\n \"24/365\",\n \"best-of-breed\",\n \"killer\",\n \"magnetic\",\n \"bleeding-edge\",\n \"web-enabled\",\n \"interactive\",\n \"dot-com\",\n \"sexy\",\n \"back-end\",\n \"real-time\",\n \"efficient\",\n \"front-end\",\n \"distributed\",\n \"seamless\",\n \"extensible\",\n \"turn-key\",\n \"world-class\",\n \"open-source\",\n \"cross-platform\",\n \"cross-media\",\n \"synergistic\",\n \"bricks-and-clicks\",\n \"out-of-the-box\",\n \"enterprise\",\n \"integrated\",\n \"impactful\",\n \"wireless\",\n \"transparent\",\n \"next-generation\",\n \"cutting-edge\",\n \"user-centric\",\n \"visionary\",\n \"customized\",\n \"ubiquitous\",\n \"plug-and-play\",\n \"collaborative\",\n \"compelling\",\n \"holistic\",\n \"rich\"\n];\n\n},{}],89:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"synergies\",\n \"web-readiness\",\n \"paradigms\",\n \"markets\",\n \"partnerships\",\n \"infrastructures\",\n \"platforms\",\n \"initiatives\",\n \"channels\",\n \"eyeballs\",\n \"communities\",\n \"ROI\",\n \"solutions\",\n \"e-tailers\",\n \"e-services\",\n \"action-items\",\n \"portals\",\n \"niches\",\n \"technologies\",\n \"content\",\n \"vortals\",\n \"supply-chains\",\n \"convergence\",\n \"relationships\",\n \"architectures\",\n \"interfaces\",\n \"e-markets\",\n \"e-commerce\",\n \"systems\",\n \"bandwidth\",\n \"infomediaries\",\n \"models\",\n \"mindshare\",\n \"deliverables\",\n \"users\",\n \"schemas\",\n \"networks\",\n \"applications\",\n \"metrics\",\n \"e-business\",\n \"functionalities\",\n \"experiences\",\n \"web services\",\n \"methodologies\",\n \"blockchains\"\n];\n\n},{}],90:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"implement\",\n \"utilize\",\n \"integrate\",\n \"streamline\",\n \"optimize\",\n \"evolve\",\n \"transform\",\n \"embrace\",\n \"enable\",\n \"orchestrate\",\n \"leverage\",\n \"reinvent\",\n \"aggregate\",\n \"architect\",\n \"enhance\",\n \"incentivize\",\n \"morph\",\n \"empower\",\n \"envisioneer\",\n \"monetize\",\n \"harness\",\n \"facilitate\",\n \"seize\",\n \"disintermediate\",\n \"synergize\",\n \"strategize\",\n \"deploy\",\n \"brand\",\n \"grow\",\n \"target\",\n \"syndicate\",\n \"synthesize\",\n \"deliver\",\n \"mesh\",\n \"incubate\",\n \"engage\",\n \"maximize\",\n \"benchmark\",\n \"expedite\",\n \"reintermediate\",\n \"whiteboard\",\n \"visualize\",\n \"repurpose\",\n \"innovate\",\n \"scale\",\n \"unleash\",\n \"drive\",\n \"extend\",\n \"engineer\",\n \"revolutionize\",\n \"generate\",\n \"exploit\",\n \"transition\",\n \"e-enable\",\n \"iterate\",\n \"cultivate\",\n \"matrix\",\n \"productize\",\n \"redefine\",\n \"recontextualize\"\n];\n\n},{}],91:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"24 hour\",\n \"24/7\",\n \"3rd generation\",\n \"4th generation\",\n \"5th generation\",\n \"6th generation\",\n \"actuating\",\n \"analyzing\",\n \"asymmetric\",\n \"asynchronous\",\n \"attitude-oriented\",\n \"background\",\n \"bandwidth-monitored\",\n \"bi-directional\",\n \"bifurcated\",\n \"bottom-line\",\n \"clear-thinking\",\n \"client-driven\",\n \"client-server\",\n \"coherent\",\n \"cohesive\",\n \"composite\",\n \"context-sensitive\",\n \"contextually-based\",\n \"content-based\",\n \"dedicated\",\n \"demand-driven\",\n \"didactic\",\n \"directional\",\n \"discrete\",\n \"disintermediate\",\n \"dynamic\",\n \"eco-centric\",\n \"empowering\",\n \"encompassing\",\n \"even-keeled\",\n \"executive\",\n \"explicit\",\n \"exuding\",\n \"fault-tolerant\",\n \"foreground\",\n \"fresh-thinking\",\n \"full-range\",\n \"global\",\n \"grid-enabled\",\n \"heuristic\",\n \"high-level\",\n \"holistic\",\n \"homogeneous\",\n \"human-resource\",\n \"hybrid\",\n \"impactful\",\n \"incremental\",\n \"intangible\",\n \"interactive\",\n \"intermediate\",\n \"leading edge\",\n \"local\",\n \"logistical\",\n \"maximized\",\n \"methodical\",\n \"mission-critical\",\n \"mobile\",\n \"modular\",\n \"motivating\",\n \"multimedia\",\n \"multi-state\",\n \"multi-tasking\",\n \"national\",\n \"needs-based\",\n \"neutral\",\n \"next generation\",\n \"non-volatile\",\n \"object-oriented\",\n \"optimal\",\n \"optimizing\",\n \"radical\",\n \"real-time\",\n \"reciprocal\",\n \"regional\",\n \"responsive\",\n \"scalable\",\n \"secondary\",\n \"solution-oriented\",\n \"stable\",\n \"static\",\n \"systematic\",\n \"systemic\",\n \"system-worthy\",\n \"tangible\",\n \"tertiary\",\n \"transitional\",\n \"uniform\",\n \"upward-trending\",\n \"user-facing\",\n \"value-added\",\n \"web-enabled\",\n \"well-modulated\",\n \"zero administration\",\n \"zero defect\",\n \"zero tolerance\"\n];\n\n},{}],92:[function(require,module,exports){\nvar company = {};\nmodule['exports'] = company;\ncompany.suffix = require(\"./suffix\");\ncompany.adjective = require(\"./adjective\");\ncompany.descriptor = require(\"./descriptor\");\ncompany.noun = require(\"./noun\");\ncompany.bs_verb = require(\"./bs_verb\");\ncompany.bs_adjective = require(\"./bs_adjective\");\ncompany.bs_noun = require(\"./bs_noun\");\ncompany.name = require(\"./name\");\n\n},{\"./adjective\":87,\"./bs_adjective\":88,\"./bs_noun\":89,\"./bs_verb\":90,\"./descriptor\":91,\"./name\":93,\"./noun\":94,\"./suffix\":95}],93:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{Name.last_name} #{suffix}\",\n \"#{Name.last_name}-#{Name.last_name}\",\n \"#{Name.last_name}, #{Name.last_name} and #{Name.last_name}\"\n];\n\n},{}],94:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"ability\",\n \"access\",\n \"adapter\",\n \"algorithm\",\n \"alliance\",\n \"analyzer\",\n \"application\",\n \"approach\",\n \"architecture\",\n \"archive\",\n \"artificial intelligence\",\n \"array\",\n \"attitude\",\n \"benchmark\",\n \"budgetary management\",\n \"capability\",\n \"capacity\",\n \"challenge\",\n \"circuit\",\n \"collaboration\",\n \"complexity\",\n \"concept\",\n \"conglomeration\",\n \"contingency\",\n \"core\",\n \"customer loyalty\",\n \"database\",\n \"data-warehouse\",\n \"definition\",\n \"emulation\",\n \"encoding\",\n \"encryption\",\n \"extranet\",\n \"firmware\",\n \"flexibility\",\n \"focus group\",\n \"forecast\",\n \"frame\",\n \"framework\",\n \"function\",\n \"functionalities\",\n \"Graphic Interface\",\n \"groupware\",\n \"Graphical User Interface\",\n \"hardware\",\n \"help-desk\",\n \"hierarchy\",\n \"hub\",\n \"implementation\",\n \"info-mediaries\",\n \"infrastructure\",\n \"initiative\",\n \"installation\",\n \"instruction set\",\n \"interface\",\n \"internet solution\",\n \"intranet\",\n \"knowledge user\",\n \"knowledge base\",\n \"local area network\",\n \"leverage\",\n \"matrices\",\n \"matrix\",\n \"methodology\",\n \"middleware\",\n \"migration\",\n \"model\",\n \"moderator\",\n \"monitoring\",\n \"moratorium\",\n \"neural-net\",\n \"open architecture\",\n \"open system\",\n \"orchestration\",\n \"paradigm\",\n \"parallelism\",\n \"policy\",\n \"portal\",\n \"pricing structure\",\n \"process improvement\",\n \"product\",\n \"productivity\",\n \"project\",\n \"projection\",\n \"protocol\",\n \"secured line\",\n \"service-desk\",\n \"software\",\n \"solution\",\n \"standardization\",\n \"strategy\",\n \"structure\",\n \"success\",\n \"superstructure\",\n \"support\",\n \"synergy\",\n \"system engine\",\n \"task-force\",\n \"throughput\",\n \"time-frame\",\n \"toolset\",\n \"utilisation\",\n \"website\",\n \"workforce\"\n];\n\n},{}],95:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Inc\",\n \"and Sons\",\n \"LLC\",\n \"Group\"\n];\n\n},{}],96:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"utf8_unicode_ci\",\n \"utf8_general_ci\",\n \"utf8_bin\",\n \"ascii_bin\",\n \"ascii_general_ci\",\n \"cp1250_bin\",\n \"cp1250_general_ci\"\n];\n\n},{}],97:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"id\",\n \"title\",\n \"name\",\n \"email\",\n \"phone\",\n \"token\",\n \"group\",\n \"category\",\n \"password\",\n \"comment\",\n \"avatar\",\n \"status\",\n \"createdAt\",\n \"updatedAt\"\n];\n\n},{}],98:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"InnoDB\",\n \"MyISAM\",\n \"MEMORY\",\n \"CSV\",\n \"BLACKHOLE\",\n \"ARCHIVE\"\n];\n\n},{}],99:[function(require,module,exports){\nvar database = {};\nmodule['exports'] = database;\ndatabase.collation = require(\"./collation\");\ndatabase.column = require(\"./column\");\ndatabase.engine = require(\"./engine\");\ndatabase.type = require(\"./type\");\n},{\"./collation\":96,\"./column\":97,\"./engine\":98,\"./type\":100}],100:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"int\",\n \"varchar\",\n \"text\",\n \"date\",\n \"datetime\",\n \"tinyint\",\n \"time\",\n \"timestamp\",\n \"smallint\",\n \"mediumint\",\n \"bigint\",\n \"decimal\",\n \"float\",\n \"double\",\n \"real\",\n \"bit\",\n \"boolean\",\n \"serial\",\n \"blob\",\n \"binary\",\n \"enum\",\n \"set\",\n \"geometry\",\n \"point\"\n];\n\n},{}],101:[function(require,module,exports){\nvar date = {};\nmodule[\"exports\"] = date;\ndate.month = require(\"./month\");\ndate.weekday = require(\"./weekday\");\n\n},{\"./month\":102,\"./weekday\":103}],102:[function(require,module,exports){\n// Source: http://unicode.org/cldr/trac/browser/tags/release-27/common/main/en.xml#L1799\nmodule[\"exports\"] = {\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n // Property \"wide_context\" is optional, if not set then \"wide\" will be used instead\n // It is used to specify a word in context, which may differ from a stand-alone word\n wide_context: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ],\n abbr: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ],\n // Property \"abbr_context\" is optional, if not set then \"abbr\" will be used instead\n // It is used to specify a word in context, which may differ from a stand-alone word\n abbr_context: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\"\n ]\n};\n\n},{}],103:[function(require,module,exports){\n// Source: http://unicode.org/cldr/trac/browser/tags/release-27/common/main/en.xml#L1847\nmodule[\"exports\"] = {\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n ],\n // Property \"wide_context\" is optional, if not set then \"wide\" will be used instead\n // It is used to specify a word in context, which may differ from a stand-alone word\n wide_context: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n ],\n abbr: [\n \"Sun\",\n \"Mon\",\n \"Tue\",\n \"Wed\",\n \"Thu\",\n \"Fri\",\n \"Sat\"\n ],\n // Property \"abbr_context\" is optional, if not set then \"abbr\" will be used instead\n // It is used to specify a word in context, which may differ from a stand-alone word\n abbr_context: [\n \"Sun\",\n \"Mon\",\n \"Tue\",\n \"Wed\",\n \"Thu\",\n \"Fri\",\n \"Sat\"\n ]\n};\n\n},{}],104:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Checking\",\n \"Savings\",\n \"Money Market\",\n \"Investment\",\n \"Home Loan\",\n \"Credit Card\",\n \"Auto Loan\",\n \"Personal Loan\"\n];\n\n},{}],105:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"34##-######-####L\",\n \"37##-######-####L\"\n];\n\n},{}],106:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"30[0-5]#-######-###L\",\n \"36##-######-###L\",\n \"54##-####-####-###L\"\n];\n\n},{}],107:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"6011-####-####-###L\",\n \"65##-####-####-###L\",\n \"64[4-9]#-####-####-###L\",\n \"6011-62##-####-####-###L\",\n \"65##-62##-####-####-###L\",\n \"64[4-9]#-62##-####-####-###L\"\n];\n\n},{}],108:[function(require,module,exports){\nvar credit_card = {};\nmodule['exports'] = credit_card;\ncredit_card.visa = require(\"./visa\");\ncredit_card.mastercard = require(\"./mastercard\");\ncredit_card.discover = require(\"./discover\");\ncredit_card.american_express = require(\"./american_express\");\ncredit_card.diners_club = require(\"./diners_club\");\ncredit_card.jcb = require(\"./jcb\");\ncredit_card.switch = require(\"./switch\");\ncredit_card.solo = require(\"./solo\");\ncredit_card.maestro = require(\"./maestro\");\ncredit_card.laser = require(\"./laser\");\ncredit_card.instapayment = require(\"./instapayment.js\")\n\n},{\"./american_express\":105,\"./diners_club\":106,\"./discover\":107,\"./instapayment.js\":109,\"./jcb\":110,\"./laser\":111,\"./maestro\":112,\"./mastercard\":113,\"./solo\":114,\"./switch\":115,\"./visa\":116}],109:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"63[7-9]#-####-####-###L\"\n];\n\n},{}],110:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"3528-####-####-###L\",\n \"3529-####-####-###L\",\n \"35[3-8]#-####-####-###L\"\n];\n\n},{}],111:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"6304###########L\",\n \"6706###########L\",\n \"6771###########L\",\n \"6709###########L\",\n \"6304#########{5,6}L\",\n \"6706#########{5,6}L\",\n \"6771#########{5,6}L\",\n \"6709#########{5,6}L\"\n];\n\n},{}],112:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"5018-#{4}-#{4}-#{3}L\",\n \"5020-#{4}-#{4}-#{3}L\",\n \"5038-#{4}-#{4}-#{3}L\",\n \"5893-#{4}-#{4}-#{3}L\",\n \"6304-#{4}-#{4}-#{3}L\",\n \"6759-#{4}-#{4}-#{3}L\",\n \"676[1-3]-####-####-###L\",\n \"5018#{11,15}L\",\n \"5020#{11,15}L\",\n \"5038#{11,15}L\",\n \"5893#{11,15}L\",\n \"6304#{11,15}L\",\n \"6759#{11,15}L\",\n \"676[1-3]#{11,15}L\",\n];\n\n// 5018 xxxx xxxx xxxx xxL\n\n},{}],113:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"5[1-5]##-####-####-###L\",\n \"6771-89##-####-###L\"\n];\n\n},{}],114:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"6767-####-####-###L\",\n \"6767-####-####-####-#L\",\n \"6767-####-####-####-##L\"\n];\n\n},{}],115:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"6759-####-####-###L\",\n \"6759-####-####-####-#L\",\n \"6759-####-####-####-##L\"\n];\n\n},{}],116:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"4###########L\",\n \"4###-####-####-###L\"\n];\n\n},{}],117:[function(require,module,exports){\nmodule[\"exports\"] = {\n \"UAE Dirham\": {\n \"code\": \"AED\",\n \"symbol\": \"\"\n },\n \"Afghani\": {\n \"code\": \"AFN\",\n \"symbol\": \"؋\"\n },\n \"Lek\": {\n \"code\": \"ALL\",\n \"symbol\": \"Lek\"\n },\n \"Armenian Dram\": {\n \"code\": \"AMD\",\n \"symbol\": \"\"\n },\n \"Netherlands Antillian Guilder\": {\n \"code\": \"ANG\",\n \"symbol\": \"ƒ\"\n },\n \"Kwanza\": {\n \"code\": \"AOA\",\n \"symbol\": \"\"\n },\n \"Argentine Peso\": {\n \"code\": \"ARS\",\n \"symbol\": \"$\"\n },\n \"Australian Dollar\": {\n \"code\": \"AUD\",\n \"symbol\": \"$\"\n },\n \"Aruban Guilder\": {\n \"code\": \"AWG\",\n \"symbol\": \"ƒ\"\n },\n \"Azerbaijanian Manat\": {\n \"code\": \"AZN\",\n \"symbol\": \"ман\"\n },\n \"Convertible Marks\": {\n \"code\": \"BAM\",\n \"symbol\": \"KM\"\n },\n \"Barbados Dollar\": {\n \"code\": \"BBD\",\n \"symbol\": \"$\"\n },\n \"Taka\": {\n \"code\": \"BDT\",\n \"symbol\": \"\"\n },\n \"Bulgarian Lev\": {\n \"code\": \"BGN\",\n \"symbol\": \"лв\"\n },\n \"Bahraini Dinar\": {\n \"code\": \"BHD\",\n \"symbol\": \"\"\n },\n \"Burundi Franc\": {\n \"code\": \"BIF\",\n \"symbol\": \"\"\n },\n \"Bermudian Dollar (customarily known as Bermuda Dollar)\": {\n \"code\": \"BMD\",\n \"symbol\": \"$\"\n },\n \"Brunei Dollar\": {\n \"code\": \"BND\",\n \"symbol\": \"$\"\n },\n \"Boliviano boliviano\": {\n \"code\": \"BOB\",\n \"symbol\": \"Bs\"\n },\n \"Brazilian Real\": {\n \"code\": \"BRL\",\n \"symbol\": \"R$\"\n },\n \"Bahamian Dollar\": {\n \"code\": \"BSD\",\n \"symbol\": \"$\"\n },\n \"Pula\": {\n \"code\": \"BWP\",\n \"symbol\": \"P\"\n },\n \"Belarussian Ruble\": {\n \"code\": \"BYR\",\n \"symbol\": \"p.\"\n },\n \"Belize Dollar\": {\n \"code\": \"BZD\",\n \"symbol\": \"BZ$\"\n },\n \"Canadian Dollar\": {\n \"code\": \"CAD\",\n \"symbol\": \"$\"\n },\n \"Congolese Franc\": {\n \"code\": \"CDF\",\n \"symbol\": \"\"\n },\n \"Swiss Franc\": {\n \"code\": \"CHF\",\n \"symbol\": \"CHF\"\n },\n \"Chilean Peso\": {\n \"code\": \"CLP\",\n \"symbol\": \"$\"\n },\n \"Yuan Renminbi\": {\n \"code\": \"CNY\",\n \"symbol\": \"¥\"\n },\n \"Colombian Peso\": {\n \"code\": \"COP\",\n \"symbol\": \"$\"\n },\n \"Costa Rican Colon\": {\n \"code\": \"CRC\",\n \"symbol\": \"₡\"\n },\n \"Cuban Peso\": {\n \"code\": \"CUP\",\n \"symbol\": \"₱\"\n },\n \"Cuban Peso Convertible\": {\n \"code\": \"CUC\",\n \"symbol\": \"$\"\n },\n \"Cape Verde Escudo\": {\n \"code\": \"CVE\",\n \"symbol\": \"\"\n },\n \"Czech Koruna\": {\n \"code\": \"CZK\",\n \"symbol\": \"Kč\"\n },\n \"Djibouti Franc\": {\n \"code\": \"DJF\",\n \"symbol\": \"\"\n },\n \"Danish Krone\": {\n \"code\": \"DKK\",\n \"symbol\": \"kr\"\n },\n \"Dominican Peso\": {\n \"code\": \"DOP\",\n \"symbol\": \"RD$\"\n },\n \"Algerian Dinar\": {\n \"code\": \"DZD\",\n \"symbol\": \"\"\n },\n \"Kroon\": {\n \"code\": \"EEK\",\n \"symbol\": \"\"\n },\n \"Egyptian Pound\": {\n \"code\": \"EGP\",\n \"symbol\": \"£\"\n },\n \"Nakfa\": {\n \"code\": \"ERN\",\n \"symbol\": \"\"\n },\n \"Ethiopian Birr\": {\n \"code\": \"ETB\",\n \"symbol\": \"\"\n },\n \"Euro\": {\n \"code\": \"EUR\",\n \"symbol\": \"€\"\n },\n \"Fiji Dollar\": {\n \"code\": \"FJD\",\n \"symbol\": \"$\"\n },\n \"Falkland Islands Pound\": {\n \"code\": \"FKP\",\n \"symbol\": \"£\"\n },\n \"Pound Sterling\": {\n \"code\": \"GBP\",\n \"symbol\": \"£\"\n },\n \"Lari\": {\n \"code\": \"GEL\",\n \"symbol\": \"\"\n },\n \"Cedi\": {\n \"code\": \"GHS\",\n \"symbol\": \"\"\n },\n \"Gibraltar Pound\": {\n \"code\": \"GIP\",\n \"symbol\": \"£\"\n },\n \"Dalasi\": {\n \"code\": \"GMD\",\n \"symbol\": \"\"\n },\n \"Guinea Franc\": {\n \"code\": \"GNF\",\n \"symbol\": \"\"\n },\n \"Quetzal\": {\n \"code\": \"GTQ\",\n \"symbol\": \"Q\"\n },\n \"Guyana Dollar\": {\n \"code\": \"GYD\",\n \"symbol\": \"$\"\n },\n \"Hong Kong Dollar\": {\n \"code\": \"HKD\",\n \"symbol\": \"$\"\n },\n \"Lempira\": {\n \"code\": \"HNL\",\n \"symbol\": \"L\"\n },\n \"Croatian Kuna\": {\n \"code\": \"HRK\",\n \"symbol\": \"kn\"\n },\n \"Gourde\": {\n \"code\": \"HTG\",\n \"symbol\": \"\"\n },\n \"Forint\": {\n \"code\": \"HUF\",\n \"symbol\": \"Ft\"\n },\n \"Rupiah\": {\n \"code\": \"IDR\",\n \"symbol\": \"Rp\"\n },\n \"New Israeli Sheqel\": {\n \"code\": \"ILS\",\n \"symbol\": \"₪\"\n },\n \"Bhutanese Ngultrum\": {\n \"code\": \"BTN\",\n \"symbol\": \"Nu\"\n },\n \"Indian Rupee\": {\n \"code\": \"INR\",\n \"symbol\": \"₹\"\n },\n \"Iraqi Dinar\": {\n \"code\": \"IQD\",\n \"symbol\": \"\"\n },\n \"Iranian Rial\": {\n \"code\": \"IRR\",\n \"symbol\": \"﷼\"\n },\n \"Iceland Krona\": {\n \"code\": \"ISK\",\n \"symbol\": \"kr\"\n },\n \"Jamaican Dollar\": {\n \"code\": \"JMD\",\n \"symbol\": \"J$\"\n },\n \"Jordanian Dinar\": {\n \"code\": \"JOD\",\n \"symbol\": \"\"\n },\n \"Yen\": {\n \"code\": \"JPY\",\n \"symbol\": \"¥\"\n },\n \"Kenyan Shilling\": {\n \"code\": \"KES\",\n \"symbol\": \"\"\n },\n \"Som\": {\n \"code\": \"KGS\",\n \"symbol\": \"лв\"\n },\n \"Riel\": {\n \"code\": \"KHR\",\n \"symbol\": \"៛\"\n },\n \"Comoro Franc\": {\n \"code\": \"KMF\",\n \"symbol\": \"\"\n },\n \"North Korean Won\": {\n \"code\": \"KPW\",\n \"symbol\": \"₩\"\n },\n \"Won\": {\n \"code\": \"KRW\",\n \"symbol\": \"₩\"\n },\n \"Kuwaiti Dinar\": {\n \"code\": \"KWD\",\n \"symbol\": \"\"\n },\n \"Cayman Islands Dollar\": {\n \"code\": \"KYD\",\n \"symbol\": \"$\"\n },\n \"Tenge\": {\n \"code\": \"KZT\",\n \"symbol\": \"лв\"\n },\n \"Kip\": {\n \"code\": \"LAK\",\n \"symbol\": \"₭\"\n },\n \"Lebanese Pound\": {\n \"code\": \"LBP\",\n \"symbol\": \"£\"\n },\n \"Sri Lanka Rupee\": {\n \"code\": \"LKR\",\n \"symbol\": \"₨\"\n },\n \"Liberian Dollar\": {\n \"code\": \"LRD\",\n \"symbol\": \"$\"\n },\n \"Lithuanian Litas\": {\n \"code\": \"LTL\",\n \"symbol\": \"Lt\"\n },\n \"Latvian Lats\": {\n \"code\": \"LVL\",\n \"symbol\": \"Ls\"\n },\n \"Libyan Dinar\": {\n \"code\": \"LYD\",\n \"symbol\": \"\"\n },\n \"Moroccan Dirham\": {\n \"code\": \"MAD\",\n \"symbol\": \"\"\n },\n \"Moldovan Leu\": {\n \"code\": \"MDL\",\n \"symbol\": \"\"\n },\n \"Malagasy Ariary\": {\n \"code\": \"MGA\",\n \"symbol\": \"\"\n },\n \"Denar\": {\n \"code\": \"MKD\",\n \"symbol\": \"ден\"\n },\n \"Kyat\": {\n \"code\": \"MMK\",\n \"symbol\": \"\"\n },\n \"Tugrik\": {\n \"code\": \"MNT\",\n \"symbol\": \"₮\"\n },\n \"Pataca\": {\n \"code\": \"MOP\",\n \"symbol\": \"\"\n },\n \"Ouguiya\": {\n \"code\": \"MRO\",\n \"symbol\": \"\"\n },\n \"Mauritius Rupee\": {\n \"code\": \"MUR\",\n \"symbol\": \"₨\"\n },\n \"Rufiyaa\": {\n \"code\": \"MVR\",\n \"symbol\": \"\"\n },\n \"Kwacha\": {\n \"code\": \"MWK\",\n \"symbol\": \"\"\n },\n \"Mexican Peso\": {\n \"code\": \"MXN\",\n \"symbol\": \"$\"\n },\n \"Malaysian Ringgit\": {\n \"code\": \"MYR\",\n \"symbol\": \"RM\"\n },\n \"Metical\": {\n \"code\": \"MZN\",\n \"symbol\": \"MT\"\n },\n \"Naira\": {\n \"code\": \"NGN\",\n \"symbol\": \"₦\"\n },\n \"Cordoba Oro\": {\n \"code\": \"NIO\",\n \"symbol\": \"C$\"\n },\n \"Norwegian Krone\": {\n \"code\": \"NOK\",\n \"symbol\": \"kr\"\n },\n \"Nepalese Rupee\": {\n \"code\": \"NPR\",\n \"symbol\": \"₨\"\n },\n \"New Zealand Dollar\": {\n \"code\": \"NZD\",\n \"symbol\": \"$\"\n },\n \"Rial Omani\": {\n \"code\": \"OMR\",\n \"symbol\": \"﷼\"\n },\n \"Balboa\": {\n \"code\": \"PAB\",\n \"symbol\": \"B/.\"\n },\n \"Nuevo Sol\": {\n \"code\": \"PEN\",\n \"symbol\": \"S/.\"\n },\n \"Kina\": {\n \"code\": \"PGK\",\n \"symbol\": \"\"\n },\n \"Philippine Peso\": {\n \"code\": \"PHP\",\n \"symbol\": \"Php\"\n },\n \"Pakistan Rupee\": {\n \"code\": \"PKR\",\n \"symbol\": \"₨\"\n },\n \"Zloty\": {\n \"code\": \"PLN\",\n \"symbol\": \"zł\"\n },\n \"Guarani\": {\n \"code\": \"PYG\",\n \"symbol\": \"Gs\"\n },\n \"Qatari Rial\": {\n \"code\": \"QAR\",\n \"symbol\": \"﷼\"\n },\n \"New Leu\": {\n \"code\": \"RON\",\n \"symbol\": \"lei\"\n },\n \"Serbian Dinar\": {\n \"code\": \"RSD\",\n \"symbol\": \"Дин.\"\n },\n \"Russian Ruble\": {\n \"code\": \"RUB\",\n \"symbol\": \"руб\"\n },\n \"Rwanda Franc\": {\n \"code\": \"RWF\",\n \"symbol\": \"\"\n },\n \"Saudi Riyal\": {\n \"code\": \"SAR\",\n \"symbol\": \"﷼\"\n },\n \"Solomon Islands Dollar\": {\n \"code\": \"SBD\",\n \"symbol\": \"$\"\n },\n \"Seychelles Rupee\": {\n \"code\": \"SCR\",\n \"symbol\": \"₨\"\n },\n \"Sudanese Pound\": {\n \"code\": \"SDG\",\n \"symbol\": \"\"\n },\n \"Swedish Krona\": {\n \"code\": \"SEK\",\n \"symbol\": \"kr\"\n },\n \"Singapore Dollar\": {\n \"code\": \"SGD\",\n \"symbol\": \"$\"\n },\n \"Saint Helena Pound\": {\n \"code\": \"SHP\",\n \"symbol\": \"£\"\n },\n \"Leone\": {\n \"code\": \"SLL\",\n \"symbol\": \"\"\n },\n \"Somali Shilling\": {\n \"code\": \"SOS\",\n \"symbol\": \"S\"\n },\n \"Surinam Dollar\": {\n \"code\": \"SRD\",\n \"symbol\": \"$\"\n },\n \"Dobra\": {\n \"code\": \"STN\",\n \"symbol\": \"Db\"\n },\n \"El Salvador Colon\": {\n \"code\": \"SVC\",\n \"symbol\": \"₡\"\n },\n \"Syrian Pound\": {\n \"code\": \"SYP\",\n \"symbol\": \"£\"\n },\n \"Lilangeni\": {\n \"code\": \"SZL\",\n \"symbol\": \"\"\n },\n \"Baht\": {\n \"code\": \"THB\",\n \"symbol\": \"฿\"\n },\n \"Somoni\": {\n \"code\": \"TJS\",\n \"symbol\": \"\"\n },\n \"Manat\": {\n \"code\": \"TMT\",\n \"symbol\": \"\"\n },\n \"Tunisian Dinar\": {\n \"code\": \"TND\",\n \"symbol\": \"\"\n },\n \"Pa'anga\": {\n \"code\": \"TOP\",\n \"symbol\": \"\"\n },\n \"Turkish Lira\": {\n \"code\": \"TRY\",\n \"symbol\": \"₺\"\n },\n \"Trinidad and Tobago Dollar\": {\n \"code\": \"TTD\",\n \"symbol\": \"TT$\"\n },\n \"New Taiwan Dollar\": {\n \"code\": \"TWD\",\n \"symbol\": \"NT$\"\n },\n \"Tanzanian Shilling\": {\n \"code\": \"TZS\",\n \"symbol\": \"\"\n },\n \"Hryvnia\": {\n \"code\": \"UAH\",\n \"symbol\": \"₴\"\n },\n \"Uganda Shilling\": {\n \"code\": \"UGX\",\n \"symbol\": \"\"\n },\n \"US Dollar\": {\n \"code\": \"USD\",\n \"symbol\": \"$\"\n },\n \"Peso Uruguayo\": {\n \"code\": \"UYU\",\n \"symbol\": \"$U\"\n },\n \"Uzbekistan Sum\": {\n \"code\": \"UZS\",\n \"symbol\": \"лв\"\n },\n \"Bolivar Fuerte\": {\n \"code\": \"VEF\",\n \"symbol\": \"Bs\"\n },\n \"Dong\": {\n \"code\": \"VND\",\n \"symbol\": \"₫\"\n },\n \"Vatu\": {\n \"code\": \"VUV\",\n \"symbol\": \"\"\n },\n \"Tala\": {\n \"code\": \"WST\",\n \"symbol\": \"\"\n },\n \"CFA Franc BEAC\": {\n \"code\": \"XAF\",\n \"symbol\": \"\"\n },\n \"Silver\": {\n \"code\": \"XAG\",\n \"symbol\": \"\"\n },\n \"Gold\": {\n \"code\": \"XAU\",\n \"symbol\": \"\"\n },\n \"Bond Markets Units European Composite Unit (EURCO)\": {\n \"code\": \"XBA\",\n \"symbol\": \"\"\n },\n \"European Monetary Unit (E.M.U.-6)\": {\n \"code\": \"XBB\",\n \"symbol\": \"\"\n },\n \"European Unit of Account 9(E.U.A.-9)\": {\n \"code\": \"XBC\",\n \"symbol\": \"\"\n },\n \"European Unit of Account 17(E.U.A.-17)\": {\n \"code\": \"XBD\",\n \"symbol\": \"\"\n },\n \"East Caribbean Dollar\": {\n \"code\": \"XCD\",\n \"symbol\": \"$\"\n },\n \"SDR\": {\n \"code\": \"XDR\",\n \"symbol\": \"\"\n },\n \"UIC-Franc\": {\n \"code\": \"XFU\",\n \"symbol\": \"\"\n },\n \"CFA Franc BCEAO\": {\n \"code\": \"XOF\",\n \"symbol\": \"\"\n },\n \"Palladium\": {\n \"code\": \"XPD\",\n \"symbol\": \"\"\n },\n \"CFP Franc\": {\n \"code\": \"XPF\",\n \"symbol\": \"\"\n },\n \"Platinum\": {\n \"code\": \"XPT\",\n \"symbol\": \"\"\n },\n \"Codes specifically reserved for testing purposes\": {\n \"code\": \"XTS\",\n \"symbol\": \"\"\n },\n \"Yemeni Rial\": {\n \"code\": \"YER\",\n \"symbol\": \"﷼\"\n },\n \"Rand\": {\n \"code\": \"ZAR\",\n \"symbol\": \"R\"\n },\n \"Lesotho Loti\": {\n \"code\": \"LSL\",\n \"symbol\": \"\"\n },\n \"Namibia Dollar\": {\n \"code\": \"NAD\",\n \"symbol\": \"N$\"\n },\n \"Zambian Kwacha\": {\n \"code\": \"ZMK\",\n \"symbol\": \"\"\n },\n \"Zimbabwe Dollar\": {\n \"code\": \"ZWL\",\n \"symbol\": \"\"\n }\n};\n\n},{}],118:[function(require,module,exports){\nvar finance = {};\nmodule['exports'] = finance;\nfinance.account_type = require(\"./account_type\");\nfinance.transaction_type = require(\"./transaction_type\");\nfinance.currency = require(\"./currency\");\nfinance.credit_card = require(\"./credit_card\");\n\n},{\"./account_type\":104,\"./credit_card\":108,\"./currency\":117,\"./transaction_type\":119}],119:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"deposit\",\n \"withdrawal\",\n \"payment\",\n \"invoice\"\n];\n\n},{}],120:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"TCP\",\n \"HTTP\",\n \"SDD\",\n \"RAM\",\n \"GB\",\n \"CSS\",\n \"SSL\",\n \"AGP\",\n \"SQL\",\n \"FTP\",\n \"PCI\",\n \"AI\",\n \"ADP\",\n \"RSS\",\n \"XML\",\n \"EXE\",\n \"COM\",\n \"HDD\",\n \"THX\",\n \"SMTP\",\n \"SMS\",\n \"USB\",\n \"PNG\",\n \"SAS\",\n \"IB\",\n \"SCSI\",\n \"JSON\",\n \"XSS\",\n \"JBOD\"\n];\n\n},{}],121:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"auxiliary\",\n \"primary\",\n \"back-end\",\n \"digital\",\n \"open-source\",\n \"virtual\",\n \"cross-platform\",\n \"redundant\",\n \"online\",\n \"haptic\",\n \"multi-byte\",\n \"bluetooth\",\n \"wireless\",\n \"1080p\",\n \"neural\",\n \"optical\",\n \"solid state\",\n \"mobile\"\n];\n\n},{}],122:[function(require,module,exports){\nvar hacker = {};\nmodule['exports'] = hacker;\nhacker.abbreviation = require(\"./abbreviation\");\nhacker.adjective = require(\"./adjective\");\nhacker.noun = require(\"./noun\");\nhacker.verb = require(\"./verb\");\nhacker.ingverb = require(\"./ingverb\");\nhacker.phrase = require(\"./phrase\");\n\n},{\"./abbreviation\":120,\"./adjective\":121,\"./ingverb\":123,\"./noun\":124,\"./phrase\":125,\"./verb\":126}],123:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"backing up\",\n \"bypassing\",\n \"hacking\",\n \"overriding\",\n \"compressing\",\n \"copying\",\n \"navigating\",\n \"indexing\",\n \"connecting\",\n \"generating\",\n \"quantifying\",\n \"calculating\",\n \"synthesizing\",\n \"transmitting\",\n \"programming\",\n \"parsing\"\n];\n\n},{}],124:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"driver\",\n \"protocol\",\n \"bandwidth\",\n \"panel\",\n \"microchip\",\n \"program\",\n \"port\",\n \"card\",\n \"array\",\n \"interface\",\n \"system\",\n \"sensor\",\n \"firewall\",\n \"hard drive\",\n \"pixel\",\n \"alarm\",\n \"feed\",\n \"monitor\",\n \"application\",\n \"transmitter\",\n \"bus\",\n \"circuit\",\n \"capacitor\",\n \"matrix\"\n];\n\n},{}],125:[function(require,module,exports){\nmodule[\"exports\"] = [\r\n \"If we {{verb}} the {{noun}}, we can get to the {{abbreviation}} {{noun}} through the {{adjective}} {{abbreviation}} {{noun}}!\",\r\n \"We need to {{verb}} the {{adjective}} {{abbreviation}} {{noun}}!\",\r\n \"Try to {{verb}} the {{abbreviation}} {{noun}}, maybe it will {{verb}} the {{adjective}} {{noun}}!\",\r\n \"You can't {{verb}} the {{noun}} without {{ingverb}} the {{adjective}} {{abbreviation}} {{noun}}!\",\r\n \"Use the {{adjective}} {{abbreviation}} {{noun}}, then you can {{verb}} the {{adjective}} {{noun}}!\",\r\n \"The {{abbreviation}} {{noun}} is down, {{verb}} the {{adjective}} {{noun}} so we can {{verb}} the {{abbreviation}} {{noun}}!\",\r\n \"{{ingverb}} the {{noun}} won't do anything, we need to {{verb}} the {{adjective}} {{abbreviation}} {{noun}}!\",\r\n \"I'll {{verb}} the {{adjective}} {{abbreviation}} {{noun}}, that should {{noun}} the {{abbreviation}} {{noun}}!\"\r\n];\n},{}],126:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"back up\",\n \"bypass\",\n \"hack\",\n \"override\",\n \"compress\",\n \"copy\",\n \"navigate\",\n \"index\",\n \"connect\",\n \"generate\",\n \"quantify\",\n \"calculate\",\n \"synthesize\",\n \"input\",\n \"transmit\",\n \"program\",\n \"reboot\",\n \"parse\"\n];\n\n},{}],127:[function(require,module,exports){\nvar en = {};\nmodule['exports'] = en;\nen.title = \"English\";\nen.separator = \" & \";\nen.address = require(\"./address\");\nen.animal = require(\"./animal\");\nen.company = require(\"./company\");\nen.internet = require(\"./internet\");\nen.database = require(\"./database\");\nen.lorem = require(\"./lorem\");\nen.name = require(\"./name\");\nen.phone_number = require(\"./phone_number\");\nen.cell_phone = require(\"./cell_phone\");\nen.business = require(\"./business\");\nen.commerce = require(\"./commerce\");\nen.team = require(\"./team\");\nen.hacker = require(\"./hacker\");\nen.app = require(\"./app\");\nen.finance = require(\"./finance\");\nen.date = require(\"./date\");\nen.system = require(\"./system\");\nen.vehicle = require(\"./vehicle\");\nen.music = require(\"./music\");\n\n},{\"./address\":47,\"./animal\":66,\"./app\":73,\"./business\":79,\"./cell_phone\":81,\"./commerce\":84,\"./company\":92,\"./database\":99,\"./date\":101,\"./finance\":118,\"./hacker\":122,\"./internet\":132,\"./lorem\":133,\"./music\":137,\"./name\":142,\"./phone_number\":150,\"./system\":152,\"./team\":155,\"./vehicle\":159}],128:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"0therplanet_128.jpg\",\n \"1markiz_128.jpg\",\n \"2fockus_128.jpg\",\n \"8d3k_128.jpg\",\n \"91bilal_128.jpg\",\n \"9lessons_128.jpg\",\n \"AM_Kn2_128.jpg\",\n \"AlbertoCococi_128.jpg\",\n \"BenouarradeM_128.jpg\",\n \"BillSKenney_128.jpg\",\n \"BrianPurkiss_128.jpg\",\n \"BroumiYoussef_128.jpg\",\n \"BryanHorsey_128.jpg\",\n \"Chakintosh_128.jpg\",\n \"ChrisFarina78_128.jpg\",\n \"Elt_n_128.jpg\",\n \"GavicoInd_128.jpg\",\n \"HenryHoffman_128.jpg\",\n \"IsaryAmairani_128.jpg\",\n \"Karimmove_128.jpg\",\n \"LucasPerdidao_128.jpg\",\n \"ManikRathee_128.jpg\",\n \"RussellBishop_128.jpg\",\n \"S0ufi4n3_128.jpg\",\n \"SULiik_128.jpg\",\n \"Shriiiiimp_128.jpg\",\n \"Silveredge9_128.jpg\",\n \"Skyhartman_128.jpg\",\n \"SlaapMe_128.jpg\",\n \"Stievius_128.jpg\",\n \"Talbi_ConSept_128.jpg\",\n \"VMilescu_128.jpg\",\n \"VinThomas_128.jpg\",\n \"YoungCutlass_128.jpg\",\n \"ZacharyZorbas_128.jpg\",\n \"_dwite__128.jpg\",\n \"_kkga_128.jpg\",\n \"_pedropinho_128.jpg\",\n \"_ragzor_128.jpg\",\n \"_scottburgess_128.jpg\",\n \"_shahedk_128.jpg\",\n \"_victa_128.jpg\",\n \"_vojto_128.jpg\",\n \"_williamguerra_128.jpg\",\n \"_yardenoon_128.jpg\",\n \"a1chapone_128.jpg\",\n \"a_brixen_128.jpg\",\n \"a_harris88_128.jpg\",\n \"aaronalfred_128.jpg\",\n \"aaroni_128.jpg\",\n \"aaronkwhite_128.jpg\",\n \"abdots_128.jpg\",\n \"abdulhyeuk_128.jpg\",\n \"abdullindenis_128.jpg\",\n \"abelcabans_128.jpg\",\n \"abotap_128.jpg\",\n \"abovefunction_128.jpg\",\n \"adamawesomeface_128.jpg\",\n \"adammarsbar_128.jpg\",\n \"adamnac_128.jpg\",\n \"adamsxu_128.jpg\",\n \"adellecharles_128.jpg\",\n \"ademilter_128.jpg\",\n \"adhamdannaway_128.jpg\",\n \"adhiardana_128.jpg\",\n \"adityasutomo_128.jpg\",\n \"adobi_128.jpg\",\n \"adrienths_128.jpg\",\n \"aeon56_128.jpg\",\n \"afusinatto_128.jpg\",\n \"agromov_128.jpg\",\n \"agustincruiz_128.jpg\",\n \"ah_lice_128.jpg\",\n \"ahmadajmi_128.jpg\",\n \"ahmetalpbalkan_128.jpg\",\n \"ahmetsulek_128.jpg\",\n \"aiiaiiaii_128.jpg\",\n \"ainsleywagon_128.jpg\",\n \"aio____128.jpg\",\n \"airskylar_128.jpg\",\n \"aislinnkelly_128.jpg\",\n \"ajaxy_ru_128.jpg\",\n \"aka_james_128.jpg\",\n \"akashsharma39_128.jpg\",\n \"akmalfikri_128.jpg\",\n \"akmur_128.jpg\",\n \"al_li_128.jpg\",\n \"alagoon_128.jpg\",\n \"alan_zhang__128.jpg\",\n \"albertaugustin_128.jpg\",\n \"alecarpentier_128.jpg\",\n \"aleclarsoniv_128.jpg\",\n \"aleinadsays_128.jpg\",\n \"alek_djuric_128.jpg\",\n \"aleksitappura_128.jpg\",\n \"alessandroribe_128.jpg\",\n \"alevizio_128.jpg\",\n \"alexandermayes_128.jpg\",\n \"alexivanichkin_128.jpg\",\n \"algunsanabria_128.jpg\",\n \"allagringaus_128.jpg\",\n \"allfordesign_128.jpg\",\n \"allthingssmitty_128.jpg\",\n \"alsobrooks_128.jpg\",\n \"alterchuca_128.jpg\",\n \"aluisio_azevedo_128.jpg\",\n \"alxleroydeval_128.jpg\",\n \"alxndrustinov_128.jpg\",\n \"amandabuzard_128.jpg\",\n \"amanruzaini_128.jpg\",\n \"amayvs_128.jpg\",\n \"amywebbb_128.jpg\",\n \"anaami_128.jpg\",\n \"anasnakawa_128.jpg\",\n \"anatolinicolae_128.jpg\",\n \"andrea211087_128.jpg\",\n \"andreas_pr_128.jpg\",\n \"andresdjasso_128.jpg\",\n \"andresenfredrik_128.jpg\",\n \"andrewabogado_128.jpg\",\n \"andrewarrow_128.jpg\",\n \"andrewcohen_128.jpg\",\n \"andrewofficer_128.jpg\",\n \"andyisonline_128.jpg\",\n \"andysolomon_128.jpg\",\n \"andytlaw_128.jpg\",\n \"angelceballos_128.jpg\",\n \"angelcolberg_128.jpg\",\n \"angelcreative_128.jpg\",\n \"anjhero_128.jpg\",\n \"ankitind_128.jpg\",\n \"anoff_128.jpg\",\n \"anthonysukow_128.jpg\",\n \"antjanus_128.jpg\",\n \"antongenkin_128.jpg\",\n \"antonyryndya_128.jpg\",\n \"antonyzotov_128.jpg\",\n \"aoimedia_128.jpg\",\n \"apriendeau_128.jpg\",\n \"arashmanteghi_128.jpg\",\n \"areandacom_128.jpg\",\n \"areus_128.jpg\",\n \"ariffsetiawan_128.jpg\",\n \"ariil_128.jpg\",\n \"arindam__128.jpg\",\n \"arishi__128.jpg\",\n \"arkokoley_128.jpg\",\n \"aroon_sharma_128.jpg\",\n \"arpitnj_128.jpg\",\n \"artd_sign_128.jpg\",\n \"artem_kostenko_128.jpg\",\n \"arthurholcombe1_128.jpg\",\n \"artvavs_128.jpg\",\n \"ashernatali_128.jpg\",\n \"ashocka18_128.jpg\",\n \"atanism_128.jpg\",\n \"atariboy_128.jpg\",\n \"ateneupopular_128.jpg\",\n \"attacks_128.jpg\",\n \"aviddayentonbay_128.jpg\",\n \"axel_128.jpg\",\n \"badlittleduck_128.jpg\",\n \"bagawarman_128.jpg\",\n \"baires_128.jpg\",\n \"balakayuriy_128.jpg\",\n \"balintorosz_128.jpg\",\n \"baliomega_128.jpg\",\n \"baluli_128.jpg\",\n \"bargaorobalo_128.jpg\",\n \"barputro_128.jpg\",\n \"bartjo_128.jpg\",\n \"bartoszdawydzik_128.jpg\",\n \"bassamology_128.jpg\",\n \"batsirai_128.jpg\",\n \"baumann_alex_128.jpg\",\n \"baumannzone_128.jpg\",\n \"bboy1895_128.jpg\",\n \"bcrad_128.jpg\",\n \"begreative_128.jpg\",\n \"belyaev_rs_128.jpg\",\n \"benefritz_128.jpg\",\n \"benjamin_knight_128.jpg\",\n \"bennyjien_128.jpg\",\n \"benoitboucart_128.jpg\",\n \"bereto_128.jpg\",\n \"bergmartin_128.jpg\",\n \"bermonpainter_128.jpg\",\n \"bertboerland_128.jpg\",\n \"besbujupi_128.jpg\",\n \"beshur_128.jpg\",\n \"betraydan_128.jpg\",\n \"beweinreich_128.jpg\",\n \"bfrohs_128.jpg\",\n \"bighanddesign_128.jpg\",\n \"bigmancho_128.jpg\",\n \"billyroshan_128.jpg\",\n \"bistrianiosip_128.jpg\",\n \"blakehawksworth_128.jpg\",\n \"blakesimkins_128.jpg\",\n \"bluefx__128.jpg\",\n \"bluesix_128.jpg\",\n \"bobbytwoshoes_128.jpg\",\n \"bobwassermann_128.jpg\",\n \"bolzanmarco_128.jpg\",\n \"borantula_128.jpg\",\n \"borges_marcos_128.jpg\",\n \"bowbrick_128.jpg\",\n \"boxmodel_128.jpg\",\n \"bpartridge_128.jpg\",\n \"bradenhamm_128.jpg\",\n \"brajeshwar_128.jpg\",\n \"brandclay_128.jpg\",\n \"brandonburke_128.jpg\",\n \"brandonflatsoda_128.jpg\",\n \"brandonmorreale_128.jpg\",\n \"brenmurrell_128.jpg\",\n \"brenton_clarke_128.jpg\",\n \"bruno_mart_128.jpg\",\n \"brunodesign1206_128.jpg\",\n \"bryan_topham_128.jpg\",\n \"bu7921_128.jpg\",\n \"bublienko_128.jpg\",\n \"buddhasource_128.jpg\",\n \"buleswapnil_128.jpg\",\n \"bungiwan_128.jpg\",\n \"buryaknick_128.jpg\",\n \"buzzusborne_128.jpg\",\n \"byrnecore_128.jpg\",\n \"byryan_128.jpg\",\n \"cadikkara_128.jpg\",\n \"calebjoyce_128.jpg\",\n \"calebogden_128.jpg\",\n \"canapud_128.jpg\",\n \"carbontwelve_128.jpg\",\n \"carlfairclough_128.jpg\",\n \"carlosblanco_eu_128.jpg\",\n \"carlosgavina_128.jpg\",\n \"carlosjgsousa_128.jpg\",\n \"carlosm_128.jpg\",\n \"carlyson_128.jpg\",\n \"caseycavanagh_128.jpg\",\n \"caspergrl_128.jpg\",\n \"catadeleon_128.jpg\",\n \"catarino_128.jpg\",\n \"cboller1_128.jpg\",\n \"cbracco_128.jpg\",\n \"ccinojasso1_128.jpg\",\n \"cdavis565_128.jpg\",\n \"cdharrison_128.jpg\",\n \"ceekaytweet_128.jpg\",\n \"cemshid_128.jpg\",\n \"cggaurav_128.jpg\",\n \"chaabane_wail_128.jpg\",\n \"chacky14_128.jpg\",\n \"chadami_128.jpg\",\n \"chadengle_128.jpg\",\n \"chaensel_128.jpg\",\n \"chandlervdw_128.jpg\",\n \"chanpory_128.jpg\",\n \"charlesrpratt_128.jpg\",\n \"charliecwaite_128.jpg\",\n \"charliegann_128.jpg\",\n \"chatyrko_128.jpg\",\n \"cherif_b_128.jpg\",\n \"chris_frees_128.jpg\",\n \"chris_witko_128.jpg\",\n \"chrismj83_128.jpg\",\n \"chrisslowik_128.jpg\",\n \"chrisstumph_128.jpg\",\n \"christianoliff_128.jpg\",\n \"chrisvanderkooi_128.jpg\",\n \"ciaranr_128.jpg\",\n \"cicerobr_128.jpg\",\n \"claudioguglieri_128.jpg\",\n \"cloudstudio_128.jpg\",\n \"clubb3rry_128.jpg\",\n \"cocolero_128.jpg\",\n \"codepoet_ru_128.jpg\",\n \"coderdiaz_128.jpg\",\n \"codysanfilippo_128.jpg\",\n \"cofla_128.jpg\",\n \"colgruv_128.jpg\",\n \"colirpixoil_128.jpg\",\n \"collegeman_128.jpg\",\n \"commadelimited_128.jpg\",\n \"conspirator_128.jpg\",\n \"constantx_128.jpg\",\n \"coreyginnivan_128.jpg\",\n \"coreyhaggard_128.jpg\",\n \"coreyweb_128.jpg\",\n \"craigelimeliah_128.jpg\",\n \"craighenneberry_128.jpg\",\n \"craigrcoles_128.jpg\",\n \"creartinc_128.jpg\",\n \"croakx_128.jpg\",\n \"curiousoffice_128.jpg\",\n \"curiousonaut_128.jpg\",\n \"cybind_128.jpg\",\n \"cynthiasavard_128.jpg\",\n \"cyril_gaillard_128.jpg\",\n \"d00maz_128.jpg\",\n \"d33pthought_128.jpg\",\n \"d_kobelyatsky_128.jpg\",\n \"d_nny_m_cher_128.jpg\",\n \"dactrtr_128.jpg\",\n \"dahparra_128.jpg\",\n \"dallasbpeters_128.jpg\",\n \"damenleeturks_128.jpg\",\n \"danillos_128.jpg\",\n \"daniloc_128.jpg\",\n \"danmartin70_128.jpg\",\n \"dannol_128.jpg\",\n \"danpliego_128.jpg\",\n \"danro_128.jpg\",\n \"dansowter_128.jpg\",\n \"danthms_128.jpg\",\n \"danvernon_128.jpg\",\n \"danvierich_128.jpg\",\n \"darcystonge_128.jpg\",\n \"darylws_128.jpg\",\n \"davecraige_128.jpg\",\n \"davidbaldie_128.jpg\",\n \"davidcazalis_128.jpg\",\n \"davidhemphill_128.jpg\",\n \"davidmerrique_128.jpg\",\n \"davidsasda_128.jpg\",\n \"dawidwu_128.jpg\",\n \"daykiine_128.jpg\",\n \"dc_user_128.jpg\",\n \"dcalonaci_128.jpg\",\n \"ddggccaa_128.jpg\",\n \"de_ascanio_128.jpg\",\n \"deeenright_128.jpg\",\n \"demersdesigns_128.jpg\",\n \"denisepires_128.jpg\",\n \"depaulawagner_128.jpg\",\n \"derekcramer_128.jpg\",\n \"derekebradley_128.jpg\",\n \"derienzo777_128.jpg\",\n \"desastrozo_128.jpg\",\n \"designervzm_128.jpg\",\n \"dev_essentials_128.jpg\",\n \"devankoshal_128.jpg\",\n \"deviljho__128.jpg\",\n \"devinhalladay_128.jpg\",\n \"dgajjar_128.jpg\",\n \"dgclegg_128.jpg\",\n \"dhilipsiva_128.jpg\",\n \"dhoot_amit_128.jpg\",\n \"dhooyenga_128.jpg\",\n \"dhrubo_128.jpg\",\n \"diansigitp_128.jpg\",\n \"dicesales_128.jpg\",\n \"diesellaws_128.jpg\",\n \"digitalmaverick_128.jpg\",\n \"dimaposnyy_128.jpg\",\n \"dingyi_128.jpg\",\n \"divya_128.jpg\",\n \"dixchen_128.jpg\",\n \"djsherman_128.jpg\",\n \"dmackerman_128.jpg\",\n \"dmitriychuta_128.jpg\",\n \"dnezkumar_128.jpg\",\n \"dnirmal_128.jpg\",\n \"donjain_128.jpg\",\n \"doooon_128.jpg\",\n \"doronmalki_128.jpg\",\n \"dorphern_128.jpg\",\n \"dotgridline_128.jpg\",\n \"dparrelli_128.jpg\",\n \"dpmachado_128.jpg\",\n \"dreizle_128.jpg\",\n \"drewbyreese_128.jpg\",\n \"dshster_128.jpg\",\n \"dss49_128.jpg\",\n \"dudestein_128.jpg\",\n \"duivvv_128.jpg\",\n \"dutchnadia_128.jpg\",\n \"dvdwinden_128.jpg\",\n \"dzantievm_128.jpg\",\n \"ecommerceil_128.jpg\",\n \"eddiechen_128.jpg\",\n \"edgarchris99_128.jpg\",\n \"edhenderson_128.jpg\",\n \"edkf_128.jpg\",\n \"edobene_128.jpg\",\n \"eduardostuart_128.jpg\",\n \"ehsandiary_128.jpg\",\n \"eitarafa_128.jpg\",\n \"el_fuertisimo_128.jpg\",\n \"elbuscainfo_128.jpg\",\n \"elenadissi_128.jpg\",\n \"elisabethkjaer_128.jpg\",\n \"elliotlewis_128.jpg\",\n \"elliotnolten_128.jpg\",\n \"embrcecreations_128.jpg\",\n \"emileboudeling_128.jpg\",\n \"emmandenn_128.jpg\",\n \"emmeffess_128.jpg\",\n \"emsgulam_128.jpg\",\n \"enda_128.jpg\",\n \"enjoythetau_128.jpg\",\n \"enricocicconi_128.jpg\",\n \"envex_128.jpg\",\n \"ernestsemerda_128.jpg\",\n \"erwanhesry_128.jpg\",\n \"estebanuribe_128.jpg\",\n \"eugeneeweb_128.jpg\",\n \"evandrix_128.jpg\",\n \"evanshajed_128.jpg\",\n \"exentrich_128.jpg\",\n \"eyronn_128.jpg\",\n \"fabbianz_128.jpg\",\n \"fabbrucci_128.jpg\",\n \"faisalabid_128.jpg\",\n \"falconerie_128.jpg\",\n \"falling_soul_128.jpg\",\n \"falvarad_128.jpg\",\n \"felipeapiress_128.jpg\",\n \"felipecsl_128.jpg\",\n \"ffbel_128.jpg\",\n \"finchjke_128.jpg\",\n \"findingjenny_128.jpg\",\n \"fiterik_128.jpg\",\n \"fjaguero_128.jpg\",\n \"flashmurphy_128.jpg\",\n \"flexrs_128.jpg\",\n \"foczzi_128.jpg\",\n \"fotomagin_128.jpg\",\n \"fran_mchamy_128.jpg\",\n \"francis_vega_128.jpg\",\n \"franciscoamk_128.jpg\",\n \"frankiefreesbie_128.jpg\",\n \"fronx_128.jpg\",\n \"funwatercat_128.jpg\",\n \"g3d_128.jpg\",\n \"gaborenton_128.jpg\",\n \"gabrielizalo_128.jpg\",\n \"gabrielrosser_128.jpg\",\n \"ganserene_128.jpg\",\n \"garand_128.jpg\",\n \"gauchomatt_128.jpg\",\n \"gauravjassal_128.jpg\",\n \"gavr1l0_128.jpg\",\n \"gcmorley_128.jpg\",\n \"gearpixels_128.jpg\",\n \"geneseleznev_128.jpg\",\n \"geobikas_128.jpg\",\n \"geran7_128.jpg\",\n \"geshan_128.jpg\",\n \"giancarlon_128.jpg\",\n \"gipsy_raf_128.jpg\",\n \"giuliusa_128.jpg\",\n \"gizmeedevil1991_128.jpg\",\n \"gkaam_128.jpg\",\n \"gmourier_128.jpg\",\n \"goddardlewis_128.jpg\",\n \"gofrasdesign_128.jpg\",\n \"gojeanyn_128.jpg\",\n \"gonzalorobaina_128.jpg\",\n \"grahamkennery_128.jpg\",\n \"greenbes_128.jpg\",\n \"gregkilian_128.jpg\",\n \"gregrwilkinson_128.jpg\",\n \"gregsqueeb_128.jpg\",\n \"grrr_nl_128.jpg\",\n \"gseguin_128.jpg\",\n \"gt_128.jpg\",\n \"gu5taf_128.jpg\",\n \"guiiipontes_128.jpg\",\n \"guillemboti_128.jpg\",\n \"guischmitt_128.jpg\",\n \"gusoto_128.jpg\",\n \"h1brd_128.jpg\",\n \"hafeeskhan_128.jpg\",\n \"hai_ninh_nguyen_128.jpg\",\n \"haligaliharun_128.jpg\",\n \"hanna_smi_128.jpg\",\n \"happypeter1983_128.jpg\",\n \"harry_sistalam_128.jpg\",\n \"haruintesettden_128.jpg\",\n \"hasslunsford_128.jpg\",\n \"haydn_woods_128.jpg\",\n \"helderleal_128.jpg\",\n \"hellofeverrrr_128.jpg\",\n \"her_ruu_128.jpg\",\n \"herbigt_128.jpg\",\n \"herkulano_128.jpg\",\n \"hermanobrother_128.jpg\",\n \"herrhaase_128.jpg\",\n \"heycamtaylor_128.jpg\",\n \"heyimjuani_128.jpg\",\n \"heykenneth_128.jpg\",\n \"hfalucas_128.jpg\",\n \"hgharrygo_128.jpg\",\n \"hiemil_128.jpg\",\n \"hjartstrorn_128.jpg\",\n \"hoangloi_128.jpg\",\n \"holdenweb_128.jpg\",\n \"homka_128.jpg\",\n \"horaciobella_128.jpg\",\n \"hota_v_128.jpg\",\n \"hsinyo23_128.jpg\",\n \"hugocornejo_128.jpg\",\n \"hugomano_128.jpg\",\n \"iamgarth_128.jpg\",\n \"iamglimy_128.jpg\",\n \"iamjdeleon_128.jpg\",\n \"iamkarna_128.jpg\",\n \"iamkeithmason_128.jpg\",\n \"iamsteffen_128.jpg\",\n \"id835559_128.jpg\",\n \"idiot_128.jpg\",\n \"iduuck_128.jpg\",\n \"ifarafonow_128.jpg\",\n \"igorgarybaldi_128.jpg\",\n \"illyzoren_128.jpg\",\n \"ilya_pestov_128.jpg\",\n \"imammuht_128.jpg\",\n \"imcoding_128.jpg\",\n \"imomenui_128.jpg\",\n \"imsoper_128.jpg\",\n \"increase_128.jpg\",\n \"incubo82_128.jpg\",\n \"instalox_128.jpg\",\n \"ionuss_128.jpg\",\n \"ipavelek_128.jpg\",\n \"iqbalperkasa_128.jpg\",\n \"iqonicd_128.jpg\",\n \"irae_128.jpg\",\n \"isaacfifth_128.jpg\",\n \"isacosta_128.jpg\",\n \"ismail_biltagi_128.jpg\",\n \"isnifer_128.jpg\",\n \"itolmach_128.jpg\",\n \"itsajimithing_128.jpg\",\n \"itskawsar_128.jpg\",\n \"itstotallyamy_128.jpg\",\n \"ivanfilipovbg_128.jpg\",\n \"j04ntoh_128.jpg\",\n \"j2deme_128.jpg\",\n \"j_drake__128.jpg\",\n \"jackiesaik_128.jpg\",\n \"jacksonlatka_128.jpg\",\n \"jacobbennett_128.jpg\",\n \"jagan123_128.jpg\",\n \"jakemoore_128.jpg\",\n \"jamiebrittain_128.jpg\",\n \"janpalounek_128.jpg\",\n \"jarjan_128.jpg\",\n \"jarsen_128.jpg\",\n \"jasonmarkjones_128.jpg\",\n \"javorszky_128.jpg\",\n \"jay_wilburn_128.jpg\",\n \"jayphen_128.jpg\",\n \"jayrobinson_128.jpg\",\n \"jcubic_128.jpg\",\n \"jedbridges_128.jpg\",\n \"jefffis_128.jpg\",\n \"jeffgolenski_128.jpg\",\n \"jehnglynn_128.jpg\",\n \"jennyshen_128.jpg\",\n \"jennyyo_128.jpg\",\n \"jeremery_128.jpg\",\n \"jeremiaha_128.jpg\",\n \"jeremiespoken_128.jpg\",\n \"jeremymouton_128.jpg\",\n \"jeremyshimko_128.jpg\",\n \"jeremyworboys_128.jpg\",\n \"jerrybai1907_128.jpg\",\n \"jervo_128.jpg\",\n \"jesseddy_128.jpg\",\n \"jffgrdnr_128.jpg\",\n \"jghyllebert_128.jpg\",\n \"jimmuirhead_128.jpg\",\n \"jitachi_128.jpg\",\n \"jjshaw14_128.jpg\",\n \"jjsiii_128.jpg\",\n \"jlsolerdeltoro_128.jpg\",\n \"jm_denis_128.jpg\",\n \"jmfsocial_128.jpg\",\n \"jmillspaysbills_128.jpg\",\n \"jnmnrd_128.jpg\",\n \"joannefournier_128.jpg\",\n \"joaoedumedeiros_128.jpg\",\n \"jodytaggart_128.jpg\",\n \"joe_black_128.jpg\",\n \"joelcipriano_128.jpg\",\n \"joelhelin_128.jpg\",\n \"joemdesign_128.jpg\",\n \"joetruesdell_128.jpg\",\n \"joeymurdah_128.jpg\",\n \"johannesneu_128.jpg\",\n \"johncafazza_128.jpg\",\n \"johndezember_128.jpg\",\n \"johnriordan_128.jpg\",\n \"johnsmithagency_128.jpg\",\n \"joki4_128.jpg\",\n \"jomarmen_128.jpg\",\n \"jonathansimmons_128.jpg\",\n \"jonkspr_128.jpg\",\n \"jonsgotwood_128.jpg\",\n \"jordyvdboom_128.jpg\",\n \"joreira_128.jpg\",\n \"josecarlospsh_128.jpg\",\n \"josemarques_128.jpg\",\n \"josep_martins_128.jpg\",\n \"josevnclch_128.jpg\",\n \"joshaustin_128.jpg\",\n \"joshhemsley_128.jpg\",\n \"joshmedeski_128.jpg\",\n \"joshuaraichur_128.jpg\",\n \"joshuasortino_128.jpg\",\n \"jpenico_128.jpg\",\n \"jpscribbles_128.jpg\",\n \"jqiuss_128.jpg\",\n \"juamperro_128.jpg\",\n \"juangomezw_128.jpg\",\n \"juanmamartinez_128.jpg\",\n \"juaumlol_128.jpg\",\n \"judzhin_miles_128.jpg\",\n \"justinrgraham_128.jpg\",\n \"justinrhee_128.jpg\",\n \"justinrob_128.jpg\",\n \"justme_timothyg_128.jpg\",\n \"jwalter14_128.jpg\",\n \"jydesign_128.jpg\",\n \"kaelifa_128.jpg\",\n \"kalmerrautam_128.jpg\",\n \"kamal_chaneman_128.jpg\",\n \"kanickairaj_128.jpg\",\n \"kapaluccio_128.jpg\",\n \"karalek_128.jpg\",\n \"karlkanall_128.jpg\",\n \"karolkrakowiak__128.jpg\",\n \"karsh_128.jpg\",\n \"karthipanraj_128.jpg\",\n \"kaspernordkvist_128.jpg\",\n \"katiemdaly_128.jpg\",\n \"kaysix_dizzy_128.jpg\",\n \"kazaky999_128.jpg\",\n \"kennyadr_128.jpg\",\n \"kerem_128.jpg\",\n \"kerihenare_128.jpg\",\n \"keryilmaz_128.jpg\",\n \"kevinjohndayy_128.jpg\",\n \"kevinoh_128.jpg\",\n \"kevka_128.jpg\",\n \"keyuri85_128.jpg\",\n \"kianoshp_128.jpg\",\n \"kijanmaharjan_128.jpg\",\n \"kikillo_128.jpg\",\n \"kimcool_128.jpg\",\n \"kinday_128.jpg\",\n \"kirangopal_128.jpg\",\n \"kiwiupover_128.jpg\",\n \"kkusaa_128.jpg\",\n \"klefue_128.jpg\",\n \"klimmka_128.jpg\",\n \"knilob_128.jpg\",\n \"kohette_128.jpg\",\n \"kojourin_128.jpg\",\n \"kolage_128.jpg\",\n \"kolmarlopez_128.jpg\",\n \"kolsvein_128.jpg\",\n \"konus_128.jpg\",\n \"koridhandy_128.jpg\",\n \"kosmar_128.jpg\",\n \"kostaspt_128.jpg\",\n \"krasnoukhov_128.jpg\",\n \"krystalfister_128.jpg\",\n \"kucingbelang4_128.jpg\",\n \"kudretkeskin_128.jpg\",\n \"kuldarkalvik_128.jpg\",\n \"kumarrajan12123_128.jpg\",\n \"kurafire_128.jpg\",\n \"kurtinc_128.jpg\",\n \"kushsolitary_128.jpg\",\n \"kvasnic_128.jpg\",\n \"ky_128.jpg\",\n \"kylefoundry_128.jpg\",\n \"kylefrost_128.jpg\",\n \"laasli_128.jpg\",\n \"lanceguyatt_128.jpg\",\n \"langate_128.jpg\",\n \"larrybolt_128.jpg\",\n \"larrygerard_128.jpg\",\n \"laurengray_128.jpg\",\n \"lawlbwoy_128.jpg\",\n \"layerssss_128.jpg\",\n \"leandrovaranda_128.jpg\",\n \"lebinoclard_128.jpg\",\n \"lebronjennan_128.jpg\",\n \"leehambley_128.jpg\",\n \"leeiio_128.jpg\",\n \"leemunroe_128.jpg\",\n \"leonfedotov_128.jpg\",\n \"lepetitogre_128.jpg\",\n \"lepinski_128.jpg\",\n \"levisan_128.jpg\",\n \"lewisainslie_128.jpg\",\n \"lhausermann_128.jpg\",\n \"liminha_128.jpg\",\n \"lingeswaran_128.jpg\",\n \"linkibol_128.jpg\",\n \"linux29_128.jpg\",\n \"lisovsky_128.jpg\",\n \"llun_128.jpg\",\n \"lmjabreu_128.jpg\",\n \"loganjlambert_128.jpg\",\n \"logorado_128.jpg\",\n \"lokesh_coder_128.jpg\",\n \"lonesomelemon_128.jpg\",\n \"longlivemyword_128.jpg\",\n \"looneydoodle_128.jpg\",\n \"lososina_128.jpg\",\n \"louis_currie_128.jpg\",\n \"low_res_128.jpg\",\n \"lowie_128.jpg\",\n \"lu4sh1i_128.jpg\",\n \"ludwiczakpawel_128.jpg\",\n \"luxe_128.jpg\",\n \"lvovenok_128.jpg\",\n \"m4rio_128.jpg\",\n \"m_kalibry_128.jpg\",\n \"ma_tiax_128.jpg\",\n \"mactopus_128.jpg\",\n \"macxim_128.jpg\",\n \"madcampos_128.jpg\",\n \"madebybrenton_128.jpg\",\n \"madebyvadim_128.jpg\",\n \"madewulf_128.jpg\",\n \"madshensel_128.jpg\",\n \"madysondesigns_128.jpg\",\n \"magoo04_128.jpg\",\n \"magugzbrand2d_128.jpg\",\n \"mahdif_128.jpg\",\n \"mahmoudmetwally_128.jpg\",\n \"maikelk_128.jpg\",\n \"maiklam_128.jpg\",\n \"malgordon_128.jpg\",\n \"malykhinv_128.jpg\",\n \"mandalareopens_128.jpg\",\n \"manekenthe_128.jpg\",\n \"mangosango_128.jpg\",\n \"manigm_128.jpg\",\n \"marakasina_128.jpg\",\n \"marciotoledo_128.jpg\",\n \"marclgonzales_128.jpg\",\n \"marcobarbosa_128.jpg\",\n \"marcomano__128.jpg\",\n \"marcoramires_128.jpg\",\n \"marcusgorillius_128.jpg\",\n \"markjenkins_128.jpg\",\n \"marklamb_128.jpg\",\n \"markolschesky_128.jpg\",\n \"markretzloff_128.jpg\",\n \"markwienands_128.jpg\",\n \"marlinjayakody_128.jpg\",\n \"marosholly_128.jpg\",\n \"marrimo_128.jpg\",\n \"marshallchen__128.jpg\",\n \"martinansty_128.jpg\",\n \"martip07_128.jpg\",\n \"mashaaaaal_128.jpg\",\n \"mastermindesign_128.jpg\",\n \"matbeedotcom_128.jpg\",\n \"mateaodviteza_128.jpg\",\n \"matkins_128.jpg\",\n \"matt3224_128.jpg\",\n \"mattbilotti_128.jpg\",\n \"mattdetails_128.jpg\",\n \"matthewkay__128.jpg\",\n \"mattlat_128.jpg\",\n \"mattsapii_128.jpg\",\n \"mauriolg_128.jpg\",\n \"maximseshuk_128.jpg\",\n \"maximsorokin_128.jpg\",\n \"maxlinderman_128.jpg\",\n \"maz_128.jpg\",\n \"mbilalsiddique1_128.jpg\",\n \"mbilderbach_128.jpg\",\n \"mcflydesign_128.jpg\",\n \"mds_128.jpg\",\n \"mdsisto_128.jpg\",\n \"meelford_128.jpg\",\n \"megdraws_128.jpg\",\n \"mekal_128.jpg\",\n \"meln1ks_128.jpg\",\n \"melvindidit_128.jpg\",\n \"mfacchinello_128.jpg\",\n \"mgonto_128.jpg\",\n \"mhaligowski_128.jpg\",\n \"mhesslow_128.jpg\",\n \"mhudobivnik_128.jpg\",\n \"michaelabehsera_128.jpg\",\n \"michaelbrooksjr_128.jpg\",\n \"michaelcolenso_128.jpg\",\n \"michaelcomiskey_128.jpg\",\n \"michaelkoper_128.jpg\",\n \"michaelmartinho_128.jpg\",\n \"michalhron_128.jpg\",\n \"michigangraham_128.jpg\",\n \"michzen_128.jpg\",\n \"mighty55_128.jpg\",\n \"miguelkooreman_128.jpg\",\n \"miguelmendes_128.jpg\",\n \"mikaeljorhult_128.jpg\",\n \"mikebeecham_128.jpg\",\n \"mikemai2awesome_128.jpg\",\n \"millinet_128.jpg\",\n \"mirfanqureshi_128.jpg\",\n \"missaaamy_128.jpg\",\n \"mizhgan_128.jpg\",\n \"mizko_128.jpg\",\n \"mkginfo_128.jpg\",\n \"mocabyte_128.jpg\",\n \"mohanrohith_128.jpg\",\n \"moscoz_128.jpg\",\n \"motionthinks_128.jpg\",\n \"moynihan_128.jpg\",\n \"mr_shiznit_128.jpg\",\n \"mr_subtle_128.jpg\",\n \"mrebay007_128.jpg\",\n \"mrjamesnoble_128.jpg\",\n \"mrmartineau_128.jpg\",\n \"mrxloka_128.jpg\",\n \"mslarkina_128.jpg\",\n \"msveet_128.jpg\",\n \"mtolokonnikov_128.jpg\",\n \"mufaddal_mw_128.jpg\",\n \"mugukamil_128.jpg\",\n \"muridrahhal_128.jpg\",\n \"muringa_128.jpg\",\n \"murrayswift_128.jpg\",\n \"mutlu82_128.jpg\",\n \"mutu_krish_128.jpg\",\n \"mvdheuvel_128.jpg\",\n \"mwarkentin_128.jpg\",\n \"myastro_128.jpg\",\n \"mylesb_128.jpg\",\n \"mymyboy_128.jpg\",\n \"n1ght_coder_128.jpg\",\n \"n3dmax_128.jpg\",\n \"n_tassone_128.jpg\",\n \"nacho_128.jpg\",\n \"naitanamoreno_128.jpg\",\n \"namankreative_128.jpg\",\n \"nandini_m_128.jpg\",\n \"nasirwd_128.jpg\",\n \"nastya_mane_128.jpg\",\n \"nateschulte_128.jpg\",\n \"nathalie_fs_128.jpg\",\n \"naupintos_128.jpg\",\n \"nbirckel_128.jpg\",\n \"nckjrvs_128.jpg\",\n \"necodymiconer_128.jpg\",\n \"nehfy_128.jpg\",\n \"nellleo_128.jpg\",\n \"nelshd_128.jpg\",\n \"nelsonjoyce_128.jpg\",\n \"nemanjaivanovic_128.jpg\",\n \"nepdud_128.jpg\",\n \"nerdgr8_128.jpg\",\n \"nerrsoft_128.jpg\",\n \"nessoila_128.jpg\",\n \"netonet_il_128.jpg\",\n \"newbrushes_128.jpg\",\n \"nfedoroff_128.jpg\",\n \"nickfratter_128.jpg\",\n \"nicklacke_128.jpg\",\n \"nicolai_larsen_128.jpg\",\n \"nicolasfolliot_128.jpg\",\n \"nicoleglynn_128.jpg\",\n \"nicollerich_128.jpg\",\n \"nilshelmersson_128.jpg\",\n \"nilshoenson_128.jpg\",\n \"ninjad3m0_128.jpg\",\n \"nitinhayaran_128.jpg\",\n \"nomidesigns_128.jpg\",\n \"normanbox_128.jpg\",\n \"notbadart_128.jpg\",\n \"noufalibrahim_128.jpg\",\n \"noxdzine_128.jpg\",\n \"nsamoylov_128.jpg\",\n \"ntfblog_128.jpg\",\n \"nutzumi_128.jpg\",\n \"nvkznemo_128.jpg\",\n \"nwdsha_128.jpg\",\n \"nyancecom_128.jpg\",\n \"oaktreemedia_128.jpg\",\n \"okandungel_128.jpg\",\n \"okansurreel_128.jpg\",\n \"okcoker_128.jpg\",\n \"oksanafrewer_128.jpg\",\n \"okseanjay_128.jpg\",\n \"oktayelipek_128.jpg\",\n \"olaolusoga_128.jpg\",\n \"olgary_128.jpg\",\n \"omnizya_128.jpg\",\n \"ooomz_128.jpg\",\n \"operatino_128.jpg\",\n \"opnsrce_128.jpg\",\n \"orkuncaylar_128.jpg\",\n \"oscarowusu_128.jpg\",\n \"oskamaya_128.jpg\",\n \"oskarlevinson_128.jpg\",\n \"osmanince_128.jpg\",\n \"osmond_128.jpg\",\n \"ostirbu_128.jpg\",\n \"osvaldas_128.jpg\",\n \"otozk_128.jpg\",\n \"ovall_128.jpg\",\n \"overcloacked_128.jpg\",\n \"overra_128.jpg\",\n \"panchajanyag_128.jpg\",\n \"panghal0_128.jpg\",\n \"patrickcoombe_128.jpg\",\n \"paulfarino_128.jpg\",\n \"pcridesagain_128.jpg\",\n \"peachananr_128.jpg\",\n \"pechkinator_128.jpg\",\n \"peejfancher_128.jpg\",\n \"pehamondello_128.jpg\",\n \"perfectflow_128.jpg\",\n \"perretmagali_128.jpg\",\n \"petar_prog_128.jpg\",\n \"petebernardo_128.jpg\",\n \"peter576_128.jpg\",\n \"peterlandt_128.jpg\",\n \"petrangr_128.jpg\",\n \"phillapier_128.jpg\",\n \"picard102_128.jpg\",\n \"pierre_nel_128.jpg\",\n \"pierrestoffe_128.jpg\",\n \"pifagor_128.jpg\",\n \"pixage_128.jpg\",\n \"plasticine_128.jpg\",\n \"plbabin_128.jpg\",\n \"pmeissner_128.jpg\",\n \"polarity_128.jpg\",\n \"ponchomendivil_128.jpg\",\n \"poormini_128.jpg\",\n \"popey_128.jpg\",\n \"posterjob_128.jpg\",\n \"praveen_vijaya_128.jpg\",\n \"prheemo_128.jpg\",\n \"primozcigler_128.jpg\",\n \"prinzadi_128.jpg\",\n \"privetwagner_128.jpg\",\n \"prrstn_128.jpg\",\n \"psaikali_128.jpg\",\n \"psdesignuk_128.jpg\",\n \"puzik_128.jpg\",\n \"pyronite_128.jpg\",\n \"quailandquasar_128.jpg\",\n \"r_garcia_128.jpg\",\n \"r_oy_128.jpg\",\n \"rachelreveley_128.jpg\",\n \"rahmeen_128.jpg\",\n \"ralph_lam_128.jpg\",\n \"ramanathan_pdy_128.jpg\",\n \"randomlies_128.jpg\",\n \"rangafangs_128.jpg\",\n \"raphaelnikson_128.jpg\",\n \"raquelwilson_128.jpg\",\n \"ratbus_128.jpg\",\n \"rawdiggie_128.jpg\",\n \"rdbannon_128.jpg\",\n \"rdsaunders_128.jpg\",\n \"reabo101_128.jpg\",\n \"reetajayendra_128.jpg\",\n \"rehatkathuria_128.jpg\",\n \"reideiredale_128.jpg\",\n \"renbyrd_128.jpg\",\n \"rez___a_128.jpg\",\n \"ricburton_128.jpg\",\n \"richardgarretts_128.jpg\",\n \"richwild_128.jpg\",\n \"rickdt_128.jpg\",\n \"rickyyean_128.jpg\",\n \"rikas_128.jpg\",\n \"ripplemdk_128.jpg\",\n \"rmlewisuk_128.jpg\",\n \"rob_thomas10_128.jpg\",\n \"robbschiller_128.jpg\",\n \"robergd_128.jpg\",\n \"robinclediere_128.jpg\",\n \"robinlayfield_128.jpg\",\n \"robturlinckx_128.jpg\",\n \"rodnylobos_128.jpg\",\n \"rohixx_128.jpg\",\n \"romanbulah_128.jpg\",\n \"roxanejammet_128.jpg\",\n \"roybarberuk_128.jpg\",\n \"rpatey_128.jpg\",\n \"rpeezy_128.jpg\",\n \"rtgibbons_128.jpg\",\n \"rtyukmaev_128.jpg\",\n \"rude_128.jpg\",\n \"ruehldesign_128.jpg\",\n \"runningskull_128.jpg\",\n \"russell_baylis_128.jpg\",\n \"russoedu_128.jpg\",\n \"ruzinav_128.jpg\",\n \"rweve_128.jpg\",\n \"ryandownie_128.jpg\",\n \"ryanjohnson_me_128.jpg\",\n \"ryankirkman_128.jpg\",\n \"ryanmclaughlin_128.jpg\",\n \"ryhanhassan_128.jpg\",\n \"ryuchi311_128.jpg\",\n \"s4f1_128.jpg\",\n \"saarabpreet_128.jpg\",\n \"sachacorazzi_128.jpg\",\n \"sachingawas_128.jpg\",\n \"safrankov_128.jpg\",\n \"sainraja_128.jpg\",\n \"salimianoff_128.jpg\",\n \"salleedesign_128.jpg\",\n \"salvafc_128.jpg\",\n \"samgrover_128.jpg\",\n \"samihah_128.jpg\",\n \"samscouto_128.jpg\",\n \"samuelkraft_128.jpg\",\n \"sandywoodruff_128.jpg\",\n \"sangdth_128.jpg\",\n \"santi_urso_128.jpg\",\n \"saschadroste_128.jpg\",\n \"saschamt_128.jpg\",\n \"sasha_shestakov_128.jpg\",\n \"saulihirvi_128.jpg\",\n \"sawalazar_128.jpg\",\n \"sawrb_128.jpg\",\n \"sbtransparent_128.jpg\",\n \"scips_128.jpg\",\n \"scott_riley_128.jpg\",\n \"scottfeltham_128.jpg\",\n \"scottgallant_128.jpg\",\n \"scottiedude_128.jpg\",\n \"scottkclark_128.jpg\",\n \"scrapdnb_128.jpg\",\n \"sdidonato_128.jpg\",\n \"sebashton_128.jpg\",\n \"sementiy_128.jpg\",\n \"serefka_128.jpg\",\n \"sergeyalmone_128.jpg\",\n \"sergeysafonov_128.jpg\",\n \"sethlouey_128.jpg\",\n \"seyedhossein1_128.jpg\",\n \"sgaurav_baghel_128.jpg\",\n \"shadeed9_128.jpg\",\n \"shalt0ni_128.jpg\",\n \"shaneIxD_128.jpg\",\n \"shanehudson_128.jpg\",\n \"sharvin_128.jpg\",\n \"shesgared_128.jpg\",\n \"shinze_128.jpg\",\n \"shoaib253_128.jpg\",\n \"shojberg_128.jpg\",\n \"shvelo96_128.jpg\",\n \"silv3rgvn_128.jpg\",\n \"silvanmuhlemann_128.jpg\",\n \"simobenso_128.jpg\",\n \"sindresorhus_128.jpg\",\n \"sircalebgrove_128.jpg\",\n \"skkirilov_128.jpg\",\n \"slowspock_128.jpg\",\n \"smaczny_128.jpg\",\n \"smalonso_128.jpg\",\n \"smenov_128.jpg\",\n \"snowshade_128.jpg\",\n \"snowwrite_128.jpg\",\n \"sokaniwaal_128.jpg\",\n \"solid_color_128.jpg\",\n \"souperphly_128.jpg\",\n \"souuf_128.jpg\",\n \"sovesove_128.jpg\",\n \"soyjavi_128.jpg\",\n \"spacewood__128.jpg\",\n \"spbroma_128.jpg\",\n \"spedwig_128.jpg\",\n \"sprayaga_128.jpg\",\n \"sreejithexp_128.jpg\",\n \"ssbb_me_128.jpg\",\n \"ssiskind_128.jpg\",\n \"sta1ex_128.jpg\",\n \"stalewine_128.jpg\",\n \"stan_128.jpg\",\n \"stayuber_128.jpg\",\n \"stefanotirloni_128.jpg\",\n \"stefanozoffoli_128.jpg\",\n \"stefooo_128.jpg\",\n \"stefvdham_128.jpg\",\n \"stephcoue_128.jpg\",\n \"sterlingrules_128.jpg\",\n \"stevedesigner_128.jpg\",\n \"steynviljoen_128.jpg\",\n \"strikewan_128.jpg\",\n \"stushona_128.jpg\",\n \"sulaqo_128.jpg\",\n \"sunlandictwin_128.jpg\",\n \"sunshinedgirl_128.jpg\",\n \"superoutman_128.jpg\",\n \"supervova_128.jpg\",\n \"supjoey_128.jpg\",\n \"suprb_128.jpg\",\n \"sur4dye_128.jpg\",\n \"surgeonist_128.jpg\",\n \"suribbles_128.jpg\",\n \"svenlen_128.jpg\",\n \"swaplord_128.jpg\",\n \"sweetdelisa_128.jpg\",\n \"switmer777_128.jpg\",\n \"swooshycueb_128.jpg\",\n \"sydlawrence_128.jpg\",\n \"syropian_128.jpg\",\n \"tanveerrao_128.jpg\",\n \"taybenlor_128.jpg\",\n \"taylorling_128.jpg\",\n \"tbakdesigns_128.jpg\",\n \"teddyzetterlund_128.jpg\",\n \"teeragit_128.jpg\",\n \"tereshenkov_128.jpg\",\n \"terpimost_128.jpg\",\n \"terrorpixel_128.jpg\",\n \"terryxlife_128.jpg\",\n \"teylorfeliz_128.jpg\",\n \"tgerken_128.jpg\",\n \"tgormtx_128.jpg\",\n \"thaisselenator__128.jpg\",\n \"thaodang17_128.jpg\",\n \"thatonetommy_128.jpg\",\n \"the_purplebunny_128.jpg\",\n \"the_winslet_128.jpg\",\n \"thedamianhdez_128.jpg\",\n \"thedjpetersen_128.jpg\",\n \"thehacker_128.jpg\",\n \"thekevinjones_128.jpg\",\n \"themadray_128.jpg\",\n \"themikenagle_128.jpg\",\n \"themrdave_128.jpg\",\n \"theonlyzeke_128.jpg\",\n \"therealmarvin_128.jpg\",\n \"thewillbeard_128.jpg\",\n \"thiagovernetti_128.jpg\",\n \"thibaut_re_128.jpg\",\n \"thierrykoblentz_128.jpg\",\n \"thierrymeier__128.jpg\",\n \"thimo_cz_128.jpg\",\n \"thinkleft_128.jpg\",\n \"thomasgeisen_128.jpg\",\n \"thomasschrijer_128.jpg\",\n \"timgthomas_128.jpg\",\n \"timmillwood_128.jpg\",\n \"timothycd_128.jpg\",\n \"timpetricola_128.jpg\",\n \"tjrus_128.jpg\",\n \"to_soham_128.jpg\",\n \"tobysaxon_128.jpg\",\n \"toddrew_128.jpg\",\n \"tom_even_128.jpg\",\n \"tomas_janousek_128.jpg\",\n \"tonymillion_128.jpg\",\n \"traneblow_128.jpg\",\n \"travis_arnold_128.jpg\",\n \"travishines_128.jpg\",\n \"tristanlegros_128.jpg\",\n \"trubeatto_128.jpg\",\n \"trueblood_33_128.jpg\",\n \"tumski_128.jpg\",\n \"tur8le_128.jpg\",\n \"turkutuuli_128.jpg\",\n \"tweetubhai_128.jpg\",\n \"twittypork_128.jpg\",\n \"txcx_128.jpg\",\n \"uberschizo_128.jpg\",\n \"ultragex_128.jpg\",\n \"umurgdk_128.jpg\",\n \"unterdreht_128.jpg\",\n \"urrutimeoli_128.jpg\",\n \"uxalex_128.jpg\",\n \"uxpiper_128.jpg\",\n \"uxward_128.jpg\",\n \"vanchesz_128.jpg\",\n \"vaughanmoffitt_128.jpg\",\n \"vc27_128.jpg\",\n \"vicivadeline_128.jpg\",\n \"victorDubugras_128.jpg\",\n \"victor_haydin_128.jpg\",\n \"victordeanda_128.jpg\",\n \"victorerixon_128.jpg\",\n \"victorquinn_128.jpg\",\n \"victorstuber_128.jpg\",\n \"vigobronx_128.jpg\",\n \"vijaykarthik_128.jpg\",\n \"vikashpathak18_128.jpg\",\n \"vikasvinfotech_128.jpg\",\n \"vimarethomas_128.jpg\",\n \"vinciarts_128.jpg\",\n \"vitor376_128.jpg\",\n \"vitorleal_128.jpg\",\n \"vivekprvr_128.jpg\",\n \"vj_demien_128.jpg\",\n \"vladarbatov_128.jpg\",\n \"vladimirdevic_128.jpg\",\n \"vladyn_128.jpg\",\n \"vlajki_128.jpg\",\n \"vm_f_128.jpg\",\n \"vocino_128.jpg\",\n \"vonachoo_128.jpg\",\n \"vovkasolovev_128.jpg\",\n \"vytautas_a_128.jpg\",\n \"waghner_128.jpg\",\n \"wake_gs_128.jpg\",\n \"we_social_128.jpg\",\n \"wearesavas_128.jpg\",\n \"weavermedia_128.jpg\",\n \"webtanya_128.jpg\",\n \"weglov_128.jpg\",\n \"wegotvices_128.jpg\",\n \"wesleytrankin_128.jpg\",\n \"wikiziner_128.jpg\",\n \"wiljanslofstra_128.jpg\",\n \"wim1k_128.jpg\",\n \"wintopia_128.jpg\",\n \"woodsman001_128.jpg\",\n \"woodydotmx_128.jpg\",\n \"wtrsld_128.jpg\",\n \"xadhix_128.jpg\",\n \"xalionmalik_128.jpg\",\n \"xamorep_128.jpg\",\n \"xiel_128.jpg\",\n \"xilantra_128.jpg\",\n \"xravil_128.jpg\",\n \"xripunov_128.jpg\",\n \"xtopherpaul_128.jpg\",\n \"y2graphic_128.jpg\",\n \"yalozhkin_128.jpg\",\n \"yassiryahya_128.jpg\",\n \"yayteejay_128.jpg\",\n \"yecidsm_128.jpg\",\n \"yehudab_128.jpg\",\n \"yesmeck_128.jpg\",\n \"yigitpinarbasi_128.jpg\",\n \"zackeeler_128.jpg\",\n \"zaki3d_128.jpg\",\n \"zauerkraut_128.jpg\",\n \"zforrester_128.jpg\",\n \"zvchkelly_128.jpg\",\n];\n\n},{}],129:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"com\",\n \"biz\",\n \"info\",\n \"name\",\n \"net\",\n \"org\"\n];\n\n},{}],130:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"example.org\",\n \"example.com\",\n \"example.net\"\n];\n\n},{}],131:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\"\n];\n\n},{}],132:[function(require,module,exports){\nvar internet = {};\nmodule['exports'] = internet;\ninternet.free_email = require(\"./free_email\");\ninternet.example_email = require(\"./example_email\");\ninternet.domain_suffix = require(\"./domain_suffix\");\ninternet.avatar_uri = require(\"./avatar_uri\");\n\n},{\"./avatar_uri\":128,\"./domain_suffix\":129,\"./example_email\":130,\"./free_email\":131}],133:[function(require,module,exports){\nvar lorem = {};\nmodule['exports'] = lorem;\nlorem.words = require(\"./words\");\nlorem.supplemental = require(\"./supplemental\");\n\n},{\"./supplemental\":134,\"./words\":135}],134:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"abbas\",\n \"abduco\",\n \"abeo\",\n \"abscido\",\n \"absconditus\",\n \"absens\",\n \"absorbeo\",\n \"absque\",\n \"abstergo\",\n \"absum\",\n \"abundans\",\n \"abutor\",\n \"accedo\",\n \"accendo\",\n \"acceptus\",\n \"accipio\",\n \"accommodo\",\n \"accusator\",\n \"acer\",\n \"acerbitas\",\n \"acervus\",\n \"acidus\",\n \"acies\",\n \"acquiro\",\n \"acsi\",\n \"adamo\",\n \"adaugeo\",\n \"addo\",\n \"adduco\",\n \"ademptio\",\n \"adeo\",\n \"adeptio\",\n \"adfectus\",\n \"adfero\",\n \"adficio\",\n \"adflicto\",\n \"adhaero\",\n \"adhuc\",\n \"adicio\",\n \"adimpleo\",\n \"adinventitias\",\n \"adipiscor\",\n \"adiuvo\",\n \"administratio\",\n \"admiratio\",\n \"admitto\",\n \"admoneo\",\n \"admoveo\",\n \"adnuo\",\n \"adopto\",\n \"adsidue\",\n \"adstringo\",\n \"adsuesco\",\n \"adsum\",\n \"adulatio\",\n \"adulescens\",\n \"adultus\",\n \"aduro\",\n \"advenio\",\n \"adversus\",\n \"advoco\",\n \"aedificium\",\n \"aeger\",\n \"aegre\",\n \"aegrotatio\",\n \"aegrus\",\n \"aeneus\",\n \"aequitas\",\n \"aequus\",\n \"aer\",\n \"aestas\",\n \"aestivus\",\n \"aestus\",\n \"aetas\",\n \"aeternus\",\n \"ager\",\n \"aggero\",\n \"aggredior\",\n \"agnitio\",\n \"agnosco\",\n \"ago\",\n \"ait\",\n \"aiunt\",\n \"alienus\",\n \"alii\",\n \"alioqui\",\n \"aliqua\",\n \"alius\",\n \"allatus\",\n \"alo\",\n \"alter\",\n \"altus\",\n \"alveus\",\n \"amaritudo\",\n \"ambitus\",\n \"ambulo\",\n \"amicitia\",\n \"amiculum\",\n \"amissio\",\n \"amita\",\n \"amitto\",\n \"amo\",\n \"amor\",\n \"amoveo\",\n \"amplexus\",\n \"amplitudo\",\n \"amplus\",\n \"ancilla\",\n \"angelus\",\n \"angulus\",\n \"angustus\",\n \"animadverto\",\n \"animi\",\n \"animus\",\n \"annus\",\n \"anser\",\n \"ante\",\n \"antea\",\n \"antepono\",\n \"antiquus\",\n \"aperio\",\n \"aperte\",\n \"apostolus\",\n \"apparatus\",\n \"appello\",\n \"appono\",\n \"appositus\",\n \"approbo\",\n \"apto\",\n \"aptus\",\n \"apud\",\n \"aqua\",\n \"ara\",\n \"aranea\",\n \"arbitro\",\n \"arbor\",\n \"arbustum\",\n \"arca\",\n \"arceo\",\n \"arcesso\",\n \"arcus\",\n \"argentum\",\n \"argumentum\",\n \"arguo\",\n \"arma\",\n \"armarium\",\n \"armo\",\n \"aro\",\n \"ars\",\n \"articulus\",\n \"artificiose\",\n \"arto\",\n \"arx\",\n \"ascisco\",\n \"ascit\",\n \"asper\",\n \"aspicio\",\n \"asporto\",\n \"assentator\",\n \"astrum\",\n \"atavus\",\n \"ater\",\n \"atqui\",\n \"atrocitas\",\n \"atrox\",\n \"attero\",\n \"attollo\",\n \"attonbitus\",\n \"auctor\",\n \"auctus\",\n \"audacia\",\n \"audax\",\n \"audentia\",\n \"audeo\",\n \"audio\",\n \"auditor\",\n \"aufero\",\n \"aureus\",\n \"auris\",\n \"aurum\",\n \"aut\",\n \"autem\",\n \"autus\",\n \"auxilium\",\n \"avaritia\",\n \"avarus\",\n \"aveho\",\n \"averto\",\n \"avoco\",\n \"baiulus\",\n \"balbus\",\n \"barba\",\n \"bardus\",\n \"basium\",\n \"beatus\",\n \"bellicus\",\n \"bellum\",\n \"bene\",\n \"beneficium\",\n \"benevolentia\",\n \"benigne\",\n \"bestia\",\n \"bibo\",\n \"bis\",\n \"blandior\",\n \"bonus\",\n \"bos\",\n \"brevis\",\n \"cado\",\n \"caecus\",\n \"caelestis\",\n \"caelum\",\n \"calamitas\",\n \"calcar\",\n \"calco\",\n \"calculus\",\n \"callide\",\n \"campana\",\n \"candidus\",\n \"canis\",\n \"canonicus\",\n \"canto\",\n \"capillus\",\n \"capio\",\n \"capitulus\",\n \"capto\",\n \"caput\",\n \"carbo\",\n \"carcer\",\n \"careo\",\n \"caries\",\n \"cariosus\",\n \"caritas\",\n \"carmen\",\n \"carpo\",\n \"carus\",\n \"casso\",\n \"caste\",\n \"casus\",\n \"catena\",\n \"caterva\",\n \"cattus\",\n \"cauda\",\n \"causa\",\n \"caute\",\n \"caveo\",\n \"cavus\",\n \"cedo\",\n \"celebrer\",\n \"celer\",\n \"celo\",\n \"cena\",\n \"cenaculum\",\n \"ceno\",\n \"censura\",\n \"centum\",\n \"cerno\",\n \"cernuus\",\n \"certe\",\n \"certo\",\n \"certus\",\n \"cervus\",\n \"cetera\",\n \"charisma\",\n \"chirographum\",\n \"cibo\",\n \"cibus\",\n \"cicuta\",\n \"cilicium\",\n \"cimentarius\",\n \"ciminatio\",\n \"cinis\",\n \"circumvenio\",\n \"cito\",\n \"civis\",\n \"civitas\",\n \"clam\",\n \"clamo\",\n \"claro\",\n \"clarus\",\n \"claudeo\",\n \"claustrum\",\n \"clementia\",\n \"clibanus\",\n \"coadunatio\",\n \"coaegresco\",\n \"coepi\",\n \"coerceo\",\n \"cogito\",\n \"cognatus\",\n \"cognomen\",\n \"cogo\",\n \"cohaero\",\n \"cohibeo\",\n \"cohors\",\n \"colligo\",\n \"colloco\",\n \"collum\",\n \"colo\",\n \"color\",\n \"coma\",\n \"combibo\",\n \"comburo\",\n \"comedo\",\n \"comes\",\n \"cometes\",\n \"comis\",\n \"comitatus\",\n \"commemoro\",\n \"comminor\",\n \"commodo\",\n \"communis\",\n \"comparo\",\n \"compello\",\n \"complectus\",\n \"compono\",\n \"comprehendo\",\n \"comptus\",\n \"conatus\",\n \"concedo\",\n \"concido\",\n \"conculco\",\n \"condico\",\n \"conduco\",\n \"confero\",\n \"confido\",\n \"conforto\",\n \"confugo\",\n \"congregatio\",\n \"conicio\",\n \"coniecto\",\n \"conitor\",\n \"coniuratio\",\n \"conor\",\n \"conqueror\",\n \"conscendo\",\n \"conservo\",\n \"considero\",\n \"conspergo\",\n \"constans\",\n \"consuasor\",\n \"contabesco\",\n \"contego\",\n \"contigo\",\n \"contra\",\n \"conturbo\",\n \"conventus\",\n \"convoco\",\n \"copia\",\n \"copiose\",\n \"cornu\",\n \"corona\",\n \"corpus\",\n \"correptius\",\n \"corrigo\",\n \"corroboro\",\n \"corrumpo\",\n \"coruscus\",\n \"cotidie\",\n \"crapula\",\n \"cras\",\n \"crastinus\",\n \"creator\",\n \"creber\",\n \"crebro\",\n \"credo\",\n \"creo\",\n \"creptio\",\n \"crepusculum\",\n \"cresco\",\n \"creta\",\n \"cribro\",\n \"crinis\",\n \"cruciamentum\",\n \"crudelis\",\n \"cruentus\",\n \"crur\",\n \"crustulum\",\n \"crux\",\n \"cubicularis\",\n \"cubitum\",\n \"cubo\",\n \"cui\",\n \"cuius\",\n \"culpa\",\n \"culpo\",\n \"cultellus\",\n \"cultura\",\n \"cum\",\n \"cunabula\",\n \"cunae\",\n \"cunctatio\",\n \"cupiditas\",\n \"cupio\",\n \"cuppedia\",\n \"cupressus\",\n \"cur\",\n \"cura\",\n \"curatio\",\n \"curia\",\n \"curiositas\",\n \"curis\",\n \"curo\",\n \"curriculum\",\n \"currus\",\n \"cursim\",\n \"curso\",\n \"cursus\",\n \"curto\",\n \"curtus\",\n \"curvo\",\n \"curvus\",\n \"custodia\",\n \"damnatio\",\n \"damno\",\n \"dapifer\",\n \"debeo\",\n \"debilito\",\n \"decens\",\n \"decerno\",\n \"decet\",\n \"decimus\",\n \"decipio\",\n \"decor\",\n \"decretum\",\n \"decumbo\",\n \"dedecor\",\n \"dedico\",\n \"deduco\",\n \"defaeco\",\n \"defendo\",\n \"defero\",\n \"defessus\",\n \"defetiscor\",\n \"deficio\",\n \"defigo\",\n \"defleo\",\n \"defluo\",\n \"defungo\",\n \"degenero\",\n \"degero\",\n \"degusto\",\n \"deinde\",\n \"delectatio\",\n \"delego\",\n \"deleo\",\n \"delibero\",\n \"delicate\",\n \"delinquo\",\n \"deludo\",\n \"demens\",\n \"demergo\",\n \"demitto\",\n \"demo\",\n \"demonstro\",\n \"demoror\",\n \"demulceo\",\n \"demum\",\n \"denego\",\n \"denique\",\n \"dens\",\n \"denuncio\",\n \"denuo\",\n \"deorsum\",\n \"depereo\",\n \"depono\",\n \"depopulo\",\n \"deporto\",\n \"depraedor\",\n \"deprecator\",\n \"deprimo\",\n \"depromo\",\n \"depulso\",\n \"deputo\",\n \"derelinquo\",\n \"derideo\",\n \"deripio\",\n \"desidero\",\n \"desino\",\n \"desipio\",\n \"desolo\",\n \"desparatus\",\n \"despecto\",\n \"despirmatio\",\n \"infit\",\n \"inflammatio\",\n \"paens\",\n \"patior\",\n \"patria\",\n \"patrocinor\",\n \"patruus\",\n \"pauci\",\n \"paulatim\",\n \"pauper\",\n \"pax\",\n \"peccatus\",\n \"pecco\",\n \"pecto\",\n \"pectus\",\n \"pecunia\",\n \"pecus\",\n \"peior\",\n \"pel\",\n \"ocer\",\n \"socius\",\n \"sodalitas\",\n \"sol\",\n \"soleo\",\n \"solio\",\n \"solitudo\",\n \"solium\",\n \"sollers\",\n \"sollicito\",\n \"solum\",\n \"solus\",\n \"solutio\",\n \"solvo\",\n \"somniculosus\",\n \"somnus\",\n \"sonitus\",\n \"sono\",\n \"sophismata\",\n \"sopor\",\n \"sordeo\",\n \"sortitus\",\n \"spargo\",\n \"speciosus\",\n \"spectaculum\",\n \"speculum\",\n \"sperno\",\n \"spero\",\n \"spes\",\n \"spiculum\",\n \"spiritus\",\n \"spoliatio\",\n \"sponte\",\n \"stabilis\",\n \"statim\",\n \"statua\",\n \"stella\",\n \"stillicidium\",\n \"stipes\",\n \"stips\",\n \"sto\",\n \"strenuus\",\n \"strues\",\n \"studio\",\n \"stultus\",\n \"suadeo\",\n \"suasoria\",\n \"sub\",\n \"subito\",\n \"subiungo\",\n \"sublime\",\n \"subnecto\",\n \"subseco\",\n \"substantia\",\n \"subvenio\",\n \"succedo\",\n \"succurro\",\n \"sufficio\",\n \"suffoco\",\n \"suffragium\",\n \"suggero\",\n \"sui\",\n \"sulum\",\n \"sum\",\n \"summa\",\n \"summisse\",\n \"summopere\",\n \"sumo\",\n \"sumptus\",\n \"supellex\",\n \"super\",\n \"suppellex\",\n \"supplanto\",\n \"suppono\",\n \"supra\",\n \"surculus\",\n \"surgo\",\n \"sursum\",\n \"suscipio\",\n \"suspendo\",\n \"sustineo\",\n \"suus\",\n \"synagoga\",\n \"tabella\",\n \"tabernus\",\n \"tabesco\",\n \"tabgo\",\n \"tabula\",\n \"taceo\",\n \"tactus\",\n \"taedium\",\n \"talio\",\n \"talis\",\n \"talus\",\n \"tam\",\n \"tamdiu\",\n \"tamen\",\n \"tametsi\",\n \"tamisium\",\n \"tamquam\",\n \"tandem\",\n \"tantillus\",\n \"tantum\",\n \"tardus\",\n \"tego\",\n \"temeritas\",\n \"temperantia\",\n \"templum\",\n \"temptatio\",\n \"tempus\",\n \"tenax\",\n \"tendo\",\n \"teneo\",\n \"tener\",\n \"tenuis\",\n \"tenus\",\n \"tepesco\",\n \"tepidus\",\n \"ter\",\n \"terebro\",\n \"teres\",\n \"terga\",\n \"tergeo\",\n \"tergiversatio\",\n \"tergo\",\n \"tergum\",\n \"termes\",\n \"terminatio\",\n \"tero\",\n \"terra\",\n \"terreo\",\n \"territo\",\n \"terror\",\n \"tersus\",\n \"tertius\",\n \"testimonium\",\n \"texo\",\n \"textilis\",\n \"textor\",\n \"textus\",\n \"thalassinus\",\n \"theatrum\",\n \"theca\",\n \"thema\",\n \"theologus\",\n \"thermae\",\n \"thesaurus\",\n \"thesis\",\n \"thorax\",\n \"thymbra\",\n \"thymum\",\n \"tibi\",\n \"timidus\",\n \"timor\",\n \"titulus\",\n \"tolero\",\n \"tollo\",\n \"tondeo\",\n \"tonsor\",\n \"torqueo\",\n \"torrens\",\n \"tot\",\n \"totidem\",\n \"toties\",\n \"totus\",\n \"tracto\",\n \"trado\",\n \"traho\",\n \"trans\",\n \"tredecim\",\n \"tremo\",\n \"trepide\",\n \"tres\",\n \"tribuo\",\n \"tricesimus\",\n \"triduana\",\n \"triginta\",\n \"tripudio\",\n \"tristis\",\n \"triumphus\",\n \"trucido\",\n \"truculenter\",\n \"tubineus\",\n \"tui\",\n \"tum\",\n \"tumultus\",\n \"tunc\",\n \"turba\",\n \"turbo\",\n \"turpe\",\n \"turpis\",\n \"tutamen\",\n \"tutis\",\n \"tyrannus\",\n \"uberrime\",\n \"ubi\",\n \"ulciscor\",\n \"ullus\",\n \"ulterius\",\n \"ultio\",\n \"ultra\",\n \"umbra\",\n \"umerus\",\n \"umquam\",\n \"una\",\n \"unde\",\n \"undique\",\n \"universe\",\n \"unus\",\n \"urbanus\",\n \"urbs\",\n \"uredo\",\n \"usitas\",\n \"usque\",\n \"ustilo\",\n \"ustulo\",\n \"usus\",\n \"uter\",\n \"uterque\",\n \"utilis\",\n \"utique\",\n \"utor\",\n \"utpote\",\n \"utrimque\",\n \"utroque\",\n \"utrum\",\n \"uxor\",\n \"vaco\",\n \"vacuus\",\n \"vado\",\n \"vae\",\n \"valde\",\n \"valens\",\n \"valeo\",\n \"valetudo\",\n \"validus\",\n \"vallum\",\n \"vapulus\",\n \"varietas\",\n \"varius\",\n \"vehemens\",\n \"vel\",\n \"velociter\",\n \"velum\",\n \"velut\",\n \"venia\",\n \"venio\",\n \"ventito\",\n \"ventosus\",\n \"ventus\",\n \"venustas\",\n \"ver\",\n \"verbera\",\n \"verbum\",\n \"vere\",\n \"verecundia\",\n \"vereor\",\n \"vergo\",\n \"veritas\",\n \"vero\",\n \"versus\",\n \"verto\",\n \"verumtamen\",\n \"verus\",\n \"vesco\",\n \"vesica\",\n \"vesper\",\n \"vespillo\",\n \"vester\",\n \"vestigium\",\n \"vestrum\",\n \"vetus\",\n \"via\",\n \"vicinus\",\n \"vicissitudo\",\n \"victoria\",\n \"victus\",\n \"videlicet\",\n \"video\",\n \"viduata\",\n \"viduo\",\n \"vigilo\",\n \"vigor\",\n \"vilicus\",\n \"vilis\",\n \"vilitas\",\n \"villa\",\n \"vinco\",\n \"vinculum\",\n \"vindico\",\n \"vinitor\",\n \"vinum\",\n \"vir\",\n \"virga\",\n \"virgo\",\n \"viridis\",\n \"viriliter\",\n \"virtus\",\n \"vis\",\n \"viscus\",\n \"vita\",\n \"vitiosus\",\n \"vitium\",\n \"vito\",\n \"vivo\",\n \"vix\",\n \"vobis\",\n \"vociferor\",\n \"voco\",\n \"volaticus\",\n \"volo\",\n \"volubilis\",\n \"voluntarius\",\n \"volup\",\n \"volutabrum\",\n \"volva\",\n \"vomer\",\n \"vomica\",\n \"vomito\",\n \"vorago\",\n \"vorax\",\n \"voro\",\n \"vos\",\n \"votum\",\n \"voveo\",\n \"vox\",\n \"vulariter\",\n \"vulgaris\",\n \"vulgivagus\",\n \"vulgo\",\n \"vulgus\",\n \"vulnero\",\n \"vulnus\",\n \"vulpes\",\n \"vulticulus\",\n \"vultuosus\",\n \"xiphias\"\n];\n\n},{}],135:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"alias\",\n \"consequatur\",\n \"aut\",\n \"perferendis\",\n \"sit\",\n \"voluptatem\",\n \"accusantium\",\n \"doloremque\",\n \"aperiam\",\n \"eaque\",\n \"ipsa\",\n \"quae\",\n \"ab\",\n \"illo\",\n \"inventore\",\n \"veritatis\",\n \"et\",\n \"quasi\",\n \"architecto\",\n \"beatae\",\n \"vitae\",\n \"dicta\",\n \"sunt\",\n \"explicabo\",\n \"aspernatur\",\n \"aut\",\n \"odit\",\n \"aut\",\n \"fugit\",\n \"sed\",\n \"quia\",\n \"consequuntur\",\n \"magni\",\n \"dolores\",\n \"eos\",\n \"qui\",\n \"ratione\",\n \"voluptatem\",\n \"sequi\",\n \"nesciunt\",\n \"neque\",\n \"dolorem\",\n \"ipsum\",\n \"quia\",\n \"dolor\",\n \"sit\",\n \"amet\",\n \"consectetur\",\n \"adipisci\",\n \"velit\",\n \"sed\",\n \"quia\",\n \"non\",\n \"numquam\",\n \"eius\",\n \"modi\",\n \"tempora\",\n \"incidunt\",\n \"ut\",\n \"labore\",\n \"et\",\n \"dolore\",\n \"magnam\",\n \"aliquam\",\n \"quaerat\",\n \"voluptatem\",\n \"ut\",\n \"enim\",\n \"ad\",\n \"minima\",\n \"veniam\",\n \"quis\",\n \"nostrum\",\n \"exercitationem\",\n \"ullam\",\n \"corporis\",\n \"nemo\",\n \"enim\",\n \"ipsam\",\n \"voluptatem\",\n \"quia\",\n \"voluptas\",\n \"sit\",\n \"suscipit\",\n \"laboriosam\",\n \"nisi\",\n \"ut\",\n \"aliquid\",\n \"ex\",\n \"ea\",\n \"commodi\",\n \"consequatur\",\n \"quis\",\n \"autem\",\n \"vel\",\n \"eum\",\n \"iure\",\n \"reprehenderit\",\n \"qui\",\n \"in\",\n \"ea\",\n \"voluptate\",\n \"velit\",\n \"esse\",\n \"quam\",\n \"nihil\",\n \"molestiae\",\n \"et\",\n \"iusto\",\n \"odio\",\n \"dignissimos\",\n \"ducimus\",\n \"qui\",\n \"blanditiis\",\n \"praesentium\",\n \"laudantium\",\n \"totam\",\n \"rem\",\n \"voluptatum\",\n \"deleniti\",\n \"atque\",\n \"corrupti\",\n \"quos\",\n \"dolores\",\n \"et\",\n \"quas\",\n \"molestias\",\n \"excepturi\",\n \"sint\",\n \"occaecati\",\n \"cupiditate\",\n \"non\",\n \"provident\",\n \"sed\",\n \"ut\",\n \"perspiciatis\",\n \"unde\",\n \"omnis\",\n \"iste\",\n \"natus\",\n \"error\",\n \"similique\",\n \"sunt\",\n \"in\",\n \"culpa\",\n \"qui\",\n \"officia\",\n \"deserunt\",\n \"mollitia\",\n \"animi\",\n \"id\",\n \"est\",\n \"laborum\",\n \"et\",\n \"dolorum\",\n \"fuga\",\n \"et\",\n \"harum\",\n \"quidem\",\n \"rerum\",\n \"facilis\",\n \"est\",\n \"et\",\n \"expedita\",\n \"distinctio\",\n \"nam\",\n \"libero\",\n \"tempore\",\n \"cum\",\n \"soluta\",\n \"nobis\",\n \"est\",\n \"eligendi\",\n \"optio\",\n \"cumque\",\n \"nihil\",\n \"impedit\",\n \"quo\",\n \"porro\",\n \"quisquam\",\n \"est\",\n \"qui\",\n \"minus\",\n \"id\",\n \"quod\",\n \"maxime\",\n \"placeat\",\n \"facere\",\n \"possimus\",\n \"omnis\",\n \"voluptas\",\n \"assumenda\",\n \"est\",\n \"omnis\",\n \"dolor\",\n \"repellendus\",\n \"temporibus\",\n \"autem\",\n \"quibusdam\",\n \"et\",\n \"aut\",\n \"consequatur\",\n \"vel\",\n \"illum\",\n \"qui\",\n \"dolorem\",\n \"eum\",\n \"fugiat\",\n \"quo\",\n \"voluptas\",\n \"nulla\",\n \"pariatur\",\n \"at\",\n \"vero\",\n \"eos\",\n \"et\",\n \"accusamus\",\n \"officiis\",\n \"debitis\",\n \"aut\",\n \"rerum\",\n \"necessitatibus\",\n \"saepe\",\n \"eveniet\",\n \"ut\",\n \"et\",\n \"voluptates\",\n \"repudiandae\",\n \"sint\",\n \"et\",\n \"molestiae\",\n \"non\",\n \"recusandae\",\n \"itaque\",\n \"earum\",\n \"rerum\",\n \"hic\",\n \"tenetur\",\n \"a\",\n \"sapiente\",\n \"delectus\",\n \"ut\",\n \"aut\",\n \"reiciendis\",\n \"voluptatibus\",\n \"maiores\",\n \"doloribus\",\n \"asperiores\",\n \"repellat\"\n];\n\n},{}],136:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Rock\",\n \"Metal\",\n \"Pop\",\n \"Electronic\",\n \"Folk\",\n \"World\",\n \"Country\",\n \"Jazz\",\n \"Funk\",\n \"Soul\",\n \"Hip Hop\",\n \"Classical\",\n \"Latin\",\n \"Reggae\",\n \"Stage And Screen\",\n \"Blues\",\n \"Non Music\",\n \"Rap\"\n];\n\n},{}],137:[function(require,module,exports){\nvar music = {};\nmodule['exports'] = music;\nmusic.genre = require(\"./genre\");\n\n},{\"./genre\":136}],138:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Female\",\n \"Male\"\n];\n},{}],139:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Mary\",\n \"Patricia\",\n \"Linda\",\n \"Barbara\",\n \"Elizabeth\",\n \"Jennifer\",\n \"Maria\",\n \"Susan\",\n \"Margaret\",\n \"Dorothy\",\n \"Lisa\",\n \"Nancy\",\n \"Karen\",\n \"Betty\",\n \"Helen\",\n \"Sandra\",\n \"Donna\",\n \"Carol\",\n \"Ruth\",\n \"Sharon\",\n \"Michelle\",\n \"Laura\",\n \"Sarah\",\n \"Kimberly\",\n \"Deborah\",\n \"Jessica\",\n \"Shirley\",\n \"Cynthia\",\n \"Angela\",\n \"Melissa\",\n \"Brenda\",\n \"Amy\",\n \"Anna\",\n \"Rebecca\",\n \"Virginia\",\n \"Kathleen\",\n \"Pamela\",\n \"Martha\",\n \"Debra\",\n \"Amanda\",\n \"Stephanie\",\n \"Carolyn\",\n \"Christine\",\n \"Marie\",\n \"Janet\",\n \"Catherine\",\n \"Frances\",\n \"Ann\",\n \"Joyce\",\n \"Diane\",\n \"Alice\",\n \"Julie\",\n \"Heather\",\n \"Teresa\",\n \"Doris\",\n \"Gloria\",\n \"Evelyn\",\n \"Jean\",\n \"Cheryl\",\n \"Mildred\",\n \"Katherine\",\n \"Joan\",\n \"Ashley\",\n \"Judith\",\n \"Rose\",\n \"Janice\",\n \"Kelly\",\n \"Nicole\",\n \"Judy\",\n \"Christina\",\n \"Kathy\",\n \"Theresa\",\n \"Beverly\",\n \"Denise\",\n \"Tammy\",\n \"Irene\",\n \"Jane\",\n \"Lori\",\n \"Rachel\",\n \"Marilyn\",\n \"Andrea\",\n \"Kathryn\",\n \"Louise\",\n \"Sara\",\n \"Anne\",\n \"Jacqueline\",\n \"Wanda\",\n \"Bonnie\",\n \"Julia\",\n \"Ruby\",\n \"Lois\",\n \"Tina\",\n \"Phyllis\",\n \"Norma\",\n \"Paula\",\n \"Diana\",\n \"Annie\",\n \"Lillian\",\n \"Emily\",\n \"Robin\",\n \"Peggy\",\n \"Crystal\",\n \"Gladys\",\n \"Rita\",\n \"Dawn\",\n \"Connie\",\n \"Florence\",\n \"Tracy\",\n \"Edna\",\n \"Tiffany\",\n \"Carmen\",\n \"Rosa\",\n \"Cindy\",\n \"Grace\",\n \"Wendy\",\n \"Victoria\",\n \"Edith\",\n \"Kim\",\n \"Sherry\",\n \"Sylvia\",\n \"Josephine\",\n \"Thelma\",\n \"Shannon\",\n \"Sheila\",\n \"Ethel\",\n \"Ellen\",\n \"Elaine\",\n \"Marjorie\",\n \"Carrie\",\n \"Charlotte\",\n \"Monica\",\n \"Esther\",\n \"Pauline\",\n \"Emma\",\n \"Juanita\",\n \"Anita\",\n \"Rhonda\",\n \"Hazel\",\n \"Amber\",\n \"Eva\",\n \"Debbie\",\n \"April\",\n \"Leslie\",\n \"Clara\",\n \"Lucille\",\n \"Jamie\",\n \"Joanne\",\n \"Eleanor\",\n \"Valerie\",\n \"Danielle\",\n \"Megan\",\n \"Alicia\",\n \"Suzanne\",\n \"Michele\",\n \"Gail\",\n \"Bertha\",\n \"Darlene\",\n \"Veronica\",\n \"Jill\",\n \"Erin\",\n \"Geraldine\",\n \"Lauren\",\n \"Cathy\",\n \"Joann\",\n \"Lorraine\",\n \"Lynn\",\n \"Sally\",\n \"Regina\",\n \"Erica\",\n \"Beatrice\",\n \"Dolores\",\n \"Bernice\",\n \"Audrey\",\n \"Yvonne\",\n \"Annette\",\n \"June\",\n \"Samantha\",\n \"Marion\",\n \"Dana\",\n \"Stacy\",\n \"Ana\",\n \"Renee\",\n \"Ida\",\n \"Vivian\",\n \"Roberta\",\n \"Holly\",\n \"Brittany\",\n \"Melanie\",\n \"Loretta\",\n \"Yolanda\",\n \"Jeanette\",\n \"Laurie\",\n \"Katie\",\n \"Kristen\",\n \"Vanessa\",\n \"Alma\",\n \"Sue\",\n \"Elsie\",\n \"Beth\",\n \"Jeanne\",\n \"Vicki\",\n \"Carla\",\n \"Tara\",\n \"Rosemary\",\n \"Eileen\",\n \"Terri\",\n \"Gertrude\",\n \"Lucy\",\n \"Tonya\",\n \"Ella\",\n \"Stacey\",\n \"Wilma\",\n \"Gina\",\n \"Kristin\",\n \"Jessie\",\n \"Natalie\",\n \"Agnes\",\n \"Vera\",\n \"Willie\",\n \"Charlene\",\n \"Bessie\",\n \"Delores\",\n \"Melinda\",\n \"Pearl\",\n \"Arlene\",\n \"Maureen\",\n \"Colleen\",\n \"Allison\",\n \"Tamara\",\n \"Joy\",\n \"Georgia\",\n \"Constance\",\n \"Lillie\",\n \"Claudia\",\n \"Jackie\",\n \"Marcia\",\n \"Tanya\",\n \"Nellie\",\n \"Minnie\",\n \"Marlene\",\n \"Heidi\",\n \"Glenda\",\n \"Lydia\",\n \"Viola\",\n \"Courtney\",\n \"Marian\",\n \"Stella\",\n \"Caroline\",\n \"Dora\",\n \"Jo\",\n \"Vickie\",\n \"Mattie\",\n \"Terry\",\n \"Maxine\",\n \"Irma\",\n \"Mabel\",\n \"Marsha\",\n \"Myrtle\",\n \"Lena\",\n \"Christy\",\n \"Deanna\",\n \"Patsy\",\n \"Hilda\",\n \"Gwendolyn\",\n \"Jennie\",\n \"Nora\",\n \"Margie\",\n \"Nina\",\n \"Cassandra\",\n \"Leah\",\n \"Penny\",\n \"Kay\",\n \"Priscilla\",\n \"Naomi\",\n \"Carole\",\n \"Brandy\",\n \"Olga\",\n \"Billie\",\n \"Dianne\",\n \"Tracey\",\n \"Leona\",\n \"Jenny\",\n \"Felicia\",\n \"Sonia\",\n \"Miriam\",\n \"Velma\",\n \"Becky\",\n \"Bobbie\",\n \"Violet\",\n \"Kristina\",\n \"Toni\",\n \"Misty\",\n \"Mae\",\n \"Shelly\",\n \"Daisy\",\n \"Ramona\",\n \"Sherri\",\n \"Erika\",\n \"Katrina\",\n \"Claire\",\n \"Lindsey\",\n \"Lindsay\",\n \"Geneva\",\n \"Guadalupe\",\n \"Belinda\",\n \"Margarita\",\n \"Sheryl\",\n \"Cora\",\n \"Faye\",\n \"Ada\",\n \"Natasha\",\n \"Sabrina\",\n \"Isabel\",\n \"Marguerite\",\n \"Hattie\",\n \"Harriet\",\n \"Molly\",\n \"Cecilia\",\n \"Kristi\",\n \"Brandi\",\n \"Blanche\",\n \"Sandy\",\n \"Rosie\",\n \"Joanna\",\n \"Iris\",\n \"Eunice\",\n \"Angie\",\n \"Inez\",\n \"Lynda\",\n \"Madeline\",\n \"Amelia\",\n \"Alberta\",\n \"Genevieve\",\n \"Monique\",\n \"Jodi\",\n \"Janie\",\n \"Maggie\",\n \"Kayla\",\n \"Sonya\",\n \"Jan\",\n \"Lee\",\n \"Kristine\",\n \"Candace\",\n \"Fannie\",\n \"Maryann\",\n \"Opal\",\n \"Alison\",\n \"Yvette\",\n \"Melody\",\n \"Luz\",\n \"Susie\",\n \"Olivia\",\n \"Flora\",\n \"Shelley\",\n \"Kristy\",\n \"Mamie\",\n \"Lula\",\n \"Lola\",\n \"Verna\",\n \"Beulah\",\n \"Antoinette\",\n \"Candice\",\n \"Juana\",\n \"Jeannette\",\n \"Pam\",\n \"Kelli\",\n \"Hannah\",\n \"Whitney\",\n \"Bridget\",\n \"Karla\",\n \"Celia\",\n \"Latoya\",\n \"Patty\",\n \"Shelia\",\n \"Gayle\",\n \"Della\",\n \"Vicky\",\n \"Lynne\",\n \"Sheri\",\n \"Marianne\",\n \"Kara\",\n \"Jacquelyn\",\n \"Erma\",\n \"Blanca\",\n \"Myra\",\n \"Leticia\",\n \"Pat\",\n \"Krista\",\n \"Roxanne\",\n \"Angelica\",\n \"Johnnie\",\n \"Robyn\",\n \"Francis\",\n \"Adrienne\",\n \"Rosalie\",\n \"Alexandra\",\n \"Brooke\",\n \"Bethany\",\n \"Sadie\",\n \"Bernadette\",\n \"Traci\",\n \"Jody\",\n \"Kendra\",\n \"Jasmine\",\n \"Nichole\",\n \"Rachael\",\n \"Chelsea\",\n \"Mable\",\n \"Ernestine\",\n \"Muriel\",\n \"Marcella\",\n \"Elena\",\n \"Krystal\",\n \"Angelina\",\n \"Nadine\",\n \"Kari\",\n \"Estelle\",\n \"Dianna\",\n \"Paulette\",\n \"Lora\",\n \"Mona\",\n \"Doreen\",\n \"Rosemarie\",\n \"Angel\",\n \"Desiree\",\n \"Antonia\",\n \"Hope\",\n \"Ginger\",\n \"Janis\",\n \"Betsy\",\n \"Christie\",\n \"Freda\",\n \"Mercedes\",\n \"Meredith\",\n \"Lynette\",\n \"Teri\",\n \"Cristina\",\n \"Eula\",\n \"Leigh\",\n \"Meghan\",\n \"Sophia\",\n \"Eloise\",\n \"Rochelle\",\n \"Gretchen\",\n \"Cecelia\",\n \"Raquel\",\n \"Henrietta\",\n \"Alyssa\",\n \"Jana\",\n \"Kelley\",\n \"Gwen\",\n \"Kerry\",\n \"Jenna\",\n \"Tricia\",\n \"Laverne\",\n \"Olive\",\n \"Alexis\",\n \"Tasha\",\n \"Silvia\",\n \"Elvira\",\n \"Casey\",\n \"Delia\",\n \"Sophie\",\n \"Kate\",\n \"Patti\",\n \"Lorena\",\n \"Kellie\",\n \"Sonja\",\n \"Lila\",\n \"Lana\",\n \"Darla\",\n \"May\",\n \"Mindy\",\n \"Essie\",\n \"Mandy\",\n \"Lorene\",\n \"Elsa\",\n \"Josefina\",\n \"Jeannie\",\n \"Miranda\",\n \"Dixie\",\n \"Lucia\",\n \"Marta\",\n \"Faith\",\n \"Lela\",\n \"Johanna\",\n \"Shari\",\n \"Camille\",\n \"Tami\",\n \"Shawna\",\n \"Elisa\",\n \"Ebony\",\n \"Melba\",\n \"Ora\",\n \"Nettie\",\n \"Tabitha\",\n \"Ollie\",\n \"Jaime\",\n \"Winifred\",\n \"Kristie\"\n];\n},{}],140:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Aaliyah\",\n \"Aaron\",\n \"Abagail\",\n \"Abbey\",\n \"Abbie\",\n \"Abbigail\",\n \"Abby\",\n \"Abdiel\",\n \"Abdul\",\n \"Abdullah\",\n \"Abe\",\n \"Abel\",\n \"Abelardo\",\n \"Abigail\",\n \"Abigale\",\n \"Abigayle\",\n \"Abner\",\n \"Abraham\",\n \"Ada\",\n \"Adah\",\n \"Adalberto\",\n \"Adaline\",\n \"Adam\",\n \"Adan\",\n \"Addie\",\n \"Addison\",\n \"Adela\",\n \"Adelbert\",\n \"Adele\",\n \"Adelia\",\n \"Adeline\",\n \"Adell\",\n \"Adella\",\n \"Adelle\",\n \"Aditya\",\n \"Adolf\",\n \"Adolfo\",\n \"Adolph\",\n \"Adolphus\",\n \"Adonis\",\n \"Adrain\",\n \"Adrian\",\n \"Adriana\",\n \"Adrianna\",\n \"Adriel\",\n \"Adrien\",\n \"Adrienne\",\n \"Afton\",\n \"Aglae\",\n \"Agnes\",\n \"Agustin\",\n \"Agustina\",\n \"Ahmad\",\n \"Ahmed\",\n \"Aida\",\n \"Aidan\",\n \"Aiden\",\n \"Aileen\",\n \"Aimee\",\n \"Aisha\",\n \"Aiyana\",\n \"Akeem\",\n \"Al\",\n \"Alaina\",\n \"Alan\",\n \"Alana\",\n \"Alanis\",\n \"Alanna\",\n \"Alayna\",\n \"Alba\",\n \"Albert\",\n \"Alberta\",\n \"Albertha\",\n \"Alberto\",\n \"Albin\",\n \"Albina\",\n \"Alda\",\n \"Alden\",\n \"Alec\",\n \"Aleen\",\n \"Alejandra\",\n \"Alejandrin\",\n \"Alek\",\n \"Alena\",\n \"Alene\",\n \"Alessandra\",\n \"Alessandro\",\n \"Alessia\",\n \"Aletha\",\n \"Alex\",\n \"Alexa\",\n \"Alexander\",\n \"Alexandra\",\n \"Alexandre\",\n \"Alexandrea\",\n \"Alexandria\",\n \"Alexandrine\",\n \"Alexandro\",\n \"Alexane\",\n \"Alexanne\",\n \"Alexie\",\n \"Alexis\",\n \"Alexys\",\n \"Alexzander\",\n \"Alf\",\n \"Alfonso\",\n \"Alfonzo\",\n \"Alford\",\n \"Alfred\",\n \"Alfreda\",\n \"Alfredo\",\n \"Ali\",\n \"Alia\",\n \"Alice\",\n \"Alicia\",\n \"Alisa\",\n \"Alisha\",\n \"Alison\",\n \"Alivia\",\n \"Aliya\",\n \"Aliyah\",\n \"Aliza\",\n \"Alize\",\n \"Allan\",\n \"Allen\",\n \"Allene\",\n \"Allie\",\n \"Allison\",\n \"Ally\",\n \"Alphonso\",\n \"Alta\",\n \"Althea\",\n \"Alva\",\n \"Alvah\",\n \"Alvena\",\n \"Alvera\",\n \"Alverta\",\n \"Alvina\",\n \"Alvis\",\n \"Alyce\",\n \"Alycia\",\n \"Alysa\",\n \"Alysha\",\n \"Alyson\",\n \"Alysson\",\n \"Amalia\",\n \"Amanda\",\n \"Amani\",\n \"Amara\",\n \"Amari\",\n \"Amaya\",\n \"Amber\",\n \"Ambrose\",\n \"Amelia\",\n \"Amelie\",\n \"Amely\",\n \"America\",\n \"Americo\",\n \"Amie\",\n \"Amina\",\n \"Amir\",\n \"Amira\",\n \"Amiya\",\n \"Amos\",\n \"Amparo\",\n \"Amy\",\n \"Amya\",\n \"Ana\",\n \"Anabel\",\n \"Anabelle\",\n \"Anahi\",\n \"Anais\",\n \"Anastacio\",\n \"Anastasia\",\n \"Anderson\",\n \"Andre\",\n \"Andreane\",\n \"Andreanne\",\n \"Andres\",\n \"Andrew\",\n \"Andy\",\n \"Angel\",\n \"Angela\",\n \"Angelica\",\n \"Angelina\",\n \"Angeline\",\n \"Angelita\",\n \"Angelo\",\n \"Angie\",\n \"Angus\",\n \"Anibal\",\n \"Anika\",\n \"Anissa\",\n \"Anita\",\n \"Aniya\",\n \"Aniyah\",\n \"Anjali\",\n \"Anna\",\n \"Annabel\",\n \"Annabell\",\n \"Annabelle\",\n \"Annalise\",\n \"Annamae\",\n \"Annamarie\",\n \"Anne\",\n \"Annetta\",\n \"Annette\",\n \"Annie\",\n \"Ansel\",\n \"Ansley\",\n \"Anthony\",\n \"Antoinette\",\n \"Antone\",\n \"Antonetta\",\n \"Antonette\",\n \"Antonia\",\n \"Antonietta\",\n \"Antonina\",\n \"Antonio\",\n \"Antwan\",\n \"Antwon\",\n \"Anya\",\n \"April\",\n \"Ara\",\n \"Araceli\",\n \"Aracely\",\n \"Arch\",\n \"Archibald\",\n \"Ardella\",\n \"Arden\",\n \"Ardith\",\n \"Arely\",\n \"Ari\",\n \"Ariane\",\n \"Arianna\",\n \"Aric\",\n \"Ariel\",\n \"Arielle\",\n \"Arjun\",\n \"Arlene\",\n \"Arlie\",\n \"Arlo\",\n \"Armand\",\n \"Armando\",\n \"Armani\",\n \"Arnaldo\",\n \"Arne\",\n \"Arno\",\n \"Arnold\",\n \"Arnoldo\",\n \"Arnulfo\",\n \"Aron\",\n \"Art\",\n \"Arthur\",\n \"Arturo\",\n \"Arvel\",\n \"Arvid\",\n \"Arvilla\",\n \"Aryanna\",\n \"Asa\",\n \"Asha\",\n \"Ashlee\",\n \"Ashleigh\",\n \"Ashley\",\n \"Ashly\",\n \"Ashlynn\",\n \"Ashton\",\n \"Ashtyn\",\n \"Asia\",\n \"Assunta\",\n \"Astrid\",\n \"Athena\",\n \"Aubree\",\n \"Aubrey\",\n \"Audie\",\n \"Audra\",\n \"Audreanne\",\n \"Audrey\",\n \"August\",\n \"Augusta\",\n \"Augustine\",\n \"Augustus\",\n \"Aurelia\",\n \"Aurelie\",\n \"Aurelio\",\n \"Aurore\",\n \"Austen\",\n \"Austin\",\n \"Austyn\",\n \"Autumn\",\n \"Ava\",\n \"Avery\",\n \"Avis\",\n \"Axel\",\n \"Ayana\",\n \"Ayden\",\n \"Ayla\",\n \"Aylin\",\n \"Baby\",\n \"Bailee\",\n \"Bailey\",\n \"Barbara\",\n \"Barney\",\n \"Baron\",\n \"Barrett\",\n \"Barry\",\n \"Bart\",\n \"Bartholome\",\n \"Barton\",\n \"Baylee\",\n \"Beatrice\",\n \"Beau\",\n \"Beaulah\",\n \"Bell\",\n \"Bella\",\n \"Belle\",\n \"Ben\",\n \"Benedict\",\n \"Benjamin\",\n \"Bennett\",\n \"Bennie\",\n \"Benny\",\n \"Benton\",\n \"Berenice\",\n \"Bernadette\",\n \"Bernadine\",\n \"Bernard\",\n \"Bernardo\",\n \"Berneice\",\n \"Bernhard\",\n \"Bernice\",\n \"Bernie\",\n \"Berniece\",\n \"Bernita\",\n \"Berry\",\n \"Bert\",\n \"Berta\",\n \"Bertha\",\n \"Bertram\",\n \"Bertrand\",\n \"Beryl\",\n \"Bessie\",\n \"Beth\",\n \"Bethany\",\n \"Bethel\",\n \"Betsy\",\n \"Bette\",\n \"Bettie\",\n \"Betty\",\n \"Bettye\",\n \"Beulah\",\n \"Beverly\",\n \"Bianka\",\n \"Bill\",\n \"Billie\",\n \"Billy\",\n \"Birdie\",\n \"Blair\",\n \"Blaise\",\n \"Blake\",\n \"Blanca\",\n \"Blanche\",\n \"Blaze\",\n \"Bo\",\n \"Bobbie\",\n \"Bobby\",\n \"Bonita\",\n \"Bonnie\",\n \"Boris\",\n \"Boyd\",\n \"Brad\",\n \"Braden\",\n \"Bradford\",\n \"Bradley\",\n \"Bradly\",\n \"Brady\",\n \"Braeden\",\n \"Brain\",\n \"Brandi\",\n \"Brando\",\n \"Brandon\",\n \"Brandt\",\n \"Brandy\",\n \"Brandyn\",\n \"Brannon\",\n \"Branson\",\n \"Brant\",\n \"Braulio\",\n \"Braxton\",\n \"Brayan\",\n \"Breana\",\n \"Breanna\",\n \"Breanne\",\n \"Brenda\",\n \"Brendan\",\n \"Brenden\",\n \"Brendon\",\n \"Brenna\",\n \"Brennan\",\n \"Brennon\",\n \"Brent\",\n \"Bret\",\n \"Brett\",\n \"Bria\",\n \"Brian\",\n \"Briana\",\n \"Brianne\",\n \"Brice\",\n \"Bridget\",\n \"Bridgette\",\n \"Bridie\",\n \"Brielle\",\n \"Brigitte\",\n \"Brionna\",\n \"Brisa\",\n \"Britney\",\n \"Brittany\",\n \"Brock\",\n \"Broderick\",\n \"Brody\",\n \"Brook\",\n \"Brooke\",\n \"Brooklyn\",\n \"Brooks\",\n \"Brown\",\n \"Bruce\",\n \"Bryana\",\n \"Bryce\",\n \"Brycen\",\n \"Bryon\",\n \"Buck\",\n \"Bud\",\n \"Buddy\",\n \"Buford\",\n \"Bulah\",\n \"Burdette\",\n \"Burley\",\n \"Burnice\",\n \"Buster\",\n \"Cade\",\n \"Caden\",\n \"Caesar\",\n \"Caitlyn\",\n \"Cale\",\n \"Caleb\",\n \"Caleigh\",\n \"Cali\",\n \"Calista\",\n \"Callie\",\n \"Camden\",\n \"Cameron\",\n \"Camila\",\n \"Camilla\",\n \"Camille\",\n \"Camren\",\n \"Camron\",\n \"Camryn\",\n \"Camylle\",\n \"Candace\",\n \"Candelario\",\n \"Candice\",\n \"Candida\",\n \"Candido\",\n \"Cara\",\n \"Carey\",\n \"Carissa\",\n \"Carlee\",\n \"Carleton\",\n \"Carley\",\n \"Carli\",\n \"Carlie\",\n \"Carlo\",\n \"Carlos\",\n \"Carlotta\",\n \"Carmel\",\n \"Carmela\",\n \"Carmella\",\n \"Carmelo\",\n \"Carmen\",\n \"Carmine\",\n \"Carol\",\n \"Carolanne\",\n \"Carole\",\n \"Carolina\",\n \"Caroline\",\n \"Carolyn\",\n \"Carolyne\",\n \"Carrie\",\n \"Carroll\",\n \"Carson\",\n \"Carter\",\n \"Cary\",\n \"Casandra\",\n \"Casey\",\n \"Casimer\",\n \"Casimir\",\n \"Casper\",\n \"Cassandra\",\n \"Cassandre\",\n \"Cassidy\",\n \"Cassie\",\n \"Catalina\",\n \"Caterina\",\n \"Catharine\",\n \"Catherine\",\n \"Cathrine\",\n \"Cathryn\",\n \"Cathy\",\n \"Cayla\",\n \"Ceasar\",\n \"Cecelia\",\n \"Cecil\",\n \"Cecile\",\n \"Cecilia\",\n \"Cedrick\",\n \"Celestine\",\n \"Celestino\",\n \"Celia\",\n \"Celine\",\n \"Cesar\",\n \"Chad\",\n \"Chadd\",\n \"Chadrick\",\n \"Chaim\",\n \"Chance\",\n \"Chandler\",\n \"Chanel\",\n \"Chanelle\",\n \"Charity\",\n \"Charlene\",\n \"Charles\",\n \"Charley\",\n \"Charlie\",\n \"Charlotte\",\n \"Chase\",\n \"Chasity\",\n \"Chauncey\",\n \"Chaya\",\n \"Chaz\",\n \"Chelsea\",\n \"Chelsey\",\n \"Chelsie\",\n \"Chesley\",\n \"Chester\",\n \"Chet\",\n \"Cheyanne\",\n \"Cheyenne\",\n \"Chloe\",\n \"Chris\",\n \"Christ\",\n \"Christa\",\n \"Christelle\",\n \"Christian\",\n \"Christiana\",\n \"Christina\",\n \"Christine\",\n \"Christop\",\n \"Christophe\",\n \"Christopher\",\n \"Christy\",\n \"Chyna\",\n \"Ciara\",\n \"Cicero\",\n \"Cielo\",\n \"Cierra\",\n \"Cindy\",\n \"Citlalli\",\n \"Clair\",\n \"Claire\",\n \"Clara\",\n \"Clarabelle\",\n \"Clare\",\n \"Clarissa\",\n \"Clark\",\n \"Claud\",\n \"Claude\",\n \"Claudia\",\n \"Claudie\",\n \"Claudine\",\n \"Clay\",\n \"Clemens\",\n \"Clement\",\n \"Clementina\",\n \"Clementine\",\n \"Clemmie\",\n \"Cleo\",\n \"Cleora\",\n \"Cleta\",\n \"Cletus\",\n \"Cleve\",\n \"Cleveland\",\n \"Clifford\",\n \"Clifton\",\n \"Clint\",\n \"Clinton\",\n \"Clotilde\",\n \"Clovis\",\n \"Cloyd\",\n \"Clyde\",\n \"Coby\",\n \"Cody\",\n \"Colby\",\n \"Cole\",\n \"Coleman\",\n \"Colin\",\n \"Colleen\",\n \"Collin\",\n \"Colt\",\n \"Colten\",\n \"Colton\",\n \"Columbus\",\n \"Concepcion\",\n \"Conner\",\n \"Connie\",\n \"Connor\",\n \"Conor\",\n \"Conrad\",\n \"Constance\",\n \"Constantin\",\n \"Consuelo\",\n \"Cooper\",\n \"Cora\",\n \"Coralie\",\n \"Corbin\",\n \"Cordelia\",\n \"Cordell\",\n \"Cordia\",\n \"Cordie\",\n \"Corene\",\n \"Corine\",\n \"Cornelius\",\n \"Cornell\",\n \"Corrine\",\n \"Cortez\",\n \"Cortney\",\n \"Cory\",\n \"Coty\",\n \"Courtney\",\n \"Coy\",\n \"Craig\",\n \"Crawford\",\n \"Creola\",\n \"Cristal\",\n \"Cristian\",\n \"Cristina\",\n \"Cristobal\",\n \"Cristopher\",\n \"Cruz\",\n \"Crystal\",\n \"Crystel\",\n \"Cullen\",\n \"Curt\",\n \"Curtis\",\n \"Cydney\",\n \"Cynthia\",\n \"Cyril\",\n \"Cyrus\",\n \"Dagmar\",\n \"Dahlia\",\n \"Daija\",\n \"Daisha\",\n \"Daisy\",\n \"Dakota\",\n \"Dale\",\n \"Dallas\",\n \"Dallin\",\n \"Dalton\",\n \"Damaris\",\n \"Dameon\",\n \"Damian\",\n \"Damien\",\n \"Damion\",\n \"Damon\",\n \"Dan\",\n \"Dana\",\n \"Dandre\",\n \"Dane\",\n \"D'angelo\",\n \"Dangelo\",\n \"Danial\",\n \"Daniela\",\n \"Daniella\",\n \"Danielle\",\n \"Danika\",\n \"Dannie\",\n \"Danny\",\n \"Dante\",\n \"Danyka\",\n \"Daphne\",\n \"Daphnee\",\n \"Daphney\",\n \"Darby\",\n \"Daren\",\n \"Darian\",\n \"Dariana\",\n \"Darien\",\n \"Dario\",\n \"Darion\",\n \"Darius\",\n \"Darlene\",\n \"Daron\",\n \"Darrel\",\n \"Darrell\",\n \"Darren\",\n \"Darrick\",\n \"Darrin\",\n \"Darrion\",\n \"Darron\",\n \"Darryl\",\n \"Darwin\",\n \"Daryl\",\n \"Dashawn\",\n \"Dasia\",\n \"Dave\",\n \"David\",\n \"Davin\",\n \"Davion\",\n \"Davon\",\n \"Davonte\",\n \"Dawn\",\n \"Dawson\",\n \"Dax\",\n \"Dayana\",\n \"Dayna\",\n \"Dayne\",\n \"Dayton\",\n \"Dean\",\n \"Deangelo\",\n \"Deanna\",\n \"Deborah\",\n \"Declan\",\n \"Dedric\",\n \"Dedrick\",\n \"Dee\",\n \"Deion\",\n \"Deja\",\n \"Dejah\",\n \"Dejon\",\n \"Dejuan\",\n \"Delaney\",\n \"Delbert\",\n \"Delfina\",\n \"Delia\",\n \"Delilah\",\n \"Dell\",\n \"Della\",\n \"Delmer\",\n \"Delores\",\n \"Delpha\",\n \"Delphia\",\n \"Delphine\",\n \"Delta\",\n \"Demarco\",\n \"Demarcus\",\n \"Demario\",\n \"Demetris\",\n \"Demetrius\",\n \"Demond\",\n \"Dena\",\n \"Denis\",\n \"Dennis\",\n \"Deon\",\n \"Deondre\",\n \"Deontae\",\n \"Deonte\",\n \"Dereck\",\n \"Derek\",\n \"Derick\",\n \"Deron\",\n \"Derrick\",\n \"Deshaun\",\n \"Deshawn\",\n \"Desiree\",\n \"Desmond\",\n \"Dessie\",\n \"Destany\",\n \"Destin\",\n \"Destinee\",\n \"Destiney\",\n \"Destini\",\n \"Destiny\",\n \"Devan\",\n \"Devante\",\n \"Deven\",\n \"Devin\",\n \"Devon\",\n \"Devonte\",\n \"Devyn\",\n \"Dewayne\",\n \"Dewitt\",\n \"Dexter\",\n \"Diamond\",\n \"Diana\",\n \"Dianna\",\n \"Diego\",\n \"Dillan\",\n \"Dillon\",\n \"Dimitri\",\n \"Dina\",\n \"Dino\",\n \"Dion\",\n \"Dixie\",\n \"Dock\",\n \"Dolly\",\n \"Dolores\",\n \"Domenic\",\n \"Domenica\",\n \"Domenick\",\n \"Domenico\",\n \"Domingo\",\n \"Dominic\",\n \"Dominique\",\n \"Don\",\n \"Donald\",\n \"Donato\",\n \"Donavon\",\n \"Donna\",\n \"Donnell\",\n \"Donnie\",\n \"Donny\",\n \"Dora\",\n \"Dorcas\",\n \"Dorian\",\n \"Doris\",\n \"Dorothea\",\n \"Dorothy\",\n \"Dorris\",\n \"Dortha\",\n \"Dorthy\",\n \"Doug\",\n \"Douglas\",\n \"Dovie\",\n \"Doyle\",\n \"Drake\",\n \"Drew\",\n \"Duane\",\n \"Dudley\",\n \"Dulce\",\n \"Duncan\",\n \"Durward\",\n \"Dustin\",\n \"Dusty\",\n \"Dwight\",\n \"Dylan\",\n \"Earl\",\n \"Earlene\",\n \"Earline\",\n \"Earnest\",\n \"Earnestine\",\n \"Easter\",\n \"Easton\",\n \"Ebba\",\n \"Ebony\",\n \"Ed\",\n \"Eda\",\n \"Edd\",\n \"Eddie\",\n \"Eden\",\n \"Edgar\",\n \"Edgardo\",\n \"Edison\",\n \"Edmond\",\n \"Edmund\",\n \"Edna\",\n \"Eduardo\",\n \"Edward\",\n \"Edwardo\",\n \"Edwin\",\n \"Edwina\",\n \"Edyth\",\n \"Edythe\",\n \"Effie\",\n \"Efrain\",\n \"Efren\",\n \"Eileen\",\n \"Einar\",\n \"Eino\",\n \"Eladio\",\n \"Elaina\",\n \"Elbert\",\n \"Elda\",\n \"Eldon\",\n \"Eldora\",\n \"Eldred\",\n \"Eldridge\",\n \"Eleanora\",\n \"Eleanore\",\n \"Eleazar\",\n \"Electa\",\n \"Elena\",\n \"Elenor\",\n \"Elenora\",\n \"Eleonore\",\n \"Elfrieda\",\n \"Eli\",\n \"Elian\",\n \"Eliane\",\n \"Elias\",\n \"Eliezer\",\n \"Elijah\",\n \"Elinor\",\n \"Elinore\",\n \"Elisa\",\n \"Elisabeth\",\n \"Elise\",\n \"Eliseo\",\n \"Elisha\",\n \"Elissa\",\n \"Eliza\",\n \"Elizabeth\",\n \"Ella\",\n \"Ellen\",\n \"Ellie\",\n \"Elliot\",\n \"Elliott\",\n \"Ellis\",\n \"Ellsworth\",\n \"Elmer\",\n \"Elmira\",\n \"Elmo\",\n \"Elmore\",\n \"Elna\",\n \"Elnora\",\n \"Elody\",\n \"Eloisa\",\n \"Eloise\",\n \"Elouise\",\n \"Eloy\",\n \"Elroy\",\n \"Elsa\",\n \"Else\",\n \"Elsie\",\n \"Elta\",\n \"Elton\",\n \"Elva\",\n \"Elvera\",\n \"Elvie\",\n \"Elvis\",\n \"Elwin\",\n \"Elwyn\",\n \"Elyse\",\n \"Elyssa\",\n \"Elza\",\n \"Emanuel\",\n \"Emelia\",\n \"Emelie\",\n \"Emely\",\n \"Emerald\",\n \"Emerson\",\n \"Emery\",\n \"Emie\",\n \"Emil\",\n \"Emile\",\n \"Emilia\",\n \"Emiliano\",\n \"Emilie\",\n \"Emilio\",\n \"Emily\",\n \"Emma\",\n \"Emmalee\",\n \"Emmanuel\",\n \"Emmanuelle\",\n \"Emmet\",\n \"Emmett\",\n \"Emmie\",\n \"Emmitt\",\n \"Emmy\",\n \"Emory\",\n \"Ena\",\n \"Enid\",\n \"Enoch\",\n \"Enola\",\n \"Enos\",\n \"Enrico\",\n \"Enrique\",\n \"Ephraim\",\n \"Era\",\n \"Eriberto\",\n \"Eric\",\n \"Erica\",\n \"Erich\",\n \"Erick\",\n \"Ericka\",\n \"Erik\",\n \"Erika\",\n \"Erin\",\n \"Erling\",\n \"Erna\",\n \"Ernest\",\n \"Ernestina\",\n \"Ernestine\",\n \"Ernesto\",\n \"Ernie\",\n \"Ervin\",\n \"Erwin\",\n \"Eryn\",\n \"Esmeralda\",\n \"Esperanza\",\n \"Esta\",\n \"Esteban\",\n \"Estefania\",\n \"Estel\",\n \"Estell\",\n \"Estella\",\n \"Estelle\",\n \"Estevan\",\n \"Esther\",\n \"Estrella\",\n \"Etha\",\n \"Ethan\",\n \"Ethel\",\n \"Ethelyn\",\n \"Ethyl\",\n \"Ettie\",\n \"Eudora\",\n \"Eugene\",\n \"Eugenia\",\n \"Eula\",\n \"Eulah\",\n \"Eulalia\",\n \"Euna\",\n \"Eunice\",\n \"Eusebio\",\n \"Eva\",\n \"Evalyn\",\n \"Evan\",\n \"Evangeline\",\n \"Evans\",\n \"Eve\",\n \"Eveline\",\n \"Evelyn\",\n \"Everardo\",\n \"Everett\",\n \"Everette\",\n \"Evert\",\n \"Evie\",\n \"Ewald\",\n \"Ewell\",\n \"Ezekiel\",\n \"Ezequiel\",\n \"Ezra\",\n \"Fabian\",\n \"Fabiola\",\n \"Fae\",\n \"Fannie\",\n \"Fanny\",\n \"Fatima\",\n \"Faustino\",\n \"Fausto\",\n \"Favian\",\n \"Fay\",\n \"Faye\",\n \"Federico\",\n \"Felicia\",\n \"Felicita\",\n \"Felicity\",\n \"Felipa\",\n \"Felipe\",\n \"Felix\",\n \"Felton\",\n \"Fermin\",\n \"Fern\",\n \"Fernando\",\n \"Ferne\",\n \"Fidel\",\n \"Filiberto\",\n \"Filomena\",\n \"Finn\",\n \"Fiona\",\n \"Flavie\",\n \"Flavio\",\n \"Fleta\",\n \"Fletcher\",\n \"Flo\",\n \"Florence\",\n \"Florencio\",\n \"Florian\",\n \"Florida\",\n \"Florine\",\n \"Flossie\",\n \"Floy\",\n \"Floyd\",\n \"Ford\",\n \"Forest\",\n \"Forrest\",\n \"Foster\",\n \"Frances\",\n \"Francesca\",\n \"Francesco\",\n \"Francis\",\n \"Francisca\",\n \"Francisco\",\n \"Franco\",\n \"Frank\",\n \"Frankie\",\n \"Franz\",\n \"Fred\",\n \"Freda\",\n \"Freddie\",\n \"Freddy\",\n \"Frederic\",\n \"Frederick\",\n \"Frederik\",\n \"Frederique\",\n \"Fredrick\",\n \"Fredy\",\n \"Freeda\",\n \"Freeman\",\n \"Freida\",\n \"Frida\",\n \"Frieda\",\n \"Friedrich\",\n \"Fritz\",\n \"Furman\",\n \"Gabe\",\n \"Gabriel\",\n \"Gabriella\",\n \"Gabrielle\",\n \"Gaetano\",\n \"Gage\",\n \"Gail\",\n \"Gardner\",\n \"Garett\",\n \"Garfield\",\n \"Garland\",\n \"Garnet\",\n \"Garnett\",\n \"Garret\",\n \"Garrett\",\n \"Garrick\",\n \"Garrison\",\n \"Garry\",\n \"Garth\",\n \"Gaston\",\n \"Gavin\",\n \"Gay\",\n \"Gayle\",\n \"Gaylord\",\n \"Gene\",\n \"General\",\n \"Genesis\",\n \"Genevieve\",\n \"Gennaro\",\n \"Genoveva\",\n \"Geo\",\n \"Geoffrey\",\n \"George\",\n \"Georgette\",\n \"Georgiana\",\n \"Georgianna\",\n \"Geovanni\",\n \"Geovanny\",\n \"Geovany\",\n \"Gerald\",\n \"Geraldine\",\n \"Gerard\",\n \"Gerardo\",\n \"Gerda\",\n \"Gerhard\",\n \"Germaine\",\n \"German\",\n \"Gerry\",\n \"Gerson\",\n \"Gertrude\",\n \"Gia\",\n \"Gianni\",\n \"Gideon\",\n \"Gilbert\",\n \"Gilberto\",\n \"Gilda\",\n \"Giles\",\n \"Gillian\",\n \"Gina\",\n \"Gino\",\n \"Giovani\",\n \"Giovanna\",\n \"Giovanni\",\n \"Giovanny\",\n \"Gisselle\",\n \"Giuseppe\",\n \"Gladyce\",\n \"Gladys\",\n \"Glen\",\n \"Glenda\",\n \"Glenna\",\n \"Glennie\",\n \"Gloria\",\n \"Godfrey\",\n \"Golda\",\n \"Golden\",\n \"Gonzalo\",\n \"Gordon\",\n \"Grace\",\n \"Gracie\",\n \"Graciela\",\n \"Grady\",\n \"Graham\",\n \"Grant\",\n \"Granville\",\n \"Grayce\",\n \"Grayson\",\n \"Green\",\n \"Greg\",\n \"Gregg\",\n \"Gregoria\",\n \"Gregorio\",\n \"Gregory\",\n \"Greta\",\n \"Gretchen\",\n \"Greyson\",\n \"Griffin\",\n \"Grover\",\n \"Guadalupe\",\n \"Gudrun\",\n \"Guido\",\n \"Guillermo\",\n \"Guiseppe\",\n \"Gunnar\",\n \"Gunner\",\n \"Gus\",\n \"Gussie\",\n \"Gust\",\n \"Gustave\",\n \"Guy\",\n \"Gwen\",\n \"Gwendolyn\",\n \"Hadley\",\n \"Hailee\",\n \"Hailey\",\n \"Hailie\",\n \"Hal\",\n \"Haleigh\",\n \"Haley\",\n \"Halie\",\n \"Halle\",\n \"Hallie\",\n \"Hank\",\n \"Hanna\",\n \"Hannah\",\n \"Hans\",\n \"Hardy\",\n \"Harley\",\n \"Harmon\",\n \"Harmony\",\n \"Harold\",\n \"Harrison\",\n \"Harry\",\n \"Harvey\",\n \"Haskell\",\n \"Hassan\",\n \"Hassie\",\n \"Hattie\",\n \"Haven\",\n \"Hayden\",\n \"Haylee\",\n \"Hayley\",\n \"Haylie\",\n \"Hazel\",\n \"Hazle\",\n \"Heath\",\n \"Heather\",\n \"Heaven\",\n \"Heber\",\n \"Hector\",\n \"Heidi\",\n \"Helen\",\n \"Helena\",\n \"Helene\",\n \"Helga\",\n \"Hellen\",\n \"Helmer\",\n \"Heloise\",\n \"Henderson\",\n \"Henri\",\n \"Henriette\",\n \"Henry\",\n \"Herbert\",\n \"Herman\",\n \"Hermann\",\n \"Hermina\",\n \"Herminia\",\n \"Herminio\",\n \"Hershel\",\n \"Herta\",\n \"Hertha\",\n \"Hester\",\n \"Hettie\",\n \"Hilario\",\n \"Hilbert\",\n \"Hilda\",\n \"Hildegard\",\n \"Hillard\",\n \"Hillary\",\n \"Hilma\",\n \"Hilton\",\n \"Hipolito\",\n \"Hiram\",\n \"Hobart\",\n \"Holden\",\n \"Hollie\",\n \"Hollis\",\n \"Holly\",\n \"Hope\",\n \"Horace\",\n \"Horacio\",\n \"Hortense\",\n \"Hosea\",\n \"Houston\",\n \"Howard\",\n \"Howell\",\n \"Hoyt\",\n \"Hubert\",\n \"Hudson\",\n \"Hugh\",\n \"Hulda\",\n \"Humberto\",\n \"Hunter\",\n \"Hyman\",\n \"Ian\",\n \"Ibrahim\",\n \"Icie\",\n \"Ida\",\n \"Idell\",\n \"Idella\",\n \"Ignacio\",\n \"Ignatius\",\n \"Ike\",\n \"Ila\",\n \"Ilene\",\n \"Iliana\",\n \"Ima\",\n \"Imani\",\n \"Imelda\",\n \"Immanuel\",\n \"Imogene\",\n \"Ines\",\n \"Irma\",\n \"Irving\",\n \"Irwin\",\n \"Isaac\",\n \"Isabel\",\n \"Isabell\",\n \"Isabella\",\n \"Isabelle\",\n \"Isac\",\n \"Isadore\",\n \"Isai\",\n \"Isaiah\",\n \"Isaias\",\n \"Isidro\",\n \"Ismael\",\n \"Isobel\",\n \"Isom\",\n \"Israel\",\n \"Issac\",\n \"Itzel\",\n \"Iva\",\n \"Ivah\",\n \"Ivory\",\n \"Ivy\",\n \"Izabella\",\n \"Izaiah\",\n \"Jabari\",\n \"Jace\",\n \"Jacey\",\n \"Jacinthe\",\n \"Jacinto\",\n \"Jack\",\n \"Jackeline\",\n \"Jackie\",\n \"Jacklyn\",\n \"Jackson\",\n \"Jacky\",\n \"Jaclyn\",\n \"Jacquelyn\",\n \"Jacques\",\n \"Jacynthe\",\n \"Jada\",\n \"Jade\",\n \"Jaden\",\n \"Jadon\",\n \"Jadyn\",\n \"Jaeden\",\n \"Jaida\",\n \"Jaiden\",\n \"Jailyn\",\n \"Jaime\",\n \"Jairo\",\n \"Jakayla\",\n \"Jake\",\n \"Jakob\",\n \"Jaleel\",\n \"Jalen\",\n \"Jalon\",\n \"Jalyn\",\n \"Jamaal\",\n \"Jamal\",\n \"Jamar\",\n \"Jamarcus\",\n \"Jamel\",\n \"Jameson\",\n \"Jamey\",\n \"Jamie\",\n \"Jamil\",\n \"Jamir\",\n \"Jamison\",\n \"Jammie\",\n \"Jan\",\n \"Jana\",\n \"Janae\",\n \"Jane\",\n \"Janelle\",\n \"Janessa\",\n \"Janet\",\n \"Janice\",\n \"Janick\",\n \"Janie\",\n \"Janis\",\n \"Janiya\",\n \"Jannie\",\n \"Jany\",\n \"Jaquan\",\n \"Jaquelin\",\n \"Jaqueline\",\n \"Jared\",\n \"Jaren\",\n \"Jarod\",\n \"Jaron\",\n \"Jarred\",\n \"Jarrell\",\n \"Jarret\",\n \"Jarrett\",\n \"Jarrod\",\n \"Jarvis\",\n \"Jasen\",\n \"Jasmin\",\n \"Jason\",\n \"Jasper\",\n \"Jaunita\",\n \"Javier\",\n \"Javon\",\n \"Javonte\",\n \"Jay\",\n \"Jayce\",\n \"Jaycee\",\n \"Jayda\",\n \"Jayde\",\n \"Jayden\",\n \"Jaydon\",\n \"Jaylan\",\n \"Jaylen\",\n \"Jaylin\",\n \"Jaylon\",\n \"Jayme\",\n \"Jayne\",\n \"Jayson\",\n \"Jazlyn\",\n \"Jazmin\",\n \"Jazmyn\",\n \"Jazmyne\",\n \"Jean\",\n \"Jeanette\",\n \"Jeanie\",\n \"Jeanne\",\n \"Jed\",\n \"Jedediah\",\n \"Jedidiah\",\n \"Jeff\",\n \"Jefferey\",\n \"Jeffery\",\n \"Jeffrey\",\n \"Jeffry\",\n \"Jena\",\n \"Jenifer\",\n \"Jennie\",\n \"Jennifer\",\n \"Jennings\",\n \"Jennyfer\",\n \"Jensen\",\n \"Jerad\",\n \"Jerald\",\n \"Jeramie\",\n \"Jeramy\",\n \"Jerel\",\n \"Jeremie\",\n \"Jeremy\",\n \"Jermain\",\n \"Jermaine\",\n \"Jermey\",\n \"Jerod\",\n \"Jerome\",\n \"Jeromy\",\n \"Jerrell\",\n \"Jerrod\",\n \"Jerrold\",\n \"Jerry\",\n \"Jess\",\n \"Jesse\",\n \"Jessica\",\n \"Jessie\",\n \"Jessika\",\n \"Jessy\",\n \"Jessyca\",\n \"Jesus\",\n \"Jett\",\n \"Jettie\",\n \"Jevon\",\n \"Jewel\",\n \"Jewell\",\n \"Jillian\",\n \"Jimmie\",\n \"Jimmy\",\n \"Jo\",\n \"Joan\",\n \"Joana\",\n \"Joanie\",\n \"Joanne\",\n \"Joannie\",\n \"Joanny\",\n \"Joany\",\n \"Joaquin\",\n \"Jocelyn\",\n \"Jodie\",\n \"Jody\",\n \"Joe\",\n \"Joel\",\n \"Joelle\",\n \"Joesph\",\n \"Joey\",\n \"Johan\",\n \"Johann\",\n \"Johanna\",\n \"Johathan\",\n \"John\",\n \"Johnathan\",\n \"Johnathon\",\n \"Johnnie\",\n \"Johnny\",\n \"Johnpaul\",\n \"Johnson\",\n \"Jolie\",\n \"Jon\",\n \"Jonas\",\n \"Jonatan\",\n \"Jonathan\",\n \"Jonathon\",\n \"Jordan\",\n \"Jordane\",\n \"Jordi\",\n \"Jordon\",\n \"Jordy\",\n \"Jordyn\",\n \"Jorge\",\n \"Jose\",\n \"Josefa\",\n \"Josefina\",\n \"Joseph\",\n \"Josephine\",\n \"Josh\",\n \"Joshua\",\n \"Joshuah\",\n \"Josiah\",\n \"Josiane\",\n \"Josianne\",\n \"Josie\",\n \"Josue\",\n \"Jovan\",\n \"Jovani\",\n \"Jovanny\",\n \"Jovany\",\n \"Joy\",\n \"Joyce\",\n \"Juana\",\n \"Juanita\",\n \"Judah\",\n \"Judd\",\n \"Jude\",\n \"Judge\",\n \"Judson\",\n \"Judy\",\n \"Jules\",\n \"Julia\",\n \"Julian\",\n \"Juliana\",\n \"Julianne\",\n \"Julie\",\n \"Julien\",\n \"Juliet\",\n \"Julio\",\n \"Julius\",\n \"June\",\n \"Junior\",\n \"Junius\",\n \"Justen\",\n \"Justice\",\n \"Justina\",\n \"Justine\",\n \"Juston\",\n \"Justus\",\n \"Justyn\",\n \"Juvenal\",\n \"Juwan\",\n \"Kacey\",\n \"Kaci\",\n \"Kacie\",\n \"Kade\",\n \"Kaden\",\n \"Kadin\",\n \"Kaela\",\n \"Kaelyn\",\n \"Kaia\",\n \"Kailee\",\n \"Kailey\",\n \"Kailyn\",\n \"Kaitlin\",\n \"Kaitlyn\",\n \"Kale\",\n \"Kaleb\",\n \"Kaleigh\",\n \"Kaley\",\n \"Kali\",\n \"Kallie\",\n \"Kameron\",\n \"Kamille\",\n \"Kamren\",\n \"Kamron\",\n \"Kamryn\",\n \"Kane\",\n \"Kara\",\n \"Kareem\",\n \"Karelle\",\n \"Karen\",\n \"Kari\",\n \"Kariane\",\n \"Karianne\",\n \"Karina\",\n \"Karine\",\n \"Karl\",\n \"Karlee\",\n \"Karley\",\n \"Karli\",\n \"Karlie\",\n \"Karolann\",\n \"Karson\",\n \"Kasandra\",\n \"Kasey\",\n \"Kassandra\",\n \"Katarina\",\n \"Katelin\",\n \"Katelyn\",\n \"Katelynn\",\n \"Katharina\",\n \"Katherine\",\n \"Katheryn\",\n \"Kathleen\",\n \"Kathlyn\",\n \"Kathryn\",\n \"Kathryne\",\n \"Katlyn\",\n \"Katlynn\",\n \"Katrina\",\n \"Katrine\",\n \"Kattie\",\n \"Kavon\",\n \"Kay\",\n \"Kaya\",\n \"Kaycee\",\n \"Kayden\",\n \"Kayla\",\n \"Kaylah\",\n \"Kaylee\",\n \"Kayleigh\",\n \"Kayley\",\n \"Kayli\",\n \"Kaylie\",\n \"Kaylin\",\n \"Keagan\",\n \"Keanu\",\n \"Keara\",\n \"Keaton\",\n \"Keegan\",\n \"Keeley\",\n \"Keely\",\n \"Keenan\",\n \"Keira\",\n \"Keith\",\n \"Kellen\",\n \"Kelley\",\n \"Kelli\",\n \"Kellie\",\n \"Kelly\",\n \"Kelsi\",\n \"Kelsie\",\n \"Kelton\",\n \"Kelvin\",\n \"Ken\",\n \"Kendall\",\n \"Kendra\",\n \"Kendrick\",\n \"Kenna\",\n \"Kennedi\",\n \"Kennedy\",\n \"Kenneth\",\n \"Kennith\",\n \"Kenny\",\n \"Kenton\",\n \"Kenya\",\n \"Kenyatta\",\n \"Kenyon\",\n \"Keon\",\n \"Keshaun\",\n \"Keshawn\",\n \"Keven\",\n \"Kevin\",\n \"Kevon\",\n \"Keyon\",\n \"Keyshawn\",\n \"Khalid\",\n \"Khalil\",\n \"Kian\",\n \"Kiana\",\n \"Kianna\",\n \"Kiara\",\n \"Kiarra\",\n \"Kiel\",\n \"Kiera\",\n \"Kieran\",\n \"Kiley\",\n \"Kim\",\n \"Kimberly\",\n \"King\",\n \"Kip\",\n \"Kira\",\n \"Kirk\",\n \"Kirsten\",\n \"Kirstin\",\n \"Kitty\",\n \"Kobe\",\n \"Koby\",\n \"Kody\",\n \"Kolby\",\n \"Kole\",\n \"Korbin\",\n \"Korey\",\n \"Kory\",\n \"Kraig\",\n \"Kris\",\n \"Krista\",\n \"Kristian\",\n \"Kristin\",\n \"Kristina\",\n \"Kristofer\",\n \"Kristoffer\",\n \"Kristopher\",\n \"Kristy\",\n \"Krystal\",\n \"Krystel\",\n \"Krystina\",\n \"Kurt\",\n \"Kurtis\",\n \"Kyla\",\n \"Kyle\",\n \"Kylee\",\n \"Kyleigh\",\n \"Kyler\",\n \"Kylie\",\n \"Kyra\",\n \"Lacey\",\n \"Lacy\",\n \"Ladarius\",\n \"Lafayette\",\n \"Laila\",\n \"Laisha\",\n \"Lamar\",\n \"Lambert\",\n \"Lamont\",\n \"Lance\",\n \"Landen\",\n \"Lane\",\n \"Laney\",\n \"Larissa\",\n \"Laron\",\n \"Larry\",\n \"Larue\",\n \"Laura\",\n \"Laurel\",\n \"Lauren\",\n \"Laurence\",\n \"Lauretta\",\n \"Lauriane\",\n \"Laurianne\",\n \"Laurie\",\n \"Laurine\",\n \"Laury\",\n \"Lauryn\",\n \"Lavada\",\n \"Lavern\",\n \"Laverna\",\n \"Laverne\",\n \"Lavina\",\n \"Lavinia\",\n \"Lavon\",\n \"Lavonne\",\n \"Lawrence\",\n \"Lawson\",\n \"Layla\",\n \"Layne\",\n \"Lazaro\",\n \"Lea\",\n \"Leann\",\n \"Leanna\",\n \"Leanne\",\n \"Leatha\",\n \"Leda\",\n \"Lee\",\n \"Leif\",\n \"Leila\",\n \"Leilani\",\n \"Lela\",\n \"Lelah\",\n \"Leland\",\n \"Lelia\",\n \"Lempi\",\n \"Lemuel\",\n \"Lenna\",\n \"Lennie\",\n \"Lenny\",\n \"Lenora\",\n \"Lenore\",\n \"Leo\",\n \"Leola\",\n \"Leon\",\n \"Leonard\",\n \"Leonardo\",\n \"Leone\",\n \"Leonel\",\n \"Leonie\",\n \"Leonor\",\n \"Leonora\",\n \"Leopold\",\n \"Leopoldo\",\n \"Leora\",\n \"Lera\",\n \"Lesley\",\n \"Leslie\",\n \"Lesly\",\n \"Lessie\",\n \"Lester\",\n \"Leta\",\n \"Letha\",\n \"Letitia\",\n \"Levi\",\n \"Lew\",\n \"Lewis\",\n \"Lexi\",\n \"Lexie\",\n \"Lexus\",\n \"Lia\",\n \"Liam\",\n \"Liana\",\n \"Libbie\",\n \"Libby\",\n \"Lila\",\n \"Lilian\",\n \"Liliana\",\n \"Liliane\",\n \"Lilla\",\n \"Lillian\",\n \"Lilliana\",\n \"Lillie\",\n \"Lilly\",\n \"Lily\",\n \"Lilyan\",\n \"Lina\",\n \"Lincoln\",\n \"Linda\",\n \"Lindsay\",\n \"Lindsey\",\n \"Linnea\",\n \"Linnie\",\n \"Linwood\",\n \"Lionel\",\n \"Lisa\",\n \"Lisandro\",\n \"Lisette\",\n \"Litzy\",\n \"Liza\",\n \"Lizeth\",\n \"Lizzie\",\n \"Llewellyn\",\n \"Lloyd\",\n \"Logan\",\n \"Lois\",\n \"Lola\",\n \"Lolita\",\n \"Loma\",\n \"Lon\",\n \"London\",\n \"Lonie\",\n \"Lonnie\",\n \"Lonny\",\n \"Lonzo\",\n \"Lora\",\n \"Loraine\",\n \"Loren\",\n \"Lorena\",\n \"Lorenz\",\n \"Lorenza\",\n \"Lorenzo\",\n \"Lori\",\n \"Lorine\",\n \"Lorna\",\n \"Lottie\",\n \"Lou\",\n \"Louie\",\n \"Louisa\",\n \"Lourdes\",\n \"Louvenia\",\n \"Lowell\",\n \"Loy\",\n \"Loyal\",\n \"Loyce\",\n \"Lucas\",\n \"Luciano\",\n \"Lucie\",\n \"Lucienne\",\n \"Lucile\",\n \"Lucinda\",\n \"Lucio\",\n \"Lucious\",\n \"Lucius\",\n \"Lucy\",\n \"Ludie\",\n \"Ludwig\",\n \"Lue\",\n \"Luella\",\n \"Luigi\",\n \"Luis\",\n \"Luisa\",\n \"Lukas\",\n \"Lula\",\n \"Lulu\",\n \"Luna\",\n \"Lupe\",\n \"Lura\",\n \"Lurline\",\n \"Luther\",\n \"Luz\",\n \"Lyda\",\n \"Lydia\",\n \"Lyla\",\n \"Lynn\",\n \"Lyric\",\n \"Lysanne\",\n \"Mabel\",\n \"Mabelle\",\n \"Mable\",\n \"Mac\",\n \"Macey\",\n \"Maci\",\n \"Macie\",\n \"Mack\",\n \"Mackenzie\",\n \"Macy\",\n \"Madaline\",\n \"Madalyn\",\n \"Maddison\",\n \"Madeline\",\n \"Madelyn\",\n \"Madelynn\",\n \"Madge\",\n \"Madie\",\n \"Madilyn\",\n \"Madisen\",\n \"Madison\",\n \"Madisyn\",\n \"Madonna\",\n \"Madyson\",\n \"Mae\",\n \"Maegan\",\n \"Maeve\",\n \"Mafalda\",\n \"Magali\",\n \"Magdalen\",\n \"Magdalena\",\n \"Maggie\",\n \"Magnolia\",\n \"Magnus\",\n \"Maia\",\n \"Maida\",\n \"Maiya\",\n \"Major\",\n \"Makayla\",\n \"Makenna\",\n \"Makenzie\",\n \"Malachi\",\n \"Malcolm\",\n \"Malika\",\n \"Malinda\",\n \"Mallie\",\n \"Mallory\",\n \"Malvina\",\n \"Mandy\",\n \"Manley\",\n \"Manuel\",\n \"Manuela\",\n \"Mara\",\n \"Marc\",\n \"Marcel\",\n \"Marcelina\",\n \"Marcelino\",\n \"Marcella\",\n \"Marcelle\",\n \"Marcellus\",\n \"Marcelo\",\n \"Marcia\",\n \"Marco\",\n \"Marcos\",\n \"Marcus\",\n \"Margaret\",\n \"Margarete\",\n \"Margarett\",\n \"Margaretta\",\n \"Margarette\",\n \"Margarita\",\n \"Marge\",\n \"Margie\",\n \"Margot\",\n \"Margret\",\n \"Marguerite\",\n \"Maria\",\n \"Mariah\",\n \"Mariam\",\n \"Marian\",\n \"Mariana\",\n \"Mariane\",\n \"Marianna\",\n \"Marianne\",\n \"Mariano\",\n \"Maribel\",\n \"Marie\",\n \"Mariela\",\n \"Marielle\",\n \"Marietta\",\n \"Marilie\",\n \"Marilou\",\n \"Marilyne\",\n \"Marina\",\n \"Mario\",\n \"Marion\",\n \"Marisa\",\n \"Marisol\",\n \"Maritza\",\n \"Marjolaine\",\n \"Marjorie\",\n \"Marjory\",\n \"Mark\",\n \"Markus\",\n \"Marlee\",\n \"Marlen\",\n \"Marlene\",\n \"Marley\",\n \"Marlin\",\n \"Marlon\",\n \"Marques\",\n \"Marquis\",\n \"Marquise\",\n \"Marshall\",\n \"Marta\",\n \"Martin\",\n \"Martina\",\n \"Martine\",\n \"Marty\",\n \"Marvin\",\n \"Mary\",\n \"Maryam\",\n \"Maryjane\",\n \"Maryse\",\n \"Mason\",\n \"Mateo\",\n \"Mathew\",\n \"Mathias\",\n \"Mathilde\",\n \"Matilda\",\n \"Matilde\",\n \"Matt\",\n \"Matteo\",\n \"Mattie\",\n \"Maud\",\n \"Maude\",\n \"Maudie\",\n \"Maureen\",\n \"Maurice\",\n \"Mauricio\",\n \"Maurine\",\n \"Maverick\",\n \"Mavis\",\n \"Max\",\n \"Maxie\",\n \"Maxime\",\n \"Maximilian\",\n \"Maximillia\",\n \"Maximillian\",\n \"Maximo\",\n \"Maximus\",\n \"Maxine\",\n \"Maxwell\",\n \"May\",\n \"Maya\",\n \"Maybell\",\n \"Maybelle\",\n \"Maye\",\n \"Maymie\",\n \"Maynard\",\n \"Mayra\",\n \"Mazie\",\n \"Mckayla\",\n \"Mckenna\",\n \"Mckenzie\",\n \"Meagan\",\n \"Meaghan\",\n \"Meda\",\n \"Megane\",\n \"Meggie\",\n \"Meghan\",\n \"Mekhi\",\n \"Melany\",\n \"Melba\",\n \"Melisa\",\n \"Melissa\",\n \"Mellie\",\n \"Melody\",\n \"Melvin\",\n \"Melvina\",\n \"Melyna\",\n \"Melyssa\",\n \"Mercedes\",\n \"Meredith\",\n \"Merl\",\n \"Merle\",\n \"Merlin\",\n \"Merritt\",\n \"Mertie\",\n \"Mervin\",\n \"Meta\",\n \"Mia\",\n \"Micaela\",\n \"Micah\",\n \"Michael\",\n \"Michaela\",\n \"Michale\",\n \"Micheal\",\n \"Michel\",\n \"Michele\",\n \"Michelle\",\n \"Miguel\",\n \"Mikayla\",\n \"Mike\",\n \"Mikel\",\n \"Milan\",\n \"Miles\",\n \"Milford\",\n \"Miller\",\n \"Millie\",\n \"Milo\",\n \"Milton\",\n \"Mina\",\n \"Minerva\",\n \"Minnie\",\n \"Miracle\",\n \"Mireille\",\n \"Mireya\",\n \"Misael\",\n \"Missouri\",\n \"Misty\",\n \"Mitchel\",\n \"Mitchell\",\n \"Mittie\",\n \"Modesta\",\n \"Modesto\",\n \"Mohamed\",\n \"Mohammad\",\n \"Mohammed\",\n \"Moises\",\n \"Mollie\",\n \"Molly\",\n \"Mona\",\n \"Monica\",\n \"Monique\",\n \"Monroe\",\n \"Monserrat\",\n \"Monserrate\",\n \"Montana\",\n \"Monte\",\n \"Monty\",\n \"Morgan\",\n \"Moriah\",\n \"Morris\",\n \"Mortimer\",\n \"Morton\",\n \"Mose\",\n \"Moses\",\n \"Moshe\",\n \"Mossie\",\n \"Mozell\",\n \"Mozelle\",\n \"Muhammad\",\n \"Muriel\",\n \"Murl\",\n \"Murphy\",\n \"Murray\",\n \"Mustafa\",\n \"Mya\",\n \"Myah\",\n \"Mylene\",\n \"Myles\",\n \"Myra\",\n \"Myriam\",\n \"Myrl\",\n \"Myrna\",\n \"Myron\",\n \"Myrtice\",\n \"Myrtie\",\n \"Myrtis\",\n \"Myrtle\",\n \"Nadia\",\n \"Nakia\",\n \"Name\",\n \"Nannie\",\n \"Naomi\",\n \"Naomie\",\n \"Napoleon\",\n \"Narciso\",\n \"Nash\",\n \"Nasir\",\n \"Nat\",\n \"Natalia\",\n \"Natalie\",\n \"Natasha\",\n \"Nathan\",\n \"Nathanael\",\n \"Nathanial\",\n \"Nathaniel\",\n \"Nathen\",\n \"Nayeli\",\n \"Neal\",\n \"Ned\",\n \"Nedra\",\n \"Neha\",\n \"Neil\",\n \"Nelda\",\n \"Nella\",\n \"Nelle\",\n \"Nellie\",\n \"Nels\",\n \"Nelson\",\n \"Neoma\",\n \"Nestor\",\n \"Nettie\",\n \"Neva\",\n \"Newell\",\n \"Newton\",\n \"Nia\",\n \"Nicholas\",\n \"Nicholaus\",\n \"Nichole\",\n \"Nick\",\n \"Nicklaus\",\n \"Nickolas\",\n \"Nico\",\n \"Nicola\",\n \"Nicolas\",\n \"Nicole\",\n \"Nicolette\",\n \"Nigel\",\n \"Nikita\",\n \"Nikki\",\n \"Nikko\",\n \"Niko\",\n \"Nikolas\",\n \"Nils\",\n \"Nina\",\n \"Noah\",\n \"Noble\",\n \"Noe\",\n \"Noel\",\n \"Noelia\",\n \"Noemi\",\n \"Noemie\",\n \"Noemy\",\n \"Nola\",\n \"Nolan\",\n \"Nona\",\n \"Nora\",\n \"Norbert\",\n \"Norberto\",\n \"Norene\",\n \"Norma\",\n \"Norris\",\n \"Norval\",\n \"Norwood\",\n \"Nova\",\n \"Novella\",\n \"Nya\",\n \"Nyah\",\n \"Nyasia\",\n \"Obie\",\n \"Oceane\",\n \"Ocie\",\n \"Octavia\",\n \"Oda\",\n \"Odell\",\n \"Odessa\",\n \"Odie\",\n \"Ofelia\",\n \"Okey\",\n \"Ola\",\n \"Olaf\",\n \"Ole\",\n \"Olen\",\n \"Oleta\",\n \"Olga\",\n \"Olin\",\n \"Oliver\",\n \"Ollie\",\n \"Oma\",\n \"Omari\",\n \"Omer\",\n \"Ona\",\n \"Onie\",\n \"Opal\",\n \"Ophelia\",\n \"Ora\",\n \"Oral\",\n \"Oran\",\n \"Oren\",\n \"Orie\",\n \"Orin\",\n \"Orion\",\n \"Orland\",\n \"Orlando\",\n \"Orlo\",\n \"Orpha\",\n \"Orrin\",\n \"Orval\",\n \"Orville\",\n \"Osbaldo\",\n \"Osborne\",\n \"Oscar\",\n \"Osvaldo\",\n \"Oswald\",\n \"Oswaldo\",\n \"Otha\",\n \"Otho\",\n \"Otilia\",\n \"Otis\",\n \"Ottilie\",\n \"Ottis\",\n \"Otto\",\n \"Ova\",\n \"Owen\",\n \"Ozella\",\n \"Pablo\",\n \"Paige\",\n \"Palma\",\n \"Pamela\",\n \"Pansy\",\n \"Paolo\",\n \"Paris\",\n \"Parker\",\n \"Pascale\",\n \"Pasquale\",\n \"Pat\",\n \"Patience\",\n \"Patricia\",\n \"Patrick\",\n \"Patsy\",\n \"Pattie\",\n \"Paul\",\n \"Paula\",\n \"Pauline\",\n \"Paxton\",\n \"Payton\",\n \"Pearl\",\n \"Pearlie\",\n \"Pearline\",\n \"Pedro\",\n \"Peggie\",\n \"Penelope\",\n \"Percival\",\n \"Percy\",\n \"Perry\",\n \"Pete\",\n \"Peter\",\n \"Petra\",\n \"Peyton\",\n \"Philip\",\n \"Phoebe\",\n \"Phyllis\",\n \"Pierce\",\n \"Pierre\",\n \"Pietro\",\n \"Pink\",\n \"Pinkie\",\n \"Piper\",\n \"Polly\",\n \"Porter\",\n \"Precious\",\n \"Presley\",\n \"Preston\",\n \"Price\",\n \"Prince\",\n \"Princess\",\n \"Priscilla\",\n \"Providenci\",\n \"Prudence\",\n \"Queen\",\n \"Queenie\",\n \"Quentin\",\n \"Quincy\",\n \"Quinn\",\n \"Quinten\",\n \"Quinton\",\n \"Rachael\",\n \"Rachel\",\n \"Rachelle\",\n \"Rae\",\n \"Raegan\",\n \"Rafael\",\n \"Rafaela\",\n \"Raheem\",\n \"Rahsaan\",\n \"Rahul\",\n \"Raina\",\n \"Raleigh\",\n \"Ralph\",\n \"Ramiro\",\n \"Ramon\",\n \"Ramona\",\n \"Randal\",\n \"Randall\",\n \"Randi\",\n \"Randy\",\n \"Ransom\",\n \"Raoul\",\n \"Raphael\",\n \"Raphaelle\",\n \"Raquel\",\n \"Rashad\",\n \"Rashawn\",\n \"Rasheed\",\n \"Raul\",\n \"Raven\",\n \"Ray\",\n \"Raymond\",\n \"Raymundo\",\n \"Reagan\",\n \"Reanna\",\n \"Reba\",\n \"Rebeca\",\n \"Rebecca\",\n \"Rebeka\",\n \"Rebekah\",\n \"Reece\",\n \"Reed\",\n \"Reese\",\n \"Regan\",\n \"Reggie\",\n \"Reginald\",\n \"Reid\",\n \"Reilly\",\n \"Reina\",\n \"Reinhold\",\n \"Remington\",\n \"Rene\",\n \"Renee\",\n \"Ressie\",\n \"Reta\",\n \"Retha\",\n \"Retta\",\n \"Reuben\",\n \"Reva\",\n \"Rex\",\n \"Rey\",\n \"Reyes\",\n \"Reymundo\",\n \"Reyna\",\n \"Reynold\",\n \"Rhea\",\n \"Rhett\",\n \"Rhianna\",\n \"Rhiannon\",\n \"Rhoda\",\n \"Ricardo\",\n \"Richard\",\n \"Richie\",\n \"Richmond\",\n \"Rick\",\n \"Rickey\",\n \"Rickie\",\n \"Ricky\",\n \"Rico\",\n \"Rigoberto\",\n \"Riley\",\n \"Rita\",\n \"River\",\n \"Robb\",\n \"Robbie\",\n \"Robert\",\n \"Roberta\",\n \"Roberto\",\n \"Robin\",\n \"Robyn\",\n \"Rocio\",\n \"Rocky\",\n \"Rod\",\n \"Roderick\",\n \"Rodger\",\n \"Rodolfo\",\n \"Rodrick\",\n \"Rodrigo\",\n \"Roel\",\n \"Rogelio\",\n \"Roger\",\n \"Rogers\",\n \"Rolando\",\n \"Rollin\",\n \"Roma\",\n \"Romaine\",\n \"Roman\",\n \"Ron\",\n \"Ronaldo\",\n \"Ronny\",\n \"Roosevelt\",\n \"Rory\",\n \"Rosa\",\n \"Rosalee\",\n \"Rosalia\",\n \"Rosalind\",\n \"Rosalinda\",\n \"Rosalyn\",\n \"Rosamond\",\n \"Rosanna\",\n \"Rosario\",\n \"Roscoe\",\n \"Rose\",\n \"Rosella\",\n \"Roselyn\",\n \"Rosemarie\",\n \"Rosemary\",\n \"Rosendo\",\n \"Rosetta\",\n \"Rosie\",\n \"Rosina\",\n \"Roslyn\",\n \"Ross\",\n \"Rossie\",\n \"Rowan\",\n \"Rowena\",\n \"Rowland\",\n \"Roxane\",\n \"Roxanne\",\n \"Roy\",\n \"Royal\",\n \"Royce\",\n \"Rozella\",\n \"Ruben\",\n \"Rubie\",\n \"Ruby\",\n \"Rubye\",\n \"Rudolph\",\n \"Rudy\",\n \"Rupert\",\n \"Russ\",\n \"Russel\",\n \"Russell\",\n \"Rusty\",\n \"Ruth\",\n \"Ruthe\",\n \"Ruthie\",\n \"Ryan\",\n \"Ryann\",\n \"Ryder\",\n \"Rylan\",\n \"Rylee\",\n \"Ryleigh\",\n \"Ryley\",\n \"Sabina\",\n \"Sabrina\",\n \"Sabryna\",\n \"Sadie\",\n \"Sadye\",\n \"Sage\",\n \"Saige\",\n \"Sallie\",\n \"Sally\",\n \"Salma\",\n \"Salvador\",\n \"Salvatore\",\n \"Sam\",\n \"Samanta\",\n \"Samantha\",\n \"Samara\",\n \"Samir\",\n \"Sammie\",\n \"Sammy\",\n \"Samson\",\n \"Sandra\",\n \"Sandrine\",\n \"Sandy\",\n \"Sanford\",\n \"Santa\",\n \"Santiago\",\n \"Santina\",\n \"Santino\",\n \"Santos\",\n \"Sarah\",\n \"Sarai\",\n \"Sarina\",\n \"Sasha\",\n \"Saul\",\n \"Savanah\",\n \"Savanna\",\n \"Savannah\",\n \"Savion\",\n \"Scarlett\",\n \"Schuyler\",\n \"Scot\",\n \"Scottie\",\n \"Scotty\",\n \"Seamus\",\n \"Sean\",\n \"Sebastian\",\n \"Sedrick\",\n \"Selena\",\n \"Selina\",\n \"Selmer\",\n \"Serena\",\n \"Serenity\",\n \"Seth\",\n \"Shad\",\n \"Shaina\",\n \"Shakira\",\n \"Shana\",\n \"Shane\",\n \"Shanel\",\n \"Shanelle\",\n \"Shania\",\n \"Shanie\",\n \"Shaniya\",\n \"Shanna\",\n \"Shannon\",\n \"Shanny\",\n \"Shanon\",\n \"Shany\",\n \"Sharon\",\n \"Shaun\",\n \"Shawn\",\n \"Shawna\",\n \"Shaylee\",\n \"Shayna\",\n \"Shayne\",\n \"Shea\",\n \"Sheila\",\n \"Sheldon\",\n \"Shemar\",\n \"Sheridan\",\n \"Sherman\",\n \"Sherwood\",\n \"Shirley\",\n \"Shyann\",\n \"Shyanne\",\n \"Sibyl\",\n \"Sid\",\n \"Sidney\",\n \"Sienna\",\n \"Sierra\",\n \"Sigmund\",\n \"Sigrid\",\n \"Sigurd\",\n \"Silas\",\n \"Sim\",\n \"Simeon\",\n \"Simone\",\n \"Sincere\",\n \"Sister\",\n \"Skye\",\n \"Skyla\",\n \"Skylar\",\n \"Sofia\",\n \"Soledad\",\n \"Solon\",\n \"Sonia\",\n \"Sonny\",\n \"Sonya\",\n \"Sophia\",\n \"Sophie\",\n \"Spencer\",\n \"Stacey\",\n \"Stacy\",\n \"Stan\",\n \"Stanford\",\n \"Stanley\",\n \"Stanton\",\n \"Stefan\",\n \"Stefanie\",\n \"Stella\",\n \"Stephan\",\n \"Stephania\",\n \"Stephanie\",\n \"Stephany\",\n \"Stephen\",\n \"Stephon\",\n \"Sterling\",\n \"Steve\",\n \"Stevie\",\n \"Stewart\",\n \"Stone\",\n \"Stuart\",\n \"Summer\",\n \"Sunny\",\n \"Susan\",\n \"Susana\",\n \"Susanna\",\n \"Susie\",\n \"Suzanne\",\n \"Sven\",\n \"Syble\",\n \"Sydnee\",\n \"Sydney\",\n \"Sydni\",\n \"Sydnie\",\n \"Sylvan\",\n \"Sylvester\",\n \"Sylvia\",\n \"Tabitha\",\n \"Tad\",\n \"Talia\",\n \"Talon\",\n \"Tamara\",\n \"Tamia\",\n \"Tania\",\n \"Tanner\",\n \"Tanya\",\n \"Tara\",\n \"Taryn\",\n \"Tate\",\n \"Tatum\",\n \"Tatyana\",\n \"Taurean\",\n \"Tavares\",\n \"Taya\",\n \"Taylor\",\n \"Teagan\",\n \"Ted\",\n \"Telly\",\n \"Terence\",\n \"Teresa\",\n \"Terrance\",\n \"Terrell\",\n \"Terrence\",\n \"Terrill\",\n \"Terry\",\n \"Tess\",\n \"Tessie\",\n \"Tevin\",\n \"Thad\",\n \"Thaddeus\",\n \"Thalia\",\n \"Thea\",\n \"Thelma\",\n \"Theo\",\n \"Theodora\",\n \"Theodore\",\n \"Theresa\",\n \"Therese\",\n \"Theresia\",\n \"Theron\",\n \"Thomas\",\n \"Thora\",\n \"Thurman\",\n \"Tia\",\n \"Tiana\",\n \"Tianna\",\n \"Tiara\",\n \"Tierra\",\n \"Tiffany\",\n \"Tillman\",\n \"Timmothy\",\n \"Timmy\",\n \"Timothy\",\n \"Tina\",\n \"Tito\",\n \"Titus\",\n \"Tobin\",\n \"Toby\",\n \"Tod\",\n \"Tom\",\n \"Tomas\",\n \"Tomasa\",\n \"Tommie\",\n \"Toney\",\n \"Toni\",\n \"Tony\",\n \"Torey\",\n \"Torrance\",\n \"Torrey\",\n \"Toy\",\n \"Trace\",\n \"Tracey\",\n \"Tracy\",\n \"Travis\",\n \"Travon\",\n \"Tre\",\n \"Tremaine\",\n \"Tremayne\",\n \"Trent\",\n \"Trenton\",\n \"Tressa\",\n \"Tressie\",\n \"Treva\",\n \"Trever\",\n \"Trevion\",\n \"Trevor\",\n \"Trey\",\n \"Trinity\",\n \"Trisha\",\n \"Tristian\",\n \"Tristin\",\n \"Triston\",\n \"Troy\",\n \"Trudie\",\n \"Trycia\",\n \"Trystan\",\n \"Turner\",\n \"Twila\",\n \"Tyler\",\n \"Tyra\",\n \"Tyree\",\n \"Tyreek\",\n \"Tyrel\",\n \"Tyrell\",\n \"Tyrese\",\n \"Tyrique\",\n \"Tyshawn\",\n \"Tyson\",\n \"Ubaldo\",\n \"Ulices\",\n \"Ulises\",\n \"Una\",\n \"Unique\",\n \"Urban\",\n \"Uriah\",\n \"Uriel\",\n \"Ursula\",\n \"Vada\",\n \"Valentin\",\n \"Valentina\",\n \"Valentine\",\n \"Valerie\",\n \"Vallie\",\n \"Van\",\n \"Vance\",\n \"Vanessa\",\n \"Vaughn\",\n \"Veda\",\n \"Velda\",\n \"Vella\",\n \"Velma\",\n \"Velva\",\n \"Vena\",\n \"Verda\",\n \"Verdie\",\n \"Vergie\",\n \"Verla\",\n \"Verlie\",\n \"Vern\",\n \"Verna\",\n \"Verner\",\n \"Vernice\",\n \"Vernie\",\n \"Vernon\",\n \"Verona\",\n \"Veronica\",\n \"Vesta\",\n \"Vicenta\",\n \"Vicente\",\n \"Vickie\",\n \"Vicky\",\n \"Victor\",\n \"Victoria\",\n \"Vida\",\n \"Vidal\",\n \"Vilma\",\n \"Vince\",\n \"Vincent\",\n \"Vincenza\",\n \"Vincenzo\",\n \"Vinnie\",\n \"Viola\",\n \"Violet\",\n \"Violette\",\n \"Virgie\",\n \"Virgil\",\n \"Virginia\",\n \"Virginie\",\n \"Vita\",\n \"Vito\",\n \"Viva\",\n \"Vivian\",\n \"Viviane\",\n \"Vivianne\",\n \"Vivien\",\n \"Vivienne\",\n \"Vladimir\",\n \"Wade\",\n \"Waino\",\n \"Waldo\",\n \"Walker\",\n \"Wallace\",\n \"Walter\",\n \"Walton\",\n \"Wanda\",\n \"Ward\",\n \"Warren\",\n \"Watson\",\n \"Wava\",\n \"Waylon\",\n \"Wayne\",\n \"Webster\",\n \"Weldon\",\n \"Wellington\",\n \"Wendell\",\n \"Wendy\",\n \"Werner\",\n \"Westley\",\n \"Weston\",\n \"Whitney\",\n \"Wilber\",\n \"Wilbert\",\n \"Wilburn\",\n \"Wiley\",\n \"Wilford\",\n \"Wilfred\",\n \"Wilfredo\",\n \"Wilfrid\",\n \"Wilhelm\",\n \"Wilhelmine\",\n \"Will\",\n \"Willa\",\n \"Willard\",\n \"William\",\n \"Willie\",\n \"Willis\",\n \"Willow\",\n \"Willy\",\n \"Wilma\",\n \"Wilmer\",\n \"Wilson\",\n \"Wilton\",\n \"Winfield\",\n \"Winifred\",\n \"Winnifred\",\n \"Winona\",\n \"Winston\",\n \"Woodrow\",\n \"Wyatt\",\n \"Wyman\",\n \"Xander\",\n \"Xavier\",\n \"Xzavier\",\n \"Yadira\",\n \"Yasmeen\",\n \"Yasmin\",\n \"Yasmine\",\n \"Yazmin\",\n \"Yesenia\",\n \"Yessenia\",\n \"Yolanda\",\n \"Yoshiko\",\n \"Yvette\",\n \"Yvonne\",\n \"Zachariah\",\n \"Zachary\",\n \"Zachery\",\n \"Zack\",\n \"Zackary\",\n \"Zackery\",\n \"Zakary\",\n \"Zander\",\n \"Zane\",\n \"Zaria\",\n \"Zechariah\",\n \"Zelda\",\n \"Zella\",\n \"Zelma\",\n \"Zena\",\n \"Zetta\",\n \"Zion\",\n \"Zita\",\n \"Zoe\",\n \"Zoey\",\n \"Zoie\",\n \"Zoila\",\n \"Zola\",\n \"Zora\",\n \"Zula\"\n];\n\n},{}],141:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Asexual\",\n \"Female to male trans man\",\n \"Female to male transgender man\",\n \"Female to male transsexual man\",\n \"F2M\",\n \"Gender neutral\",\n \"Hermaphrodite\",\n \"Intersex man\",\n \"Intersex person\",\n \"Intersex woman\",\n \"Male to female trans woman\",\n \"Male to female transgender woman\",\n \"Male to female transsexual woman\",\n \"Man\",\n \"M2F\",\n \"Polygender\",\n \"T* man\",\n \"T* woman\",\n \"Two* person\",\n \"Two-spirit person\",\n \"Woman\",\n \"Agender\",\n \"Androgyne\",\n \"Androgynes\",\n \"Androgynous\",\n \"Bigender\",\n \"Cis\",\n \"Cis Female\",\n \"Cis Male\",\n \"Cis Man\",\n \"Cis Woman\",\n \"Cisgender\",\n \"Cisgender Female\",\n \"Cisgender Male\",\n \"Cisgender Man\",\n \"Cisgender Woman\",\n \"Female to Male\",\n \"FTM\",\n \"Gender Fluid\",\n \"Gender Nonconforming\",\n \"Gender Questioning\",\n \"Gender Variant\",\n \"Genderqueer\",\n \"Intersex\",\n \"Male to Female\",\n \"MTF\",\n \"Neither\",\n \"Neutrois\",\n \"Non-binary\",\n \"Other\",\n \"Pangender\",\n \"Trans\",\n \"Trans Female\",\n \"Trans Male\",\n \"Trans Man\",\n \"Trans Person\",\n \"Trans*Female\",\n \"Trans*Male\",\n \"Trans*Man\",\n \"Trans*Person\",\n \"Trans*Woman\",\n \"Transexual\",\n \"Transexual Female\",\n \"Transexual Male\",\n \"Transexual Man\",\n \"Transexual Person\",\n \"Transexual Woman\",\n \"Transgender Female\",\n \"Transgender Person\",\n \"Transmasculine\",\n \"Two-spirit\"\n];\n\n},{}],142:[function(require,module,exports){\nvar name = {};\nmodule['exports'] = name;\nname.male_first_name = require(\"./male_first_name\");\nname.female_first_name = require(\"./female_first_name\");\nname.first_name = require(\"./first_name\");\nname.last_name = require(\"./last_name\");\nname.binary_gender = require(\"./binary_gender\");\nname.gender = require(\"./gender\");\nname.prefix = require(\"./prefix\");\nname.suffix = require(\"./suffix\");\nname.title = require(\"./title\");\nname.name = require(\"./name\");\n},{\"./binary_gender\":138,\"./female_first_name\":139,\"./first_name\":140,\"./gender\":141,\"./last_name\":143,\"./male_first_name\":144,\"./name\":145,\"./prefix\":146,\"./suffix\":147,\"./title\":148}],143:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Abbott\",\n \"Abernathy\",\n \"Abshire\",\n \"Adams\",\n \"Altenwerth\",\n \"Anderson\",\n \"Ankunding\",\n \"Armstrong\",\n \"Auer\",\n \"Aufderhar\",\n \"Bahringer\",\n \"Bailey\",\n \"Balistreri\",\n \"Barrows\",\n \"Bartell\",\n \"Bartoletti\",\n \"Barton\",\n \"Bashirian\",\n \"Batz\",\n \"Bauch\",\n \"Baumbach\",\n \"Bayer\",\n \"Beahan\",\n \"Beatty\",\n \"Bechtelar\",\n \"Becker\",\n \"Bednar\",\n \"Beer\",\n \"Beier\",\n \"Berge\",\n \"Bergnaum\",\n \"Bergstrom\",\n \"Bernhard\",\n \"Bernier\",\n \"Bins\",\n \"Blanda\",\n \"Blick\",\n \"Block\",\n \"Bode\",\n \"Boehm\",\n \"Bogan\",\n \"Bogisich\",\n \"Borer\",\n \"Bosco\",\n \"Botsford\",\n \"Boyer\",\n \"Boyle\",\n \"Bradtke\",\n \"Brakus\",\n \"Braun\",\n \"Breitenberg\",\n \"Brekke\",\n \"Brown\",\n \"Bruen\",\n \"Buckridge\",\n \"Carroll\",\n \"Carter\",\n \"Cartwright\",\n \"Casper\",\n \"Cassin\",\n \"Champlin\",\n \"Christiansen\",\n \"Cole\",\n \"Collier\",\n \"Collins\",\n \"Conn\",\n \"Connelly\",\n \"Conroy\",\n \"Considine\",\n \"Corkery\",\n \"Cormier\",\n \"Corwin\",\n \"Cremin\",\n \"Crist\",\n \"Crona\",\n \"Cronin\",\n \"Crooks\",\n \"Cruickshank\",\n \"Cummerata\",\n \"Cummings\",\n \"Dach\",\n \"D'Amore\",\n \"Daniel\",\n \"Dare\",\n \"Daugherty\",\n \"Davis\",\n \"Deckow\",\n \"Denesik\",\n \"Dibbert\",\n \"Dickens\",\n \"Dicki\",\n \"Dickinson\",\n \"Dietrich\",\n \"Donnelly\",\n \"Dooley\",\n \"Douglas\",\n \"Doyle\",\n \"DuBuque\",\n \"Durgan\",\n \"Ebert\",\n \"Effertz\",\n \"Emard\",\n \"Emmerich\",\n \"Erdman\",\n \"Ernser\",\n \"Fadel\",\n \"Fahey\",\n \"Farrell\",\n \"Fay\",\n \"Feeney\",\n \"Feest\",\n \"Feil\",\n \"Ferry\",\n \"Fisher\",\n \"Flatley\",\n \"Frami\",\n \"Franecki\",\n \"Friesen\",\n \"Fritsch\",\n \"Funk\",\n \"Gaylord\",\n \"Gerhold\",\n \"Gerlach\",\n \"Gibson\",\n \"Gislason\",\n \"Gleason\",\n \"Gleichner\",\n \"Glover\",\n \"Goldner\",\n \"Goodwin\",\n \"Gorczany\",\n \"Gottlieb\",\n \"Goyette\",\n \"Grady\",\n \"Graham\",\n \"Grant\",\n \"Green\",\n \"Greenfelder\",\n \"Greenholt\",\n \"Grimes\",\n \"Gulgowski\",\n \"Gusikowski\",\n \"Gutkowski\",\n \"Gutmann\",\n \"Haag\",\n \"Hackett\",\n \"Hagenes\",\n \"Hahn\",\n \"Haley\",\n \"Halvorson\",\n \"Hamill\",\n \"Hammes\",\n \"Hand\",\n \"Hane\",\n \"Hansen\",\n \"Harber\",\n \"Harris\",\n \"Hartmann\",\n \"Harvey\",\n \"Hauck\",\n \"Hayes\",\n \"Heaney\",\n \"Heathcote\",\n \"Hegmann\",\n \"Heidenreich\",\n \"Heller\",\n \"Herman\",\n \"Hermann\",\n \"Hermiston\",\n \"Herzog\",\n \"Hessel\",\n \"Hettinger\",\n \"Hickle\",\n \"Hilll\",\n \"Hills\",\n \"Hilpert\",\n \"Hintz\",\n \"Hirthe\",\n \"Hodkiewicz\",\n \"Hoeger\",\n \"Homenick\",\n \"Hoppe\",\n \"Howe\",\n \"Howell\",\n \"Hudson\",\n \"Huel\",\n \"Huels\",\n \"Hyatt\",\n \"Jacobi\",\n \"Jacobs\",\n \"Jacobson\",\n \"Jakubowski\",\n \"Jaskolski\",\n \"Jast\",\n \"Jenkins\",\n \"Jerde\",\n \"Johns\",\n \"Johnson\",\n \"Johnston\",\n \"Jones\",\n \"Kassulke\",\n \"Kautzer\",\n \"Keebler\",\n \"Keeling\",\n \"Kemmer\",\n \"Kerluke\",\n \"Kertzmann\",\n \"Kessler\",\n \"Kiehn\",\n \"Kihn\",\n \"Kilback\",\n \"King\",\n \"Kirlin\",\n \"Klein\",\n \"Kling\",\n \"Klocko\",\n \"Koch\",\n \"Koelpin\",\n \"Koepp\",\n \"Kohler\",\n \"Konopelski\",\n \"Koss\",\n \"Kovacek\",\n \"Kozey\",\n \"Krajcik\",\n \"Kreiger\",\n \"Kris\",\n \"Kshlerin\",\n \"Kub\",\n \"Kuhic\",\n \"Kuhlman\",\n \"Kuhn\",\n \"Kulas\",\n \"Kunde\",\n \"Kunze\",\n \"Kuphal\",\n \"Kutch\",\n \"Kuvalis\",\n \"Labadie\",\n \"Lakin\",\n \"Lang\",\n \"Langosh\",\n \"Langworth\",\n \"Larkin\",\n \"Larson\",\n \"Leannon\",\n \"Lebsack\",\n \"Ledner\",\n \"Leffler\",\n \"Legros\",\n \"Lehner\",\n \"Lemke\",\n \"Lesch\",\n \"Leuschke\",\n \"Lind\",\n \"Lindgren\",\n \"Littel\",\n \"Little\",\n \"Lockman\",\n \"Lowe\",\n \"Lubowitz\",\n \"Lueilwitz\",\n \"Luettgen\",\n \"Lynch\",\n \"Macejkovic\",\n \"MacGyver\",\n \"Maggio\",\n \"Mann\",\n \"Mante\",\n \"Marks\",\n \"Marquardt\",\n \"Marvin\",\n \"Mayer\",\n \"Mayert\",\n \"McClure\",\n \"McCullough\",\n \"McDermott\",\n \"McGlynn\",\n \"McKenzie\",\n \"McLaughlin\",\n \"Medhurst\",\n \"Mertz\",\n \"Metz\",\n \"Miller\",\n \"Mills\",\n \"Mitchell\",\n \"Moen\",\n \"Mohr\",\n \"Monahan\",\n \"Moore\",\n \"Morar\",\n \"Morissette\",\n \"Mosciski\",\n \"Mraz\",\n \"Mueller\",\n \"Muller\",\n \"Murazik\",\n \"Murphy\",\n \"Murray\",\n \"Nader\",\n \"Nicolas\",\n \"Nienow\",\n \"Nikolaus\",\n \"Nitzsche\",\n \"Nolan\",\n \"Oberbrunner\",\n \"O'Connell\",\n \"O'Conner\",\n \"O'Hara\",\n \"O'Keefe\",\n \"O'Kon\",\n \"Okuneva\",\n \"Olson\",\n \"Ondricka\",\n \"O'Reilly\",\n \"Orn\",\n \"Ortiz\",\n \"Osinski\",\n \"Pacocha\",\n \"Padberg\",\n \"Pagac\",\n \"Parisian\",\n \"Parker\",\n \"Paucek\",\n \"Pfannerstill\",\n \"Pfeffer\",\n \"Pollich\",\n \"Pouros\",\n \"Powlowski\",\n \"Predovic\",\n \"Price\",\n \"Prohaska\",\n \"Prosacco\",\n \"Purdy\",\n \"Quigley\",\n \"Quitzon\",\n \"Rath\",\n \"Ratke\",\n \"Rau\",\n \"Raynor\",\n \"Reichel\",\n \"Reichert\",\n \"Reilly\",\n \"Reinger\",\n \"Rempel\",\n \"Renner\",\n \"Reynolds\",\n \"Rice\",\n \"Rippin\",\n \"Ritchie\",\n \"Robel\",\n \"Roberts\",\n \"Rodriguez\",\n \"Rogahn\",\n \"Rohan\",\n \"Rolfson\",\n \"Romaguera\",\n \"Roob\",\n \"Rosenbaum\",\n \"Rowe\",\n \"Ruecker\",\n \"Runolfsdottir\",\n \"Runolfsson\",\n \"Runte\",\n \"Russel\",\n \"Rutherford\",\n \"Ryan\",\n \"Sanford\",\n \"Satterfield\",\n \"Sauer\",\n \"Sawayn\",\n \"Schaden\",\n \"Schaefer\",\n \"Schamberger\",\n \"Schiller\",\n \"Schimmel\",\n \"Schinner\",\n \"Schmeler\",\n \"Schmidt\",\n \"Schmitt\",\n \"Schneider\",\n \"Schoen\",\n \"Schowalter\",\n \"Schroeder\",\n \"Schulist\",\n \"Schultz\",\n \"Schumm\",\n \"Schuppe\",\n \"Schuster\",\n \"Senger\",\n \"Shanahan\",\n \"Shields\",\n \"Simonis\",\n \"Sipes\",\n \"Skiles\",\n \"Smith\",\n \"Smitham\",\n \"Spencer\",\n \"Spinka\",\n \"Sporer\",\n \"Stamm\",\n \"Stanton\",\n \"Stark\",\n \"Stehr\",\n \"Steuber\",\n \"Stiedemann\",\n \"Stokes\",\n \"Stoltenberg\",\n \"Stracke\",\n \"Streich\",\n \"Stroman\",\n \"Strosin\",\n \"Swaniawski\",\n \"Swift\",\n \"Terry\",\n \"Thiel\",\n \"Thompson\",\n \"Tillman\",\n \"Torp\",\n \"Torphy\",\n \"Towne\",\n \"Toy\",\n \"Trantow\",\n \"Tremblay\",\n \"Treutel\",\n \"Tromp\",\n \"Turcotte\",\n \"Turner\",\n \"Ullrich\",\n \"Upton\",\n \"Vandervort\",\n \"Veum\",\n \"Volkman\",\n \"Von\",\n \"VonRueden\",\n \"Waelchi\",\n \"Walker\",\n \"Walsh\",\n \"Walter\",\n \"Ward\",\n \"Waters\",\n \"Watsica\",\n \"Weber\",\n \"Wehner\",\n \"Weimann\",\n \"Weissnat\",\n \"Welch\",\n \"West\",\n \"White\",\n \"Wiegand\",\n \"Wilderman\",\n \"Wilkinson\",\n \"Will\",\n \"Williamson\",\n \"Willms\",\n \"Windler\",\n \"Wintheiser\",\n \"Wisoky\",\n \"Wisozk\",\n \"Witting\",\n \"Wiza\",\n \"Wolf\",\n \"Wolff\",\n \"Wuckert\",\n \"Wunsch\",\n \"Wyman\",\n \"Yost\",\n \"Yundt\",\n \"Zboncak\",\n \"Zemlak\",\n \"Ziemann\",\n \"Zieme\",\n \"Zulauf\"\n];\n\n},{}],144:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"James\",\n \"John\",\n \"Robert\",\n \"Michael\",\n \"William\",\n \"David\",\n \"Richard\",\n \"Charles\",\n \"Joseph\",\n \"Thomas\",\n \"Christopher\",\n \"Daniel\",\n \"Paul\",\n \"Mark\",\n \"Donald\",\n \"George\",\n \"Kenneth\",\n \"Steven\",\n \"Edward\",\n \"Brian\",\n \"Ronald\",\n \"Anthony\",\n \"Kevin\",\n \"Jason\",\n \"Matthew\",\n \"Gary\",\n \"Timothy\",\n \"Jose\",\n \"Larry\",\n \"Jeffrey\",\n \"Frank\",\n \"Scott\",\n \"Eric\",\n \"Stephen\",\n \"Andrew\",\n \"Raymond\",\n \"Gregory\",\n \"Joshua\",\n \"Jerry\",\n \"Dennis\",\n \"Walter\",\n \"Patrick\",\n \"Peter\",\n \"Harold\",\n \"Douglas\",\n \"Henry\",\n \"Carl\",\n \"Arthur\",\n \"Ryan\",\n \"Roger\",\n \"Joe\",\n \"Juan\",\n \"Jack\",\n \"Albert\",\n \"Jonathan\",\n \"Justin\",\n \"Terry\",\n \"Gerald\",\n \"Keith\",\n \"Samuel\",\n \"Willie\",\n \"Ralph\",\n \"Lawrence\",\n \"Nicholas\",\n \"Roy\",\n \"Benjamin\",\n \"Bruce\",\n \"Brandon\",\n \"Adam\",\n \"Harry\",\n \"Fred\",\n \"Wayne\",\n \"Billy\",\n \"Steve\",\n \"Louis\",\n \"Jeremy\",\n \"Aaron\",\n \"Randy\",\n \"Howard\",\n \"Eugene\",\n \"Carlos\",\n \"Russell\",\n \"Bobby\",\n \"Victor\",\n \"Martin\",\n \"Ernest\",\n \"Phillip\",\n \"Todd\",\n \"Jesse\",\n \"Craig\",\n \"Alan\",\n \"Shawn\",\n \"Clarence\",\n \"Sean\",\n \"Philip\",\n \"Chris\",\n \"Johnny\",\n \"Earl\",\n \"Jimmy\",\n \"Antonio\",\n \"Danny\",\n \"Bryan\",\n \"Tony\",\n \"Luis\",\n \"Mike\",\n \"Stanley\",\n \"Leonard\",\n \"Nathan\",\n \"Dale\",\n \"Manuel\",\n \"Rodney\",\n \"Curtis\",\n \"Norman\",\n \"Allen\",\n \"Marvin\",\n \"Vincent\",\n \"Glenn\",\n \"Jeffery\",\n \"Travis\",\n \"Jeff\",\n \"Chad\",\n \"Jacob\",\n \"Lee\",\n \"Melvin\",\n \"Alfred\",\n \"Kyle\",\n \"Francis\",\n \"Bradley\",\n \"Jesus\",\n \"Herbert\",\n \"Frederick\",\n \"Ray\",\n \"Joel\",\n \"Edwin\",\n \"Don\",\n \"Eddie\",\n \"Ricky\",\n \"Troy\",\n \"Randall\",\n \"Barry\",\n \"Alexander\",\n \"Bernard\",\n \"Mario\",\n \"Leroy\",\n \"Francisco\",\n \"Marcus\",\n \"Micheal\",\n \"Theodore\",\n \"Clifford\",\n \"Miguel\",\n \"Oscar\",\n \"Jay\",\n \"Jim\",\n \"Tom\",\n \"Calvin\",\n \"Alex\",\n \"Jon\",\n \"Ronnie\",\n \"Bill\",\n \"Lloyd\",\n \"Tommy\",\n \"Leon\",\n \"Derek\",\n \"Warren\",\n \"Darrell\",\n \"Jerome\",\n \"Floyd\",\n \"Leo\",\n \"Alvin\",\n \"Tim\",\n \"Wesley\",\n \"Gordon\",\n \"Dean\",\n \"Greg\",\n \"Jorge\",\n \"Dustin\",\n \"Pedro\",\n \"Derrick\",\n \"Dan\",\n \"Lewis\",\n \"Zachary\",\n \"Corey\",\n \"Herman\",\n \"Maurice\",\n \"Vernon\",\n \"Roberto\",\n \"Clyde\",\n \"Glen\",\n \"Hector\",\n \"Shane\",\n \"Ricardo\",\n \"Sam\",\n \"Rick\",\n \"Lester\",\n \"Brent\",\n \"Ramon\",\n \"Charlie\",\n \"Tyler\",\n \"Gilbert\",\n \"Gene\",\n \"Marc\",\n \"Reginald\",\n \"Ruben\",\n \"Brett\",\n \"Angel\",\n \"Nathaniel\",\n \"Rafael\",\n \"Leslie\",\n \"Edgar\",\n \"Milton\",\n \"Raul\",\n \"Ben\",\n \"Chester\",\n \"Cecil\",\n \"Duane\",\n \"Franklin\",\n \"Andre\",\n \"Elmer\",\n \"Brad\",\n \"Gabriel\",\n \"Ron\",\n \"Mitchell\",\n \"Roland\",\n \"Arnold\",\n \"Harvey\",\n \"Jared\",\n \"Adrian\",\n \"Karl\",\n \"Cory\",\n \"Claude\",\n \"Erik\",\n \"Darryl\",\n \"Jamie\",\n \"Neil\",\n \"Jessie\",\n \"Christian\",\n \"Javier\",\n \"Fernando\",\n \"Clinton\",\n \"Ted\",\n \"Mathew\",\n \"Tyrone\",\n \"Darren\",\n \"Lonnie\",\n \"Lance\",\n \"Cody\",\n \"Julio\",\n \"Kelly\",\n \"Kurt\",\n \"Allan\",\n \"Nelson\",\n \"Guy\",\n \"Clayton\",\n \"Hugh\",\n \"Max\",\n \"Dwayne\",\n \"Dwight\",\n \"Armando\",\n \"Felix\",\n \"Jimmie\",\n \"Everett\",\n \"Jordan\",\n \"Ian\",\n \"Wallace\",\n \"Ken\",\n \"Bob\",\n \"Jaime\",\n \"Casey\",\n \"Alfredo\",\n \"Alberto\",\n \"Dave\",\n \"Ivan\",\n \"Johnnie\",\n \"Sidney\",\n \"Byron\",\n \"Julian\",\n \"Isaac\",\n \"Morris\",\n \"Clifton\",\n \"Willard\",\n \"Daryl\",\n \"Ross\",\n \"Virgil\",\n \"Andy\",\n \"Marshall\",\n \"Salvador\",\n \"Perry\",\n \"Kirk\",\n \"Sergio\",\n \"Marion\",\n \"Tracy\",\n \"Seth\",\n \"Kent\",\n \"Terrance\",\n \"Rene\",\n \"Eduardo\",\n \"Terrence\",\n \"Enrique\",\n \"Freddie\",\n \"Wade\",\n \"Austin\",\n \"Stuart\",\n \"Fredrick\",\n \"Arturo\",\n \"Alejandro\",\n \"Jackie\",\n \"Joey\",\n \"Nick\",\n \"Luther\",\n \"Wendell\",\n \"Jeremiah\",\n \"Evan\",\n \"Julius\",\n \"Dana\",\n \"Donnie\",\n \"Otis\",\n \"Shannon\",\n \"Trevor\",\n \"Oliver\",\n \"Luke\",\n \"Homer\",\n \"Gerard\",\n \"Doug\",\n \"Kenny\",\n \"Hubert\",\n \"Angelo\",\n \"Shaun\",\n \"Lyle\",\n \"Matt\",\n \"Lynn\",\n \"Alfonso\",\n \"Orlando\",\n \"Rex\",\n \"Carlton\",\n \"Ernesto\",\n \"Cameron\",\n \"Neal\",\n \"Pablo\",\n \"Lorenzo\",\n \"Omar\",\n \"Wilbur\",\n \"Blake\",\n \"Grant\",\n \"Horace\",\n \"Roderick\",\n \"Kerry\",\n \"Abraham\",\n \"Willis\",\n \"Rickey\",\n \"Jean\",\n \"Ira\",\n \"Andres\",\n \"Cesar\",\n \"Johnathan\",\n \"Malcolm\",\n \"Rudolph\",\n \"Damon\",\n \"Kelvin\",\n \"Rudy\",\n \"Preston\",\n \"Alton\",\n \"Archie\",\n \"Marco\",\n \"Wm\",\n \"Pete\",\n \"Randolph\",\n \"Garry\",\n \"Geoffrey\",\n \"Jonathon\",\n \"Felipe\",\n \"Bennie\",\n \"Gerardo\",\n \"Ed\",\n \"Dominic\",\n \"Robin\",\n \"Loren\",\n \"Delbert\",\n \"Colin\",\n \"Guillermo\",\n \"Earnest\",\n \"Lucas\",\n \"Benny\",\n \"Noel\",\n \"Spencer\",\n \"Rodolfo\",\n \"Myron\",\n \"Edmund\",\n \"Garrett\",\n \"Salvatore\",\n \"Cedric\",\n \"Lowell\",\n \"Gregg\",\n \"Sherman\",\n \"Wilson\",\n \"Devin\",\n \"Sylvester\",\n \"Kim\",\n \"Roosevelt\",\n \"Israel\",\n \"Jermaine\",\n \"Forrest\",\n \"Wilbert\",\n \"Leland\",\n \"Simon\",\n \"Guadalupe\",\n \"Clark\",\n \"Irving\",\n \"Carroll\",\n \"Bryant\",\n \"Owen\",\n \"Rufus\",\n \"Woodrow\",\n \"Sammy\",\n \"Kristopher\",\n \"Mack\",\n \"Levi\",\n \"Marcos\",\n \"Gustavo\",\n \"Jake\",\n \"Lionel\",\n \"Marty\",\n \"Taylor\",\n \"Ellis\",\n \"Dallas\",\n \"Gilberto\",\n \"Clint\",\n \"Nicolas\",\n \"Laurence\",\n \"Ismael\",\n \"Orville\",\n \"Drew\",\n \"Jody\",\n \"Ervin\",\n \"Dewey\",\n \"Al\",\n \"Wilfred\",\n \"Josh\",\n \"Hugo\",\n \"Ignacio\",\n \"Caleb\",\n \"Tomas\",\n \"Sheldon\",\n \"Erick\",\n \"Frankie\",\n \"Stewart\",\n \"Doyle\",\n \"Darrel\",\n \"Rogelio\",\n \"Terence\",\n \"Santiago\",\n \"Alonzo\",\n \"Elias\",\n \"Bert\",\n \"Elbert\",\n \"Ramiro\",\n \"Conrad\",\n \"Pat\",\n \"Noah\",\n \"Grady\",\n \"Phil\",\n \"Cornelius\",\n \"Lamar\",\n \"Rolando\",\n \"Clay\",\n \"Percy\",\n \"Dexter\",\n \"Bradford\",\n \"Merle\",\n \"Darin\",\n \"Amos\",\n \"Terrell\",\n \"Moses\",\n \"Irvin\",\n \"Saul\",\n \"Roman\",\n \"Darnell\",\n \"Randal\",\n \"Tommie\",\n \"Timmy\",\n \"Darrin\",\n \"Winston\",\n \"Brendan\",\n \"Toby\",\n \"Van\",\n \"Abel\",\n \"Dominick\",\n \"Boyd\",\n \"Courtney\",\n \"Jan\",\n \"Emilio\",\n \"Elijah\",\n \"Cary\",\n \"Domingo\",\n \"Santos\",\n \"Aubrey\",\n \"Emmett\",\n \"Marlon\",\n \"Emanuel\",\n \"Jerald\",\n \"Edmond\"\n];\n},{}],145:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{prefix} #{first_name} #{last_name}\",\n \"#{first_name} #{last_name} #{suffix}\",\n \"#{first_name} #{last_name}\",\n \"#{first_name} #{last_name}\",\n \"#{male_first_name} #{last_name}\",\n \"#{female_first_name} #{last_name}\"\n];\n\n},{}],146:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Mr.\",\n \"Mrs.\",\n \"Ms.\",\n \"Miss\",\n \"Dr.\"\n];\n\n},{}],147:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Jr.\",\n \"Sr.\",\n \"I\",\n \"II\",\n \"III\",\n \"IV\",\n \"V\",\n \"MD\",\n \"DDS\",\n \"PhD\",\n \"DVM\"\n];\n\n},{}],148:[function(require,module,exports){\nmodule[\"exports\"] = {\n \"descriptor\": [\n \"Lead\",\n \"Senior\",\n \"Direct\",\n \"Corporate\",\n \"Dynamic\",\n \"Future\",\n \"Product\",\n \"National\",\n \"Regional\",\n \"District\",\n \"Central\",\n \"Global\",\n \"Customer\",\n \"Investor\",\n \"Dynamic\",\n \"International\",\n \"Legacy\",\n \"Forward\",\n \"Internal\",\n \"Human\",\n \"Chief\",\n \"Principal\"\n ],\n \"level\": [\n \"Solutions\",\n \"Program\",\n \"Brand\",\n \"Security\",\n \"Research\",\n \"Marketing\",\n \"Directives\",\n \"Implementation\",\n \"Integration\",\n \"Functionality\",\n \"Response\",\n \"Paradigm\",\n \"Tactics\",\n \"Identity\",\n \"Markets\",\n \"Group\",\n \"Division\",\n \"Applications\",\n \"Optimization\",\n \"Operations\",\n \"Infrastructure\",\n \"Intranet\",\n \"Communications\",\n \"Web\",\n \"Branding\",\n \"Quality\",\n \"Assurance\",\n \"Mobility\",\n \"Accounts\",\n \"Data\",\n \"Creative\",\n \"Configuration\",\n \"Accountability\",\n \"Interactions\",\n \"Factors\",\n \"Usability\",\n \"Metrics\"\n ],\n \"job\": [\n \"Supervisor\",\n \"Associate\",\n \"Executive\",\n \"Liaison\",\n \"Officer\",\n \"Manager\",\n \"Engineer\",\n \"Specialist\",\n \"Director\",\n \"Coordinator\",\n \"Administrator\",\n \"Architect\",\n \"Analyst\",\n \"Designer\",\n \"Planner\",\n \"Orchestrator\",\n \"Technician\",\n \"Developer\",\n \"Producer\",\n \"Consultant\",\n \"Assistant\",\n \"Facilitator\",\n \"Agent\",\n \"Representative\",\n \"Strategist\"\n ]\n};\n\n},{}],149:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"!##-!##-####\",\n \"(!##) !##-####\",\n \"1-!##-!##-####\",\n \"!##.!##.####\",\n \"!##-!##-####\",\n \"(!##) !##-####\",\n \"1-!##-!##-####\",\n \"!##.!##.####\",\n \"!##-!##-#### x###\",\n \"(!##) !##-#### x###\",\n \"1-!##-!##-#### x###\",\n \"!##.!##.#### x###\",\n \"!##-!##-#### x####\",\n \"(!##) !##-#### x####\",\n \"1-!##-!##-#### x####\",\n \"!##.!##.#### x####\",\n \"!##-!##-#### x#####\",\n \"(!##) !##-#### x#####\",\n \"1-!##-!##-#### x#####\",\n \"!##.!##.#### x#####\"\n];\n\n},{}],150:[function(require,module,exports){\nvar phone_number = {};\nmodule['exports'] = phone_number;\nphone_number.formats = require(\"./formats\");\n\n},{\"./formats\":149}],151:[function(require,module,exports){\nmodule['exports'] = [\n \"/Applications\",\n \"/bin\",\n \"/boot\",\n \"/boot/defaults\",\n \"/dev\",\n \"/etc\",\n \"/etc/defaults\",\n \"/etc/mail\",\n \"/etc/namedb\",\n \"/etc/periodic\",\n \"/etc/ppp\",\n \"/home\",\n \"/home/user\",\n \"/home/user/dir\",\n \"/lib\",\n \"/Library\",\n \"/lost+found\",\n \"/media\",\n \"/mnt\",\n \"/net\",\n \"/Network\",\n \"/opt\",\n \"/opt/bin\",\n \"/opt/include\",\n \"/opt/lib\",\n \"/opt/sbin\",\n \"/opt/share\",\n \"/private\",\n \"/private/tmp\",\n \"/private/var\",\n \"/proc\",\n \"/rescue\",\n \"/root\",\n \"/sbin\",\n \"/selinux\",\n \"/srv\",\n \"/sys\",\n \"/System\",\n \"/tmp\",\n \"/Users\",\n \"/usr\",\n \"/usr/X11R6\",\n \"/usr/bin\",\n \"/usr/include\",\n \"/usr/lib\",\n \"/usr/libdata\",\n \"/usr/libexec\",\n \"/usr/local/bin\",\n \"/usr/local/src\",\n \"/usr/obj\",\n \"/usr/ports\",\n \"/usr/sbin\",\n \"/usr/share\",\n \"/usr/src\",\n \"/var\",\n \"/var/log\",\n \"/var/mail\",\n \"/var/spool\",\n \"/var/tmp\",\n \"/var/yp\"\n];\n\n},{}],152:[function(require,module,exports){\nvar system = {};\nmodule['exports'] = system;\nsystem.directoryPaths = require(\"./directoryPaths\");\nsystem.mimeTypes = require(\"./mimeTypes\");\n\n},{\"./directoryPaths\":151,\"./mimeTypes\":153}],153:[function(require,module,exports){\n/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Jonathan Ong me@jongleberry.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nDefinitions from mime-db v1.21.0\nFor updates check: https://github.com/jshttp/mime-db/blob/master/db.json\n\n*/\n\nmodule['exports'] = {\n \"application/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"application/3gpdash-qoe-report+xml\": {\n \"source\": \"iana\"\n },\n \"application/3gpp-ims+xml\": {\n \"source\": \"iana\"\n },\n \"application/a2l\": {\n \"source\": \"iana\"\n },\n \"application/activemessage\": {\n \"source\": \"iana\"\n },\n \"application/alto-costmap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-costmapfilter+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-directory+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointcost+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointcostparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointprop+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-endpointpropparams+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-error+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-networkmap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/alto-networkmapfilter+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/aml\": {\n \"source\": \"iana\"\n },\n \"application/andrew-inset\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez\"]\n },\n \"application/applefile\": {\n \"source\": \"iana\"\n },\n \"application/applixware\": {\n \"source\": \"apache\",\n \"extensions\": [\"aw\"]\n },\n \"application/atf\": {\n \"source\": \"iana\"\n },\n \"application/atfx\": {\n \"source\": \"iana\"\n },\n \"application/atom+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"atom\"]\n },\n \"application/atomcat+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"atomcat\"]\n },\n \"application/atomdeleted+xml\": {\n \"source\": \"iana\"\n },\n \"application/atomicmail\": {\n \"source\": \"iana\"\n },\n \"application/atomsvc+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"atomsvc\"]\n },\n \"application/atxml\": {\n \"source\": \"iana\"\n },\n \"application/auth-policy+xml\": {\n \"source\": \"iana\"\n },\n \"application/bacnet-xdd+zip\": {\n \"source\": \"iana\"\n },\n \"application/batch-smtp\": {\n \"source\": \"iana\"\n },\n \"application/bdoc\": {\n \"compressible\": false,\n \"extensions\": [\"bdoc\"]\n },\n \"application/beep+xml\": {\n \"source\": \"iana\"\n },\n \"application/calendar+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/calendar+xml\": {\n \"source\": \"iana\"\n },\n \"application/call-completion\": {\n \"source\": \"iana\"\n },\n \"application/cals-1840\": {\n \"source\": \"iana\"\n },\n \"application/cbor\": {\n \"source\": \"iana\"\n },\n \"application/ccmp+xml\": {\n \"source\": \"iana\"\n },\n \"application/ccxml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"ccxml\"]\n },\n \"application/cdfx+xml\": {\n \"source\": \"iana\"\n },\n \"application/cdmi-capability\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmia\"]\n },\n \"application/cdmi-container\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmic\"]\n },\n \"application/cdmi-domain\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmid\"]\n },\n \"application/cdmi-object\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmio\"]\n },\n \"application/cdmi-queue\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdmiq\"]\n },\n \"application/cdni\": {\n \"source\": \"iana\"\n },\n \"application/cea\": {\n \"source\": \"iana\"\n },\n \"application/cea-2018+xml\": {\n \"source\": \"iana\"\n },\n \"application/cellml+xml\": {\n \"source\": \"iana\"\n },\n \"application/cfw\": {\n \"source\": \"iana\"\n },\n \"application/cms\": {\n \"source\": \"iana\"\n },\n \"application/cnrp+xml\": {\n \"source\": \"iana\"\n },\n \"application/coap-group+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/commonground\": {\n \"source\": \"iana\"\n },\n \"application/conference-info+xml\": {\n \"source\": \"iana\"\n },\n \"application/cpl+xml\": {\n \"source\": \"iana\"\n },\n \"application/csrattrs\": {\n \"source\": \"iana\"\n },\n \"application/csta+xml\": {\n \"source\": \"iana\"\n },\n \"application/cstadata+xml\": {\n \"source\": \"iana\"\n },\n \"application/csvm+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/cu-seeme\": {\n \"source\": \"apache\",\n \"extensions\": [\"cu\"]\n },\n \"application/cybercash\": {\n \"source\": \"iana\"\n },\n \"application/dart\": {\n \"compressible\": true\n },\n \"application/dash+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mdp\"]\n },\n \"application/dashdelta\": {\n \"source\": \"iana\"\n },\n \"application/davmount+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"davmount\"]\n },\n \"application/dca-rft\": {\n \"source\": \"iana\"\n },\n \"application/dcd\": {\n \"source\": \"iana\"\n },\n \"application/dec-dx\": {\n \"source\": \"iana\"\n },\n \"application/dialog-info+xml\": {\n \"source\": \"iana\"\n },\n \"application/dicom\": {\n \"source\": \"iana\"\n },\n \"application/dii\": {\n \"source\": \"iana\"\n },\n \"application/dit\": {\n \"source\": \"iana\"\n },\n \"application/dns\": {\n \"source\": \"iana\"\n },\n \"application/docbook+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"dbk\"]\n },\n \"application/dskpp+xml\": {\n \"source\": \"iana\"\n },\n \"application/dssc+der\": {\n \"source\": \"iana\",\n \"extensions\": [\"dssc\"]\n },\n \"application/dssc+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdssc\"]\n },\n \"application/dvcs\": {\n \"source\": \"iana\"\n },\n \"application/ecmascript\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ecma\"]\n },\n \"application/edi-consent\": {\n \"source\": \"iana\"\n },\n \"application/edi-x12\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/edifact\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/emergencycalldata.comment+xml\": {\n \"source\": \"iana\"\n },\n \"application/emergencycalldata.deviceinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/emergencycalldata.providerinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/emergencycalldata.serviceinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/emergencycalldata.subscriberinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/emma+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"emma\"]\n },\n \"application/emotionml+xml\": {\n \"source\": \"iana\"\n },\n \"application/encaprtp\": {\n \"source\": \"iana\"\n },\n \"application/epp+xml\": {\n \"source\": \"iana\"\n },\n \"application/epub+zip\": {\n \"source\": \"iana\",\n \"extensions\": [\"epub\"]\n },\n \"application/eshop\": {\n \"source\": \"iana\"\n },\n \"application/exi\": {\n \"source\": \"iana\",\n \"extensions\": [\"exi\"]\n },\n \"application/fastinfoset\": {\n \"source\": \"iana\"\n },\n \"application/fastsoap\": {\n \"source\": \"iana\"\n },\n \"application/fdt+xml\": {\n \"source\": \"iana\"\n },\n \"application/fits\": {\n \"source\": \"iana\"\n },\n \"application/font-sfnt\": {\n \"source\": \"iana\"\n },\n \"application/font-tdpfr\": {\n \"source\": \"iana\",\n \"extensions\": [\"pfr\"]\n },\n \"application/font-woff\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"woff\"]\n },\n \"application/font-woff2\": {\n \"compressible\": false,\n \"extensions\": [\"woff2\"]\n },\n \"application/framework-attributes+xml\": {\n \"source\": \"iana\"\n },\n \"application/gml+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"gml\"]\n },\n \"application/gpx+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"gpx\"]\n },\n \"application/gxf\": {\n \"source\": \"apache\",\n \"extensions\": [\"gxf\"]\n },\n \"application/gzip\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"application/h224\": {\n \"source\": \"iana\"\n },\n \"application/held+xml\": {\n \"source\": \"iana\"\n },\n \"application/http\": {\n \"source\": \"iana\"\n },\n \"application/hyperstudio\": {\n \"source\": \"iana\",\n \"extensions\": [\"stk\"]\n },\n \"application/ibe-key-request+xml\": {\n \"source\": \"iana\"\n },\n \"application/ibe-pkg-reply+xml\": {\n \"source\": \"iana\"\n },\n \"application/ibe-pp-data\": {\n \"source\": \"iana\"\n },\n \"application/iges\": {\n \"source\": \"iana\"\n },\n \"application/im-iscomposing+xml\": {\n \"source\": \"iana\"\n },\n \"application/index\": {\n \"source\": \"iana\"\n },\n \"application/index.cmd\": {\n \"source\": \"iana\"\n },\n \"application/index.obj\": {\n \"source\": \"iana\"\n },\n \"application/index.response\": {\n \"source\": \"iana\"\n },\n \"application/index.vnd\": {\n \"source\": \"iana\"\n },\n \"application/inkml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"ink\",\"inkml\"]\n },\n \"application/iotp\": {\n \"source\": \"iana\"\n },\n \"application/ipfix\": {\n \"source\": \"iana\",\n \"extensions\": [\"ipfix\"]\n },\n \"application/ipp\": {\n \"source\": \"iana\"\n },\n \"application/isup\": {\n \"source\": \"iana\"\n },\n \"application/its+xml\": {\n \"source\": \"iana\"\n },\n \"application/java-archive\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"jar\",\"war\",\"ear\"]\n },\n \"application/java-serialized-object\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"ser\"]\n },\n \"application/java-vm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"class\"]\n },\n \"application/javascript\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"js\"]\n },\n \"application/jose\": {\n \"source\": \"iana\"\n },\n \"application/jose+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jrd+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/json\": {\n \"source\": \"iana\",\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"json\",\"map\"]\n },\n \"application/json-patch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/json-seq\": {\n \"source\": \"iana\"\n },\n \"application/json5\": {\n \"extensions\": [\"json5\"]\n },\n \"application/jsonml+json\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"jsonml\"]\n },\n \"application/jwk+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jwk-set+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/jwt\": {\n \"source\": \"iana\"\n },\n \"application/kpml-request+xml\": {\n \"source\": \"iana\"\n },\n \"application/kpml-response+xml\": {\n \"source\": \"iana\"\n },\n \"application/ld+json\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"jsonld\"]\n },\n \"application/link-format\": {\n \"source\": \"iana\"\n },\n \"application/load-control+xml\": {\n \"source\": \"iana\"\n },\n \"application/lost+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"lostxml\"]\n },\n \"application/lostsync+xml\": {\n \"source\": \"iana\"\n },\n \"application/lxf\": {\n \"source\": \"iana\"\n },\n \"application/mac-binhex40\": {\n \"source\": \"iana\",\n \"extensions\": [\"hqx\"]\n },\n \"application/mac-compactpro\": {\n \"source\": \"apache\",\n \"extensions\": [\"cpt\"]\n },\n \"application/macwriteii\": {\n \"source\": \"iana\"\n },\n \"application/mads+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mads\"]\n },\n \"application/manifest+json\": {\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"webmanifest\"]\n },\n \"application/marc\": {\n \"source\": \"iana\",\n \"extensions\": [\"mrc\"]\n },\n \"application/marcxml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mrcx\"]\n },\n \"application/mathematica\": {\n \"source\": \"iana\",\n \"extensions\": [\"ma\",\"nb\",\"mb\"]\n },\n \"application/mathml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mathml\"]\n },\n \"application/mathml-content+xml\": {\n \"source\": \"iana\"\n },\n \"application/mathml-presentation+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-associated-procedure-description+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-deregister+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-envelope+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-msk+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-msk-response+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-protection-description+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-reception-report+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-register+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-register-response+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-schedule+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbms-user-service-description+xml\": {\n \"source\": \"iana\"\n },\n \"application/mbox\": {\n \"source\": \"iana\",\n \"extensions\": [\"mbox\"]\n },\n \"application/media-policy-dataset+xml\": {\n \"source\": \"iana\"\n },\n \"application/media_control+xml\": {\n \"source\": \"iana\"\n },\n \"application/mediaservercontrol+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mscml\"]\n },\n \"application/merge-patch+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/metalink+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"metalink\"]\n },\n \"application/metalink4+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"meta4\"]\n },\n \"application/mets+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mets\"]\n },\n \"application/mf4\": {\n \"source\": \"iana\"\n },\n \"application/mikey\": {\n \"source\": \"iana\"\n },\n \"application/mods+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mods\"]\n },\n \"application/moss-keys\": {\n \"source\": \"iana\"\n },\n \"application/moss-signature\": {\n \"source\": \"iana\"\n },\n \"application/mosskey-data\": {\n \"source\": \"iana\"\n },\n \"application/mosskey-request\": {\n \"source\": \"iana\"\n },\n \"application/mp21\": {\n \"source\": \"iana\",\n \"extensions\": [\"m21\",\"mp21\"]\n },\n \"application/mp4\": {\n \"source\": \"iana\",\n \"extensions\": [\"mp4s\",\"m4p\"]\n },\n \"application/mpeg4-generic\": {\n \"source\": \"iana\"\n },\n \"application/mpeg4-iod\": {\n \"source\": \"iana\"\n },\n \"application/mpeg4-iod-xmt\": {\n \"source\": \"iana\"\n },\n \"application/mrb-consumer+xml\": {\n \"source\": \"iana\"\n },\n \"application/mrb-publish+xml\": {\n \"source\": \"iana\"\n },\n \"application/msc-ivr+xml\": {\n \"source\": \"iana\"\n },\n \"application/msc-mixer+xml\": {\n \"source\": \"iana\"\n },\n \"application/msword\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"doc\",\"dot\"]\n },\n \"application/mxf\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxf\"]\n },\n \"application/nasdata\": {\n \"source\": \"iana\"\n },\n \"application/news-checkgroups\": {\n \"source\": \"iana\"\n },\n \"application/news-groupinfo\": {\n \"source\": \"iana\"\n },\n \"application/news-transmission\": {\n \"source\": \"iana\"\n },\n \"application/nlsml+xml\": {\n \"source\": \"iana\"\n },\n \"application/nss\": {\n \"source\": \"iana\"\n },\n \"application/ocsp-request\": {\n \"source\": \"iana\"\n },\n \"application/ocsp-response\": {\n \"source\": \"iana\"\n },\n \"application/octet-stream\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"bin\",\"dms\",\"lrf\",\"mar\",\"so\",\"dist\",\"distz\",\"pkg\",\"bpk\",\"dump\",\"elc\",\"deploy\",\"exe\",\"dll\",\"deb\",\"dmg\",\"iso\",\"img\",\"msi\",\"msp\",\"msm\",\"buffer\"]\n },\n \"application/oda\": {\n \"source\": \"iana\",\n \"extensions\": [\"oda\"]\n },\n \"application/odx\": {\n \"source\": \"iana\"\n },\n \"application/oebps-package+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"opf\"]\n },\n \"application/ogg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ogx\"]\n },\n \"application/omdoc+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"omdoc\"]\n },\n \"application/onenote\": {\n \"source\": \"apache\",\n \"extensions\": [\"onetoc\",\"onetoc2\",\"onetmp\",\"onepkg\"]\n },\n \"application/oxps\": {\n \"source\": \"iana\",\n \"extensions\": [\"oxps\"]\n },\n \"application/p2p-overlay+xml\": {\n \"source\": \"iana\"\n },\n \"application/parityfec\": {\n \"source\": \"iana\"\n },\n \"application/patch-ops-error+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xer\"]\n },\n \"application/pdf\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pdf\"]\n },\n \"application/pdx\": {\n \"source\": \"iana\"\n },\n \"application/pgp-encrypted\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pgp\"]\n },\n \"application/pgp-keys\": {\n \"source\": \"iana\"\n },\n \"application/pgp-signature\": {\n \"source\": \"iana\",\n \"extensions\": [\"asc\",\"sig\"]\n },\n \"application/pics-rules\": {\n \"source\": \"apache\",\n \"extensions\": [\"prf\"]\n },\n \"application/pidf+xml\": {\n \"source\": \"iana\"\n },\n \"application/pidf-diff+xml\": {\n \"source\": \"iana\"\n },\n \"application/pkcs10\": {\n \"source\": \"iana\",\n \"extensions\": [\"p10\"]\n },\n \"application/pkcs12\": {\n \"source\": \"iana\"\n },\n \"application/pkcs7-mime\": {\n \"source\": \"iana\",\n \"extensions\": [\"p7m\",\"p7c\"]\n },\n \"application/pkcs7-signature\": {\n \"source\": \"iana\",\n \"extensions\": [\"p7s\"]\n },\n \"application/pkcs8\": {\n \"source\": \"iana\",\n \"extensions\": [\"p8\"]\n },\n \"application/pkix-attr-cert\": {\n \"source\": \"iana\",\n \"extensions\": [\"ac\"]\n },\n \"application/pkix-cert\": {\n \"source\": \"iana\",\n \"extensions\": [\"cer\"]\n },\n \"application/pkix-crl\": {\n \"source\": \"iana\",\n \"extensions\": [\"crl\"]\n },\n \"application/pkix-pkipath\": {\n \"source\": \"iana\",\n \"extensions\": [\"pkipath\"]\n },\n \"application/pkixcmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"pki\"]\n },\n \"application/pls+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"pls\"]\n },\n \"application/poc-settings+xml\": {\n \"source\": \"iana\"\n },\n \"application/postscript\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"ai\",\"eps\",\"ps\"]\n },\n \"application/provenance+xml\": {\n \"source\": \"iana\"\n },\n \"application/prs.alvestrand.titrax-sheet\": {\n \"source\": \"iana\"\n },\n \"application/prs.cww\": {\n \"source\": \"iana\",\n \"extensions\": [\"cww\"]\n },\n \"application/prs.hpub+zip\": {\n \"source\": \"iana\"\n },\n \"application/prs.nprend\": {\n \"source\": \"iana\"\n },\n \"application/prs.plucker\": {\n \"source\": \"iana\"\n },\n \"application/prs.rdf-xml-crypt\": {\n \"source\": \"iana\"\n },\n \"application/prs.xsf+xml\": {\n \"source\": \"iana\"\n },\n \"application/pskc+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"pskcxml\"]\n },\n \"application/qsig\": {\n \"source\": \"iana\"\n },\n \"application/raptorfec\": {\n \"source\": \"iana\"\n },\n \"application/rdap+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/rdf+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rdf\"]\n },\n \"application/reginfo+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"rif\"]\n },\n \"application/relax-ng-compact-syntax\": {\n \"source\": \"iana\",\n \"extensions\": [\"rnc\"]\n },\n \"application/remote-printing\": {\n \"source\": \"iana\"\n },\n \"application/reputon+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/resource-lists+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"rl\"]\n },\n \"application/resource-lists-diff+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"rld\"]\n },\n \"application/rfc+xml\": {\n \"source\": \"iana\"\n },\n \"application/riscos\": {\n \"source\": \"iana\"\n },\n \"application/rlmi+xml\": {\n \"source\": \"iana\"\n },\n \"application/rls-services+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"rs\"]\n },\n \"application/rpki-ghostbusters\": {\n \"source\": \"iana\",\n \"extensions\": [\"gbr\"]\n },\n \"application/rpki-manifest\": {\n \"source\": \"iana\",\n \"extensions\": [\"mft\"]\n },\n \"application/rpki-roa\": {\n \"source\": \"iana\",\n \"extensions\": [\"roa\"]\n },\n \"application/rpki-updown\": {\n \"source\": \"iana\"\n },\n \"application/rsd+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"rsd\"]\n },\n \"application/rss+xml\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"rss\"]\n },\n \"application/rtf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtf\"]\n },\n \"application/rtploopback\": {\n \"source\": \"iana\"\n },\n \"application/rtx\": {\n \"source\": \"iana\"\n },\n \"application/samlassertion+xml\": {\n \"source\": \"iana\"\n },\n \"application/samlmetadata+xml\": {\n \"source\": \"iana\"\n },\n \"application/sbml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"sbml\"]\n },\n \"application/scaip+xml\": {\n \"source\": \"iana\"\n },\n \"application/scim+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/scvp-cv-request\": {\n \"source\": \"iana\",\n \"extensions\": [\"scq\"]\n },\n \"application/scvp-cv-response\": {\n \"source\": \"iana\",\n \"extensions\": [\"scs\"]\n },\n \"application/scvp-vp-request\": {\n \"source\": \"iana\",\n \"extensions\": [\"spq\"]\n },\n \"application/scvp-vp-response\": {\n \"source\": \"iana\",\n \"extensions\": [\"spp\"]\n },\n \"application/sdp\": {\n \"source\": \"iana\",\n \"extensions\": [\"sdp\"]\n },\n \"application/sep+xml\": {\n \"source\": \"iana\"\n },\n \"application/sep-exi\": {\n \"source\": \"iana\"\n },\n \"application/session-info\": {\n \"source\": \"iana\"\n },\n \"application/set-payment\": {\n \"source\": \"iana\"\n },\n \"application/set-payment-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"setpay\"]\n },\n \"application/set-registration\": {\n \"source\": \"iana\"\n },\n \"application/set-registration-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"setreg\"]\n },\n \"application/sgml\": {\n \"source\": \"iana\"\n },\n \"application/sgml-open-catalog\": {\n \"source\": \"iana\"\n },\n \"application/shf+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"shf\"]\n },\n \"application/sieve\": {\n \"source\": \"iana\"\n },\n \"application/simple-filter+xml\": {\n \"source\": \"iana\"\n },\n \"application/simple-message-summary\": {\n \"source\": \"iana\"\n },\n \"application/simplesymbolcontainer\": {\n \"source\": \"iana\"\n },\n \"application/slate\": {\n \"source\": \"iana\"\n },\n \"application/smil\": {\n \"source\": \"iana\"\n },\n \"application/smil+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"smi\",\"smil\"]\n },\n \"application/smpte336m\": {\n \"source\": \"iana\"\n },\n \"application/soap+fastinfoset\": {\n \"source\": \"iana\"\n },\n \"application/soap+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/sparql-query\": {\n \"source\": \"iana\",\n \"extensions\": [\"rq\"]\n },\n \"application/sparql-results+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"srx\"]\n },\n \"application/spirits-event+xml\": {\n \"source\": \"iana\"\n },\n \"application/sql\": {\n \"source\": \"iana\"\n },\n \"application/srgs\": {\n \"source\": \"iana\",\n \"extensions\": [\"gram\"]\n },\n \"application/srgs+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"grxml\"]\n },\n \"application/sru+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"sru\"]\n },\n \"application/ssdl+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"ssdl\"]\n },\n \"application/ssml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"ssml\"]\n },\n \"application/tamp-apex-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-apex-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-community-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-community-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-error\": {\n \"source\": \"iana\"\n },\n \"application/tamp-sequence-adjust\": {\n \"source\": \"iana\"\n },\n \"application/tamp-sequence-adjust-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tamp-status-query\": {\n \"source\": \"iana\"\n },\n \"application/tamp-status-response\": {\n \"source\": \"iana\"\n },\n \"application/tamp-update\": {\n \"source\": \"iana\"\n },\n \"application/tamp-update-confirm\": {\n \"source\": \"iana\"\n },\n \"application/tar\": {\n \"compressible\": true\n },\n \"application/tei+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"tei\",\"teicorpus\"]\n },\n \"application/thraud+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"tfi\"]\n },\n \"application/timestamp-query\": {\n \"source\": \"iana\"\n },\n \"application/timestamp-reply\": {\n \"source\": \"iana\"\n },\n \"application/timestamped-data\": {\n \"source\": \"iana\",\n \"extensions\": [\"tsd\"]\n },\n \"application/ttml+xml\": {\n \"source\": \"iana\"\n },\n \"application/tve-trigger\": {\n \"source\": \"iana\"\n },\n \"application/ulpfec\": {\n \"source\": \"iana\"\n },\n \"application/urc-grpsheet+xml\": {\n \"source\": \"iana\"\n },\n \"application/urc-ressheet+xml\": {\n \"source\": \"iana\"\n },\n \"application/urc-targetdesc+xml\": {\n \"source\": \"iana\"\n },\n \"application/urc-uisocketdesc+xml\": {\n \"source\": \"iana\"\n },\n \"application/vcard+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vcard+xml\": {\n \"source\": \"iana\"\n },\n \"application/vemmi\": {\n \"source\": \"iana\"\n },\n \"application/vividence.scriptfile\": {\n \"source\": \"apache\"\n },\n \"application/vnd.3gpp-prose+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp-prose-pc3ch+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.access-transfer-events+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.bsf+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.mid-call+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.pic-bw-large\": {\n \"source\": \"iana\",\n \"extensions\": [\"plb\"]\n },\n \"application/vnd.3gpp.pic-bw-small\": {\n \"source\": \"iana\",\n \"extensions\": [\"psb\"]\n },\n \"application/vnd.3gpp.pic-bw-var\": {\n \"source\": \"iana\",\n \"extensions\": [\"pvb\"]\n },\n \"application/vnd.3gpp.sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.srvcc-ext+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.srvcc-info+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.state-and-event-info+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp.ussd+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp2.bcmcsinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp2.sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.3gpp2.tcap\": {\n \"source\": \"iana\",\n \"extensions\": [\"tcap\"]\n },\n \"application/vnd.3m.post-it-notes\": {\n \"source\": \"iana\",\n \"extensions\": [\"pwn\"]\n },\n \"application/vnd.accpac.simply.aso\": {\n \"source\": \"iana\",\n \"extensions\": [\"aso\"]\n },\n \"application/vnd.accpac.simply.imp\": {\n \"source\": \"iana\",\n \"extensions\": [\"imp\"]\n },\n \"application/vnd.acucobol\": {\n \"source\": \"iana\",\n \"extensions\": [\"acu\"]\n },\n \"application/vnd.acucorp\": {\n \"source\": \"iana\",\n \"extensions\": [\"atc\",\"acutc\"]\n },\n \"application/vnd.adobe.air-application-installer-package+zip\": {\n \"source\": \"apache\",\n \"extensions\": [\"air\"]\n },\n \"application/vnd.adobe.flash.movie\": {\n \"source\": \"iana\"\n },\n \"application/vnd.adobe.formscentral.fcdt\": {\n \"source\": \"iana\",\n \"extensions\": [\"fcdt\"]\n },\n \"application/vnd.adobe.fxp\": {\n \"source\": \"iana\",\n \"extensions\": [\"fxp\",\"fxpl\"]\n },\n \"application/vnd.adobe.partial-upload\": {\n \"source\": \"iana\"\n },\n \"application/vnd.adobe.xdp+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdp\"]\n },\n \"application/vnd.adobe.xfdf\": {\n \"source\": \"iana\",\n \"extensions\": [\"xfdf\"]\n },\n \"application/vnd.aether.imp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ah-barcode\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ahead.space\": {\n \"source\": \"iana\",\n \"extensions\": [\"ahead\"]\n },\n \"application/vnd.airzip.filesecure.azf\": {\n \"source\": \"iana\",\n \"extensions\": [\"azf\"]\n },\n \"application/vnd.airzip.filesecure.azs\": {\n \"source\": \"iana\",\n \"extensions\": [\"azs\"]\n },\n \"application/vnd.amazon.ebook\": {\n \"source\": \"apache\",\n \"extensions\": [\"azw\"]\n },\n \"application/vnd.americandynamics.acc\": {\n \"source\": \"iana\",\n \"extensions\": [\"acc\"]\n },\n \"application/vnd.amiga.ami\": {\n \"source\": \"iana\",\n \"extensions\": [\"ami\"]\n },\n \"application/vnd.amundsen.maze+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.android.package-archive\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"apk\"]\n },\n \"application/vnd.anki\": {\n \"source\": \"iana\"\n },\n \"application/vnd.anser-web-certificate-issue-initiation\": {\n \"source\": \"iana\",\n \"extensions\": [\"cii\"]\n },\n \"application/vnd.anser-web-funds-transfer-initiation\": {\n \"source\": \"apache\",\n \"extensions\": [\"fti\"]\n },\n \"application/vnd.antix.game-component\": {\n \"source\": \"iana\",\n \"extensions\": [\"atx\"]\n },\n \"application/vnd.apache.thrift.binary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.thrift.compact\": {\n \"source\": \"iana\"\n },\n \"application/vnd.apache.thrift.json\": {\n \"source\": \"iana\"\n },\n \"application/vnd.api+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.apple.installer+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpkg\"]\n },\n \"application/vnd.apple.mpegurl\": {\n \"source\": \"iana\",\n \"extensions\": [\"m3u8\"]\n },\n \"application/vnd.apple.pkpass\": {\n \"compressible\": false,\n \"extensions\": [\"pkpass\"]\n },\n \"application/vnd.arastra.swi\": {\n \"source\": \"iana\"\n },\n \"application/vnd.aristanetworks.swi\": {\n \"source\": \"iana\",\n \"extensions\": [\"swi\"]\n },\n \"application/vnd.artsquare\": {\n \"source\": \"iana\"\n },\n \"application/vnd.astraea-software.iota\": {\n \"source\": \"iana\",\n \"extensions\": [\"iota\"]\n },\n \"application/vnd.audiograph\": {\n \"source\": \"iana\",\n \"extensions\": [\"aep\"]\n },\n \"application/vnd.autopackage\": {\n \"source\": \"iana\"\n },\n \"application/vnd.avistar+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.balsamiq.bmml+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.balsamiq.bmpr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bekitzur-stech+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.biopax.rdf+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.blueice.multipass\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpm\"]\n },\n \"application/vnd.bluetooth.ep.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bluetooth.le.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.bmi\": {\n \"source\": \"iana\",\n \"extensions\": [\"bmi\"]\n },\n \"application/vnd.businessobjects\": {\n \"source\": \"iana\",\n \"extensions\": [\"rep\"]\n },\n \"application/vnd.cab-jscript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.canon-cpdl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.canon-lips\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cendio.thinlinc.clientconf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.century-systems.tcp_stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.chemdraw+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdxml\"]\n },\n \"application/vnd.chipnuts.karaoke-mmd\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmd\"]\n },\n \"application/vnd.cinderella\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdy\"]\n },\n \"application/vnd.cirpack.isdn-ext\": {\n \"source\": \"iana\"\n },\n \"application/vnd.citationstyles.style+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.claymore\": {\n \"source\": \"iana\",\n \"extensions\": [\"cla\"]\n },\n \"application/vnd.cloanto.rp9\": {\n \"source\": \"iana\",\n \"extensions\": [\"rp9\"]\n },\n \"application/vnd.clonk.c4group\": {\n \"source\": \"iana\",\n \"extensions\": [\"c4g\",\"c4d\",\"c4f\",\"c4p\",\"c4u\"]\n },\n \"application/vnd.cluetrust.cartomobile-config\": {\n \"source\": \"iana\",\n \"extensions\": [\"c11amc\"]\n },\n \"application/vnd.cluetrust.cartomobile-config-pkg\": {\n \"source\": \"iana\",\n \"extensions\": [\"c11amz\"]\n },\n \"application/vnd.coffeescript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.collection+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.collection.doc+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.collection.next+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.commerce-battelle\": {\n \"source\": \"iana\"\n },\n \"application/vnd.commonspace\": {\n \"source\": \"iana\",\n \"extensions\": [\"csp\"]\n },\n \"application/vnd.contact.cmsg\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdbcmsg\"]\n },\n \"application/vnd.cosmocaller\": {\n \"source\": \"iana\",\n \"extensions\": [\"cmc\"]\n },\n \"application/vnd.crick.clicker\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkx\"]\n },\n \"application/vnd.crick.clicker.keyboard\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkk\"]\n },\n \"application/vnd.crick.clicker.palette\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkp\"]\n },\n \"application/vnd.crick.clicker.template\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkt\"]\n },\n \"application/vnd.crick.clicker.wordbank\": {\n \"source\": \"iana\",\n \"extensions\": [\"clkw\"]\n },\n \"application/vnd.criticaltools.wbs+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wbs\"]\n },\n \"application/vnd.ctc-posml\": {\n \"source\": \"iana\",\n \"extensions\": [\"pml\"]\n },\n \"application/vnd.ctct.ws+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-pdf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-postscript\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-ppd\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppd\"]\n },\n \"application/vnd.cups-raster\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cups-raw\": {\n \"source\": \"iana\"\n },\n \"application/vnd.curl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.curl.car\": {\n \"source\": \"apache\",\n \"extensions\": [\"car\"]\n },\n \"application/vnd.curl.pcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcurl\"]\n },\n \"application/vnd.cyan.dean.root+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.cybank\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dart\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dart\"]\n },\n \"application/vnd.data-vision.rdz\": {\n \"source\": \"iana\",\n \"extensions\": [\"rdz\"]\n },\n \"application/vnd.debian.binary-package\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dece.data\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvf\",\"uvvf\",\"uvd\",\"uvvd\"]\n },\n \"application/vnd.dece.ttml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvt\",\"uvvt\"]\n },\n \"application/vnd.dece.unspecified\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvx\",\"uvvx\"]\n },\n \"application/vnd.dece.zip\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvz\",\"uvvz\"]\n },\n \"application/vnd.denovo.fcselayout-link\": {\n \"source\": \"iana\",\n \"extensions\": [\"fe_launch\"]\n },\n \"application/vnd.desmume-movie\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dir-bi.plate-dl-nosuffix\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dm.delegation+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dna\": {\n \"source\": \"iana\",\n \"extensions\": [\"dna\"]\n },\n \"application/vnd.document+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.dolby.mlp\": {\n \"source\": \"apache\",\n \"extensions\": [\"mlp\"]\n },\n \"application/vnd.dolby.mobile.1\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dolby.mobile.2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.doremir.scorecloud-binary-document\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dpgraph\": {\n \"source\": \"iana\",\n \"extensions\": [\"dpg\"]\n },\n \"application/vnd.dreamfactory\": {\n \"source\": \"iana\",\n \"extensions\": [\"dfac\"]\n },\n \"application/vnd.drive+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ds-keypoint\": {\n \"source\": \"apache\",\n \"extensions\": [\"kpxx\"]\n },\n \"application/vnd.dtg.local\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dtg.local.flash\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dtg.local.html\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ait\": {\n \"source\": \"iana\",\n \"extensions\": [\"ait\"]\n },\n \"application/vnd.dvb.dvbj\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.esgcontainer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcdftnotifaccess\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgaccess\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgaccess2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcesgpdd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.ipdcroaming\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.iptv.alfec-base\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.iptv.alfec-enhancement\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-aggregate-root+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-container+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-generic+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-ia-msglist+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-ia-registration-request+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-ia-registration-response+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.notif-init+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.pfr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dvb.service\": {\n \"source\": \"iana\",\n \"extensions\": [\"svc\"]\n },\n \"application/vnd.dxr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.dynageo\": {\n \"source\": \"iana\",\n \"extensions\": [\"geo\"]\n },\n \"application/vnd.dzr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.easykaraoke.cdgdownload\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecdis-update\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.chart\": {\n \"source\": \"iana\",\n \"extensions\": [\"mag\"]\n },\n \"application/vnd.ecowin.filerequest\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.fileupdate\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.series\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.seriesrequest\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ecowin.seriesupdate\": {\n \"source\": \"iana\"\n },\n \"application/vnd.emclient.accessrequest+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.enliven\": {\n \"source\": \"iana\",\n \"extensions\": [\"nml\"]\n },\n \"application/vnd.enphase.envoy\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eprints.data+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.epson.esf\": {\n \"source\": \"iana\",\n \"extensions\": [\"esf\"]\n },\n \"application/vnd.epson.msf\": {\n \"source\": \"iana\",\n \"extensions\": [\"msf\"]\n },\n \"application/vnd.epson.quickanime\": {\n \"source\": \"iana\",\n \"extensions\": [\"qam\"]\n },\n \"application/vnd.epson.salt\": {\n \"source\": \"iana\",\n \"extensions\": [\"slt\"]\n },\n \"application/vnd.epson.ssf\": {\n \"source\": \"iana\",\n \"extensions\": [\"ssf\"]\n },\n \"application/vnd.ericsson.quickcall\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eszigno3+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"es3\",\"et3\"]\n },\n \"application/vnd.etsi.aoc+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.asic-e+zip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.asic-s+zip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.cug+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvcommand+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvdiscovery+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvprofile+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvsad-bc+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvsad-cod+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvsad-npvr+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvservice+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvsync+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.iptvueprofile+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.mcid+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.mheg5\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.overload-control-policy-dataset+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.pstn+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.sci+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.simservs+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.timestamp-token\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.tsl+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.etsi.tsl.der\": {\n \"source\": \"iana\"\n },\n \"application/vnd.eudora.data\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ezpix-album\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez2\"]\n },\n \"application/vnd.ezpix-package\": {\n \"source\": \"iana\",\n \"extensions\": [\"ez3\"]\n },\n \"application/vnd.f-secure.mobile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fastcopy-disk-image\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fdf\": {\n \"source\": \"iana\",\n \"extensions\": [\"fdf\"]\n },\n \"application/vnd.fdsn.mseed\": {\n \"source\": \"iana\",\n \"extensions\": [\"mseed\"]\n },\n \"application/vnd.fdsn.seed\": {\n \"source\": \"iana\",\n \"extensions\": [\"seed\",\"dataless\"]\n },\n \"application/vnd.ffsns\": {\n \"source\": \"iana\"\n },\n \"application/vnd.filmit.zfc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fints\": {\n \"source\": \"iana\"\n },\n \"application/vnd.firemonkeys.cloudcell\": {\n \"source\": \"iana\"\n },\n \"application/vnd.flographit\": {\n \"source\": \"iana\",\n \"extensions\": [\"gph\"]\n },\n \"application/vnd.fluxtime.clip\": {\n \"source\": \"iana\",\n \"extensions\": [\"ftc\"]\n },\n \"application/vnd.font-fontforge-sfd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.framemaker\": {\n \"source\": \"iana\",\n \"extensions\": [\"fm\",\"frame\",\"maker\",\"book\"]\n },\n \"application/vnd.frogans.fnc\": {\n \"source\": \"iana\",\n \"extensions\": [\"fnc\"]\n },\n \"application/vnd.frogans.ltf\": {\n \"source\": \"iana\",\n \"extensions\": [\"ltf\"]\n },\n \"application/vnd.fsc.weblaunch\": {\n \"source\": \"iana\",\n \"extensions\": [\"fsc\"]\n },\n \"application/vnd.fujitsu.oasys\": {\n \"source\": \"iana\",\n \"extensions\": [\"oas\"]\n },\n \"application/vnd.fujitsu.oasys2\": {\n \"source\": \"iana\",\n \"extensions\": [\"oa2\"]\n },\n \"application/vnd.fujitsu.oasys3\": {\n \"source\": \"iana\",\n \"extensions\": [\"oa3\"]\n },\n \"application/vnd.fujitsu.oasysgp\": {\n \"source\": \"iana\",\n \"extensions\": [\"fg5\"]\n },\n \"application/vnd.fujitsu.oasysprs\": {\n \"source\": \"iana\",\n \"extensions\": [\"bh2\"]\n },\n \"application/vnd.fujixerox.art-ex\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.art4\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.ddd\": {\n \"source\": \"iana\",\n \"extensions\": [\"ddd\"]\n },\n \"application/vnd.fujixerox.docuworks\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdw\"]\n },\n \"application/vnd.fujixerox.docuworks.binder\": {\n \"source\": \"iana\",\n \"extensions\": [\"xbd\"]\n },\n \"application/vnd.fujixerox.docuworks.container\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fujixerox.hbpl\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fut-misnet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.fuzzysheet\": {\n \"source\": \"iana\",\n \"extensions\": [\"fzs\"]\n },\n \"application/vnd.genomatix.tuxedo\": {\n \"source\": \"iana\",\n \"extensions\": [\"txd\"]\n },\n \"application/vnd.geo+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.geocube+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.geogebra.file\": {\n \"source\": \"iana\",\n \"extensions\": [\"ggb\"]\n },\n \"application/vnd.geogebra.tool\": {\n \"source\": \"iana\",\n \"extensions\": [\"ggt\"]\n },\n \"application/vnd.geometry-explorer\": {\n \"source\": \"iana\",\n \"extensions\": [\"gex\",\"gre\"]\n },\n \"application/vnd.geonext\": {\n \"source\": \"iana\",\n \"extensions\": [\"gxt\"]\n },\n \"application/vnd.geoplan\": {\n \"source\": \"iana\",\n \"extensions\": [\"g2w\"]\n },\n \"application/vnd.geospace\": {\n \"source\": \"iana\",\n \"extensions\": [\"g3w\"]\n },\n \"application/vnd.gerber\": {\n \"source\": \"iana\"\n },\n \"application/vnd.globalplatform.card-content-mgt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.globalplatform.card-content-mgt-response\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gmx\": {\n \"source\": \"iana\",\n \"extensions\": [\"gmx\"]\n },\n \"application/vnd.google-apps.document\": {\n \"compressible\": false,\n \"extensions\": [\"gdoc\"]\n },\n \"application/vnd.google-apps.presentation\": {\n \"compressible\": false,\n \"extensions\": [\"gslides\"]\n },\n \"application/vnd.google-apps.spreadsheet\": {\n \"compressible\": false,\n \"extensions\": [\"gsheet\"]\n },\n \"application/vnd.google-earth.kml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"kml\"]\n },\n \"application/vnd.google-earth.kmz\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"kmz\"]\n },\n \"application/vnd.gov.sk.e-form+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gov.sk.e-form+zip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.gov.sk.xmldatacontainer+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.grafeq\": {\n \"source\": \"iana\",\n \"extensions\": [\"gqf\",\"gqs\"]\n },\n \"application/vnd.gridmp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.groove-account\": {\n \"source\": \"iana\",\n \"extensions\": [\"gac\"]\n },\n \"application/vnd.groove-help\": {\n \"source\": \"iana\",\n \"extensions\": [\"ghf\"]\n },\n \"application/vnd.groove-identity-message\": {\n \"source\": \"iana\",\n \"extensions\": [\"gim\"]\n },\n \"application/vnd.groove-injector\": {\n \"source\": \"iana\",\n \"extensions\": [\"grv\"]\n },\n \"application/vnd.groove-tool-message\": {\n \"source\": \"iana\",\n \"extensions\": [\"gtm\"]\n },\n \"application/vnd.groove-tool-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"tpl\"]\n },\n \"application/vnd.groove-vcard\": {\n \"source\": \"iana\",\n \"extensions\": [\"vcg\"]\n },\n \"application/vnd.hal+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hal+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"hal\"]\n },\n \"application/vnd.handheld-entertainment+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"zmm\"]\n },\n \"application/vnd.hbci\": {\n \"source\": \"iana\",\n \"extensions\": [\"hbci\"]\n },\n \"application/vnd.hcl-bireports\": {\n \"source\": \"iana\"\n },\n \"application/vnd.heroku+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hhe.lesson-player\": {\n \"source\": \"iana\",\n \"extensions\": [\"les\"]\n },\n \"application/vnd.hp-hpgl\": {\n \"source\": \"iana\",\n \"extensions\": [\"hpgl\"]\n },\n \"application/vnd.hp-hpid\": {\n \"source\": \"iana\",\n \"extensions\": [\"hpid\"]\n },\n \"application/vnd.hp-hps\": {\n \"source\": \"iana\",\n \"extensions\": [\"hps\"]\n },\n \"application/vnd.hp-jlyt\": {\n \"source\": \"iana\",\n \"extensions\": [\"jlt\"]\n },\n \"application/vnd.hp-pcl\": {\n \"source\": \"iana\",\n \"extensions\": [\"pcl\"]\n },\n \"application/vnd.hp-pclxl\": {\n \"source\": \"iana\",\n \"extensions\": [\"pclxl\"]\n },\n \"application/vnd.httphone\": {\n \"source\": \"iana\"\n },\n \"application/vnd.hydrostatix.sof-data\": {\n \"source\": \"iana\",\n \"extensions\": [\"sfd-hdstx\"]\n },\n \"application/vnd.hyperdrive+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.hzn-3d-crossword\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ibm.afplinedata\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ibm.electronic-media\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ibm.minipay\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpy\"]\n },\n \"application/vnd.ibm.modcap\": {\n \"source\": \"iana\",\n \"extensions\": [\"afp\",\"listafp\",\"list3820\"]\n },\n \"application/vnd.ibm.rights-management\": {\n \"source\": \"iana\",\n \"extensions\": [\"irm\"]\n },\n \"application/vnd.ibm.secure-container\": {\n \"source\": \"iana\",\n \"extensions\": [\"sc\"]\n },\n \"application/vnd.iccprofile\": {\n \"source\": \"iana\",\n \"extensions\": [\"icc\",\"icm\"]\n },\n \"application/vnd.ieee.1905\": {\n \"source\": \"iana\"\n },\n \"application/vnd.igloader\": {\n \"source\": \"iana\",\n \"extensions\": [\"igl\"]\n },\n \"application/vnd.immervision-ivp\": {\n \"source\": \"iana\",\n \"extensions\": [\"ivp\"]\n },\n \"application/vnd.immervision-ivu\": {\n \"source\": \"iana\",\n \"extensions\": [\"ivu\"]\n },\n \"application/vnd.ims.imsccv1p1\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.imsccv1p2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.imsccv1p3\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ims.lis.v2.result+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolconsumerprofile+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolproxy+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolproxy.id+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolsettings+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.ims.lti.v2.toolsettings.simple+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.informedcontrol.rms+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.informix-visionary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.infotech.project\": {\n \"source\": \"iana\"\n },\n \"application/vnd.infotech.project+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.innopath.wamp.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.insors.igm\": {\n \"source\": \"iana\",\n \"extensions\": [\"igm\"]\n },\n \"application/vnd.intercon.formnet\": {\n \"source\": \"iana\",\n \"extensions\": [\"xpw\",\"xpx\"]\n },\n \"application/vnd.intergeo\": {\n \"source\": \"iana\",\n \"extensions\": [\"i2g\"]\n },\n \"application/vnd.intertrust.digibox\": {\n \"source\": \"iana\"\n },\n \"application/vnd.intertrust.nncp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.intu.qbo\": {\n \"source\": \"iana\",\n \"extensions\": [\"qbo\"]\n },\n \"application/vnd.intu.qfx\": {\n \"source\": \"iana\",\n \"extensions\": [\"qfx\"]\n },\n \"application/vnd.iptc.g2.catalogitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.conceptitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.knowledgeitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.newsitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.newsmessage+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.packageitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.iptc.g2.planningitem+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ipunplugged.rcprofile\": {\n \"source\": \"iana\",\n \"extensions\": [\"rcprofile\"]\n },\n \"application/vnd.irepository.package+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"irp\"]\n },\n \"application/vnd.is-xpr\": {\n \"source\": \"iana\",\n \"extensions\": [\"xpr\"]\n },\n \"application/vnd.isac.fcs\": {\n \"source\": \"iana\",\n \"extensions\": [\"fcs\"]\n },\n \"application/vnd.jam\": {\n \"source\": \"iana\",\n \"extensions\": [\"jam\"]\n },\n \"application/vnd.japannet-directory-service\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-jpnstore-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-payment-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-registration\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-registration-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-setstore-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-verification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.japannet-verification-wakeup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.jcp.javame.midlet-rms\": {\n \"source\": \"iana\",\n \"extensions\": [\"rms\"]\n },\n \"application/vnd.jisp\": {\n \"source\": \"iana\",\n \"extensions\": [\"jisp\"]\n },\n \"application/vnd.joost.joda-archive\": {\n \"source\": \"iana\",\n \"extensions\": [\"joda\"]\n },\n \"application/vnd.jsk.isdn-ngn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.kahootz\": {\n \"source\": \"iana\",\n \"extensions\": [\"ktz\",\"ktr\"]\n },\n \"application/vnd.kde.karbon\": {\n \"source\": \"iana\",\n \"extensions\": [\"karbon\"]\n },\n \"application/vnd.kde.kchart\": {\n \"source\": \"iana\",\n \"extensions\": [\"chrt\"]\n },\n \"application/vnd.kde.kformula\": {\n \"source\": \"iana\",\n \"extensions\": [\"kfo\"]\n },\n \"application/vnd.kde.kivio\": {\n \"source\": \"iana\",\n \"extensions\": [\"flw\"]\n },\n \"application/vnd.kde.kontour\": {\n \"source\": \"iana\",\n \"extensions\": [\"kon\"]\n },\n \"application/vnd.kde.kpresenter\": {\n \"source\": \"iana\",\n \"extensions\": [\"kpr\",\"kpt\"]\n },\n \"application/vnd.kde.kspread\": {\n \"source\": \"iana\",\n \"extensions\": [\"ksp\"]\n },\n \"application/vnd.kde.kword\": {\n \"source\": \"iana\",\n \"extensions\": [\"kwd\",\"kwt\"]\n },\n \"application/vnd.kenameaapp\": {\n \"source\": \"iana\",\n \"extensions\": [\"htke\"]\n },\n \"application/vnd.kidspiration\": {\n \"source\": \"iana\",\n \"extensions\": [\"kia\"]\n },\n \"application/vnd.kinar\": {\n \"source\": \"iana\",\n \"extensions\": [\"kne\",\"knp\"]\n },\n \"application/vnd.koan\": {\n \"source\": \"iana\",\n \"extensions\": [\"skp\",\"skd\",\"skt\",\"skm\"]\n },\n \"application/vnd.kodak-descriptor\": {\n \"source\": \"iana\",\n \"extensions\": [\"sse\"]\n },\n \"application/vnd.las.las+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"lasxml\"]\n },\n \"application/vnd.liberty-request+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.llamagraphics.life-balance.desktop\": {\n \"source\": \"iana\",\n \"extensions\": [\"lbd\"]\n },\n \"application/vnd.llamagraphics.life-balance.exchange+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"lbe\"]\n },\n \"application/vnd.lotus-1-2-3\": {\n \"source\": \"iana\",\n \"extensions\": [\"123\"]\n },\n \"application/vnd.lotus-approach\": {\n \"source\": \"iana\",\n \"extensions\": [\"apr\"]\n },\n \"application/vnd.lotus-freelance\": {\n \"source\": \"iana\",\n \"extensions\": [\"pre\"]\n },\n \"application/vnd.lotus-notes\": {\n \"source\": \"iana\",\n \"extensions\": [\"nsf\"]\n },\n \"application/vnd.lotus-organizer\": {\n \"source\": \"iana\",\n \"extensions\": [\"org\"]\n },\n \"application/vnd.lotus-screencam\": {\n \"source\": \"iana\",\n \"extensions\": [\"scm\"]\n },\n \"application/vnd.lotus-wordpro\": {\n \"source\": \"iana\",\n \"extensions\": [\"lwp\"]\n },\n \"application/vnd.macports.portpkg\": {\n \"source\": \"iana\",\n \"extensions\": [\"portpkg\"]\n },\n \"application/vnd.mapbox-vector-tile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.marlin.drm.actiontoken+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.marlin.drm.conftoken+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.marlin.drm.license+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.marlin.drm.mdcf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mason+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.maxmind.maxmind-db\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mcd\": {\n \"source\": \"iana\",\n \"extensions\": [\"mcd\"]\n },\n \"application/vnd.medcalcdata\": {\n \"source\": \"iana\",\n \"extensions\": [\"mc1\"]\n },\n \"application/vnd.mediastation.cdkey\": {\n \"source\": \"iana\",\n \"extensions\": [\"cdkey\"]\n },\n \"application/vnd.meridian-slingshot\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mfer\": {\n \"source\": \"iana\",\n \"extensions\": [\"mwf\"]\n },\n \"application/vnd.mfmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"mfm\"]\n },\n \"application/vnd.micro+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.micrografx.flo\": {\n \"source\": \"iana\",\n \"extensions\": [\"flo\"]\n },\n \"application/vnd.micrografx.igx\": {\n \"source\": \"iana\",\n \"extensions\": [\"igx\"]\n },\n \"application/vnd.microsoft.portable-executable\": {\n \"source\": \"iana\"\n },\n \"application/vnd.miele+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.mif\": {\n \"source\": \"iana\",\n \"extensions\": [\"mif\"]\n },\n \"application/vnd.minisoft-hp3000-save\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mitsubishi.misty-guard.trustweb\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mobius.daf\": {\n \"source\": \"iana\",\n \"extensions\": [\"daf\"]\n },\n \"application/vnd.mobius.dis\": {\n \"source\": \"iana\",\n \"extensions\": [\"dis\"]\n },\n \"application/vnd.mobius.mbk\": {\n \"source\": \"iana\",\n \"extensions\": [\"mbk\"]\n },\n \"application/vnd.mobius.mqy\": {\n \"source\": \"iana\",\n \"extensions\": [\"mqy\"]\n },\n \"application/vnd.mobius.msl\": {\n \"source\": \"iana\",\n \"extensions\": [\"msl\"]\n },\n \"application/vnd.mobius.plc\": {\n \"source\": \"iana\",\n \"extensions\": [\"plc\"]\n },\n \"application/vnd.mobius.txf\": {\n \"source\": \"iana\",\n \"extensions\": [\"txf\"]\n },\n \"application/vnd.mophun.application\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpn\"]\n },\n \"application/vnd.mophun.certificate\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpc\"]\n },\n \"application/vnd.motorola.flexsuite\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.adsi\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.fis\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.gotap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.kmr\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.ttc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.flexsuite.wem\": {\n \"source\": \"iana\"\n },\n \"application/vnd.motorola.iprm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mozilla.xul+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xul\"]\n },\n \"application/vnd.ms-3mfdocument\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-artgalry\": {\n \"source\": \"iana\",\n \"extensions\": [\"cil\"]\n },\n \"application/vnd.ms-asf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-cab-compressed\": {\n \"source\": \"iana\",\n \"extensions\": [\"cab\"]\n },\n \"application/vnd.ms-color.iccprofile\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ms-excel\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xls\",\"xlm\",\"xla\",\"xlc\",\"xlt\",\"xlw\"]\n },\n \"application/vnd.ms-excel.addin.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlam\"]\n },\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlsb\"]\n },\n \"application/vnd.ms-excel.sheet.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xlsm\"]\n },\n \"application/vnd.ms-excel.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"xltm\"]\n },\n \"application/vnd.ms-fontobject\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"eot\"]\n },\n \"application/vnd.ms-htmlhelp\": {\n \"source\": \"iana\",\n \"extensions\": [\"chm\"]\n },\n \"application/vnd.ms-ims\": {\n \"source\": \"iana\",\n \"extensions\": [\"ims\"]\n },\n \"application/vnd.ms-lrm\": {\n \"source\": \"iana\",\n \"extensions\": [\"lrm\"]\n },\n \"application/vnd.ms-office.activex+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-officetheme\": {\n \"source\": \"iana\",\n \"extensions\": [\"thmx\"]\n },\n \"application/vnd.ms-opentype\": {\n \"source\": \"apache\",\n \"compressible\": true\n },\n \"application/vnd.ms-package.obfuscated-opentype\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ms-pki.seccat\": {\n \"source\": \"apache\",\n \"extensions\": [\"cat\"]\n },\n \"application/vnd.ms-pki.stl\": {\n \"source\": \"apache\",\n \"extensions\": [\"stl\"]\n },\n \"application/vnd.ms-playready.initiator+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-powerpoint\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ppt\",\"pps\",\"pot\"]\n },\n \"application/vnd.ms-powerpoint.addin.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppam\"]\n },\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"pptm\"]\n },\n \"application/vnd.ms-powerpoint.slide.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"sldm\"]\n },\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppsm\"]\n },\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"potm\"]\n },\n \"application/vnd.ms-printdevicecapabilities+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-printing.printticket+xml\": {\n \"source\": \"apache\"\n },\n \"application/vnd.ms-project\": {\n \"source\": \"iana\",\n \"extensions\": [\"mpp\",\"mpt\"]\n },\n \"application/vnd.ms-tnef\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.devicepairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.nwprinting.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.printerpairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-windows.wsd.oob\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.lic-chlg-req\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.lic-resp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.meter-chlg-req\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-wmdrm.meter-resp\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ms-word.document.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"docm\"]\n },\n \"application/vnd.ms-word.template.macroenabled.12\": {\n \"source\": \"iana\",\n \"extensions\": [\"dotm\"]\n },\n \"application/vnd.ms-works\": {\n \"source\": \"iana\",\n \"extensions\": [\"wps\",\"wks\",\"wcm\",\"wdb\"]\n },\n \"application/vnd.ms-wpl\": {\n \"source\": \"iana\",\n \"extensions\": [\"wpl\"]\n },\n \"application/vnd.ms-xpsdocument\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xps\"]\n },\n \"application/vnd.msa-disk-image\": {\n \"source\": \"iana\"\n },\n \"application/vnd.mseq\": {\n \"source\": \"iana\",\n \"extensions\": [\"mseq\"]\n },\n \"application/vnd.msign\": {\n \"source\": \"iana\"\n },\n \"application/vnd.multiad.creator\": {\n \"source\": \"iana\"\n },\n \"application/vnd.multiad.creator.cif\": {\n \"source\": \"iana\"\n },\n \"application/vnd.music-niff\": {\n \"source\": \"iana\"\n },\n \"application/vnd.musician\": {\n \"source\": \"iana\",\n \"extensions\": [\"mus\"]\n },\n \"application/vnd.muvee.style\": {\n \"source\": \"iana\",\n \"extensions\": [\"msty\"]\n },\n \"application/vnd.mynfc\": {\n \"source\": \"iana\",\n \"extensions\": [\"taglet\"]\n },\n \"application/vnd.ncd.control\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ncd.reference\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nervana\": {\n \"source\": \"iana\"\n },\n \"application/vnd.netfpx\": {\n \"source\": \"iana\"\n },\n \"application/vnd.neurolanguage.nlu\": {\n \"source\": \"iana\",\n \"extensions\": [\"nlu\"]\n },\n \"application/vnd.nintendo.nitro.rom\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nintendo.snes.rom\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nitf\": {\n \"source\": \"iana\",\n \"extensions\": [\"ntf\",\"nitf\"]\n },\n \"application/vnd.noblenet-directory\": {\n \"source\": \"iana\",\n \"extensions\": [\"nnd\"]\n },\n \"application/vnd.noblenet-sealer\": {\n \"source\": \"iana\",\n \"extensions\": [\"nns\"]\n },\n \"application/vnd.noblenet-web\": {\n \"source\": \"iana\",\n \"extensions\": [\"nnw\"]\n },\n \"application/vnd.nokia.catalogs\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.conml+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.conml+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.iptv.config+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.isds-radio-presets\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.landmark+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.landmark+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.landmarkcollection+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.n-gage.ac+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.n-gage.data\": {\n \"source\": \"iana\",\n \"extensions\": [\"ngdat\"]\n },\n \"application/vnd.nokia.n-gage.symbian.install\": {\n \"source\": \"iana\",\n \"extensions\": [\"n-gage\"]\n },\n \"application/vnd.nokia.ncd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.pcd+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.pcd+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.nokia.radio-preset\": {\n \"source\": \"iana\",\n \"extensions\": [\"rpst\"]\n },\n \"application/vnd.nokia.radio-presets\": {\n \"source\": \"iana\",\n \"extensions\": [\"rpss\"]\n },\n \"application/vnd.novadigm.edm\": {\n \"source\": \"iana\",\n \"extensions\": [\"edm\"]\n },\n \"application/vnd.novadigm.edx\": {\n \"source\": \"iana\",\n \"extensions\": [\"edx\"]\n },\n \"application/vnd.novadigm.ext\": {\n \"source\": \"iana\",\n \"extensions\": [\"ext\"]\n },\n \"application/vnd.ntt-local.content-share\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.file-transfer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.ogw_remote-access\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.sip-ta_remote\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ntt-local.sip-ta_tcp_stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oasis.opendocument.chart\": {\n \"source\": \"iana\",\n \"extensions\": [\"odc\"]\n },\n \"application/vnd.oasis.opendocument.chart-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otc\"]\n },\n \"application/vnd.oasis.opendocument.database\": {\n \"source\": \"iana\",\n \"extensions\": [\"odb\"]\n },\n \"application/vnd.oasis.opendocument.formula\": {\n \"source\": \"iana\",\n \"extensions\": [\"odf\"]\n },\n \"application/vnd.oasis.opendocument.formula-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"odft\"]\n },\n \"application/vnd.oasis.opendocument.graphics\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odg\"]\n },\n \"application/vnd.oasis.opendocument.graphics-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otg\"]\n },\n \"application/vnd.oasis.opendocument.image\": {\n \"source\": \"iana\",\n \"extensions\": [\"odi\"]\n },\n \"application/vnd.oasis.opendocument.image-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"oti\"]\n },\n \"application/vnd.oasis.opendocument.presentation\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odp\"]\n },\n \"application/vnd.oasis.opendocument.presentation-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"otp\"]\n },\n \"application/vnd.oasis.opendocument.spreadsheet\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"ods\"]\n },\n \"application/vnd.oasis.opendocument.spreadsheet-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"ots\"]\n },\n \"application/vnd.oasis.opendocument.text\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"odt\"]\n },\n \"application/vnd.oasis.opendocument.text-master\": {\n \"source\": \"iana\",\n \"extensions\": [\"odm\"]\n },\n \"application/vnd.oasis.opendocument.text-template\": {\n \"source\": \"iana\",\n \"extensions\": [\"ott\"]\n },\n \"application/vnd.oasis.opendocument.text-web\": {\n \"source\": \"iana\",\n \"extensions\": [\"oth\"]\n },\n \"application/vnd.obn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oftn.l10n+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.oipf.contentaccessdownload+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.contentaccessstreaming+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.cspg-hexbinary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.dae.svg+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.dae.xhtml+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.mippvcontrolmessage+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.pae.gem\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.spdiscovery+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.spdlist+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.ueprofile+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oipf.userprofile+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.olpc-sugar\": {\n \"source\": \"iana\",\n \"extensions\": [\"xo\"]\n },\n \"application/vnd.oma-scws-config\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma-scws-http-request\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma-scws-http-response\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.associated-procedure-parameter+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.drm-trigger+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.imd+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.ltkm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.notification+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.provisioningtrigger\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sgboot\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sgdd+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sgdu\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.simple-symbol-container\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.smartcard-trigger+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.sprov+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.bcast.stkm\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-address-book+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-feature-handler+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-pcc+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-subs-invite+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.cab-user-prefs+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.dcd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.dcdc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.dd2+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"dd2\"]\n },\n \"application/vnd.oma.drm.risd+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.group-usage-list+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.pal+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.poc.detailed-progress-report+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.poc.final-report+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.poc.groups+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.poc.invocation-descriptor+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.poc.optimized-progress-report+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.push\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.scidm.messages+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oma.xcap-directory+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.omads-email+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.omads-file+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.omads-folder+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.omaloc-supl-init\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openblox.game+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openblox.game-binary\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openeye.oeb\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openofficeorg.extension\": {\n \"source\": \"apache\",\n \"extensions\": [\"oxt\"]\n },\n \"application/vnd.openxmlformats-officedocument.custom-properties+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.customxmlproperties+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawing+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.extended-properties+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.comments+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"pptx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slide\": {\n \"source\": \"iana\",\n \"extensions\": [\"sldx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": {\n \"source\": \"iana\",\n \"extensions\": [\"ppsx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.tags+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"potx\"]\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"xlsx\"]\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"xltx\"]\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.theme+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.themeoverride+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.vmldrawing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml-template\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"docx\"]\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"dotx\"]\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-package.core-properties+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.openxmlformats-package.relationships+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oracle.resource+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.orange.indata\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osa.netdeploy\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osgeo.mapguide.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"mgp\"]\n },\n \"application/vnd.osgi.bundle\": {\n \"source\": \"iana\"\n },\n \"application/vnd.osgi.dp\": {\n \"source\": \"iana\",\n \"extensions\": [\"dp\"]\n },\n \"application/vnd.osgi.subsystem\": {\n \"source\": \"iana\",\n \"extensions\": [\"esa\"]\n },\n \"application/vnd.otps.ct-kip+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.oxli.countgraph\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pagerduty+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.palm\": {\n \"source\": \"iana\",\n \"extensions\": [\"pdb\",\"pqa\",\"oprc\"]\n },\n \"application/vnd.panoply\": {\n \"source\": \"iana\"\n },\n \"application/vnd.paos+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.paos.xml\": {\n \"source\": \"apache\"\n },\n \"application/vnd.pawaafile\": {\n \"source\": \"iana\",\n \"extensions\": [\"paw\"]\n },\n \"application/vnd.pcos\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pg.format\": {\n \"source\": \"iana\",\n \"extensions\": [\"str\"]\n },\n \"application/vnd.pg.osasli\": {\n \"source\": \"iana\",\n \"extensions\": [\"ei6\"]\n },\n \"application/vnd.piaccess.application-licence\": {\n \"source\": \"iana\"\n },\n \"application/vnd.picsel\": {\n \"source\": \"iana\",\n \"extensions\": [\"efif\"]\n },\n \"application/vnd.pmi.widget\": {\n \"source\": \"iana\",\n \"extensions\": [\"wg\"]\n },\n \"application/vnd.poc.group-advertisement+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pocketlearn\": {\n \"source\": \"iana\",\n \"extensions\": [\"plf\"]\n },\n \"application/vnd.powerbuilder6\": {\n \"source\": \"iana\",\n \"extensions\": [\"pbd\"]\n },\n \"application/vnd.powerbuilder6-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder7\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder7-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder75\": {\n \"source\": \"iana\"\n },\n \"application/vnd.powerbuilder75-s\": {\n \"source\": \"iana\"\n },\n \"application/vnd.preminet\": {\n \"source\": \"iana\"\n },\n \"application/vnd.previewsystems.box\": {\n \"source\": \"iana\",\n \"extensions\": [\"box\"]\n },\n \"application/vnd.proteus.magazine\": {\n \"source\": \"iana\",\n \"extensions\": [\"mgz\"]\n },\n \"application/vnd.publishare-delta-tree\": {\n \"source\": \"iana\",\n \"extensions\": [\"qps\"]\n },\n \"application/vnd.pvi.ptid1\": {\n \"source\": \"iana\",\n \"extensions\": [\"ptid\"]\n },\n \"application/vnd.pwg-multiplexed\": {\n \"source\": \"iana\"\n },\n \"application/vnd.pwg-xhtml-print+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.qualcomm.brew-app-res\": {\n \"source\": \"iana\"\n },\n \"application/vnd.quark.quarkxpress\": {\n \"source\": \"iana\",\n \"extensions\": [\"qxd\",\"qxt\",\"qwd\",\"qwt\",\"qxl\",\"qxb\"]\n },\n \"application/vnd.quobject-quoxdocument\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.moml+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-audit+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-audit-conf+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-audit-conn+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-audit-dialog+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-audit-stream+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-conf+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-base+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-fax-detect+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-fax-sendrecv+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-group+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-speech+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.radisys.msml-dialog-transform+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.rainstor.data\": {\n \"source\": \"iana\"\n },\n \"application/vnd.rapid\": {\n \"source\": \"iana\"\n },\n \"application/vnd.realvnc.bed\": {\n \"source\": \"iana\",\n \"extensions\": [\"bed\"]\n },\n \"application/vnd.recordare.musicxml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxl\"]\n },\n \"application/vnd.recordare.musicxml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"musicxml\"]\n },\n \"application/vnd.renlearn.rlprint\": {\n \"source\": \"iana\"\n },\n \"application/vnd.rig.cryptonote\": {\n \"source\": \"iana\",\n \"extensions\": [\"cryptonote\"]\n },\n \"application/vnd.rim.cod\": {\n \"source\": \"apache\",\n \"extensions\": [\"cod\"]\n },\n \"application/vnd.rn-realmedia\": {\n \"source\": \"apache\",\n \"extensions\": [\"rm\"]\n },\n \"application/vnd.rn-realmedia-vbr\": {\n \"source\": \"apache\",\n \"extensions\": [\"rmvb\"]\n },\n \"application/vnd.route66.link66+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"link66\"]\n },\n \"application/vnd.rs-274x\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ruckus.download\": {\n \"source\": \"iana\"\n },\n \"application/vnd.s3sms\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sailingtracker.track\": {\n \"source\": \"iana\",\n \"extensions\": [\"st\"]\n },\n \"application/vnd.sbm.cid\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sbm.mid2\": {\n \"source\": \"iana\"\n },\n \"application/vnd.scribus\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.3df\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.csf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.doc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.eml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.mht\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.net\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.ppt\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.tiff\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealed.xls\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealedmedia.softseal.html\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sealedmedia.softseal.pdf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.seemail\": {\n \"source\": \"iana\",\n \"extensions\": [\"see\"]\n },\n \"application/vnd.sema\": {\n \"source\": \"iana\",\n \"extensions\": [\"sema\"]\n },\n \"application/vnd.semd\": {\n \"source\": \"iana\",\n \"extensions\": [\"semd\"]\n },\n \"application/vnd.semf\": {\n \"source\": \"iana\",\n \"extensions\": [\"semf\"]\n },\n \"application/vnd.shana.informed.formdata\": {\n \"source\": \"iana\",\n \"extensions\": [\"ifm\"]\n },\n \"application/vnd.shana.informed.formtemplate\": {\n \"source\": \"iana\",\n \"extensions\": [\"itp\"]\n },\n \"application/vnd.shana.informed.interchange\": {\n \"source\": \"iana\",\n \"extensions\": [\"iif\"]\n },\n \"application/vnd.shana.informed.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"ipk\"]\n },\n \"application/vnd.simtech-mindmapper\": {\n \"source\": \"iana\",\n \"extensions\": [\"twd\",\"twds\"]\n },\n \"application/vnd.siren+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.smaf\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmf\"]\n },\n \"application/vnd.smart.notebook\": {\n \"source\": \"iana\"\n },\n \"application/vnd.smart.teacher\": {\n \"source\": \"iana\",\n \"extensions\": [\"teacher\"]\n },\n \"application/vnd.software602.filler.form+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.software602.filler.form-xml-zip\": {\n \"source\": \"iana\"\n },\n \"application/vnd.solent.sdkm+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"sdkm\",\"sdkd\"]\n },\n \"application/vnd.spotfire.dxp\": {\n \"source\": \"iana\",\n \"extensions\": [\"dxp\"]\n },\n \"application/vnd.spotfire.sfs\": {\n \"source\": \"iana\",\n \"extensions\": [\"sfs\"]\n },\n \"application/vnd.sss-cod\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sss-dtf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sss-ntf\": {\n \"source\": \"iana\"\n },\n \"application/vnd.stardivision.calc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdc\"]\n },\n \"application/vnd.stardivision.draw\": {\n \"source\": \"apache\",\n \"extensions\": [\"sda\"]\n },\n \"application/vnd.stardivision.impress\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdd\"]\n },\n \"application/vnd.stardivision.math\": {\n \"source\": \"apache\",\n \"extensions\": [\"smf\"]\n },\n \"application/vnd.stardivision.writer\": {\n \"source\": \"apache\",\n \"extensions\": [\"sdw\",\"vor\"]\n },\n \"application/vnd.stardivision.writer-global\": {\n \"source\": \"apache\",\n \"extensions\": [\"sgl\"]\n },\n \"application/vnd.stepmania.package\": {\n \"source\": \"iana\",\n \"extensions\": [\"smzip\"]\n },\n \"application/vnd.stepmania.stepchart\": {\n \"source\": \"iana\",\n \"extensions\": [\"sm\"]\n },\n \"application/vnd.street-stream\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sun.wadl+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.sun.xml.calc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxc\"]\n },\n \"application/vnd.sun.xml.calc.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"stc\"]\n },\n \"application/vnd.sun.xml.draw\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxd\"]\n },\n \"application/vnd.sun.xml.draw.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"std\"]\n },\n \"application/vnd.sun.xml.impress\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxi\"]\n },\n \"application/vnd.sun.xml.impress.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"sti\"]\n },\n \"application/vnd.sun.xml.math\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxm\"]\n },\n \"application/vnd.sun.xml.writer\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxw\"]\n },\n \"application/vnd.sun.xml.writer.global\": {\n \"source\": \"apache\",\n \"extensions\": [\"sxg\"]\n },\n \"application/vnd.sun.xml.writer.template\": {\n \"source\": \"apache\",\n \"extensions\": [\"stw\"]\n },\n \"application/vnd.sus-calendar\": {\n \"source\": \"iana\",\n \"extensions\": [\"sus\",\"susp\"]\n },\n \"application/vnd.svd\": {\n \"source\": \"iana\",\n \"extensions\": [\"svd\"]\n },\n \"application/vnd.swiftview-ics\": {\n \"source\": \"iana\"\n },\n \"application/vnd.symbian.install\": {\n \"source\": \"apache\",\n \"extensions\": [\"sis\",\"sisx\"]\n },\n \"application/vnd.syncml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xsm\"]\n },\n \"application/vnd.syncml.dm+wbxml\": {\n \"source\": \"iana\",\n \"extensions\": [\"bdm\"]\n },\n \"application/vnd.syncml.dm+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdm\"]\n },\n \"application/vnd.syncml.dm.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmddf+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmddf+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmtnds+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.dmtnds+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.syncml.ds.notification\": {\n \"source\": \"iana\"\n },\n \"application/vnd.tao.intent-module-archive\": {\n \"source\": \"iana\",\n \"extensions\": [\"tao\"]\n },\n \"application/vnd.tcpdump.pcap\": {\n \"source\": \"iana\",\n \"extensions\": [\"pcap\",\"cap\",\"dmp\"]\n },\n \"application/vnd.tmd.mediaflex.api+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.tml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.tmobile-livetv\": {\n \"source\": \"iana\",\n \"extensions\": [\"tmo\"]\n },\n \"application/vnd.trid.tpt\": {\n \"source\": \"iana\",\n \"extensions\": [\"tpt\"]\n },\n \"application/vnd.triscape.mxs\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxs\"]\n },\n \"application/vnd.trueapp\": {\n \"source\": \"iana\",\n \"extensions\": [\"tra\"]\n },\n \"application/vnd.truedoc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ubisoft.webplayer\": {\n \"source\": \"iana\"\n },\n \"application/vnd.ufdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"ufd\",\"ufdl\"]\n },\n \"application/vnd.uiq.theme\": {\n \"source\": \"iana\",\n \"extensions\": [\"utz\"]\n },\n \"application/vnd.umajin\": {\n \"source\": \"iana\",\n \"extensions\": [\"umj\"]\n },\n \"application/vnd.unity\": {\n \"source\": \"iana\",\n \"extensions\": [\"unityweb\"]\n },\n \"application/vnd.uoml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"uoml\"]\n },\n \"application/vnd.uplanet.alert\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.alert-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.bearer-choice\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.bearer-choice-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.cacheop\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.cacheop-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.channel\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.channel-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.list\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.list-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.listcmd\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.listcmd-wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uplanet.signal\": {\n \"source\": \"iana\"\n },\n \"application/vnd.uri-map\": {\n \"source\": \"iana\"\n },\n \"application/vnd.valve.source.material\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vcx\": {\n \"source\": \"iana\",\n \"extensions\": [\"vcx\"]\n },\n \"application/vnd.vd-study\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vectorworks\": {\n \"source\": \"iana\"\n },\n \"application/vnd.verimatrix.vcas\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vidsoft.vidconference\": {\n \"source\": \"iana\"\n },\n \"application/vnd.visio\": {\n \"source\": \"iana\",\n \"extensions\": [\"vsd\",\"vst\",\"vss\",\"vsw\"]\n },\n \"application/vnd.visionary\": {\n \"source\": \"iana\",\n \"extensions\": [\"vis\"]\n },\n \"application/vnd.vividence.scriptfile\": {\n \"source\": \"iana\"\n },\n \"application/vnd.vsf\": {\n \"source\": \"iana\",\n \"extensions\": [\"vsf\"]\n },\n \"application/vnd.wap.sic\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wap.slc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wap.wbxml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wbxml\"]\n },\n \"application/vnd.wap.wmlc\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmlc\"]\n },\n \"application/vnd.wap.wmlscriptc\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmlsc\"]\n },\n \"application/vnd.webturbo\": {\n \"source\": \"iana\",\n \"extensions\": [\"wtb\"]\n },\n \"application/vnd.wfa.p2p\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wfa.wsc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.windows.devicepairing\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wmc\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wmf.bootstrap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.mathematica\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.mathematica.package\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wolfram.player\": {\n \"source\": \"iana\",\n \"extensions\": [\"nbp\"]\n },\n \"application/vnd.wordperfect\": {\n \"source\": \"iana\",\n \"extensions\": [\"wpd\"]\n },\n \"application/vnd.wqd\": {\n \"source\": \"iana\",\n \"extensions\": [\"wqd\"]\n },\n \"application/vnd.wrq-hp3000-labelled\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wt.stf\": {\n \"source\": \"iana\",\n \"extensions\": [\"stf\"]\n },\n \"application/vnd.wv.csp+wbxml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wv.csp+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.wv.ssp+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xacml+json\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/vnd.xara\": {\n \"source\": \"iana\",\n \"extensions\": [\"xar\"]\n },\n \"application/vnd.xfdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"xfdl\"]\n },\n \"application/vnd.xfdl.webform\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmi+xml\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.cpkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.dpkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.plan\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.ppkg\": {\n \"source\": \"iana\"\n },\n \"application/vnd.xmpie.xlim\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.hv-dic\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvd\"]\n },\n \"application/vnd.yamaha.hv-script\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvs\"]\n },\n \"application/vnd.yamaha.hv-voice\": {\n \"source\": \"iana\",\n \"extensions\": [\"hvp\"]\n },\n \"application/vnd.yamaha.openscoreformat\": {\n \"source\": \"iana\",\n \"extensions\": [\"osf\"]\n },\n \"application/vnd.yamaha.openscoreformat.osfpvg+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"osfpvg\"]\n },\n \"application/vnd.yamaha.remote-setup\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.smaf-audio\": {\n \"source\": \"iana\",\n \"extensions\": [\"saf\"]\n },\n \"application/vnd.yamaha.smaf-phrase\": {\n \"source\": \"iana\",\n \"extensions\": [\"spf\"]\n },\n \"application/vnd.yamaha.through-ngn\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yamaha.tunnel-udpencap\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yaoweme\": {\n \"source\": \"iana\"\n },\n \"application/vnd.yellowriver-custom-menu\": {\n \"source\": \"iana\",\n \"extensions\": [\"cmp\"]\n },\n \"application/vnd.zul\": {\n \"source\": \"iana\",\n \"extensions\": [\"zir\",\"zirz\"]\n },\n \"application/vnd.zzazz.deck+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"zaz\"]\n },\n \"application/voicexml+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"vxml\"]\n },\n \"application/vq-rtcpxr\": {\n \"source\": \"iana\"\n },\n \"application/watcherinfo+xml\": {\n \"source\": \"iana\"\n },\n \"application/whoispp-query\": {\n \"source\": \"iana\"\n },\n \"application/whoispp-response\": {\n \"source\": \"iana\"\n },\n \"application/widget\": {\n \"source\": \"iana\",\n \"extensions\": [\"wgt\"]\n },\n \"application/winhlp\": {\n \"source\": \"apache\",\n \"extensions\": [\"hlp\"]\n },\n \"application/wita\": {\n \"source\": \"iana\"\n },\n \"application/wordperfect5.1\": {\n \"source\": \"iana\"\n },\n \"application/wsdl+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wsdl\"]\n },\n \"application/wspolicy+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wspolicy\"]\n },\n \"application/x-7z-compressed\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"7z\"]\n },\n \"application/x-abiword\": {\n \"source\": \"apache\",\n \"extensions\": [\"abw\"]\n },\n \"application/x-ace-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"ace\"]\n },\n \"application/x-amf\": {\n \"source\": \"apache\"\n },\n \"application/x-apple-diskimage\": {\n \"source\": \"apache\",\n \"extensions\": [\"dmg\"]\n },\n \"application/x-authorware-bin\": {\n \"source\": \"apache\",\n \"extensions\": [\"aab\",\"x32\",\"u32\",\"vox\"]\n },\n \"application/x-authorware-map\": {\n \"source\": \"apache\",\n \"extensions\": [\"aam\"]\n },\n \"application/x-authorware-seg\": {\n \"source\": \"apache\",\n \"extensions\": [\"aas\"]\n },\n \"application/x-bcpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"bcpio\"]\n },\n \"application/x-bdoc\": {\n \"compressible\": false,\n \"extensions\": [\"bdoc\"]\n },\n \"application/x-bittorrent\": {\n \"source\": \"apache\",\n \"extensions\": [\"torrent\"]\n },\n \"application/x-blorb\": {\n \"source\": \"apache\",\n \"extensions\": [\"blb\",\"blorb\"]\n },\n \"application/x-bzip\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"bz\"]\n },\n \"application/x-bzip2\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"bz2\",\"boz\"]\n },\n \"application/x-cbr\": {\n \"source\": \"apache\",\n \"extensions\": [\"cbr\",\"cba\",\"cbt\",\"cbz\",\"cb7\"]\n },\n \"application/x-cdlink\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcd\"]\n },\n \"application/x-cfs-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"cfs\"]\n },\n \"application/x-chat\": {\n \"source\": \"apache\",\n \"extensions\": [\"chat\"]\n },\n \"application/x-chess-pgn\": {\n \"source\": \"apache\",\n \"extensions\": [\"pgn\"]\n },\n \"application/x-chrome-extension\": {\n \"extensions\": [\"crx\"]\n },\n \"application/x-cocoa\": {\n \"source\": \"nginx\",\n \"extensions\": [\"cco\"]\n },\n \"application/x-compress\": {\n \"source\": \"apache\"\n },\n \"application/x-conference\": {\n \"source\": \"apache\",\n \"extensions\": [\"nsc\"]\n },\n \"application/x-cpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"cpio\"]\n },\n \"application/x-csh\": {\n \"source\": \"apache\",\n \"extensions\": [\"csh\"]\n },\n \"application/x-deb\": {\n \"compressible\": false\n },\n \"application/x-debian-package\": {\n \"source\": \"apache\",\n \"extensions\": [\"deb\",\"udeb\"]\n },\n \"application/x-dgc-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"dgc\"]\n },\n \"application/x-director\": {\n \"source\": \"apache\",\n \"extensions\": [\"dir\",\"dcr\",\"dxr\",\"cst\",\"cct\",\"cxt\",\"w3d\",\"fgd\",\"swa\"]\n },\n \"application/x-doom\": {\n \"source\": \"apache\",\n \"extensions\": [\"wad\"]\n },\n \"application/x-dtbncx+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"ncx\"]\n },\n \"application/x-dtbook+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"dtb\"]\n },\n \"application/x-dtbresource+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"res\"]\n },\n \"application/x-dvi\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"dvi\"]\n },\n \"application/x-envoy\": {\n \"source\": \"apache\",\n \"extensions\": [\"evy\"]\n },\n \"application/x-eva\": {\n \"source\": \"apache\",\n \"extensions\": [\"eva\"]\n },\n \"application/x-font-bdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"bdf\"]\n },\n \"application/x-font-dos\": {\n \"source\": \"apache\"\n },\n \"application/x-font-framemaker\": {\n \"source\": \"apache\"\n },\n \"application/x-font-ghostscript\": {\n \"source\": \"apache\",\n \"extensions\": [\"gsf\"]\n },\n \"application/x-font-libgrx\": {\n \"source\": \"apache\"\n },\n \"application/x-font-linux-psf\": {\n \"source\": \"apache\",\n \"extensions\": [\"psf\"]\n },\n \"application/x-font-otf\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"otf\"]\n },\n \"application/x-font-pcf\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcf\"]\n },\n \"application/x-font-snf\": {\n \"source\": \"apache\",\n \"extensions\": [\"snf\"]\n },\n \"application/x-font-speedo\": {\n \"source\": \"apache\"\n },\n \"application/x-font-sunos-news\": {\n \"source\": \"apache\"\n },\n \"application/x-font-ttf\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ttf\",\"ttc\"]\n },\n \"application/x-font-type1\": {\n \"source\": \"apache\",\n \"extensions\": [\"pfa\",\"pfb\",\"pfm\",\"afm\"]\n },\n \"application/x-font-vfont\": {\n \"source\": \"apache\"\n },\n \"application/x-freearc\": {\n \"source\": \"apache\",\n \"extensions\": [\"arc\"]\n },\n \"application/x-futuresplash\": {\n \"source\": \"apache\",\n \"extensions\": [\"spl\"]\n },\n \"application/x-gca-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"gca\"]\n },\n \"application/x-glulx\": {\n \"source\": \"apache\",\n \"extensions\": [\"ulx\"]\n },\n \"application/x-gnumeric\": {\n \"source\": \"apache\",\n \"extensions\": [\"gnumeric\"]\n },\n \"application/x-gramps-xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"gramps\"]\n },\n \"application/x-gtar\": {\n \"source\": \"apache\",\n \"extensions\": [\"gtar\"]\n },\n \"application/x-gzip\": {\n \"source\": \"apache\"\n },\n \"application/x-hdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"hdf\"]\n },\n \"application/x-httpd-php\": {\n \"compressible\": true,\n \"extensions\": [\"php\"]\n },\n \"application/x-install-instructions\": {\n \"source\": \"apache\",\n \"extensions\": [\"install\"]\n },\n \"application/x-iso9660-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"iso\"]\n },\n \"application/x-java-archive-diff\": {\n \"source\": \"nginx\",\n \"extensions\": [\"jardiff\"]\n },\n \"application/x-java-jnlp-file\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"jnlp\"]\n },\n \"application/x-javascript\": {\n \"compressible\": true\n },\n \"application/x-latex\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"latex\"]\n },\n \"application/x-lua-bytecode\": {\n \"extensions\": [\"luac\"]\n },\n \"application/x-lzh-compressed\": {\n \"source\": \"apache\",\n \"extensions\": [\"lzh\",\"lha\"]\n },\n \"application/x-makeself\": {\n \"source\": \"nginx\",\n \"extensions\": [\"run\"]\n },\n \"application/x-mie\": {\n \"source\": \"apache\",\n \"extensions\": [\"mie\"]\n },\n \"application/x-mobipocket-ebook\": {\n \"source\": \"apache\",\n \"extensions\": [\"prc\",\"mobi\"]\n },\n \"application/x-mpegurl\": {\n \"compressible\": false\n },\n \"application/x-ms-application\": {\n \"source\": \"apache\",\n \"extensions\": [\"application\"]\n },\n \"application/x-ms-shortcut\": {\n \"source\": \"apache\",\n \"extensions\": [\"lnk\"]\n },\n \"application/x-ms-wmd\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmd\"]\n },\n \"application/x-ms-wmz\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmz\"]\n },\n \"application/x-ms-xbap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xbap\"]\n },\n \"application/x-msaccess\": {\n \"source\": \"apache\",\n \"extensions\": [\"mdb\"]\n },\n \"application/x-msbinder\": {\n \"source\": \"apache\",\n \"extensions\": [\"obd\"]\n },\n \"application/x-mscardfile\": {\n \"source\": \"apache\",\n \"extensions\": [\"crd\"]\n },\n \"application/x-msclip\": {\n \"source\": \"apache\",\n \"extensions\": [\"clp\"]\n },\n \"application/x-msdos-program\": {\n \"extensions\": [\"exe\"]\n },\n \"application/x-msdownload\": {\n \"source\": \"apache\",\n \"extensions\": [\"exe\",\"dll\",\"com\",\"bat\",\"msi\"]\n },\n \"application/x-msmediaview\": {\n \"source\": \"apache\",\n \"extensions\": [\"mvb\",\"m13\",\"m14\"]\n },\n \"application/x-msmetafile\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmf\",\"wmz\",\"emf\",\"emz\"]\n },\n \"application/x-msmoney\": {\n \"source\": \"apache\",\n \"extensions\": [\"mny\"]\n },\n \"application/x-mspublisher\": {\n \"source\": \"apache\",\n \"extensions\": [\"pub\"]\n },\n \"application/x-msschedule\": {\n \"source\": \"apache\",\n \"extensions\": [\"scd\"]\n },\n \"application/x-msterminal\": {\n \"source\": \"apache\",\n \"extensions\": [\"trm\"]\n },\n \"application/x-mswrite\": {\n \"source\": \"apache\",\n \"extensions\": [\"wri\"]\n },\n \"application/x-netcdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"nc\",\"cdf\"]\n },\n \"application/x-ns-proxy-autoconfig\": {\n \"compressible\": true,\n \"extensions\": [\"pac\"]\n },\n \"application/x-nzb\": {\n \"source\": \"apache\",\n \"extensions\": [\"nzb\"]\n },\n \"application/x-perl\": {\n \"source\": \"nginx\",\n \"extensions\": [\"pl\",\"pm\"]\n },\n \"application/x-pilot\": {\n \"source\": \"nginx\",\n \"extensions\": [\"prc\",\"pdb\"]\n },\n \"application/x-pkcs12\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"p12\",\"pfx\"]\n },\n \"application/x-pkcs7-certificates\": {\n \"source\": \"apache\",\n \"extensions\": [\"p7b\",\"spc\"]\n },\n \"application/x-pkcs7-certreqresp\": {\n \"source\": \"apache\",\n \"extensions\": [\"p7r\"]\n },\n \"application/x-rar-compressed\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"rar\"]\n },\n \"application/x-redhat-package-manager\": {\n \"source\": \"nginx\",\n \"extensions\": [\"rpm\"]\n },\n \"application/x-research-info-systems\": {\n \"source\": \"apache\",\n \"extensions\": [\"ris\"]\n },\n \"application/x-sea\": {\n \"source\": \"nginx\",\n \"extensions\": [\"sea\"]\n },\n \"application/x-sh\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"sh\"]\n },\n \"application/x-shar\": {\n \"source\": \"apache\",\n \"extensions\": [\"shar\"]\n },\n \"application/x-shockwave-flash\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"swf\"]\n },\n \"application/x-silverlight-app\": {\n \"source\": \"apache\",\n \"extensions\": [\"xap\"]\n },\n \"application/x-sql\": {\n \"source\": \"apache\",\n \"extensions\": [\"sql\"]\n },\n \"application/x-stuffit\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"sit\"]\n },\n \"application/x-stuffitx\": {\n \"source\": \"apache\",\n \"extensions\": [\"sitx\"]\n },\n \"application/x-subrip\": {\n \"source\": \"apache\",\n \"extensions\": [\"srt\"]\n },\n \"application/x-sv4cpio\": {\n \"source\": \"apache\",\n \"extensions\": [\"sv4cpio\"]\n },\n \"application/x-sv4crc\": {\n \"source\": \"apache\",\n \"extensions\": [\"sv4crc\"]\n },\n \"application/x-t3vm-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"t3\"]\n },\n \"application/x-tads\": {\n \"source\": \"apache\",\n \"extensions\": [\"gam\"]\n },\n \"application/x-tar\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"tar\"]\n },\n \"application/x-tcl\": {\n \"source\": \"apache\",\n \"extensions\": [\"tcl\",\"tk\"]\n },\n \"application/x-tex\": {\n \"source\": \"apache\",\n \"extensions\": [\"tex\"]\n },\n \"application/x-tex-tfm\": {\n \"source\": \"apache\",\n \"extensions\": [\"tfm\"]\n },\n \"application/x-texinfo\": {\n \"source\": \"apache\",\n \"extensions\": [\"texinfo\",\"texi\"]\n },\n \"application/x-tgif\": {\n \"source\": \"apache\",\n \"extensions\": [\"obj\"]\n },\n \"application/x-ustar\": {\n \"source\": \"apache\",\n \"extensions\": [\"ustar\"]\n },\n \"application/x-wais-source\": {\n \"source\": \"apache\",\n \"extensions\": [\"src\"]\n },\n \"application/x-web-app-manifest+json\": {\n \"compressible\": true,\n \"extensions\": [\"webapp\"]\n },\n \"application/x-www-form-urlencoded\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"application/x-x509-ca-cert\": {\n \"source\": \"apache\",\n \"extensions\": [\"der\",\"crt\",\"pem\"]\n },\n \"application/x-xfig\": {\n \"source\": \"apache\",\n \"extensions\": [\"fig\"]\n },\n \"application/x-xliff+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"xlf\"]\n },\n \"application/x-xpinstall\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"xpi\"]\n },\n \"application/x-xz\": {\n \"source\": \"apache\",\n \"extensions\": [\"xz\"]\n },\n \"application/x-zmachine\": {\n \"source\": \"apache\",\n \"extensions\": [\"z1\",\"z2\",\"z3\",\"z4\",\"z5\",\"z6\",\"z7\",\"z8\"]\n },\n \"application/x400-bp\": {\n \"source\": \"iana\"\n },\n \"application/xacml+xml\": {\n \"source\": \"iana\"\n },\n \"application/xaml+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"xaml\"]\n },\n \"application/xcap-att+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcap-caps+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcap-diff+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xdf\"]\n },\n \"application/xcap-el+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcap-error+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcap-ns+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcon-conference-info+xml\": {\n \"source\": \"iana\"\n },\n \"application/xcon-conference-info-diff+xml\": {\n \"source\": \"iana\"\n },\n \"application/xenc+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xenc\"]\n },\n \"application/xhtml+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xhtml\",\"xht\"]\n },\n \"application/xhtml-voice+xml\": {\n \"source\": \"apache\"\n },\n \"application/xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xml\",\"xsl\",\"xsd\"]\n },\n \"application/xml-dtd\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"dtd\"]\n },\n \"application/xml-external-parsed-entity\": {\n \"source\": \"iana\"\n },\n \"application/xml-patch+xml\": {\n \"source\": \"iana\"\n },\n \"application/xmpp+xml\": {\n \"source\": \"iana\"\n },\n \"application/xop+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xop\"]\n },\n \"application/xproc+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"xpl\"]\n },\n \"application/xslt+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"xslt\"]\n },\n \"application/xspf+xml\": {\n \"source\": \"apache\",\n \"extensions\": [\"xspf\"]\n },\n \"application/xv+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"mxml\",\"xhvml\",\"xvml\",\"xvm\"]\n },\n \"application/yang\": {\n \"source\": \"iana\",\n \"extensions\": [\"yang\"]\n },\n \"application/yin+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"yin\"]\n },\n \"application/zip\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"zip\"]\n },\n \"application/zlib\": {\n \"source\": \"iana\"\n },\n \"audio/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"audio/32kadpcm\": {\n \"source\": \"iana\"\n },\n \"audio/3gpp\": {\n \"source\": \"iana\"\n },\n \"audio/3gpp2\": {\n \"source\": \"iana\"\n },\n \"audio/ac3\": {\n \"source\": \"iana\"\n },\n \"audio/adpcm\": {\n \"source\": \"apache\",\n \"extensions\": [\"adp\"]\n },\n \"audio/amr\": {\n \"source\": \"iana\"\n },\n \"audio/amr-wb\": {\n \"source\": \"iana\"\n },\n \"audio/amr-wb+\": {\n \"source\": \"iana\"\n },\n \"audio/aptx\": {\n \"source\": \"iana\"\n },\n \"audio/asc\": {\n \"source\": \"iana\"\n },\n \"audio/atrac-advanced-lossless\": {\n \"source\": \"iana\"\n },\n \"audio/atrac-x\": {\n \"source\": \"iana\"\n },\n \"audio/atrac3\": {\n \"source\": \"iana\"\n },\n \"audio/basic\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"au\",\"snd\"]\n },\n \"audio/bv16\": {\n \"source\": \"iana\"\n },\n \"audio/bv32\": {\n \"source\": \"iana\"\n },\n \"audio/clearmode\": {\n \"source\": \"iana\"\n },\n \"audio/cn\": {\n \"source\": \"iana\"\n },\n \"audio/dat12\": {\n \"source\": \"iana\"\n },\n \"audio/dls\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es201108\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202050\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202211\": {\n \"source\": \"iana\"\n },\n \"audio/dsr-es202212\": {\n \"source\": \"iana\"\n },\n \"audio/dv\": {\n \"source\": \"iana\"\n },\n \"audio/dvi4\": {\n \"source\": \"iana\"\n },\n \"audio/eac3\": {\n \"source\": \"iana\"\n },\n \"audio/encaprtp\": {\n \"source\": \"iana\"\n },\n \"audio/evrc\": {\n \"source\": \"iana\"\n },\n \"audio/evrc-qcp\": {\n \"source\": \"iana\"\n },\n \"audio/evrc0\": {\n \"source\": \"iana\"\n },\n \"audio/evrc1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcb1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcnw1\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb0\": {\n \"source\": \"iana\"\n },\n \"audio/evrcwb1\": {\n \"source\": \"iana\"\n },\n \"audio/evs\": {\n \"source\": \"iana\"\n },\n \"audio/fwdred\": {\n \"source\": \"iana\"\n },\n \"audio/g711-0\": {\n \"source\": \"iana\"\n },\n \"audio/g719\": {\n \"source\": \"iana\"\n },\n \"audio/g722\": {\n \"source\": \"iana\"\n },\n \"audio/g7221\": {\n \"source\": \"iana\"\n },\n \"audio/g723\": {\n \"source\": \"iana\"\n },\n \"audio/g726-16\": {\n \"source\": \"iana\"\n },\n \"audio/g726-24\": {\n \"source\": \"iana\"\n },\n \"audio/g726-32\": {\n \"source\": \"iana\"\n },\n \"audio/g726-40\": {\n \"source\": \"iana\"\n },\n \"audio/g728\": {\n \"source\": \"iana\"\n },\n \"audio/g729\": {\n \"source\": \"iana\"\n },\n \"audio/g7291\": {\n \"source\": \"iana\"\n },\n \"audio/g729d\": {\n \"source\": \"iana\"\n },\n \"audio/g729e\": {\n \"source\": \"iana\"\n },\n \"audio/gsm\": {\n \"source\": \"iana\"\n },\n \"audio/gsm-efr\": {\n \"source\": \"iana\"\n },\n \"audio/gsm-hr-08\": {\n \"source\": \"iana\"\n },\n \"audio/ilbc\": {\n \"source\": \"iana\"\n },\n \"audio/ip-mr_v2.5\": {\n \"source\": \"iana\"\n },\n \"audio/isac\": {\n \"source\": \"apache\"\n },\n \"audio/l16\": {\n \"source\": \"iana\"\n },\n \"audio/l20\": {\n \"source\": \"iana\"\n },\n \"audio/l24\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"audio/l8\": {\n \"source\": \"iana\"\n },\n \"audio/lpc\": {\n \"source\": \"iana\"\n },\n \"audio/midi\": {\n \"source\": \"apache\",\n \"extensions\": [\"mid\",\"midi\",\"kar\",\"rmi\"]\n },\n \"audio/mobile-xmf\": {\n \"source\": \"iana\"\n },\n \"audio/mp4\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"mp4a\",\"m4a\"]\n },\n \"audio/mp4a-latm\": {\n \"source\": \"iana\"\n },\n \"audio/mpa\": {\n \"source\": \"iana\"\n },\n \"audio/mpa-robust\": {\n \"source\": \"iana\"\n },\n \"audio/mpeg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"mpga\",\"mp2\",\"mp2a\",\"mp3\",\"m2a\",\"m3a\"]\n },\n \"audio/mpeg4-generic\": {\n \"source\": \"iana\"\n },\n \"audio/musepack\": {\n \"source\": \"apache\"\n },\n \"audio/ogg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"oga\",\"ogg\",\"spx\"]\n },\n \"audio/opus\": {\n \"source\": \"iana\"\n },\n \"audio/parityfec\": {\n \"source\": \"iana\"\n },\n \"audio/pcma\": {\n \"source\": \"iana\"\n },\n \"audio/pcma-wb\": {\n \"source\": \"iana\"\n },\n \"audio/pcmu\": {\n \"source\": \"iana\"\n },\n \"audio/pcmu-wb\": {\n \"source\": \"iana\"\n },\n \"audio/prs.sid\": {\n \"source\": \"iana\"\n },\n \"audio/qcelp\": {\n \"source\": \"iana\"\n },\n \"audio/raptorfec\": {\n \"source\": \"iana\"\n },\n \"audio/red\": {\n \"source\": \"iana\"\n },\n \"audio/rtp-enc-aescm128\": {\n \"source\": \"iana\"\n },\n \"audio/rtp-midi\": {\n \"source\": \"iana\"\n },\n \"audio/rtploopback\": {\n \"source\": \"iana\"\n },\n \"audio/rtx\": {\n \"source\": \"iana\"\n },\n \"audio/s3m\": {\n \"source\": \"apache\",\n \"extensions\": [\"s3m\"]\n },\n \"audio/silk\": {\n \"source\": \"apache\",\n \"extensions\": [\"sil\"]\n },\n \"audio/smv\": {\n \"source\": \"iana\"\n },\n \"audio/smv-qcp\": {\n \"source\": \"iana\"\n },\n \"audio/smv0\": {\n \"source\": \"iana\"\n },\n \"audio/sp-midi\": {\n \"source\": \"iana\"\n },\n \"audio/speex\": {\n \"source\": \"iana\"\n },\n \"audio/t140c\": {\n \"source\": \"iana\"\n },\n \"audio/t38\": {\n \"source\": \"iana\"\n },\n \"audio/telephone-event\": {\n \"source\": \"iana\"\n },\n \"audio/tone\": {\n \"source\": \"iana\"\n },\n \"audio/uemclip\": {\n \"source\": \"iana\"\n },\n \"audio/ulpfec\": {\n \"source\": \"iana\"\n },\n \"audio/vdvi\": {\n \"source\": \"iana\"\n },\n \"audio/vmr-wb\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.3gpp.iufp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.4sb\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.audiokoz\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.celp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cisco.nse\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cmles.radio-events\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cns.anp1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.cns.inf1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dece.audio\": {\n \"source\": \"iana\",\n \"extensions\": [\"uva\",\"uvva\"]\n },\n \"audio/vnd.digital-winds\": {\n \"source\": \"iana\",\n \"extensions\": [\"eol\"]\n },\n \"audio/vnd.dlna.adts\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.heaac.1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.heaac.2\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.mlp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.mps\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2x\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pl2z\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dolby.pulse.1\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.dra\": {\n \"source\": \"iana\",\n \"extensions\": [\"dra\"]\n },\n \"audio/vnd.dts\": {\n \"source\": \"iana\",\n \"extensions\": [\"dts\"]\n },\n \"audio/vnd.dts.hd\": {\n \"source\": \"iana\",\n \"extensions\": [\"dtshd\"]\n },\n \"audio/vnd.dvb.file\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.everad.plj\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.hns.audio\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.lucent.voice\": {\n \"source\": \"iana\",\n \"extensions\": [\"lvp\"]\n },\n \"audio/vnd.ms-playready.media.pya\": {\n \"source\": \"iana\",\n \"extensions\": [\"pya\"]\n },\n \"audio/vnd.nokia.mobile-xmf\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.nortel.vbk\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.nuera.ecelp4800\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp4800\"]\n },\n \"audio/vnd.nuera.ecelp7470\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp7470\"]\n },\n \"audio/vnd.nuera.ecelp9600\": {\n \"source\": \"iana\",\n \"extensions\": [\"ecelp9600\"]\n },\n \"audio/vnd.octel.sbc\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.qcelp\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.rhetorex.32kadpcm\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.rip\": {\n \"source\": \"iana\",\n \"extensions\": [\"rip\"]\n },\n \"audio/vnd.rn-realaudio\": {\n \"compressible\": false\n },\n \"audio/vnd.sealedmedia.softseal.mpeg\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.vmx.cvsd\": {\n \"source\": \"iana\"\n },\n \"audio/vnd.wave\": {\n \"compressible\": false\n },\n \"audio/vorbis\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"audio/vorbis-config\": {\n \"source\": \"iana\"\n },\n \"audio/wav\": {\n \"compressible\": false,\n \"extensions\": [\"wav\"]\n },\n \"audio/wave\": {\n \"compressible\": false,\n \"extensions\": [\"wav\"]\n },\n \"audio/webm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"weba\"]\n },\n \"audio/x-aac\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"aac\"]\n },\n \"audio/x-aiff\": {\n \"source\": \"apache\",\n \"extensions\": [\"aif\",\"aiff\",\"aifc\"]\n },\n \"audio/x-caf\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"caf\"]\n },\n \"audio/x-flac\": {\n \"source\": \"apache\",\n \"extensions\": [\"flac\"]\n },\n \"audio/x-m4a\": {\n \"source\": \"nginx\",\n \"extensions\": [\"m4a\"]\n },\n \"audio/x-matroska\": {\n \"source\": \"apache\",\n \"extensions\": [\"mka\"]\n },\n \"audio/x-mpegurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"m3u\"]\n },\n \"audio/x-ms-wax\": {\n \"source\": \"apache\",\n \"extensions\": [\"wax\"]\n },\n \"audio/x-ms-wma\": {\n \"source\": \"apache\",\n \"extensions\": [\"wma\"]\n },\n \"audio/x-pn-realaudio\": {\n \"source\": \"apache\",\n \"extensions\": [\"ram\",\"ra\"]\n },\n \"audio/x-pn-realaudio-plugin\": {\n \"source\": \"apache\",\n \"extensions\": [\"rmp\"]\n },\n \"audio/x-realaudio\": {\n \"source\": \"nginx\",\n \"extensions\": [\"ra\"]\n },\n \"audio/x-tta\": {\n \"source\": \"apache\"\n },\n \"audio/x-wav\": {\n \"source\": \"apache\",\n \"extensions\": [\"wav\"]\n },\n \"audio/xm\": {\n \"source\": \"apache\",\n \"extensions\": [\"xm\"]\n },\n \"chemical/x-cdx\": {\n \"source\": \"apache\",\n \"extensions\": [\"cdx\"]\n },\n \"chemical/x-cif\": {\n \"source\": \"apache\",\n \"extensions\": [\"cif\"]\n },\n \"chemical/x-cmdf\": {\n \"source\": \"apache\",\n \"extensions\": [\"cmdf\"]\n },\n \"chemical/x-cml\": {\n \"source\": \"apache\",\n \"extensions\": [\"cml\"]\n },\n \"chemical/x-csml\": {\n \"source\": \"apache\",\n \"extensions\": [\"csml\"]\n },\n \"chemical/x-pdb\": {\n \"source\": \"apache\"\n },\n \"chemical/x-xyz\": {\n \"source\": \"apache\",\n \"extensions\": [\"xyz\"]\n },\n \"font/opentype\": {\n \"compressible\": true,\n \"extensions\": [\"otf\"]\n },\n \"image/bmp\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"bmp\"]\n },\n \"image/cgm\": {\n \"source\": \"iana\",\n \"extensions\": [\"cgm\"]\n },\n \"image/fits\": {\n \"source\": \"iana\"\n },\n \"image/g3fax\": {\n \"source\": \"iana\",\n \"extensions\": [\"g3\"]\n },\n \"image/gif\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"gif\"]\n },\n \"image/ief\": {\n \"source\": \"iana\",\n \"extensions\": [\"ief\"]\n },\n \"image/jp2\": {\n \"source\": \"iana\"\n },\n \"image/jpeg\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"jpeg\",\"jpg\",\"jpe\"]\n },\n \"image/jpm\": {\n \"source\": \"iana\"\n },\n \"image/jpx\": {\n \"source\": \"iana\"\n },\n \"image/ktx\": {\n \"source\": \"iana\",\n \"extensions\": [\"ktx\"]\n },\n \"image/naplps\": {\n \"source\": \"iana\"\n },\n \"image/pjpeg\": {\n \"compressible\": false\n },\n \"image/png\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"png\"]\n },\n \"image/prs.btif\": {\n \"source\": \"iana\",\n \"extensions\": [\"btif\"]\n },\n \"image/prs.pti\": {\n \"source\": \"iana\"\n },\n \"image/pwg-raster\": {\n \"source\": \"iana\"\n },\n \"image/sgi\": {\n \"source\": \"apache\",\n \"extensions\": [\"sgi\"]\n },\n \"image/svg+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"svg\",\"svgz\"]\n },\n \"image/t38\": {\n \"source\": \"iana\"\n },\n \"image/tiff\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"tiff\",\"tif\"]\n },\n \"image/tiff-fx\": {\n \"source\": \"iana\"\n },\n \"image/vnd.adobe.photoshop\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"psd\"]\n },\n \"image/vnd.airzip.accelerator.azv\": {\n \"source\": \"iana\"\n },\n \"image/vnd.cns.inf2\": {\n \"source\": \"iana\"\n },\n \"image/vnd.dece.graphic\": {\n \"source\": \"iana\",\n \"extensions\": [\"uvi\",\"uvvi\",\"uvg\",\"uvvg\"]\n },\n \"image/vnd.djvu\": {\n \"source\": \"iana\",\n \"extensions\": [\"djvu\",\"djv\"]\n },\n \"image/vnd.dvb.subtitle\": {\n \"source\": \"iana\",\n \"extensions\": [\"sub\"]\n },\n \"image/vnd.dwg\": {\n \"source\": \"iana\",\n \"extensions\": [\"dwg\"]\n },\n \"image/vnd.dxf\": {\n \"source\": \"iana\",\n \"extensions\": [\"dxf\"]\n },\n \"image/vnd.fastbidsheet\": {\n \"source\": \"iana\",\n \"extensions\": [\"fbs\"]\n },\n \"image/vnd.fpx\": {\n \"source\": \"iana\",\n \"extensions\": [\"fpx\"]\n },\n \"image/vnd.fst\": {\n \"source\": \"iana\",\n \"extensions\": [\"fst\"]\n },\n \"image/vnd.fujixerox.edmics-mmr\": {\n \"source\": \"iana\",\n \"extensions\": [\"mmr\"]\n },\n \"image/vnd.fujixerox.edmics-rlc\": {\n \"source\": \"iana\",\n \"extensions\": [\"rlc\"]\n },\n \"image/vnd.globalgraphics.pgb\": {\n \"source\": \"iana\"\n },\n \"image/vnd.microsoft.icon\": {\n \"source\": \"iana\"\n },\n \"image/vnd.mix\": {\n \"source\": \"iana\"\n },\n \"image/vnd.mozilla.apng\": {\n \"source\": \"iana\"\n },\n \"image/vnd.ms-modi\": {\n \"source\": \"iana\",\n \"extensions\": [\"mdi\"]\n },\n \"image/vnd.ms-photo\": {\n \"source\": \"apache\",\n \"extensions\": [\"wdp\"]\n },\n \"image/vnd.net-fpx\": {\n \"source\": \"iana\",\n \"extensions\": [\"npx\"]\n },\n \"image/vnd.radiance\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealed.png\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealedmedia.softseal.gif\": {\n \"source\": \"iana\"\n },\n \"image/vnd.sealedmedia.softseal.jpg\": {\n \"source\": \"iana\"\n },\n \"image/vnd.svf\": {\n \"source\": \"iana\"\n },\n \"image/vnd.tencent.tap\": {\n \"source\": \"iana\"\n },\n \"image/vnd.valve.source.texture\": {\n \"source\": \"iana\"\n },\n \"image/vnd.wap.wbmp\": {\n \"source\": \"iana\",\n \"extensions\": [\"wbmp\"]\n },\n \"image/vnd.xiff\": {\n \"source\": \"iana\",\n \"extensions\": [\"xif\"]\n },\n \"image/vnd.zbrush.pcx\": {\n \"source\": \"iana\"\n },\n \"image/webp\": {\n \"source\": \"apache\",\n \"extensions\": [\"webp\"]\n },\n \"image/x-3ds\": {\n \"source\": \"apache\",\n \"extensions\": [\"3ds\"]\n },\n \"image/x-cmu-raster\": {\n \"source\": \"apache\",\n \"extensions\": [\"ras\"]\n },\n \"image/x-cmx\": {\n \"source\": \"apache\",\n \"extensions\": [\"cmx\"]\n },\n \"image/x-freehand\": {\n \"source\": \"apache\",\n \"extensions\": [\"fh\",\"fhc\",\"fh4\",\"fh5\",\"fh7\"]\n },\n \"image/x-icon\": {\n \"source\": \"apache\",\n \"compressible\": true,\n \"extensions\": [\"ico\"]\n },\n \"image/x-jng\": {\n \"source\": \"nginx\",\n \"extensions\": [\"jng\"]\n },\n \"image/x-mrsid-image\": {\n \"source\": \"apache\",\n \"extensions\": [\"sid\"]\n },\n \"image/x-ms-bmp\": {\n \"source\": \"nginx\",\n \"compressible\": true,\n \"extensions\": [\"bmp\"]\n },\n \"image/x-pcx\": {\n \"source\": \"apache\",\n \"extensions\": [\"pcx\"]\n },\n \"image/x-pict\": {\n \"source\": \"apache\",\n \"extensions\": [\"pic\",\"pct\"]\n },\n \"image/x-portable-anymap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pnm\"]\n },\n \"image/x-portable-bitmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pbm\"]\n },\n \"image/x-portable-graymap\": {\n \"source\": \"apache\",\n \"extensions\": [\"pgm\"]\n },\n \"image/x-portable-pixmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"ppm\"]\n },\n \"image/x-rgb\": {\n \"source\": \"apache\",\n \"extensions\": [\"rgb\"]\n },\n \"image/x-tga\": {\n \"source\": \"apache\",\n \"extensions\": [\"tga\"]\n },\n \"image/x-xbitmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xbm\"]\n },\n \"image/x-xcf\": {\n \"compressible\": false\n },\n \"image/x-xpixmap\": {\n \"source\": \"apache\",\n \"extensions\": [\"xpm\"]\n },\n \"image/x-xwindowdump\": {\n \"source\": \"apache\",\n \"extensions\": [\"xwd\"]\n },\n \"message/cpim\": {\n \"source\": \"iana\"\n },\n \"message/delivery-status\": {\n \"source\": \"iana\"\n },\n \"message/disposition-notification\": {\n \"source\": \"iana\"\n },\n \"message/external-body\": {\n \"source\": \"iana\"\n },\n \"message/feedback-report\": {\n \"source\": \"iana\"\n },\n \"message/global\": {\n \"source\": \"iana\"\n },\n \"message/global-delivery-status\": {\n \"source\": \"iana\"\n },\n \"message/global-disposition-notification\": {\n \"source\": \"iana\"\n },\n \"message/global-headers\": {\n \"source\": \"iana\"\n },\n \"message/http\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"message/imdn+xml\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"message/news\": {\n \"source\": \"iana\"\n },\n \"message/partial\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"message/rfc822\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"eml\",\"mime\"]\n },\n \"message/s-http\": {\n \"source\": \"iana\"\n },\n \"message/sip\": {\n \"source\": \"iana\"\n },\n \"message/sipfrag\": {\n \"source\": \"iana\"\n },\n \"message/tracking-status\": {\n \"source\": \"iana\"\n },\n \"message/vnd.si.simp\": {\n \"source\": \"iana\"\n },\n \"message/vnd.wfa.wsc\": {\n \"source\": \"iana\"\n },\n \"model/iges\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"igs\",\"iges\"]\n },\n \"model/mesh\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"msh\",\"mesh\",\"silo\"]\n },\n \"model/vnd.collada+xml\": {\n \"source\": \"iana\",\n \"extensions\": [\"dae\"]\n },\n \"model/vnd.dwf\": {\n \"source\": \"iana\",\n \"extensions\": [\"dwf\"]\n },\n \"model/vnd.flatland.3dml\": {\n \"source\": \"iana\"\n },\n \"model/vnd.gdl\": {\n \"source\": \"iana\",\n \"extensions\": [\"gdl\"]\n },\n \"model/vnd.gs-gdl\": {\n \"source\": \"apache\"\n },\n \"model/vnd.gs.gdl\": {\n \"source\": \"iana\"\n },\n \"model/vnd.gtw\": {\n \"source\": \"iana\",\n \"extensions\": [\"gtw\"]\n },\n \"model/vnd.moml+xml\": {\n \"source\": \"iana\"\n },\n \"model/vnd.mts\": {\n \"source\": \"iana\",\n \"extensions\": [\"mts\"]\n },\n \"model/vnd.opengex\": {\n \"source\": \"iana\"\n },\n \"model/vnd.parasolid.transmit.binary\": {\n \"source\": \"iana\"\n },\n \"model/vnd.parasolid.transmit.text\": {\n \"source\": \"iana\"\n },\n \"model/vnd.valve.source.compiled-map\": {\n \"source\": \"iana\"\n },\n \"model/vnd.vtu\": {\n \"source\": \"iana\",\n \"extensions\": [\"vtu\"]\n },\n \"model/vrml\": {\n \"source\": \"iana\",\n \"compressible\": false,\n \"extensions\": [\"wrl\",\"vrml\"]\n },\n \"model/x3d+binary\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"x3db\",\"x3dbz\"]\n },\n \"model/x3d+fastinfoset\": {\n \"source\": \"iana\"\n },\n \"model/x3d+vrml\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"x3dv\",\"x3dvz\"]\n },\n \"model/x3d+xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"x3d\",\"x3dz\"]\n },\n \"model/x3d-vrml\": {\n \"source\": \"iana\"\n },\n \"multipart/alternative\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/appledouble\": {\n \"source\": \"iana\"\n },\n \"multipart/byteranges\": {\n \"source\": \"iana\"\n },\n \"multipart/digest\": {\n \"source\": \"iana\"\n },\n \"multipart/encrypted\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/form-data\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/header-set\": {\n \"source\": \"iana\"\n },\n \"multipart/mixed\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/parallel\": {\n \"source\": \"iana\"\n },\n \"multipart/related\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/report\": {\n \"source\": \"iana\"\n },\n \"multipart/signed\": {\n \"source\": \"iana\",\n \"compressible\": false\n },\n \"multipart/voice-message\": {\n \"source\": \"iana\"\n },\n \"multipart/x-mixed-replace\": {\n \"source\": \"iana\"\n },\n \"text/1d-interleaved-parityfec\": {\n \"source\": \"iana\"\n },\n \"text/cache-manifest\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"appcache\",\"manifest\"]\n },\n \"text/calendar\": {\n \"source\": \"iana\",\n \"extensions\": [\"ics\",\"ifb\"]\n },\n \"text/calender\": {\n \"compressible\": true\n },\n \"text/cmd\": {\n \"compressible\": true\n },\n \"text/coffeescript\": {\n \"extensions\": [\"coffee\",\"litcoffee\"]\n },\n \"text/css\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"css\"]\n },\n \"text/csv\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"csv\"]\n },\n \"text/csv-schema\": {\n \"source\": \"iana\"\n },\n \"text/directory\": {\n \"source\": \"iana\"\n },\n \"text/dns\": {\n \"source\": \"iana\"\n },\n \"text/ecmascript\": {\n \"source\": \"iana\"\n },\n \"text/encaprtp\": {\n \"source\": \"iana\"\n },\n \"text/enriched\": {\n \"source\": \"iana\"\n },\n \"text/fwdred\": {\n \"source\": \"iana\"\n },\n \"text/grammar-ref-list\": {\n \"source\": \"iana\"\n },\n \"text/hjson\": {\n \"extensions\": [\"hjson\"]\n },\n \"text/html\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"html\",\"htm\",\"shtml\"]\n },\n \"text/jade\": {\n \"extensions\": [\"jade\"]\n },\n \"text/javascript\": {\n \"source\": \"iana\",\n \"compressible\": true\n },\n \"text/jcr-cnd\": {\n \"source\": \"iana\"\n },\n \"text/jsx\": {\n \"compressible\": true,\n \"extensions\": [\"jsx\"]\n },\n \"text/less\": {\n \"extensions\": [\"less\"]\n },\n \"text/markdown\": {\n \"source\": \"iana\"\n },\n \"text/mathml\": {\n \"source\": \"nginx\",\n \"extensions\": [\"mml\"]\n },\n \"text/mizar\": {\n \"source\": \"iana\"\n },\n \"text/n3\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"n3\"]\n },\n \"text/parameters\": {\n \"source\": \"iana\"\n },\n \"text/parityfec\": {\n \"source\": \"iana\"\n },\n \"text/plain\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\",\"in\",\"ini\"]\n },\n \"text/provenance-notation\": {\n \"source\": \"iana\"\n },\n \"text/prs.fallenstein.rst\": {\n \"source\": \"iana\"\n },\n \"text/prs.lines.tag\": {\n \"source\": \"iana\",\n \"extensions\": [\"dsc\"]\n },\n \"text/raptorfec\": {\n \"source\": \"iana\"\n },\n \"text/red\": {\n \"source\": \"iana\"\n },\n \"text/rfc822-headers\": {\n \"source\": \"iana\"\n },\n \"text/richtext\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtx\"]\n },\n \"text/rtf\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"rtf\"]\n },\n \"text/rtp-enc-aescm128\": {\n \"source\": \"iana\"\n },\n \"text/rtploopback\": {\n \"source\": \"iana\"\n },\n \"text/rtx\": {\n \"source\": \"iana\"\n },\n \"text/sgml\": {\n \"source\": \"iana\",\n \"extensions\": [\"sgml\",\"sgm\"]\n },\n \"text/stylus\": {\n \"extensions\": [\"stylus\",\"styl\"]\n },\n \"text/t140\": {\n \"source\": \"iana\"\n },\n \"text/tab-separated-values\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"tsv\"]\n },\n \"text/troff\": {\n \"source\": \"iana\",\n \"extensions\": [\"t\",\"tr\",\"roff\",\"man\",\"me\",\"ms\"]\n },\n \"text/turtle\": {\n \"source\": \"iana\",\n \"extensions\": [\"ttl\"]\n },\n \"text/ulpfec\": {\n \"source\": \"iana\"\n },\n \"text/uri-list\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"uri\",\"uris\",\"urls\"]\n },\n \"text/vcard\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"vcard\"]\n },\n \"text/vnd.a\": {\n \"source\": \"iana\"\n },\n \"text/vnd.abc\": {\n \"source\": \"iana\"\n },\n \"text/vnd.curl\": {\n \"source\": \"iana\",\n \"extensions\": [\"curl\"]\n },\n \"text/vnd.curl.dcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"dcurl\"]\n },\n \"text/vnd.curl.mcurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"mcurl\"]\n },\n \"text/vnd.curl.scurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"scurl\"]\n },\n \"text/vnd.debian.copyright\": {\n \"source\": \"iana\"\n },\n \"text/vnd.dmclientscript\": {\n \"source\": \"iana\"\n },\n \"text/vnd.dvb.subtitle\": {\n \"source\": \"iana\",\n \"extensions\": [\"sub\"]\n },\n \"text/vnd.esmertec.theme-descriptor\": {\n \"source\": \"iana\"\n },\n \"text/vnd.fly\": {\n \"source\": \"iana\",\n \"extensions\": [\"fly\"]\n },\n \"text/vnd.fmi.flexstor\": {\n \"source\": \"iana\",\n \"extensions\": [\"flx\"]\n },\n \"text/vnd.graphviz\": {\n \"source\": \"iana\",\n \"extensions\": [\"gv\"]\n },\n \"text/vnd.in3d.3dml\": {\n \"source\": \"iana\",\n \"extensions\": [\"3dml\"]\n },\n \"text/vnd.in3d.spot\": {\n \"source\": \"iana\",\n \"extensions\": [\"spot\"]\n },\n \"text/vnd.iptc.newsml\": {\n \"source\": \"iana\"\n },\n \"text/vnd.iptc.nitf\": {\n \"source\": \"iana\"\n },\n \"text/vnd.latex-z\": {\n \"source\": \"iana\"\n },\n \"text/vnd.motorola.reflex\": {\n \"source\": \"iana\"\n },\n \"text/vnd.ms-mediapackage\": {\n \"source\": \"iana\"\n },\n \"text/vnd.net2phone.commcenter.command\": {\n \"source\": \"iana\"\n },\n \"text/vnd.radisys.msml-basic-layout\": {\n \"source\": \"iana\"\n },\n \"text/vnd.si.uricatalogue\": {\n \"source\": \"iana\"\n },\n \"text/vnd.sun.j2me.app-descriptor\": {\n \"source\": \"iana\",\n \"extensions\": [\"jad\"]\n },\n \"text/vnd.trolltech.linguist\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.si\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.sl\": {\n \"source\": \"iana\"\n },\n \"text/vnd.wap.wml\": {\n \"source\": \"iana\",\n \"extensions\": [\"wml\"]\n },\n \"text/vnd.wap.wmlscript\": {\n \"source\": \"iana\",\n \"extensions\": [\"wmls\"]\n },\n \"text/vtt\": {\n \"charset\": \"UTF-8\",\n \"compressible\": true,\n \"extensions\": [\"vtt\"]\n },\n \"text/x-asm\": {\n \"source\": \"apache\",\n \"extensions\": [\"s\",\"asm\"]\n },\n \"text/x-c\": {\n \"source\": \"apache\",\n \"extensions\": [\"c\",\"cc\",\"cxx\",\"cpp\",\"h\",\"hh\",\"dic\"]\n },\n \"text/x-component\": {\n \"source\": \"nginx\",\n \"extensions\": [\"htc\"]\n },\n \"text/x-fortran\": {\n \"source\": \"apache\",\n \"extensions\": [\"f\",\"for\",\"f77\",\"f90\"]\n },\n \"text/x-gwt-rpc\": {\n \"compressible\": true\n },\n \"text/x-handlebars-template\": {\n \"extensions\": [\"hbs\"]\n },\n \"text/x-java-source\": {\n \"source\": \"apache\",\n \"extensions\": [\"java\"]\n },\n \"text/x-jquery-tmpl\": {\n \"compressible\": true\n },\n \"text/x-lua\": {\n \"extensions\": [\"lua\"]\n },\n \"text/x-markdown\": {\n \"compressible\": true,\n \"extensions\": [\"markdown\",\"md\",\"mkd\"]\n },\n \"text/x-nfo\": {\n \"source\": \"apache\",\n \"extensions\": [\"nfo\"]\n },\n \"text/x-opml\": {\n \"source\": \"apache\",\n \"extensions\": [\"opml\"]\n },\n \"text/x-pascal\": {\n \"source\": \"apache\",\n \"extensions\": [\"p\",\"pas\"]\n },\n \"text/x-processing\": {\n \"compressible\": true,\n \"extensions\": [\"pde\"]\n },\n \"text/x-sass\": {\n \"extensions\": [\"sass\"]\n },\n \"text/x-scss\": {\n \"extensions\": [\"scss\"]\n },\n \"text/x-setext\": {\n \"source\": \"apache\",\n \"extensions\": [\"etx\"]\n },\n \"text/x-sfv\": {\n \"source\": \"apache\",\n \"extensions\": [\"sfv\"]\n },\n \"text/x-suse-ymp\": {\n \"compressible\": true,\n \"extensions\": [\"ymp\"]\n },\n \"text/x-uuencode\": {\n \"source\": \"apache\",\n \"extensions\": [\"uu\"]\n },\n \"text/x-vcalendar\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcs\"]\n },\n \"text/x-vcard\": {\n \"source\": \"apache\",\n \"extensions\": [\"vcf\"]\n },\n \"text/xml\": {\n \"source\": \"iana\",\n \"compressible\": true,\n \"extensions\": [\"xml\"]\n },\n \"text/xml-external-parsed-entity\": {\n \"source\": \"iana\"\n },\n \"text/yaml\": {\n \"extensions\": [\"yaml\",\"yml\"]\n },\n \"video/1d-interleaved-parityfec\": {\n \"source\": \"apache\"\n },\n \"video/3gpp\": {\n \"source\": \"apache\",\n \"extensions\": [\"3gp\",\"3gpp\"]\n },\n \"video/3gpp-tt\": {\n \"source\": \"apache\"\n },\n \"video/3gpp2\": {\n \"source\": \"apache\",\n \"extensions\": [\"3g2\"]\n },\n \"video/bmpeg\": {\n \"source\": \"apache\"\n },\n \"video/bt656\": {\n \"source\": \"apache\"\n },\n \"video/celb\": {\n \"source\": \"apache\"\n },\n \"video/dv\": {\n \"source\": \"apache\"\n },\n \"video/h261\": {\n \"source\": \"apache\",\n \"extensions\": [\"h261\"]\n },\n \"video/h263\": {\n \"source\": \"apache\",\n \"extensions\": [\"h263\"]\n },\n \"video/h263-1998\": {\n \"source\": \"apache\"\n },\n \"video/h263-2000\": {\n \"source\": \"apache\"\n },\n \"video/h264\": {\n \"source\": \"apache\",\n \"extensions\": [\"h264\"]\n },\n \"video/h264-rcdo\": {\n \"source\": \"apache\"\n },\n \"video/h264-svc\": {\n \"source\": \"apache\"\n },\n \"video/jpeg\": {\n \"source\": \"apache\",\n \"extensions\": [\"jpgv\"]\n },\n \"video/jpeg2000\": {\n \"source\": \"apache\"\n },\n \"video/jpm\": {\n \"source\": \"apache\",\n \"extensions\": [\"jpm\",\"jpgm\"]\n },\n \"video/mj2\": {\n \"source\": \"apache\",\n \"extensions\": [\"mj2\",\"mjp2\"]\n },\n \"video/mp1s\": {\n \"source\": \"apache\"\n },\n \"video/mp2p\": {\n \"source\": \"apache\"\n },\n \"video/mp2t\": {\n \"source\": \"apache\",\n \"extensions\": [\"ts\"]\n },\n \"video/mp4\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"mp4\",\"mp4v\",\"mpg4\"]\n },\n \"video/mp4v-es\": {\n \"source\": \"apache\"\n },\n \"video/mpeg\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"mpeg\",\"mpg\",\"mpe\",\"m1v\",\"m2v\"]\n },\n \"video/mpeg4-generic\": {\n \"source\": \"apache\"\n },\n \"video/mpv\": {\n \"source\": \"apache\"\n },\n \"video/nv\": {\n \"source\": \"apache\"\n },\n \"video/ogg\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"ogv\"]\n },\n \"video/parityfec\": {\n \"source\": \"apache\"\n },\n \"video/pointer\": {\n \"source\": \"apache\"\n },\n \"video/quicktime\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"qt\",\"mov\"]\n },\n \"video/raw\": {\n \"source\": \"apache\"\n },\n \"video/rtp-enc-aescm128\": {\n \"source\": \"apache\"\n },\n \"video/rtx\": {\n \"source\": \"apache\"\n },\n \"video/smpte292m\": {\n \"source\": \"apache\"\n },\n \"video/ulpfec\": {\n \"source\": \"apache\"\n },\n \"video/vc1\": {\n \"source\": \"apache\"\n },\n \"video/vnd.cctv\": {\n \"source\": \"apache\"\n },\n \"video/vnd.dece.hd\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvh\",\"uvvh\"]\n },\n \"video/vnd.dece.mobile\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvm\",\"uvvm\"]\n },\n \"video/vnd.dece.mp4\": {\n \"source\": \"apache\"\n },\n \"video/vnd.dece.pd\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvp\",\"uvvp\"]\n },\n \"video/vnd.dece.sd\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvs\",\"uvvs\"]\n },\n \"video/vnd.dece.video\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvv\",\"uvvv\"]\n },\n \"video/vnd.directv.mpeg\": {\n \"source\": \"apache\"\n },\n \"video/vnd.directv.mpeg-tts\": {\n \"source\": \"apache\"\n },\n \"video/vnd.dlna.mpeg-tts\": {\n \"source\": \"apache\"\n },\n \"video/vnd.dvb.file\": {\n \"source\": \"apache\",\n \"extensions\": [\"dvb\"]\n },\n \"video/vnd.fvt\": {\n \"source\": \"apache\",\n \"extensions\": [\"fvt\"]\n },\n \"video/vnd.hns.video\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.1dparityfec-1010\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.1dparityfec-2005\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.2dparityfec-1010\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.2dparityfec-2005\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.ttsavc\": {\n \"source\": \"apache\"\n },\n \"video/vnd.iptvforum.ttsmpeg2\": {\n \"source\": \"apache\"\n },\n \"video/vnd.motorola.video\": {\n \"source\": \"apache\"\n },\n \"video/vnd.motorola.videop\": {\n \"source\": \"apache\"\n },\n \"video/vnd.mpegurl\": {\n \"source\": \"apache\",\n \"extensions\": [\"mxu\",\"m4u\"]\n },\n \"video/vnd.ms-playready.media.pyv\": {\n \"source\": \"apache\",\n \"extensions\": [\"pyv\"]\n },\n \"video/vnd.nokia.interleaved-multimedia\": {\n \"source\": \"apache\"\n },\n \"video/vnd.nokia.videovoip\": {\n \"source\": \"apache\"\n },\n \"video/vnd.objectvideo\": {\n \"source\": \"apache\"\n },\n \"video/vnd.sealed.mpeg1\": {\n \"source\": \"apache\"\n },\n \"video/vnd.sealed.mpeg4\": {\n \"source\": \"apache\"\n },\n \"video/vnd.sealed.swf\": {\n \"source\": \"apache\"\n },\n \"video/vnd.sealedmedia.softseal.mov\": {\n \"source\": \"apache\"\n },\n \"video/vnd.uvvu.mp4\": {\n \"source\": \"apache\",\n \"extensions\": [\"uvu\",\"uvvu\"]\n },\n \"video/vnd.vivo\": {\n \"source\": \"apache\",\n \"extensions\": [\"viv\"]\n },\n \"video/webm\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"webm\"]\n },\n \"video/x-f4v\": {\n \"source\": \"apache\",\n \"extensions\": [\"f4v\"]\n },\n \"video/x-fli\": {\n \"source\": \"apache\",\n \"extensions\": [\"fli\"]\n },\n \"video/x-flv\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"flv\"]\n },\n \"video/x-m4v\": {\n \"source\": \"apache\",\n \"extensions\": [\"m4v\"]\n },\n \"video/x-matroska\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"mkv\",\"mk3d\",\"mks\"]\n },\n \"video/x-mng\": {\n \"source\": \"apache\",\n \"extensions\": [\"mng\"]\n },\n \"video/x-ms-asf\": {\n \"source\": \"apache\",\n \"extensions\": [\"asf\",\"asx\"]\n },\n \"video/x-ms-vob\": {\n \"source\": \"apache\",\n \"extensions\": [\"vob\"]\n },\n \"video/x-ms-wm\": {\n \"source\": \"apache\",\n \"extensions\": [\"wm\"]\n },\n \"video/x-ms-wmv\": {\n \"source\": \"apache\",\n \"compressible\": false,\n \"extensions\": [\"wmv\"]\n },\n \"video/x-ms-wmx\": {\n \"source\": \"apache\",\n \"extensions\": [\"wmx\"]\n },\n \"video/x-ms-wvx\": {\n \"source\": \"apache\",\n \"extensions\": [\"wvx\"]\n },\n \"video/x-msvideo\": {\n \"source\": \"apache\",\n \"extensions\": [\"avi\"]\n },\n \"video/x-sgi-movie\": {\n \"source\": \"apache\",\n \"extensions\": [\"movie\"]\n },\n \"video/x-smv\": {\n \"source\": \"apache\",\n \"extensions\": [\"smv\"]\n },\n \"x-conference/x-cooltalk\": {\n \"source\": \"apache\",\n \"extensions\": [\"ice\"]\n },\n \"x-shader/x-fragment\": {\n \"compressible\": true\n },\n \"x-shader/x-vertex\": {\n \"compressible\": true\n }\n}\n},{}],154:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"ants\",\n \"bats\",\n \"bears\",\n \"bees\",\n \"birds\",\n \"buffalo\",\n \"cats\",\n \"chickens\",\n \"cattle\",\n \"dogs\",\n \"dolphins\",\n \"ducks\",\n \"elephants\",\n \"fishes\",\n \"foxes\",\n \"frogs\",\n \"geese\",\n \"goats\",\n \"horses\",\n \"kangaroos\",\n \"lions\",\n \"monkeys\",\n \"owls\",\n \"oxen\",\n \"penguins\",\n \"people\",\n \"pigs\",\n \"rabbits\",\n \"sheep\",\n \"tigers\",\n \"whales\",\n \"wolves\",\n \"zebras\",\n \"banshees\",\n \"crows\",\n \"black cats\",\n \"chimeras\",\n \"ghosts\",\n \"conspirators\",\n \"dragons\",\n \"dwarves\",\n \"elves\",\n \"enchanters\",\n \"exorcists\",\n \"sons\",\n \"foes\",\n \"giants\",\n \"gnomes\",\n \"goblins\",\n \"gooses\",\n \"griffins\",\n \"lycanthropes\",\n \"nemesis\",\n \"ogres\",\n \"oracles\",\n \"prophets\",\n \"sorcerors\",\n \"spiders\",\n \"spirits\",\n \"vampires\",\n \"warlocks\",\n \"vixens\",\n \"werewolves\",\n \"witches\",\n \"worshipers\",\n \"zombies\",\n \"druids\"\n];\n\n},{}],155:[function(require,module,exports){\nvar team = {};\nmodule['exports'] = team;\nteam.creature = require(\"./creature\");\nteam.name = require(\"./name\");\n\n},{\"./creature\":154,\"./name\":156}],156:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"#{Address.state} #{creature}\"\n];\n\n},{}],157:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Adventure Road Bicycle\",\n \"BMX Bicycle\",\n \"City Bicycle\",\n \"Cruiser Bicycle\",\n \"Cyclocross Bicycle\",\n \"Dual-Sport Bicycle\",\n \"Fitness Bicycle\",\n \"Flat-Foot Comfort Bicycle\",\n \"Folding Bicycle\",\n \"Hybrid Bicycle\",\n \"Mountain Bicycle\",\n \"Recumbent Bicycle\",\n \"Road Bicycle\",\n \"Tandem Bicycle\",\n \"Touring Bicycle\",\n \"Track/Fixed-Gear Bicycle\",\n \"Triathlon/Time Trial Bicycle\",\n \"Tricycle\"\n];\n},{}],158:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Diesel\",\n \"Electric\",\n \"Gasoline\",\n \"Hybrid\"\n];\n\n},{}],159:[function(require,module,exports){\nvar vehicle = {};\nmodule[\"exports\"] = vehicle;\nvehicle.manufacturer = require(\"./manufacturer\");\nvehicle.model = require(\"./model\");\nvehicle.type = require(\"./vehicle_type\");\nvehicle.fuel = require(\"./fuel\");\nvehicle.bicycle = require(\"./bicycle\");\n},{\"./bicycle\":157,\"./fuel\":158,\"./manufacturer\":160,\"./model\":161,\"./vehicle_type\":162}],160:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Aston Martin\",\n \"Audi\",\n \"Bentley\",\n \"BMW\",\n \"Bugatti\",\n \"Cadillac\",\n \"Chevrolet\",\n \"Chrysler\",\n \"Dodge\",\n \"Ferrari\",\n \"Fiat\",\n \"Ford\",\n \"Honda\",\n \"Hyundai\",\n \"Jaguar\",\n \"Jeep\",\n \"Kia\",\n \"Lamborghini\",\n \"Land Rover\",\n \"Maserati\",\n \"Mazda\",\n \"Mercedes Benz\",\n \"Mini\",\n \"Nissan\",\n \"Polestar\",\n \"Porsche\",\n \"Rolls Royce\",\n \"Smart\",\n \"Tesla\",\n \"Toyota\",\n \"Volkswagen\",\n \"Volvo\"\n];\n\n},{}],161:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Fiesta\",\n \"Focus\",\n \"Taurus\",\n \"Mustang\",\n \"Explorer\",\n \"Expedition\",\n \"F-150\",\n \"Model T\",\n \"Ranchero\",\n \"Volt\",\n \"Cruze\",\n \"Malibu\",\n \"Impala\",\n \"Camaro\",\n \"Corvette\",\n \"Colorado\",\n \"Silverado\",\n \"El Camino\",\n \"CTS\",\n \"XTS\",\n \"ATS\",\n \"Escalade\",\n \"Alpine\",\n \"Charger\",\n \"LeBaron\",\n \"PT Cruiser\",\n \"Challenger\",\n \"Durango\",\n \"Grand Caravan\",\n \"Wrangler\",\n \"Grand Cherokee\",\n \"Roadster\",\n \"Model S\",\n \"Model 3\",\n \"Camry\",\n \"Prius\",\n \"Land Cruiser\",\n \"Accord\",\n \"Civic\",\n \"Element\",\n \"Sentra\",\n \"Altima\",\n \"A8\",\n \"A4\",\n \"Beetle\",\n \"Jetta\",\n \"Golf\",\n \"911\",\n \"Spyder\",\n \"Countach\",\n \"Mercielago\",\n \"Aventador\",\n \"1\",\n \"2\",\n \"Fortwo\",\n \"V90\",\n \"XC90\",\n \"CX-9\",\n];\n\n},{}],162:[function(require,module,exports){\nmodule[\"exports\"] = [\n \"Cargo Van\",\n \"Convertible\",\n \"Coupe\",\n \"Crew Cab Pickup\",\n \"Extended Cab Pickup\",\n \"Hatchback\",\n \"Minivan\",\n \"Passenger Van\",\n \"SUV\",\n \"Sedan\",\n \"Wagon\"\n];\n\n},{}],163:[function(require,module,exports){\n\n/**\n *\n * @namespace faker.lorem\n */\nvar Lorem = function (faker) {\n var self = this;\n var Helpers = faker.helpers;\n\n /**\n * generates a word of a specified length\n *\n * @method faker.lorem.word\n * @param {number} length length of the word that should be returned. Defaults to a random length\n */\n self.word = function (length) {\n var hasRightLength = function(word) { return word.length === length; };\n var properLengthWords;\n if(typeof length === 'undefined') {\n properLengthWords = faker.definitions.lorem.words;\n } else {\n properLengthWords = faker.definitions.lorem.words.filter(hasRightLength);\n }\n return faker.random.arrayElement(properLengthWords);\n };\n\n /**\n * generates a space separated list of words\n *\n * @method faker.lorem.words\n * @param {number} num number of words, defaults to 3\n */\n self.words = function (num) {\n if (typeof num == 'undefined') { num = 3; }\n var words = [];\n for (var i = 0; i < num; i++) {\n words.push(faker.lorem.word());\n }\n return words.join(' ');\n };\n\n /**\n * sentence\n *\n * @method faker.lorem.sentence\n * @param {number} wordCount defaults to a random number between 3 and 10\n * @param {number} range\n */\n self.sentence = function (wordCount, range) {\n if (typeof wordCount == 'undefined') { wordCount = faker.datatype.number({ min: 3, max: 10 }); }\n // if (typeof range == 'undefined') { range = 7; }\n\n // strange issue with the node_min_test failing for captialize, please fix and add faker.lorem.back\n //return faker.lorem.words(wordCount + Helpers.randomNumber(range)).join(' ').capitalize();\n\n var sentence = faker.lorem.words(wordCount);\n return sentence.charAt(0).toUpperCase() + sentence.slice(1) + '.';\n };\n\n /**\n * slug\n *\n * @method faker.lorem.slug\n * @param {number} wordCount number of words, defaults to 3\n */\n self.slug = function (wordCount) {\n var words = faker.lorem.words(wordCount);\n return Helpers.slugify(words);\n };\n\n /**\n * sentences\n *\n * @method faker.lorem.sentences\n * @param {number} sentenceCount defautls to a random number between 2 and 6\n * @param {string} separator defaults to `' '`\n */\n self.sentences = function (sentenceCount, separator) {\n if (typeof sentenceCount === 'undefined') { sentenceCount = faker.datatype.number({ min: 2, max: 6 });}\n if (typeof separator == 'undefined') { separator = \" \"; }\n var sentences = [];\n for (sentenceCount; sentenceCount > 0; sentenceCount--) {\n sentences.push(faker.lorem.sentence());\n }\n return sentences.join(separator);\n };\n\n /**\n * paragraph\n *\n * @method faker.lorem.paragraph\n * @param {number} sentenceCount defaults to 3\n */\n self.paragraph = function (sentenceCount) {\n if (typeof sentenceCount == 'undefined') { sentenceCount = 3; }\n return faker.lorem.sentences(sentenceCount + faker.datatype.number(3));\n };\n\n /**\n * paragraphs\n *\n * @method faker.lorem.paragraphs\n * @param {number} paragraphCount defaults to 3\n * @param {string} separator defaults to `'\\n \\r'`\n */\n self.paragraphs = function (paragraphCount, separator) {\n if (typeof separator === \"undefined\") {\n separator = \"\\n \\r\";\n }\n if (typeof paragraphCount == 'undefined') { paragraphCount = 3; }\n var paragraphs = [];\n for (paragraphCount; paragraphCount > 0; paragraphCount--) {\n paragraphs.push(faker.lorem.paragraph());\n }\n return paragraphs.join(separator);\n }\n\n /**\n * returns random text based on a random lorem method\n *\n * @method faker.lorem.text\n * @param {number} times\n */\n self.text = function loremText (times) {\n var loremMethods = ['lorem.word', 'lorem.words', 'lorem.sentence', 'lorem.sentences', 'lorem.paragraph', 'lorem.paragraphs', 'lorem.lines'];\n var randomLoremMethod = faker.random.arrayElement(loremMethods);\n return faker.fake('{{' + randomLoremMethod + '}}');\n };\n\n /**\n * returns lines of lorem separated by `'\\n'`\n *\n * @method faker.lorem.lines\n * @param {number} lineCount defaults to a random number between 1 and 5\n */\n self.lines = function lines (lineCount) {\n if (typeof lineCount === 'undefined') { lineCount = faker.datatype.number({ min: 1, max: 5 });}\n return faker.lorem.sentences(lineCount, '\\n')\n };\n\n return self;\n};\n\n\nmodule[\"exports\"] = Lorem;\n\n},{}],164:[function(require,module,exports){\nvar Gen = require('../vendor/mersenne').MersenneTwister19937;\n\nfunction Mersenne() {\n var gen = new Gen();\n gen.init_genrand((new Date).getTime() % 1000000000);\n\n this.rand = function(max, min) {\n if (max === undefined)\n {\n min = 0;\n max = 32768;\n }\n return Math.floor(gen.genrand_real2() * (max - min) + min);\n }\n this.seed = function(S) {\n if (typeof(S) != 'number')\n {\n throw new Error(\"seed(S) must take numeric argument; is \" + typeof(S));\n }\n gen.init_genrand(S);\n }\n this.seed_array = function(A) {\n if (typeof(A) != 'object')\n {\n throw new Error(\"seed_array(A) must take array of numbers; is \" + typeof(A));\n }\n gen.init_by_array(A, A.length);\n }\n}\n\nmodule.exports = Mersenne;\n\n},{\"../vendor/mersenne\":174}],165:[function(require,module,exports){\n/**\n *\n * @namespace faker.music\n */\nvar Music = function (faker) {\n var self = this;\n /**\n * genre\n *\n * @method faker.music.genre\n */\n self.genre = function () {\n return faker.random.arrayElement(faker.definitions.music.genre);\n };\n\n self.genre.schema = {\n \"description\": \"Generates a genre.\",\n \"sampleResults\": [\"Rock\", \"Metal\", \"Pop\"]\n };\n};\n\nmodule[\"exports\"] = Music;\n\n},{}],166:[function(require,module,exports){\n/**\n *\n * @namespace faker.name\n */\nfunction Name (faker) {\n\n /**\n * firstName\n *\n * @method firstName\n * @param {mixed} gender\n * @memberof faker.name\n */\n this.firstName = function (gender) {\n if (typeof faker.definitions.name.male_first_name !== \"undefined\" && typeof faker.definitions.name.female_first_name !== \"undefined\") {\n // some locale datasets ( like ru ) have first_name split by gender. since the name.first_name field does not exist in these datasets,\n // we must randomly pick a name from either gender array so faker.name.firstName will return the correct locale data ( and not fallback )\n\n if(typeof gender === 'string') {\n if(gender.toLowerCase() === 'male') {\n gender = 0;\n }\n else if(gender.toLowerCase() === 'female') {\n gender = 1;\n }\n }\n\n if (typeof gender !== 'number') {\n if(typeof faker.definitions.name.first_name === \"undefined\") {\n gender = faker.datatype.number(1);\n }\n else {\n //Fall back to non-gendered names if they exist and gender wasn't specified\n return faker.random.arrayElement(faker.definitions.name.first_name);\n }\n }\n if (gender === 0) {\n return faker.random.arrayElement(faker.definitions.name.male_first_name)\n } else {\n return faker.random.arrayElement(faker.definitions.name.female_first_name);\n }\n }\n return faker.random.arrayElement(faker.definitions.name.first_name);\n };\n\n /**\n * lastName\n *\n * @method lastName\n * @param {mixed} gender\n * @memberof faker.name\n */\n this.lastName = function (gender) {\n if (typeof faker.definitions.name.male_last_name !== \"undefined\" && typeof faker.definitions.name.female_last_name !== \"undefined\") {\n // some locale datasets ( like ru ) have last_name split by gender. i have no idea how last names can have genders, but also i do not speak russian\n // see above comment of firstName method\n if (typeof gender !== 'number') {\n gender = faker.datatype.number(1);\n }\n if (gender === 0) {\n return faker.random.arrayElement(faker.locales[faker.locale].name.male_last_name);\n } else {\n return faker.random.arrayElement(faker.locales[faker.locale].name.female_last_name);\n }\n }\n return faker.random.arrayElement(faker.definitions.name.last_name);\n };\n\n /**\n * middleName\n *\n * @method middleName\n * @param {mixed} gender\n * @memberof faker.name\n */\n this.middleName = function (gender) {\n if (typeof faker.definitions.name.male_middle_name !== \"undefined\" && typeof faker.definitions.name.female_middle_name !== \"undefined\") {\n if (typeof gender !== 'number') {\n gender = faker.datatype.number(1);\n }\n if (gender === 0) {\n return faker.random.arrayElement(faker.locales[faker.locale].name.male_middle_name);\n } else {\n return faker.random.arrayElement(faker.locales[faker.locale].name.female_middle_name);\n }\n }\n return faker.random.arrayElement(faker.definitions.name.middle_name);\n };\n\n /**\n * findName\n *\n * @method findName\n * @param {string} firstName\n * @param {string} lastName\n * @param {mixed} gender\n * @memberof faker.name\n */\n this.findName = function (firstName, lastName, gender) {\n var r = faker.datatype.number(8);\n var prefix, suffix;\n // in particular locales first and last names split by gender,\n // thus we keep consistency by passing 0 as male and 1 as female\n if (typeof gender !== 'number') {\n gender = faker.datatype.number(1);\n }\n firstName = firstName || faker.name.firstName(gender);\n lastName = lastName || faker.name.lastName(gender);\n switch (r) {\n case 0:\n prefix = faker.name.prefix(gender);\n if (prefix) {\n return prefix + \" \" + firstName + \" \" + lastName;\n }\n case 1:\n suffix = faker.name.suffix(gender);\n if (suffix) {\n return firstName + \" \" + lastName + \" \" + suffix;\n }\n }\n\n return firstName + \" \" + lastName;\n };\n\n /**\n * jobTitle\n *\n * @method jobTitle\n * @memberof faker.name\n */\n this.jobTitle = function () {\n return faker.name.jobDescriptor() + \" \" +\n faker.name.jobArea() + \" \" +\n faker.name.jobType();\n };\n\n /**\n * gender\n *\n * @method gender\n * @memberof faker.name\n */\n this.gender = function (binary) {\n if (binary) {\n return faker.random.arrayElement(faker.definitions.name.binary_gender);\n } else {\n return faker.random.arrayElement(faker.definitions.name.gender);\n }\n }\n \n /**\n * prefix\n *\n * @method prefix\n * @param {mixed} gender\n * @memberof faker.name\n */\n this.prefix = function (gender) {\n if (typeof faker.definitions.name.male_prefix !== \"undefined\" && typeof faker.definitions.name.female_prefix !== \"undefined\") {\n if (typeof gender !== 'number') {\n gender = faker.datatype.number(1);\n }\n if (gender === 0) {\n return faker.random.arrayElement(faker.locales[faker.locale].name.male_prefix);\n } else {\n return faker.random.arrayElement(faker.locales[faker.locale].name.female_prefix);\n }\n }\n return faker.random.arrayElement(faker.definitions.name.prefix);\n };\n\n /**\n * suffix\n *\n * @method suffix\n * @memberof faker.name\n */\n this.suffix = function () {\n return faker.random.arrayElement(faker.definitions.name.suffix);\n };\n\n /**\n * title\n *\n * @method title\n * @memberof faker.name\n */\n this.title = function() {\n var descriptor = faker.random.arrayElement(faker.definitions.name.title.descriptor),\n level = faker.random.arrayElement(faker.definitions.name.title.level),\n job = faker.random.arrayElement(faker.definitions.name.title.job);\n\n return descriptor + \" \" + level + \" \" + job;\n };\n\n /**\n * jobDescriptor\n *\n * @method jobDescriptor\n * @memberof faker.name\n */\n this.jobDescriptor = function () {\n return faker.random.arrayElement(faker.definitions.name.title.descriptor);\n };\n\n /**\n * jobArea\n *\n * @method jobArea\n * @memberof faker.name\n */\n this.jobArea = function () {\n return faker.random.arrayElement(faker.definitions.name.title.level);\n };\n\n /**\n * jobType\n *\n * @method jobType\n * @memberof faker.name\n */\n this.jobType = function () {\n return faker.random.arrayElement(faker.definitions.name.title.job);\n };\n\n}\n\nmodule['exports'] = Name;\n\n},{}],167:[function(require,module,exports){\n/**\n *\n * @namespace faker.phone\n */\nvar Phone = function (faker) {\n var self = this;\n\n /**\n * phoneNumber\n *\n * @method faker.phone.phoneNumber\n * @param {string} format\n * @memberOf faker.phone\n */\n self.phoneNumber = function (format) {\n format = format || faker.phone.phoneFormats();\n return faker.helpers.replaceSymbolWithNumber(format);\n };\n\n // FIXME: this is strange passing in an array index.\n /**\n * phoneNumberFormat\n *\n * @method faker.phone.phoneFormatsArrayIndex\n * @param phoneFormatsArrayIndex\n * @memberOf faker.phone\n */\n self.phoneNumberFormat = function (phoneFormatsArrayIndex) {\n phoneFormatsArrayIndex = phoneFormatsArrayIndex || 0;\n return faker.helpers.replaceSymbolWithNumber(faker.definitions.phone_number.formats[phoneFormatsArrayIndex]);\n };\n\n /**\n * phoneFormats\n *\n * @method faker.phone.phoneFormats\n */\n self.phoneFormats = function () {\n return faker.random.arrayElement(faker.definitions.phone_number.formats);\n };\n \n return self;\n\n};\n\nmodule['exports'] = Phone;\n\n},{}],168:[function(require,module,exports){\n/**\n * Method to reduce array of characters\n * @param arr existing array of characters\n * @param values array of characters which should be removed\n * @return {*} new array without banned characters\n */\nvar arrayRemove = function (arr, values) {\n values.forEach(function(value){\n arr = arr.filter(function(ele){\n return ele !== value;\n });\n });\n return arr;\n};\n\n/**\n *\n * @namespace faker.random\n */\nfunction Random (faker, seed) {\n // Use a user provided seed if it is an array or number\n if (Array.isArray(seed) && seed.length) {\n faker.mersenne.seed_array(seed);\n }\n else if(!isNaN(seed)) {\n faker.mersenne.seed(seed);\n }\n\n /**\n * @Deprecated\n * returns a single random number based on a max number or range\n *\n * @method faker.random.number\n * @param {mixed} options {min, max, precision}\n */\n this.number = function (options) {\n console.log(\"Deprecation Warning: faker.random.number is now located in faker.datatype.number\");\n return faker.datatype.number(options);\n };\n\n /**\n * @Deprecated\n * returns a single random floating-point number based on a max number or range\n *\n * @method faker.random.float\n * @param {mixed} options\n */\n this.float = function (options) {\n console.log(\"Deprecation Warning: faker.random.float is now located in faker.datatype.float\");\n return faker.datatype.float(options);\n };\n\n /**\n * takes an array and returns a random element of the array\n *\n * @method faker.random.arrayElement\n * @param {array} array\n */\n this.arrayElement = function (array) {\n array = array || [\"a\", \"b\", \"c\"];\n var r = faker.datatype.number({ max: array.length - 1 });\n return array[r];\n };\n\n /**\n * takes an array and returns a subset with random elements of the array\n *\n * @method faker.random.arrayElements\n * @param {array} array\n * @param {number} count number of elements to pick\n */\n this.arrayElements = function (array, count) {\n array = array || [\"a\", \"b\", \"c\"];\n\n if (typeof count !== 'number') {\n count = faker.datatype.number({ min: 1, max: array.length });\n } else if (count > array.length) {\n count = array.length;\n } else if (count < 0) {\n count = 0;\n }\n\n var arrayCopy = array.slice(0);\n var i = array.length;\n var min = i - count;\n var temp;\n var index;\n\n while (i-- > min) {\n index = Math.floor((i + 1) * faker.datatype.float({ min: 0, max: 0.99 }));\n temp = arrayCopy[index];\n arrayCopy[index] = arrayCopy[i];\n arrayCopy[i] = temp;\n }\n\n return arrayCopy.slice(min);\n };\n\n /**\n * takes an object and returns a random key or value\n *\n * @method faker.random.objectElement\n * @param {object} object\n * @param {mixed} field\n */\n this.objectElement = function (object, field) {\n object = object || { \"foo\": \"bar\", \"too\": \"car\" };\n var array = Object.keys(object);\n var key = faker.random.arrayElement(array);\n\n return field === \"key\" ? key : object[key];\n };\n\n /**\n * @Deprecated\n * uuid\n *\n * @method faker.random.uuid\n */\n this.uuid = function () {\n console.log(\"Deprecation Warning: faker.random.uuid is now located in faker.datatype.uuid\");\n return faker.datatype.uuid();\n };\n\n /**\n * boolean\n *\n * @method faker.random.boolean\n */\n this.boolean = function () {\n console.log(\"Deprecation Warning: faker.random.boolean is now located in faker.datatype.boolean\");\n return faker.datatype.boolean();\n };\n\n // TODO: have ability to return specific type of word? As in: noun, adjective, verb, etc\n /**\n * word\n *\n * @method faker.random.word\n * @param {string} type\n */\n this.word = function randomWord (type) {\n\n var wordMethods = [\n 'commerce.department',\n 'commerce.productName',\n 'commerce.productAdjective',\n 'commerce.productMaterial',\n 'commerce.product',\n 'commerce.color',\n\n 'company.catchPhraseAdjective',\n 'company.catchPhraseDescriptor',\n 'company.catchPhraseNoun',\n 'company.bsAdjective',\n 'company.bsBuzz',\n 'company.bsNoun',\n 'address.streetSuffix',\n 'address.county',\n 'address.country',\n 'address.state',\n\n 'finance.accountName',\n 'finance.transactionType',\n 'finance.currencyName',\n\n 'hacker.noun',\n 'hacker.verb',\n 'hacker.adjective',\n 'hacker.ingverb',\n 'hacker.abbreviation',\n\n 'name.jobDescriptor',\n 'name.jobArea',\n 'name.jobType'];\n\n // randomly pick from the many faker methods that can generate words\n var randomWordMethod = faker.random.arrayElement(wordMethods);\n var result = faker.fake('{{' + randomWordMethod + '}}');\n return faker.random.arrayElement(result.split(' '));\n };\n\n /**\n * randomWords\n *\n * @method faker.random.words\n * @param {number} count defaults to a random value between 1 and 3\n */\n this.words = function randomWords (count) {\n var words = [];\n if (typeof count === \"undefined\") {\n count = faker.datatype.number({min:1, max: 3});\n }\n for (var i = 0; i>> i) & 0x1){\n sum = addition32(sum, unsigned32(n2 << i));\n }\n }\n return sum;\n }\n\n /* initializes mt[N] with a seed */\n //c//void init_genrand(unsigned long s)\n this.init_genrand = function (s)\n {\n //c//mt[0]= s & 0xffffffff;\n mt[0]= unsigned32(s & 0xffffffff);\n for (mti=1; mti> 30)) + mti);\n\t\t\taddition32(multiplication32(1812433253, unsigned32(mt[mti-1] ^ (mt[mti-1] >>> 30))), mti);\n /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */\n /* In the previous versions, MSBs of the seed affect */\n /* only MSBs of the array mt[]. */\n /* 2002/01/09 modified by Makoto Matsumoto */\n //c//mt[mti] &= 0xffffffff;\n mt[mti] = unsigned32(mt[mti] & 0xffffffff);\n /* for >32 bit machines */\n }\n }\n\n /* initialize by an array with array-length */\n /* init_key is the array for initializing keys */\n /* key_length is its length */\n /* slight change for C++, 2004/2/26 */\n //c//void init_by_array(unsigned long init_key[], int key_length)\n this.init_by_array = function (init_key, key_length)\n {\n //c//int i, j, k;\n var i, j, k;\n //c//init_genrand(19650218);\n this.init_genrand(19650218);\n i=1; j=0;\n k = (N>key_length ? N : key_length);\n for (; k; k--) {\n //c//mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525))\n //c//\t+ init_key[j] + j; /* non linear */\n mt[i] = addition32(addition32(unsigned32(mt[i] ^ multiplication32(unsigned32(mt[i-1] ^ (mt[i-1] >>> 30)), 1664525)), init_key[j]), j);\n mt[i] =\n\t\t\t//c//mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */\n\t\t\tunsigned32(mt[i] & 0xffffffff);\n i++; j++;\n if (i>=N) { mt[0] = mt[N-1]; i=1; }\n if (j>=key_length) {j=0;}\n }\n for (k=N-1; k; k--) {\n //c//mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941))\n //c//- i; /* non linear */\n mt[i] = subtraction32(unsigned32((dbg=mt[i]) ^ multiplication32(unsigned32(mt[i-1] ^ (mt[i-1] >>> 30)), 1566083941)), i);\n //c//mt[i] &= 0xffffffff; /* for WORDSIZE > 32 machines */\n mt[i] = unsigned32(mt[i] & 0xffffffff);\n i++;\n if (i>=N) { mt[0] = mt[N-1]; i=1; }\n }\n mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */\n }\n\n /* moved outside of genrand_int32() by jwatte 2010-11-17; generate less garbage */\n var mag01 = [0x0, MATRIX_A];\n\n /* generates a random number on [0,0xffffffff]-interval */\n //c//unsigned long genrand_int32(void)\n this.genrand_int32 = function ()\n {\n //c//unsigned long y;\n //c//static unsigned long mag01[2]={0x0UL, MATRIX_A};\n var y;\n /* mag01[x] = x * MATRIX_A for x=0,1 */\n\n if (mti >= N) { /* generate N words at one time */\n //c//int kk;\n var kk;\n\n if (mti == N+1) /* if init_genrand() has not been called, */\n //c//init_genrand(5489); /* a default initial seed is used */\n {this.init_genrand(5489);} /* a default initial seed is used */\n\n for (kk=0;kk> 1) ^ mag01[y & 0x1];\n y = unsigned32((mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK));\n mt[kk] = unsigned32(mt[kk+M] ^ (y >>> 1) ^ mag01[y & 0x1]);\n }\n for (;kk> 1) ^ mag01[y & 0x1];\n y = unsigned32((mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK));\n mt[kk] = unsigned32(mt[kk+(M-N)] ^ (y >>> 1) ^ mag01[y & 0x1]);\n }\n //c//y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);\n //c//mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];\n y = unsigned32((mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK));\n mt[N-1] = unsigned32(mt[M-1] ^ (y >>> 1) ^ mag01[y & 0x1]);\n mti = 0;\n }\n\n y = mt[mti++];\n\n /* Tempering */\n //c//y ^= (y >> 11);\n //c//y ^= (y << 7) & 0x9d2c5680;\n //c//y ^= (y << 15) & 0xefc60000;\n //c//y ^= (y >> 18);\n y = unsigned32(y ^ (y >>> 11));\n y = unsigned32(y ^ ((y << 7) & 0x9d2c5680));\n y = unsigned32(y ^ ((y << 15) & 0xefc60000));\n y = unsigned32(y ^ (y >>> 18));\n\n return y;\n }\n\n /* generates a random number on [0,0x7fffffff]-interval */\n //c//long genrand_int31(void)\n this.genrand_int31 = function ()\n {\n //c//return (genrand_int32()>>1);\n return (this.genrand_int32()>>>1);\n }\n\n /* generates a random number on [0,1]-real-interval */\n //c//double genrand_real1(void)\n this.genrand_real1 = function ()\n {\n //c//return genrand_int32()*(1.0/4294967295.0);\n return this.genrand_int32()*(1.0/4294967295.0);\n /* divided by 2^32-1 */\n }\n\n /* generates a random number on [0,1)-real-interval */\n //c//double genrand_real2(void)\n this.genrand_real2 = function ()\n {\n //c//return genrand_int32()*(1.0/4294967296.0);\n return this.genrand_int32()*(1.0/4294967296.0);\n /* divided by 2^32 */\n }\n\n /* generates a random number on (0,1)-real-interval */\n //c//double genrand_real3(void)\n this.genrand_real3 = function ()\n {\n //c//return ((genrand_int32()) + 0.5)*(1.0/4294967296.0);\n return ((this.genrand_int32()) + 0.5)*(1.0/4294967296.0);\n /* divided by 2^32 */\n }\n\n /* generates a random number on [0,1) with 53-bit resolution*/\n //c//double genrand_res53(void)\n this.genrand_res53 = function ()\n {\n //c//unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;\n var a=this.genrand_int32()>>>5, b=this.genrand_int32()>>>6;\n return(a*67108864.0+b)*(1.0/9007199254740992.0);\n }\n /* These real versions are due to Isaku Wada, 2002/01/09 added */\n}\n\n// Exports: Public API\n\n// Export the twister class\nexports.MersenneTwister19937 = MersenneTwister19937;\n\n},{}],175:[function(require,module,exports){\n// the `unique` module\nvar unique = {};\n\n// global results store\n// currently uniqueness is global to entire faker instance\n// this means that faker should currently *never* return duplicate values across all API methods when using `Faker.unique`\n// it's possible in the future that some users may want to scope found per function call instead of faker instance\nvar found = {};\n\n// global exclude list of results\n// defaults to nothing excluded\nvar exclude = [];\n\n// current iteration or retries of unique.exec ( current loop depth )\nvar currentIterations = 0;\n\n// uniqueness compare function\n// default behavior is to check value as key against object hash\nvar defaultCompare = function(obj, key) {\n if (typeof obj[key] === 'undefined') {\n return -1;\n }\n return 0;\n};\n\n// common error handler for messages\nunique.errorMessage = function (now, code, opts) {\n console.error('error', code);\n console.log('found', Object.keys(found).length, 'unique entries before throwing error. \\nretried:', currentIterations, '\\ntotal time:', now - opts.startTime, 'ms');\n throw new Error(code + ' for uniqueness check \\n\\nMay not be able to generate any more unique values with current settings. \\nTry adjusting maxTime or maxRetries parameters for faker.unique()')\n};\n\nunique.exec = function (method, args, opts) {\n //console.log(currentIterations)\n\n var now = new Date().getTime();\n\n opts = opts || {};\n opts.maxTime = opts.maxTime || 3;\n opts.maxRetries = opts.maxRetries || 50;\n opts.exclude = opts.exclude || exclude;\n opts.compare = opts.compare || defaultCompare;\n\n if (typeof opts.currentIterations !== 'number') {\n opts.currentIterations = 0;\n }\n\n if (typeof opts.startTime === 'undefined') {\n opts.startTime = new Date().getTime();\n }\n\n var startTime = opts.startTime;\n\n // support single exclude argument as string\n if (typeof opts.exclude === 'string') {\n opts.exclude = [opts.exclude];\n }\n\n if (opts.currentIterations > 0) {\n // console.log('iterating', currentIterations)\n }\n\n // console.log(now - startTime)\n if (now - startTime >= opts.maxTime) {\n return unique.errorMessage(now, 'Exceeded maxTime:' + opts.maxTime, opts);\n }\n\n if (opts.currentIterations >= opts.maxRetries) {\n return unique.errorMessage(now, 'Exceeded maxRetries:' + opts.maxRetries, opts);\n }\n\n // execute the provided method to find a potential satifised value\n var result = method.apply(this, args);\n\n // if the result has not been previously found, add it to the found array and return the value as it's unique\n if (opts.compare(found, result) === -1 && opts.exclude.indexOf(result) === -1) {\n found[result] = result;\n opts.currentIterations = 0;\n return result;\n } else {\n // console.log('conflict', result);\n opts.currentIterations++;\n return unique.exec(method, args, opts);\n }\n};\n\nmodule.exports = unique;\n\n},{}],176:[function(require,module,exports){\n/*\n\nCopyright (c) 2012-2014 Jeffrey Mealo\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\nto permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE\nWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n------------------------------------------------------------------------------------------------------------------------\n\nBased loosely on Luka Pusic's PHP Script: http://360percents.com/posts/php-random-user-agent-generator/\n\nThe license for that script is as follows:\n\n\"THE BEER-WARE LICENSE\" (Revision 42):\n\n wrote this file. As long as you retain this notice you can do whatever you want with this stuff.\nIf we meet some day, and you think this stuff is worth it, you can buy me a beer in return. Luka Pusic\n\n*/\n\nexports.generate = function generate(faker) {\n\n function rnd(a, b) {\n //calling rnd() with no arguments is identical to rnd(0, 100)\n a = a || 0;\n b = b || 100;\n\n if (typeof b === 'number' && typeof a === 'number') {\n\n // 9/2018 - Added faker random to ensure mersenne and seed\n return faker.datatype.number({ min: a, max: b});\n\n }\n\n if (Object.prototype.toString.call(a) === \"[object Array]\") {\n //returns a random element from array (a), even weighting\n return faker.random.arrayElement(a);\n }\n\n if (a && typeof a === 'object') {\n //returns a random key from the passed object; keys are weighted by the decimal probability in their value\n return (function (obj) {\n var rand = rnd(0, 100) / 100, min = 0, max = 0, key, return_val;\n\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n max = obj[key] + min;\n return_val = key;\n if (rand >= min && rand <= max) {\n break;\n }\n min = min + obj[key];\n }\n }\n\n return return_val;\n }(a));\n }\n\n throw new TypeError('Invalid arguments passed to rnd. (' + (b ? a + ', ' + b : a) + ')');\n }\n\n function randomLang() {\n return rnd(['AB', 'AF', 'AN', 'AR', 'AS', 'AZ', 'BE', 'BG', 'BN', 'BO', 'BR', 'BS', 'CA', 'CE', 'CO', 'CS',\n 'CU', 'CY', 'DA', 'DE', 'EL', 'EN', 'EO', 'ES', 'ET', 'EU', 'FA', 'FI', 'FJ', 'FO', 'FR', 'FY',\n 'GA', 'GD', 'GL', 'GV', 'HE', 'HI', 'HR', 'HT', 'HU', 'HY', 'ID', 'IS', 'IT', 'JA', 'JV', 'KA',\n 'KG', 'KO', 'KU', 'KW', 'KY', 'LA', 'LB', 'LI', 'LN', 'LT', 'LV', 'MG', 'MK', 'MN', 'MO', 'MS',\n 'MT', 'MY', 'NB', 'NE', 'NL', 'NN', 'NO', 'OC', 'PL', 'PT', 'RM', 'RO', 'RU', 'SC', 'SE', 'SK',\n 'SL', 'SO', 'SQ', 'SR', 'SV', 'SW', 'TK', 'TR', 'TY', 'UK', 'UR', 'UZ', 'VI', 'VO', 'YI', 'ZH']);\n }\n\n function randomBrowserAndOS() {\n var browser = rnd({\n chrome: .45132810566,\n iexplorer: .27477061836,\n firefox: .19384170608,\n safari: .06186781118,\n opera: .01574236955\n }),\n os = {\n chrome: {win: .89, mac: .09 , lin: .02},\n firefox: {win: .83, mac: .16, lin: .01},\n opera: {win: .91, mac: .03 , lin: .06},\n safari: {win: .04 , mac: .96 },\n iexplorer: ['win']\n };\n\n return [browser, rnd(os[browser])];\n }\n\n function randomProc(arch) {\n var procs = {\n lin:['i686', 'x86_64'],\n mac: {'Intel' : .48, 'PPC': .01, 'U; Intel':.48, 'U; PPC' :.01},\n win:['', 'WOW64', 'Win64; x64']\n };\n return rnd(procs[arch]);\n }\n\n function randomRevision(dots) {\n var return_val = '';\n //generate a random revision\n //dots = 2 returns .x.y where x & y are between 0 and 9\n for (var x = 0; x < dots; x++) {\n return_val += '.' + rnd(0, 9);\n }\n return return_val;\n }\n\n var version_string = {\n net: function () {\n return [rnd(1, 4), rnd(0, 9), rnd(10000, 99999), rnd(0, 9)].join('.');\n },\n nt: function () {\n return rnd(5, 6) + '.' + rnd(0, 3);\n },\n ie: function () {\n return rnd(7, 11);\n },\n trident: function () {\n return rnd(3, 7) + '.' + rnd(0, 1);\n },\n osx: function (delim) {\n return [10, rnd(5, 10), rnd(0, 9)].join(delim || '.');\n },\n chrome: function () {\n return [rnd(13, 39), 0, rnd(800, 899), 0].join('.');\n },\n presto: function () {\n return '2.9.' + rnd(160, 190);\n },\n presto2: function () {\n return rnd(10, 12) + '.00';\n },\n safari: function () {\n return rnd(531, 538) + '.' + rnd(0, 2) + '.' + rnd(0,2);\n }\n };\n\n var browser = {\n firefox: function firefox(arch) {\n //https://developer.mozilla.org/en-US/docs/Gecko_user_agent_string_reference\n var firefox_ver = rnd(5, 15) + randomRevision(2),\n gecko_ver = 'Gecko/20100101 Firefox/' + firefox_ver,\n proc = randomProc(arch),\n os_ver = (arch === 'win') ? '(Windows NT ' + version_string.nt() + ((proc) ? '; ' + proc : '')\n : (arch === 'mac') ? '(Macintosh; ' + proc + ' Mac OS X ' + version_string.osx()\n : '(X11; Linux ' + proc;\n\n return 'Mozilla/5.0 ' + os_ver + '; rv:' + firefox_ver.slice(0, -2) + ') ' + gecko_ver;\n },\n\n iexplorer: function iexplorer() {\n var ver = version_string.ie();\n\n if (ver >= 11) {\n //http://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx\n return 'Mozilla/5.0 (Windows NT 6.' + rnd(1,3) + '; Trident/7.0; ' + rnd(['Touch; ', '']) + 'rv:11.0) like Gecko';\n }\n\n //http://msdn.microsoft.com/en-us/library/ie/ms537503(v=vs.85).aspx\n return 'Mozilla/5.0 (compatible; MSIE ' + ver + '.0; Windows NT ' + version_string.nt() + '; Trident/' +\n version_string.trident() + ((rnd(0, 1) === 1) ? '; .NET CLR ' + version_string.net() : '') + ')';\n },\n\n opera: function opera(arch) {\n //http://www.opera.com/docs/history/\n var presto_ver = ' Presto/' + version_string.presto() + ' Version/' + version_string.presto2() + ')',\n os_ver = (arch === 'win') ? '(Windows NT ' + version_string.nt() + '; U; ' + randomLang() + presto_ver\n : (arch === 'lin') ? '(X11; Linux ' + randomProc(arch) + '; U; ' + randomLang() + presto_ver\n : '(Macintosh; Intel Mac OS X ' + version_string.osx() + ' U; ' + randomLang() + ' Presto/' +\n version_string.presto() + ' Version/' + version_string.presto2() + ')';\n\n return 'Opera/' + rnd(9, 14) + '.' + rnd(0, 99) + ' ' + os_ver;\n },\n\n safari: function safari(arch) {\n var safari = version_string.safari(),\n ver = rnd(4, 7) + '.' + rnd(0,1) + '.' + rnd(0,10),\n os_ver = (arch === 'mac') ? '(Macintosh; ' + randomProc('mac') + ' Mac OS X '+ version_string.osx('_') + ' rv:' + rnd(2, 6) + '.0; '+ randomLang() + ') '\n : '(Windows; U; Windows NT ' + version_string.nt() + ')';\n\n return 'Mozilla/5.0 ' + os_ver + 'AppleWebKit/' + safari + ' (KHTML, like Gecko) Version/' + ver + ' Safari/' + safari;\n },\n\n chrome: function chrome(arch) {\n var safari = version_string.safari(),\n os_ver = (arch === 'mac') ? '(Macintosh; ' + randomProc('mac') + ' Mac OS X ' + version_string.osx('_') + ') '\n : (arch === 'win') ? '(Windows; U; Windows NT ' + version_string.nt() + ')'\n : '(X11; Linux ' + randomProc(arch);\n\n return 'Mozilla/5.0 ' + os_ver + ' AppleWebKit/' + safari + ' (KHTML, like Gecko) Chrome/' + version_string.chrome() + ' Safari/' + safari;\n }\n };\n\n var random = randomBrowserAndOS();\n return browser[random[0]](random[1]);\n};\n\n},{}],177:[function(require,module,exports){\n/*!\n * Copyright (c) 2015-2020, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\nconst punycode = require(\"punycode/\");\nconst urlParse = require(\"url-parse\");\nconst pubsuffix = require(\"./pubsuffix-psl\");\nconst Store = require(\"./store\").Store;\nconst MemoryCookieStore = require(\"./memstore\").MemoryCookieStore;\nconst pathMatch = require(\"./pathMatch\").pathMatch;\nconst validators = require(\"./validators.js\");\nconst VERSION = require(\"./version\");\nconst { fromCallback } = require(\"universalify\");\nconst { getCustomInspectSymbol } = require(\"./utilHelper\");\n\n// From RFC6265 S4.1.1\n// note that it excludes \\x3B \";\"\nconst COOKIE_OCTETS = /^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]+$/;\n\nconst CONTROL_CHARS = /[\\x00-\\x1F]/;\n\n// From Chromium // '\\r', '\\n' and '\\0' should be treated as a terminator in\n// the \"relaxed\" mode, see:\n// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60\nconst TERMINATORS = [\"\\n\", \"\\r\", \"\\0\"];\n\n// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or \";\"'\n// Note ';' is \\x3B\nconst PATH_VALUE = /[\\x20-\\x3A\\x3C-\\x7E]+/;\n\n// date-time parsing constants (RFC6265 S5.1.1)\n\nconst DATE_DELIM = /[\\x09\\x20-\\x2F\\x3B-\\x40\\x5B-\\x60\\x7B-\\x7E]/;\n\nconst MONTH_TO_NUM = {\n jan: 0,\n feb: 1,\n mar: 2,\n apr: 3,\n may: 4,\n jun: 5,\n jul: 6,\n aug: 7,\n sep: 8,\n oct: 9,\n nov: 10,\n dec: 11\n};\n\nconst MAX_TIME = 2147483647000; // 31-bit max\nconst MIN_TIME = 0; // 31-bit min\nconst SAME_SITE_CONTEXT_VAL_ERR =\n 'Invalid sameSiteContext option for getCookies(); expected one of \"strict\", \"lax\", or \"none\"';\n\nfunction checkSameSiteContext(value) {\n validators.validate(validators.isNonEmptyString(value), value);\n const context = String(value).toLowerCase();\n if (context === \"none\" || context === \"lax\" || context === \"strict\") {\n return context;\n } else {\n return null;\n }\n}\n\nconst PrefixSecurityEnum = Object.freeze({\n SILENT: \"silent\",\n STRICT: \"strict\",\n DISABLED: \"unsafe-disabled\"\n});\n\n// Dumped from ip-regex@4.0.0, with the following changes:\n// * all capturing groups converted to non-capturing -- \"(?:)\"\n// * support for IPv6 Scoped Literal (\"%eth1\") removed\n// * lowercase hexadecimal only\nconst IP_REGEX_LOWERCASE = /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-f\\d]{1,4}:){7}(?:[a-f\\d]{1,4}|:)|(?:[a-f\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-f\\d]{1,4}|:)|(?:[a-f\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,2}|:)|(?:[a-f\\d]{1,4}:){4}(?:(?::[a-f\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,3}|:)|(?:[a-f\\d]{1,4}:){3}(?:(?::[a-f\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,4}|:)|(?:[a-f\\d]{1,4}:){2}(?:(?::[a-f\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,5}|:)|(?:[a-f\\d]{1,4}:){1}(?:(?::[a-f\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-f\\d]{1,4}){1,7}|:)))$)/;\nconst IP_V6_REGEX = `\n\\\\[?(?:\n(?:[a-fA-F\\\\d]{1,4}:){7}(?:[a-fA-F\\\\d]{1,4}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|:[a-fA-F\\\\d]{1,4}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,2}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){4}(?:(?::[a-fA-F\\\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,3}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){3}(?:(?::[a-fA-F\\\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,4}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){2}(?:(?::[a-fA-F\\\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,5}|:)|\n(?:[a-fA-F\\\\d]{1,4}:){1}(?:(?::[a-fA-F\\\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,6}|:)|\n(?::(?:(?::[a-fA-F\\\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}|(?::[a-fA-F\\\\d]{1,4}){1,7}|:))\n)(?:%[0-9a-zA-Z]{1,})?\\\\]?\n`\n .replace(/\\s*\\/\\/.*$/gm, \"\")\n .replace(/\\n/g, \"\")\n .trim();\nconst IP_V6_REGEX_OBJECT = new RegExp(`^${IP_V6_REGEX}$`);\n\n/*\n * Parses a Natural number (i.e., non-negative integer) with either the\n * *DIGIT ( non-digit *OCTET )\n * or\n * *DIGIT\n * grammar (RFC6265 S5.1.1).\n *\n * The \"trailingOK\" boolean controls if the grammar accepts a\n * \"( non-digit *OCTET )\" trailer.\n */\nfunction parseDigits(token, minDigits, maxDigits, trailingOK) {\n let count = 0;\n while (count < token.length) {\n const c = token.charCodeAt(count);\n // \"non-digit = %x00-2F / %x3A-FF\"\n if (c <= 0x2f || c >= 0x3a) {\n break;\n }\n count++;\n }\n\n // constrain to a minimum and maximum number of digits.\n if (count < minDigits || count > maxDigits) {\n return null;\n }\n\n if (!trailingOK && count != token.length) {\n return null;\n }\n\n return parseInt(token.substr(0, count), 10);\n}\n\nfunction parseTime(token) {\n const parts = token.split(\":\");\n const result = [0, 0, 0];\n\n /* RF6256 S5.1.1:\n * time = hms-time ( non-digit *OCTET )\n * hms-time = time-field \":\" time-field \":\" time-field\n * time-field = 1*2DIGIT\n */\n\n if (parts.length !== 3) {\n return null;\n }\n\n for (let i = 0; i < 3; i++) {\n // \"time-field\" must be strictly \"1*2DIGIT\", HOWEVER, \"hms-time\" can be\n // followed by \"( non-digit *OCTET )\" so therefore the last time-field can\n // have a trailer\n const trailingOK = i == 2;\n const num = parseDigits(parts[i], 1, 2, trailingOK);\n if (num === null) {\n return null;\n }\n result[i] = num;\n }\n\n return result;\n}\n\nfunction parseMonth(token) {\n token = String(token)\n .substr(0, 3)\n .toLowerCase();\n const num = MONTH_TO_NUM[token];\n return num >= 0 ? num : null;\n}\n\n/*\n * RFC6265 S5.1.1 date parser (see RFC for full grammar)\n */\nfunction parseDate(str) {\n if (!str) {\n return;\n }\n\n /* RFC6265 S5.1.1:\n * 2. Process each date-token sequentially in the order the date-tokens\n * appear in the cookie-date\n */\n const tokens = str.split(DATE_DELIM);\n if (!tokens) {\n return;\n }\n\n let hour = null;\n let minute = null;\n let second = null;\n let dayOfMonth = null;\n let month = null;\n let year = null;\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i].trim();\n if (!token.length) {\n continue;\n }\n\n let result;\n\n /* 2.1. If the found-time flag is not set and the token matches the time\n * production, set the found-time flag and set the hour- value,\n * minute-value, and second-value to the numbers denoted by the digits in\n * the date-token, respectively. Skip the remaining sub-steps and continue\n * to the next date-token.\n */\n if (second === null) {\n result = parseTime(token);\n if (result) {\n hour = result[0];\n minute = result[1];\n second = result[2];\n continue;\n }\n }\n\n /* 2.2. If the found-day-of-month flag is not set and the date-token matches\n * the day-of-month production, set the found-day-of- month flag and set\n * the day-of-month-value to the number denoted by the date-token. Skip\n * the remaining sub-steps and continue to the next date-token.\n */\n if (dayOfMonth === null) {\n // \"day-of-month = 1*2DIGIT ( non-digit *OCTET )\"\n result = parseDigits(token, 1, 2, true);\n if (result !== null) {\n dayOfMonth = result;\n continue;\n }\n }\n\n /* 2.3. If the found-month flag is not set and the date-token matches the\n * month production, set the found-month flag and set the month-value to\n * the month denoted by the date-token. Skip the remaining sub-steps and\n * continue to the next date-token.\n */\n if (month === null) {\n result = parseMonth(token);\n if (result !== null) {\n month = result;\n continue;\n }\n }\n\n /* 2.4. If the found-year flag is not set and the date-token matches the\n * year production, set the found-year flag and set the year-value to the\n * number denoted by the date-token. Skip the remaining sub-steps and\n * continue to the next date-token.\n */\n if (year === null) {\n // \"year = 2*4DIGIT ( non-digit *OCTET )\"\n result = parseDigits(token, 2, 4, true);\n if (result !== null) {\n year = result;\n /* From S5.1.1:\n * 3. If the year-value is greater than or equal to 70 and less\n * than or equal to 99, increment the year-value by 1900.\n * 4. If the year-value is greater than or equal to 0 and less\n * than or equal to 69, increment the year-value by 2000.\n */\n if (year >= 70 && year <= 99) {\n year += 1900;\n } else if (year >= 0 && year <= 69) {\n year += 2000;\n }\n }\n }\n }\n\n /* RFC 6265 S5.1.1\n * \"5. Abort these steps and fail to parse the cookie-date if:\n * * at least one of the found-day-of-month, found-month, found-\n * year, or found-time flags is not set,\n * * the day-of-month-value is less than 1 or greater than 31,\n * * the year-value is less than 1601,\n * * the hour-value is greater than 23,\n * * the minute-value is greater than 59, or\n * * the second-value is greater than 59.\n * (Note that leap seconds cannot be represented in this syntax.)\"\n *\n * So, in order as above:\n */\n if (\n dayOfMonth === null ||\n month === null ||\n year === null ||\n second === null ||\n dayOfMonth < 1 ||\n dayOfMonth > 31 ||\n year < 1601 ||\n hour > 23 ||\n minute > 59 ||\n second > 59\n ) {\n return;\n }\n\n return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));\n}\n\nfunction formatDate(date) {\n validators.validate(validators.isDate(date), date);\n return date.toUTCString();\n}\n\n// S5.1.2 Canonicalized Host Names\nfunction canonicalDomain(str) {\n if (str == null) {\n return null;\n }\n str = str.trim().replace(/^\\./, \"\"); // S4.1.2.3 & S5.2.3: ignore leading .\n\n if (IP_V6_REGEX_OBJECT.test(str)) {\n str = str.replace(\"[\", \"\").replace(\"]\", \"\");\n }\n\n // convert to IDN if any non-ASCII characters\n if (punycode && /[^\\u0001-\\u007f]/.test(str)) {\n str = punycode.toASCII(str);\n }\n\n return str.toLowerCase();\n}\n\n// S5.1.3 Domain Matching\nfunction domainMatch(str, domStr, canonicalize) {\n if (str == null || domStr == null) {\n return null;\n }\n if (canonicalize !== false) {\n str = canonicalDomain(str);\n domStr = canonicalDomain(domStr);\n }\n\n /*\n * S5.1.3:\n * \"A string domain-matches a given domain string if at least one of the\n * following conditions hold:\"\n *\n * \" o The domain string and the string are identical. (Note that both the\n * domain string and the string will have been canonicalized to lower case at\n * this point)\"\n */\n if (str == domStr) {\n return true;\n }\n\n /* \" o All of the following [three] conditions hold:\" */\n\n /* \"* The domain string is a suffix of the string\" */\n const idx = str.lastIndexOf(domStr);\n if (idx <= 0) {\n return false; // it's a non-match (-1) or prefix (0)\n }\n\n // next, check it's a proper suffix\n // e.g., \"a.b.c\".indexOf(\"b.c\") === 2\n // 5 === 3+2\n if (str.length !== domStr.length + idx) {\n return false; // it's not a suffix\n }\n\n /* \" * The last character of the string that is not included in the\n * domain string is a %x2E (\".\") character.\" */\n if (str.substr(idx - 1, 1) !== \".\") {\n return false; // doesn't align on \".\"\n }\n\n /* \" * The string is a host name (i.e., not an IP address).\" */\n if (IP_REGEX_LOWERCASE.test(str)) {\n return false; // it's an IP address\n }\n\n return true;\n}\n\n// RFC6265 S5.1.4 Paths and Path-Match\n\n/*\n * \"The user agent MUST use an algorithm equivalent to the following algorithm\n * to compute the default-path of a cookie:\"\n *\n * Assumption: the path (and not query part or absolute uri) is passed in.\n */\nfunction defaultPath(path) {\n // \"2. If the uri-path is empty or if the first character of the uri-path is not\n // a %x2F (\"/\") character, output %x2F (\"/\") and skip the remaining steps.\n if (!path || path.substr(0, 1) !== \"/\") {\n return \"/\";\n }\n\n // \"3. If the uri-path contains no more than one %x2F (\"/\") character, output\n // %x2F (\"/\") and skip the remaining step.\"\n if (path === \"/\") {\n return path;\n }\n\n const rightSlash = path.lastIndexOf(\"/\");\n if (rightSlash === 0) {\n return \"/\";\n }\n\n // \"4. Output the characters of the uri-path from the first character up to,\n // but not including, the right-most %x2F (\"/\").\"\n return path.slice(0, rightSlash);\n}\n\nfunction trimTerminator(str) {\n if (validators.isEmptyString(str)) return str;\n for (let t = 0; t < TERMINATORS.length; t++) {\n const terminatorIdx = str.indexOf(TERMINATORS[t]);\n if (terminatorIdx !== -1) {\n str = str.substr(0, terminatorIdx);\n }\n }\n\n return str;\n}\n\nfunction parseCookiePair(cookiePair, looseMode) {\n cookiePair = trimTerminator(cookiePair);\n validators.validate(validators.isString(cookiePair), cookiePair);\n\n let firstEq = cookiePair.indexOf(\"=\");\n if (looseMode) {\n if (firstEq === 0) {\n // '=' is immediately at start\n cookiePair = cookiePair.substr(1);\n firstEq = cookiePair.indexOf(\"=\"); // might still need to split on '='\n }\n } else {\n // non-loose mode\n if (firstEq <= 0) {\n // no '=' or is at start\n return; // needs to have non-empty \"cookie-name\"\n }\n }\n\n let cookieName, cookieValue;\n if (firstEq <= 0) {\n cookieName = \"\";\n cookieValue = cookiePair.trim();\n } else {\n cookieName = cookiePair.substr(0, firstEq).trim();\n cookieValue = cookiePair.substr(firstEq + 1).trim();\n }\n\n if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {\n return;\n }\n\n const c = new Cookie();\n c.key = cookieName;\n c.value = cookieValue;\n return c;\n}\n\nfunction parse(str, options) {\n if (!options || typeof options !== \"object\") {\n options = {};\n }\n\n if (validators.isEmptyString(str) || !validators.isString(str)) {\n return null;\n }\n\n str = str.trim();\n\n // We use a regex to parse the \"name-value-pair\" part of S5.2\n const firstSemi = str.indexOf(\";\"); // S5.2 step 1\n const cookiePair = firstSemi === -1 ? str : str.substr(0, firstSemi);\n const c = parseCookiePair(cookiePair, !!options.loose);\n if (!c) {\n return;\n }\n\n if (firstSemi === -1) {\n return c;\n }\n\n // S5.2.3 \"unparsed-attributes consist of the remainder of the set-cookie-string\n // (including the %x3B (\";\") in question).\" plus later on in the same section\n // \"discard the first \";\" and trim\".\n const unparsed = str.slice(firstSemi + 1).trim();\n\n // \"If the unparsed-attributes string is empty, skip the rest of these\n // steps.\"\n if (unparsed.length === 0) {\n return c;\n }\n\n /*\n * S5.2 says that when looping over the items \"[p]rocess the attribute-name\n * and attribute-value according to the requirements in the following\n * subsections\" for every item. Plus, for many of the individual attributes\n * in S5.3 it says to use the \"attribute-value of the last attribute in the\n * cookie-attribute-list\". Therefore, in this implementation, we overwrite\n * the previous value.\n */\n const cookie_avs = unparsed.split(\";\");\n while (cookie_avs.length) {\n const av = cookie_avs.shift().trim();\n if (av.length === 0) {\n // happens if \";;\" appears\n continue;\n }\n const av_sep = av.indexOf(\"=\");\n let av_key, av_value;\n\n if (av_sep === -1) {\n av_key = av;\n av_value = null;\n } else {\n av_key = av.substr(0, av_sep);\n av_value = av.substr(av_sep + 1);\n }\n\n av_key = av_key.trim().toLowerCase();\n\n if (av_value) {\n av_value = av_value.trim();\n }\n\n switch (av_key) {\n case \"expires\": // S5.2.1\n if (av_value) {\n const exp = parseDate(av_value);\n // \"If the attribute-value failed to parse as a cookie date, ignore the\n // cookie-av.\"\n if (exp) {\n // over and underflow not realistically a concern: V8's getTime() seems to\n // store something larger than a 32-bit time_t (even with 32-bit node)\n c.expires = exp;\n }\n }\n break;\n\n case \"max-age\": // S5.2.2\n if (av_value) {\n // \"If the first character of the attribute-value is not a DIGIT or a \"-\"\n // character ...[or]... If the remainder of attribute-value contains a\n // non-DIGIT character, ignore the cookie-av.\"\n if (/^-?[0-9]+$/.test(av_value)) {\n const delta = parseInt(av_value, 10);\n // \"If delta-seconds is less than or equal to zero (0), let expiry-time\n // be the earliest representable date and time.\"\n c.setMaxAge(delta);\n }\n }\n break;\n\n case \"domain\": // S5.2.3\n // \"If the attribute-value is empty, the behavior is undefined. However,\n // the user agent SHOULD ignore the cookie-av entirely.\"\n if (av_value) {\n // S5.2.3 \"Let cookie-domain be the attribute-value without the leading %x2E\n // (\".\") character.\"\n const domain = av_value.trim().replace(/^\\./, \"\");\n if (domain) {\n // \"Convert the cookie-domain to lower case.\"\n c.domain = domain.toLowerCase();\n }\n }\n break;\n\n case \"path\": // S5.2.4\n /*\n * \"If the attribute-value is empty or if the first character of the\n * attribute-value is not %x2F (\"/\"):\n * Let cookie-path be the default-path.\n * Otherwise:\n * Let cookie-path be the attribute-value.\"\n *\n * We'll represent the default-path as null since it depends on the\n * context of the parsing.\n */\n c.path = av_value && av_value[0] === \"/\" ? av_value : null;\n break;\n\n case \"secure\": // S5.2.5\n /*\n * \"If the attribute-name case-insensitively matches the string \"Secure\",\n * the user agent MUST append an attribute to the cookie-attribute-list\n * with an attribute-name of Secure and an empty attribute-value.\"\n */\n c.secure = true;\n break;\n\n case \"httponly\": // S5.2.6 -- effectively the same as 'secure'\n c.httpOnly = true;\n break;\n\n case \"samesite\": // RFC6265bis-02 S5.3.7\n const enforcement = av_value ? av_value.toLowerCase() : \"\";\n switch (enforcement) {\n case \"strict\":\n c.sameSite = \"strict\";\n break;\n case \"lax\":\n c.sameSite = \"lax\";\n break;\n case \"none\":\n c.sameSite = \"none\";\n break;\n default:\n c.sameSite = undefined;\n break;\n }\n break;\n\n default:\n c.extensions = c.extensions || [];\n c.extensions.push(av);\n break;\n }\n }\n\n return c;\n}\n\n/**\n * If the cookie-name begins with a case-sensitive match for the\n * string \"__Secure-\", abort these steps and ignore the cookie\n * entirely unless the cookie's secure-only-flag is true.\n * @param cookie\n * @returns boolean\n */\nfunction isSecurePrefixConditionMet(cookie) {\n validators.validate(validators.isObject(cookie), cookie);\n return !cookie.key.startsWith(\"__Secure-\") || cookie.secure;\n}\n\n/**\n * If the cookie-name begins with a case-sensitive match for the\n * string \"__Host-\", abort these steps and ignore the cookie\n * entirely unless the cookie meets all the following criteria:\n * 1. The cookie's secure-only-flag is true.\n * 2. The cookie's host-only-flag is true.\n * 3. The cookie-attribute-list contains an attribute with an\n * attribute-name of \"Path\", and the cookie's path is \"/\".\n * @param cookie\n * @returns boolean\n */\nfunction isHostPrefixConditionMet(cookie) {\n validators.validate(validators.isObject(cookie));\n return (\n !cookie.key.startsWith(\"__Host-\") ||\n (cookie.secure &&\n cookie.hostOnly &&\n cookie.path != null &&\n cookie.path === \"/\")\n );\n}\n\n// avoid the V8 deoptimization monster!\nfunction jsonParse(str) {\n let obj;\n try {\n obj = JSON.parse(str);\n } catch (e) {\n return e;\n }\n return obj;\n}\n\nfunction fromJSON(str) {\n if (!str || validators.isEmptyString(str)) {\n return null;\n }\n\n let obj;\n if (typeof str === \"string\") {\n obj = jsonParse(str);\n if (obj instanceof Error) {\n return null;\n }\n } else {\n // assume it's an Object\n obj = str;\n }\n\n const c = new Cookie();\n for (let i = 0; i < Cookie.serializableProperties.length; i++) {\n const prop = Cookie.serializableProperties[i];\n if (obj[prop] === undefined || obj[prop] === cookieDefaults[prop]) {\n continue; // leave as prototype default\n }\n\n if (prop === \"expires\" || prop === \"creation\" || prop === \"lastAccessed\") {\n if (obj[prop] === null) {\n c[prop] = null;\n } else {\n c[prop] = obj[prop] == \"Infinity\" ? \"Infinity\" : new Date(obj[prop]);\n }\n } else {\n c[prop] = obj[prop];\n }\n }\n\n return c;\n}\n\n/* Section 5.4 part 2:\n * \"* Cookies with longer paths are listed before cookies with\n * shorter paths.\n *\n * * Among cookies that have equal-length path fields, cookies with\n * earlier creation-times are listed before cookies with later\n * creation-times.\"\n */\n\nfunction cookieCompare(a, b) {\n validators.validate(validators.isObject(a), a);\n validators.validate(validators.isObject(b), b);\n let cmp = 0;\n\n // descending for length: b CMP a\n const aPathLen = a.path ? a.path.length : 0;\n const bPathLen = b.path ? b.path.length : 0;\n cmp = bPathLen - aPathLen;\n if (cmp !== 0) {\n return cmp;\n }\n\n // ascending for time: a CMP b\n const aTime = a.creation ? a.creation.getTime() : MAX_TIME;\n const bTime = b.creation ? b.creation.getTime() : MAX_TIME;\n cmp = aTime - bTime;\n if (cmp !== 0) {\n return cmp;\n }\n\n // break ties for the same millisecond (precision of JavaScript's clock)\n cmp = a.creationIndex - b.creationIndex;\n\n return cmp;\n}\n\n// Gives the permutation of all possible pathMatch()es of a given path. The\n// array is in longest-to-shortest order. Handy for indexing.\nfunction permutePath(path) {\n validators.validate(validators.isString(path));\n if (path === \"/\") {\n return [\"/\"];\n }\n const permutations = [path];\n while (path.length > 1) {\n const lindex = path.lastIndexOf(\"/\");\n if (lindex === 0) {\n break;\n }\n path = path.substr(0, lindex);\n permutations.push(path);\n }\n permutations.push(\"/\");\n return permutations;\n}\n\nfunction getCookieContext(url) {\n if (url instanceof Object) {\n return url;\n }\n // NOTE: decodeURI will throw on malformed URIs (see GH-32).\n // Therefore, we will just skip decoding for such URIs.\n try {\n url = decodeURI(url);\n } catch (err) {\n // Silently swallow error\n }\n\n return urlParse(url);\n}\n\nconst cookieDefaults = {\n // the order in which the RFC has them:\n key: \"\",\n value: \"\",\n expires: \"Infinity\",\n maxAge: null,\n domain: null,\n path: null,\n secure: false,\n httpOnly: false,\n extensions: null,\n // set by the CookieJar:\n hostOnly: null,\n pathIsDefault: null,\n creation: null,\n lastAccessed: null,\n sameSite: undefined\n};\n\nclass Cookie {\n constructor(options = {}) {\n const customInspectSymbol = getCustomInspectSymbol();\n if (customInspectSymbol) {\n this[customInspectSymbol] = this.inspect;\n }\n\n Object.assign(this, cookieDefaults, options);\n this.creation = this.creation || new Date();\n\n // used to break creation ties in cookieCompare():\n Object.defineProperty(this, \"creationIndex\", {\n configurable: false,\n enumerable: false, // important for assert.deepEqual checks\n writable: true,\n value: ++Cookie.cookiesCreated\n });\n }\n\n inspect() {\n const now = Date.now();\n const hostOnly = this.hostOnly != null ? this.hostOnly : \"?\";\n const createAge = this.creation\n ? `${now - this.creation.getTime()}ms`\n : \"?\";\n const accessAge = this.lastAccessed\n ? `${now - this.lastAccessed.getTime()}ms`\n : \"?\";\n return `Cookie=\"${this.toString()}; hostOnly=${hostOnly}; aAge=${accessAge}; cAge=${createAge}\"`;\n }\n\n toJSON() {\n const obj = {};\n\n for (const prop of Cookie.serializableProperties) {\n if (this[prop] === cookieDefaults[prop]) {\n continue; // leave as prototype default\n }\n\n if (\n prop === \"expires\" ||\n prop === \"creation\" ||\n prop === \"lastAccessed\"\n ) {\n if (this[prop] === null) {\n obj[prop] = null;\n } else {\n obj[prop] =\n this[prop] == \"Infinity\" // intentionally not ===\n ? \"Infinity\"\n : this[prop].toISOString();\n }\n } else if (prop === \"maxAge\") {\n if (this[prop] !== null) {\n // again, intentionally not ===\n obj[prop] =\n this[prop] == Infinity || this[prop] == -Infinity\n ? this[prop].toString()\n : this[prop];\n }\n } else {\n if (this[prop] !== cookieDefaults[prop]) {\n obj[prop] = this[prop];\n }\n }\n }\n\n return obj;\n }\n\n clone() {\n return fromJSON(this.toJSON());\n }\n\n validate() {\n if (!COOKIE_OCTETS.test(this.value)) {\n return false;\n }\n if (\n this.expires != Infinity &&\n !(this.expires instanceof Date) &&\n !parseDate(this.expires)\n ) {\n return false;\n }\n if (this.maxAge != null && this.maxAge <= 0) {\n return false; // \"Max-Age=\" non-zero-digit *DIGIT\n }\n if (this.path != null && !PATH_VALUE.test(this.path)) {\n return false;\n }\n\n const cdomain = this.cdomain();\n if (cdomain) {\n if (cdomain.match(/\\.$/)) {\n return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this\n }\n const suffix = pubsuffix.getPublicSuffix(cdomain);\n if (suffix == null) {\n // it's a public suffix\n return false;\n }\n }\n return true;\n }\n\n setExpires(exp) {\n if (exp instanceof Date) {\n this.expires = exp;\n } else {\n this.expires = parseDate(exp) || \"Infinity\";\n }\n }\n\n setMaxAge(age) {\n if (age === Infinity || age === -Infinity) {\n this.maxAge = age.toString(); // so JSON.stringify() works\n } else {\n this.maxAge = age;\n }\n }\n\n cookieString() {\n let val = this.value;\n if (val == null) {\n val = \"\";\n }\n if (this.key === \"\") {\n return val;\n }\n return `${this.key}=${val}`;\n }\n\n // gives Set-Cookie header format\n toString() {\n let str = this.cookieString();\n\n if (this.expires != Infinity) {\n if (this.expires instanceof Date) {\n str += `; Expires=${formatDate(this.expires)}`;\n } else {\n str += `; Expires=${this.expires}`;\n }\n }\n\n if (this.maxAge != null && this.maxAge != Infinity) {\n str += `; Max-Age=${this.maxAge}`;\n }\n\n if (this.domain && !this.hostOnly) {\n str += `; Domain=${this.domain}`;\n }\n if (this.path) {\n str += `; Path=${this.path}`;\n }\n\n if (this.secure) {\n str += \"; Secure\";\n }\n if (this.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (this.sameSite && this.sameSite !== \"none\") {\n const ssCanon = Cookie.sameSiteCanonical[this.sameSite.toLowerCase()];\n str += `; SameSite=${ssCanon ? ssCanon : this.sameSite}`;\n }\n if (this.extensions) {\n this.extensions.forEach(ext => {\n str += `; ${ext}`;\n });\n }\n\n return str;\n }\n\n // TTL() partially replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n // elsewhere)\n // S5.3 says to give the \"latest representable date\" for which we use Infinity\n // For \"expired\" we use 0\n TTL(now) {\n /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires\n * attribute, the Max-Age attribute has precedence and controls the\n * expiration date of the cookie.\n * (Concurs with S5.3 step 3)\n */\n if (this.maxAge != null) {\n return this.maxAge <= 0 ? 0 : this.maxAge * 1000;\n }\n\n let expires = this.expires;\n if (expires != Infinity) {\n if (!(expires instanceof Date)) {\n expires = parseDate(expires) || Infinity;\n }\n\n if (expires == Infinity) {\n return Infinity;\n }\n\n return expires.getTime() - (now || Date.now());\n }\n\n return Infinity;\n }\n\n // expiryTime() replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n // elsewhere)\n expiryTime(now) {\n if (this.maxAge != null) {\n const relativeTo = now || this.creation || new Date();\n const age = this.maxAge <= 0 ? -Infinity : this.maxAge * 1000;\n return relativeTo.getTime() + age;\n }\n\n if (this.expires == Infinity) {\n return Infinity;\n }\n return this.expires.getTime();\n }\n\n // expiryDate() replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n // elsewhere), except it returns a Date\n expiryDate(now) {\n const millisec = this.expiryTime(now);\n if (millisec == Infinity) {\n return new Date(MAX_TIME);\n } else if (millisec == -Infinity) {\n return new Date(MIN_TIME);\n } else {\n return new Date(millisec);\n }\n }\n\n // This replaces the \"persistent-flag\" parts of S5.3 step 3\n isPersistent() {\n return this.maxAge != null || this.expires != Infinity;\n }\n\n // Mostly S5.1.2 and S5.2.3:\n canonicalizedDomain() {\n if (this.domain == null) {\n return null;\n }\n return canonicalDomain(this.domain);\n }\n\n cdomain() {\n return this.canonicalizedDomain();\n }\n}\n\nCookie.cookiesCreated = 0;\nCookie.parse = parse;\nCookie.fromJSON = fromJSON;\nCookie.serializableProperties = Object.keys(cookieDefaults);\nCookie.sameSiteLevel = {\n strict: 3,\n lax: 2,\n none: 1\n};\n\nCookie.sameSiteCanonical = {\n strict: \"Strict\",\n lax: \"Lax\"\n};\n\nfunction getNormalizedPrefixSecurity(prefixSecurity) {\n if (prefixSecurity != null) {\n const normalizedPrefixSecurity = prefixSecurity.toLowerCase();\n /* The three supported options */\n switch (normalizedPrefixSecurity) {\n case PrefixSecurityEnum.STRICT:\n case PrefixSecurityEnum.SILENT:\n case PrefixSecurityEnum.DISABLED:\n return normalizedPrefixSecurity;\n }\n }\n /* Default is SILENT */\n return PrefixSecurityEnum.SILENT;\n}\n\nclass CookieJar {\n constructor(store, options = { rejectPublicSuffixes: true }) {\n if (typeof options === \"boolean\") {\n options = { rejectPublicSuffixes: options };\n }\n validators.validate(validators.isObject(options), options);\n this.rejectPublicSuffixes = options.rejectPublicSuffixes;\n this.enableLooseMode = !!options.looseMode;\n this.allowSpecialUseDomain =\n typeof options.allowSpecialUseDomain === \"boolean\"\n ? options.allowSpecialUseDomain\n : true;\n this.store = store || new MemoryCookieStore();\n this.prefixSecurity = getNormalizedPrefixSecurity(options.prefixSecurity);\n this._cloneSync = syncWrap(\"clone\");\n this._importCookiesSync = syncWrap(\"_importCookies\");\n this.getCookiesSync = syncWrap(\"getCookies\");\n this.getCookieStringSync = syncWrap(\"getCookieString\");\n this.getSetCookieStringsSync = syncWrap(\"getSetCookieStrings\");\n this.removeAllCookiesSync = syncWrap(\"removeAllCookies\");\n this.setCookieSync = syncWrap(\"setCookie\");\n this.serializeSync = syncWrap(\"serialize\");\n }\n\n setCookie(cookie, url, options, cb) {\n validators.validate(validators.isUrlStringOrObject(url), cb, options);\n\n let err;\n\n if (validators.isFunction(url)) {\n cb = url;\n return cb(new Error(\"No URL was specified\"));\n }\n\n const context = getCookieContext(url);\n if (validators.isFunction(options)) {\n cb = options;\n options = {};\n }\n\n validators.validate(validators.isFunction(cb), cb);\n\n if (\n !validators.isNonEmptyString(cookie) &&\n !validators.isObject(cookie) &&\n cookie instanceof String &&\n cookie.length == 0\n ) {\n return cb(null);\n }\n\n const host = canonicalDomain(context.hostname);\n const loose = options.loose || this.enableLooseMode;\n\n let sameSiteContext = null;\n if (options.sameSiteContext) {\n sameSiteContext = checkSameSiteContext(options.sameSiteContext);\n if (!sameSiteContext) {\n return cb(new Error(SAME_SITE_CONTEXT_VAL_ERR));\n }\n }\n\n // S5.3 step 1\n if (typeof cookie === \"string\" || cookie instanceof String) {\n cookie = Cookie.parse(cookie, { loose: loose });\n if (!cookie) {\n err = new Error(\"Cookie failed to parse\");\n return cb(options.ignoreError ? null : err);\n }\n } else if (!(cookie instanceof Cookie)) {\n // If you're seeing this error, and are passing in a Cookie object,\n // it *might* be a Cookie object from another loaded version of tough-cookie.\n err = new Error(\n \"First argument to setCookie must be a Cookie object or string\"\n );\n return cb(options.ignoreError ? null : err);\n }\n\n // S5.3 step 2\n const now = options.now || new Date(); // will assign later to save effort in the face of errors\n\n // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()\n\n // S5.3 step 4: NOOP; domain is null by default\n\n // S5.3 step 5: public suffixes\n if (this.rejectPublicSuffixes && cookie.domain) {\n const suffix = pubsuffix.getPublicSuffix(cookie.cdomain(), {\n allowSpecialUseDomain: this.allowSpecialUseDomain,\n ignoreError: options.ignoreError\n });\n if (suffix == null && !IP_V6_REGEX_OBJECT.test(cookie.domain)) {\n // e.g. \"com\"\n err = new Error(\"Cookie has domain set to a public suffix\");\n return cb(options.ignoreError ? null : err);\n }\n }\n\n // S5.3 step 6:\n if (cookie.domain) {\n if (!domainMatch(host, cookie.cdomain(), false)) {\n err = new Error(\n `Cookie not in this host's domain. Cookie:${cookie.cdomain()} Request:${host}`\n );\n return cb(options.ignoreError ? null : err);\n }\n\n if (cookie.hostOnly == null) {\n // don't reset if already set\n cookie.hostOnly = false;\n }\n } else {\n cookie.hostOnly = true;\n cookie.domain = host;\n }\n\n //S5.2.4 If the attribute-value is empty or if the first character of the\n //attribute-value is not %x2F (\"/\"):\n //Let cookie-path be the default-path.\n if (!cookie.path || cookie.path[0] !== \"/\") {\n cookie.path = defaultPath(context.pathname);\n cookie.pathIsDefault = true;\n }\n\n // S5.3 step 8: NOOP; secure attribute\n // S5.3 step 9: NOOP; httpOnly attribute\n\n // S5.3 step 10\n if (options.http === false && cookie.httpOnly) {\n err = new Error(\"Cookie is HttpOnly and this isn't an HTTP API\");\n return cb(options.ignoreError ? null : err);\n }\n\n // 6252bis-02 S5.4 Step 13 & 14:\n if (\n cookie.sameSite !== \"none\" &&\n cookie.sameSite !== undefined &&\n sameSiteContext\n ) {\n // \"If the cookie's \"same-site-flag\" is not \"None\", and the cookie\n // is being set from a context whose \"site for cookies\" is not an\n // exact match for request-uri's host's registered domain, then\n // abort these steps and ignore the newly created cookie entirely.\"\n if (sameSiteContext === \"none\") {\n err = new Error(\n \"Cookie is SameSite but this is a cross-origin request\"\n );\n return cb(options.ignoreError ? null : err);\n }\n }\n\n /* 6265bis-02 S5.4 Steps 15 & 16 */\n const ignoreErrorForPrefixSecurity =\n this.prefixSecurity === PrefixSecurityEnum.SILENT;\n const prefixSecurityDisabled =\n this.prefixSecurity === PrefixSecurityEnum.DISABLED;\n /* If prefix checking is not disabled ...*/\n if (!prefixSecurityDisabled) {\n let errorFound = false;\n let errorMsg;\n /* Check secure prefix condition */\n if (!isSecurePrefixConditionMet(cookie)) {\n errorFound = true;\n errorMsg = \"Cookie has __Secure prefix but Secure attribute is not set\";\n } else if (!isHostPrefixConditionMet(cookie)) {\n /* Check host prefix condition */\n errorFound = true;\n errorMsg =\n \"Cookie has __Host prefix but either Secure or HostOnly attribute is not set or Path is not '/'\";\n }\n if (errorFound) {\n return cb(\n options.ignoreError || ignoreErrorForPrefixSecurity\n ? null\n : new Error(errorMsg)\n );\n }\n }\n\n const store = this.store;\n\n if (!store.updateCookie) {\n store.updateCookie = function(oldCookie, newCookie, cb) {\n this.putCookie(newCookie, cb);\n };\n }\n\n function withCookie(err, oldCookie) {\n if (err) {\n return cb(err);\n }\n\n const next = function(err) {\n if (err) {\n return cb(err);\n } else {\n cb(null, cookie);\n }\n };\n\n if (oldCookie) {\n // S5.3 step 11 - \"If the cookie store contains a cookie with the same name,\n // domain, and path as the newly created cookie:\"\n if (options.http === false && oldCookie.httpOnly) {\n // step 11.2\n err = new Error(\"old Cookie is HttpOnly and this isn't an HTTP API\");\n return cb(options.ignoreError ? null : err);\n }\n cookie.creation = oldCookie.creation; // step 11.3\n cookie.creationIndex = oldCookie.creationIndex; // preserve tie-breaker\n cookie.lastAccessed = now;\n // Step 11.4 (delete cookie) is implied by just setting the new one:\n store.updateCookie(oldCookie, cookie, next); // step 12\n } else {\n cookie.creation = cookie.lastAccessed = now;\n store.putCookie(cookie, next); // step 12\n }\n }\n\n store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);\n }\n\n // RFC6365 S5.4\n getCookies(url, options, cb) {\n validators.validate(validators.isUrlStringOrObject(url), cb, url);\n\n const context = getCookieContext(url);\n if (validators.isFunction(options)) {\n cb = options;\n options = {};\n }\n validators.validate(validators.isObject(options), cb, options);\n validators.validate(validators.isFunction(cb), cb);\n\n const host = canonicalDomain(context.hostname);\n const path = context.pathname || \"/\";\n\n let secure = options.secure;\n if (\n secure == null &&\n context.protocol &&\n (context.protocol == \"https:\" || context.protocol == \"wss:\")\n ) {\n secure = true;\n }\n\n let sameSiteLevel = 0;\n if (options.sameSiteContext) {\n const sameSiteContext = checkSameSiteContext(options.sameSiteContext);\n sameSiteLevel = Cookie.sameSiteLevel[sameSiteContext];\n if (!sameSiteLevel) {\n return cb(new Error(SAME_SITE_CONTEXT_VAL_ERR));\n }\n }\n\n let http = options.http;\n if (http == null) {\n http = true;\n }\n\n const now = options.now || Date.now();\n const expireCheck = options.expire !== false;\n const allPaths = !!options.allPaths;\n const store = this.store;\n\n function matchingCookie(c) {\n // \"Either:\n // The cookie's host-only-flag is true and the canonicalized\n // request-host is identical to the cookie's domain.\n // Or:\n // The cookie's host-only-flag is false and the canonicalized\n // request-host domain-matches the cookie's domain.\"\n if (c.hostOnly) {\n if (c.domain != host) {\n return false;\n }\n } else {\n if (!domainMatch(host, c.domain, false)) {\n return false;\n }\n }\n\n // \"The request-uri's path path-matches the cookie's path.\"\n if (!allPaths && !pathMatch(path, c.path)) {\n return false;\n }\n\n // \"If the cookie's secure-only-flag is true, then the request-uri's\n // scheme must denote a \"secure\" protocol\"\n if (c.secure && !secure) {\n return false;\n }\n\n // \"If the cookie's http-only-flag is true, then exclude the cookie if the\n // cookie-string is being generated for a \"non-HTTP\" API\"\n if (c.httpOnly && !http) {\n return false;\n }\n\n // RFC6265bis-02 S5.3.7\n if (sameSiteLevel) {\n const cookieLevel = Cookie.sameSiteLevel[c.sameSite || \"none\"];\n if (cookieLevel > sameSiteLevel) {\n // only allow cookies at or below the request level\n return false;\n }\n }\n\n // deferred from S5.3\n // non-RFC: allow retention of expired cookies by choice\n if (expireCheck && c.expiryTime() <= now) {\n store.removeCookie(c.domain, c.path, c.key, () => {}); // result ignored\n return false;\n }\n\n return true;\n }\n\n store.findCookies(\n host,\n allPaths ? null : path,\n this.allowSpecialUseDomain,\n (err, cookies) => {\n if (err) {\n return cb(err);\n }\n\n cookies = cookies.filter(matchingCookie);\n\n // sorting of S5.4 part 2\n if (options.sort !== false) {\n cookies = cookies.sort(cookieCompare);\n }\n\n // S5.4 part 3\n const now = new Date();\n for (const cookie of cookies) {\n cookie.lastAccessed = now;\n }\n // TODO persist lastAccessed\n\n cb(null, cookies);\n }\n );\n }\n\n getCookieString(...args) {\n const cb = args.pop();\n validators.validate(validators.isFunction(cb), cb);\n const next = function(err, cookies) {\n if (err) {\n cb(err);\n } else {\n cb(\n null,\n cookies\n .sort(cookieCompare)\n .map(c => c.cookieString())\n .join(\"; \")\n );\n }\n };\n args.push(next);\n this.getCookies.apply(this, args);\n }\n\n getSetCookieStrings(...args) {\n const cb = args.pop();\n validators.validate(validators.isFunction(cb), cb);\n const next = function(err, cookies) {\n if (err) {\n cb(err);\n } else {\n cb(\n null,\n cookies.map(c => {\n return c.toString();\n })\n );\n }\n };\n args.push(next);\n this.getCookies.apply(this, args);\n }\n\n serialize(cb) {\n validators.validate(validators.isFunction(cb), cb);\n let type = this.store.constructor.name;\n if (validators.isObject(type)) {\n type = null;\n }\n\n // update README.md \"Serialization Format\" if you change this, please!\n const serialized = {\n // The version of tough-cookie that serialized this jar. Generally a good\n // practice since future versions can make data import decisions based on\n // known past behavior. When/if this matters, use `semver`.\n version: `tough-cookie@${VERSION}`,\n\n // add the store type, to make humans happy:\n storeType: type,\n\n // CookieJar configuration:\n rejectPublicSuffixes: !!this.rejectPublicSuffixes,\n enableLooseMode: !!this.enableLooseMode,\n allowSpecialUseDomain: !!this.allowSpecialUseDomain,\n prefixSecurity: getNormalizedPrefixSecurity(this.prefixSecurity),\n\n // this gets filled from getAllCookies:\n cookies: []\n };\n\n if (\n !(\n this.store.getAllCookies &&\n typeof this.store.getAllCookies === \"function\"\n )\n ) {\n return cb(\n new Error(\n \"store does not support getAllCookies and cannot be serialized\"\n )\n );\n }\n\n this.store.getAllCookies((err, cookies) => {\n if (err) {\n return cb(err);\n }\n\n serialized.cookies = cookies.map(cookie => {\n // convert to serialized 'raw' cookies\n cookie = cookie instanceof Cookie ? cookie.toJSON() : cookie;\n\n // Remove the index so new ones get assigned during deserialization\n delete cookie.creationIndex;\n\n return cookie;\n });\n\n return cb(null, serialized);\n });\n }\n\n toJSON() {\n return this.serializeSync();\n }\n\n // use the class method CookieJar.deserialize instead of calling this directly\n _importCookies(serialized, cb) {\n let cookies = serialized.cookies;\n if (!cookies || !Array.isArray(cookies)) {\n return cb(new Error(\"serialized jar has no cookies array\"));\n }\n cookies = cookies.slice(); // do not modify the original\n\n const putNext = err => {\n if (err) {\n return cb(err);\n }\n\n if (!cookies.length) {\n return cb(err, this);\n }\n\n let cookie;\n try {\n cookie = fromJSON(cookies.shift());\n } catch (e) {\n return cb(e);\n }\n\n if (cookie === null) {\n return putNext(null); // skip this cookie\n }\n\n this.store.putCookie(cookie, putNext);\n };\n\n putNext();\n }\n\n clone(newStore, cb) {\n if (arguments.length === 1) {\n cb = newStore;\n newStore = null;\n }\n\n this.serialize((err, serialized) => {\n if (err) {\n return cb(err);\n }\n CookieJar.deserialize(serialized, newStore, cb);\n });\n }\n\n cloneSync(newStore) {\n if (arguments.length === 0) {\n return this._cloneSync();\n }\n if (!newStore.synchronous) {\n throw new Error(\n \"CookieJar clone destination store is not synchronous; use async API instead.\"\n );\n }\n return this._cloneSync(newStore);\n }\n\n removeAllCookies(cb) {\n validators.validate(validators.isFunction(cb), cb);\n const store = this.store;\n\n // Check that the store implements its own removeAllCookies(). The default\n // implementation in Store will immediately call the callback with a \"not\n // implemented\" Error.\n if (\n typeof store.removeAllCookies === \"function\" &&\n store.removeAllCookies !== Store.prototype.removeAllCookies\n ) {\n return store.removeAllCookies(cb);\n }\n\n store.getAllCookies((err, cookies) => {\n if (err) {\n return cb(err);\n }\n\n if (cookies.length === 0) {\n return cb(null);\n }\n\n let completedCount = 0;\n const removeErrors = [];\n\n function removeCookieCb(removeErr) {\n if (removeErr) {\n removeErrors.push(removeErr);\n }\n\n completedCount++;\n\n if (completedCount === cookies.length) {\n return cb(removeErrors.length ? removeErrors[0] : null);\n }\n }\n\n cookies.forEach(cookie => {\n store.removeCookie(\n cookie.domain,\n cookie.path,\n cookie.key,\n removeCookieCb\n );\n });\n });\n }\n\n static deserialize(strOrObj, store, cb) {\n if (arguments.length !== 3) {\n // store is optional\n cb = store;\n store = null;\n }\n validators.validate(validators.isFunction(cb), cb);\n\n let serialized;\n if (typeof strOrObj === \"string\") {\n serialized = jsonParse(strOrObj);\n if (serialized instanceof Error) {\n return cb(serialized);\n }\n } else {\n serialized = strOrObj;\n }\n\n const jar = new CookieJar(store, {\n rejectPublicSuffixes: serialized.rejectPublicSuffixes,\n looseMode: serialized.enableLooseMode,\n allowSpecialUseDomain: serialized.allowSpecialUseDomain,\n prefixSecurity: serialized.prefixSecurity\n });\n jar._importCookies(serialized, err => {\n if (err) {\n return cb(err);\n }\n cb(null, jar);\n });\n }\n\n static deserializeSync(strOrObj, store) {\n const serialized =\n typeof strOrObj === \"string\" ? JSON.parse(strOrObj) : strOrObj;\n const jar = new CookieJar(store, {\n rejectPublicSuffixes: serialized.rejectPublicSuffixes,\n looseMode: serialized.enableLooseMode\n });\n\n // catch this mistake early:\n if (!jar.store.synchronous) {\n throw new Error(\n \"CookieJar store is not synchronous; use async API instead.\"\n );\n }\n\n jar._importCookiesSync(serialized);\n return jar;\n }\n}\nCookieJar.fromJSON = CookieJar.deserializeSync;\n\n[\n \"_importCookies\",\n \"clone\",\n \"getCookies\",\n \"getCookieString\",\n \"getSetCookieStrings\",\n \"removeAllCookies\",\n \"serialize\",\n \"setCookie\"\n].forEach(name => {\n CookieJar.prototype[name] = fromCallback(CookieJar.prototype[name]);\n});\nCookieJar.deserialize = fromCallback(CookieJar.deserialize);\n\n// Use a closure to provide a true imperative API for synchronous stores.\nfunction syncWrap(method) {\n return function(...args) {\n if (!this.store.synchronous) {\n throw new Error(\n \"CookieJar store is not synchronous; use async API instead.\"\n );\n }\n\n let syncErr, syncResult;\n this[method](...args, (err, result) => {\n syncErr = err;\n syncResult = result;\n });\n\n if (syncErr) {\n throw syncErr;\n }\n return syncResult;\n };\n}\n\nexports.version = VERSION;\nexports.CookieJar = CookieJar;\nexports.Cookie = Cookie;\nexports.Store = Store;\nexports.MemoryCookieStore = MemoryCookieStore;\nexports.parseDate = parseDate;\nexports.formatDate = formatDate;\nexports.parse = parse;\nexports.fromJSON = fromJSON;\nexports.domainMatch = domainMatch;\nexports.defaultPath = defaultPath;\nexports.pathMatch = pathMatch;\nexports.getPublicSuffix = pubsuffix.getPublicSuffix;\nexports.cookieCompare = cookieCompare;\nexports.permuteDomain = require(\"./permuteDomain\").permuteDomain;\nexports.permutePath = permutePath;\nexports.canonicalDomain = canonicalDomain;\nexports.PrefixSecurityEnum = PrefixSecurityEnum;\nexports.ParameterError = validators.ParameterError;\n\n},{\"./memstore\":178,\"./pathMatch\":179,\"./permuteDomain\":180,\"./pubsuffix-psl\":181,\"./store\":182,\"./utilHelper\":183,\"./validators.js\":184,\"./version\":185,\"punycode/\":532,\"universalify\":186,\"url-parse\":563}],178:[function(require,module,exports){\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\nconst { fromCallback } = require(\"universalify\");\nconst Store = require(\"./store\").Store;\nconst permuteDomain = require(\"./permuteDomain\").permuteDomain;\nconst pathMatch = require(\"./pathMatch\").pathMatch;\nconst { getCustomInspectSymbol, getUtilInspect } = require(\"./utilHelper\");\n\nclass MemoryCookieStore extends Store {\n constructor() {\n super();\n this.synchronous = true;\n this.idx = {};\n const customInspectSymbol = getCustomInspectSymbol();\n if (customInspectSymbol) {\n this[customInspectSymbol] = this.inspect;\n }\n }\n\n inspect() {\n const util = { inspect: getUtilInspect(inspectFallback) };\n return `{ idx: ${util.inspect(this.idx, false, 2)} }`;\n }\n\n findCookie(domain, path, key, cb) {\n if (!this.idx[domain]) {\n return cb(null, undefined);\n }\n if (!this.idx[domain][path]) {\n return cb(null, undefined);\n }\n return cb(null, this.idx[domain][path][key] || null);\n }\n findCookies(domain, path, allowSpecialUseDomain, cb) {\n const results = [];\n if (typeof allowSpecialUseDomain === \"function\") {\n cb = allowSpecialUseDomain;\n allowSpecialUseDomain = true;\n }\n if (!domain) {\n return cb(null, []);\n }\n\n let pathMatcher;\n if (!path) {\n // null means \"all paths\"\n pathMatcher = function matchAll(domainIndex) {\n for (const curPath in domainIndex) {\n const pathIndex = domainIndex[curPath];\n for (const key in pathIndex) {\n results.push(pathIndex[key]);\n }\n }\n };\n } else {\n pathMatcher = function matchRFC(domainIndex) {\n //NOTE: we should use path-match algorithm from S5.1.4 here\n //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)\n Object.keys(domainIndex).forEach(cookiePath => {\n if (pathMatch(path, cookiePath)) {\n const pathIndex = domainIndex[cookiePath];\n for (const key in pathIndex) {\n results.push(pathIndex[key]);\n }\n }\n });\n };\n }\n\n const domains = permuteDomain(domain, allowSpecialUseDomain) || [domain];\n const idx = this.idx;\n domains.forEach(curDomain => {\n const domainIndex = idx[curDomain];\n if (!domainIndex) {\n return;\n }\n pathMatcher(domainIndex);\n });\n\n cb(null, results);\n }\n\n putCookie(cookie, cb) {\n if (!this.idx[cookie.domain]) {\n this.idx[cookie.domain] = {};\n }\n if (!this.idx[cookie.domain][cookie.path]) {\n this.idx[cookie.domain][cookie.path] = {};\n }\n this.idx[cookie.domain][cookie.path][cookie.key] = cookie;\n cb(null);\n }\n updateCookie(oldCookie, newCookie, cb) {\n // updateCookie() may avoid updating cookies that are identical. For example,\n // lastAccessed may not be important to some stores and an equality\n // comparison could exclude that field.\n this.putCookie(newCookie, cb);\n }\n removeCookie(domain, path, key, cb) {\n if (\n this.idx[domain] &&\n this.idx[domain][path] &&\n this.idx[domain][path][key]\n ) {\n delete this.idx[domain][path][key];\n }\n cb(null);\n }\n removeCookies(domain, path, cb) {\n if (this.idx[domain]) {\n if (path) {\n delete this.idx[domain][path];\n } else {\n delete this.idx[domain];\n }\n }\n return cb(null);\n }\n removeAllCookies(cb) {\n this.idx = {};\n return cb(null);\n }\n getAllCookies(cb) {\n const cookies = [];\n const idx = this.idx;\n\n const domains = Object.keys(idx);\n domains.forEach(domain => {\n const paths = Object.keys(idx[domain]);\n paths.forEach(path => {\n const keys = Object.keys(idx[domain][path]);\n keys.forEach(key => {\n if (key !== null) {\n cookies.push(idx[domain][path][key]);\n }\n });\n });\n });\n\n // Sort by creationIndex so deserializing retains the creation order.\n // When implementing your own store, this SHOULD retain the order too\n cookies.sort((a, b) => {\n return (a.creationIndex || 0) - (b.creationIndex || 0);\n });\n\n cb(null, cookies);\n }\n}\n\n[\n \"findCookie\",\n \"findCookies\",\n \"putCookie\",\n \"updateCookie\",\n \"removeCookie\",\n \"removeCookies\",\n \"removeAllCookies\",\n \"getAllCookies\"\n].forEach(name => {\n MemoryCookieStore.prototype[name] = fromCallback(\n MemoryCookieStore.prototype[name]\n );\n});\n\nexports.MemoryCookieStore = MemoryCookieStore;\n\nfunction inspectFallback(val) {\n const domains = Object.keys(val);\n if (domains.length === 0) {\n return \"{}\";\n }\n let result = \"{\\n\";\n Object.keys(val).forEach((domain, i) => {\n result += formatDomain(domain, val[domain]);\n if (i < domains.length - 1) {\n result += \",\";\n }\n result += \"\\n\";\n });\n result += \"}\";\n return result;\n}\n\nfunction formatDomain(domainName, domainValue) {\n const indent = \" \";\n let result = `${indent}'${domainName}': {\\n`;\n Object.keys(domainValue).forEach((path, i, paths) => {\n result += formatPath(path, domainValue[path]);\n if (i < paths.length - 1) {\n result += \",\";\n }\n result += \"\\n\";\n });\n result += `${indent}}`;\n return result;\n}\n\nfunction formatPath(pathName, pathValue) {\n const indent = \" \";\n let result = `${indent}'${pathName}': {\\n`;\n Object.keys(pathValue).forEach((cookieName, i, cookieNames) => {\n const cookie = pathValue[cookieName];\n result += ` ${cookieName}: ${cookie.inspect()}`;\n if (i < cookieNames.length - 1) {\n result += \",\";\n }\n result += \"\\n\";\n });\n result += `${indent}}`;\n return result;\n}\n\nexports.inspectFallback = inspectFallback;\n\n},{\"./pathMatch\":179,\"./permuteDomain\":180,\"./store\":182,\"./utilHelper\":183,\"universalify\":186}],179:[function(require,module,exports){\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\n/*\n * \"A request-path path-matches a given cookie-path if at least one of the\n * following conditions holds:\"\n */\nfunction pathMatch(reqPath, cookiePath) {\n // \"o The cookie-path and the request-path are identical.\"\n if (cookiePath === reqPath) {\n return true;\n }\n\n const idx = reqPath.indexOf(cookiePath);\n if (idx === 0) {\n // \"o The cookie-path is a prefix of the request-path, and the last\n // character of the cookie-path is %x2F (\"/\").\"\n if (cookiePath.substr(-1) === \"/\") {\n return true;\n }\n\n // \" o The cookie-path is a prefix of the request-path, and the first\n // character of the request-path that is not included in the cookie- path\n // is a %x2F (\"/\") character.\"\n if (reqPath.substr(cookiePath.length, 1) === \"/\") {\n return true;\n }\n }\n\n return false;\n}\n\nexports.pathMatch = pathMatch;\n\n},{}],180:[function(require,module,exports){\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\nconst pubsuffix = require(\"./pubsuffix-psl\");\n\n// Gives the permutation of all possible domainMatch()es of a given domain. The\n// array is in shortest-to-longest order. Handy for indexing.\n\nfunction permuteDomain(domain, allowSpecialUseDomain) {\n const pubSuf = pubsuffix.getPublicSuffix(domain, {\n allowSpecialUseDomain: allowSpecialUseDomain\n });\n\n if (!pubSuf) {\n return null;\n }\n if (pubSuf == domain) {\n return [domain];\n }\n\n // Nuke trailing dot\n if (domain.slice(-1) == \".\") {\n domain = domain.slice(0, -1);\n }\n\n const prefix = domain.slice(0, -(pubSuf.length + 1)); // \".example.com\"\n const parts = prefix.split(\".\").reverse();\n let cur = pubSuf;\n const permutations = [cur];\n while (parts.length) {\n cur = `${parts.shift()}.${cur}`;\n permutations.push(cur);\n }\n return permutations;\n}\n\nexports.permuteDomain = permuteDomain;\n\n},{\"./pubsuffix-psl\":181}],181:[function(require,module,exports){\n/*!\n * Copyright (c) 2018, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\nconst psl = require(\"psl\");\n\n// RFC 6761\nconst SPECIAL_USE_DOMAINS = [\n \"local\",\n \"example\",\n \"invalid\",\n \"localhost\",\n \"test\"\n];\n\nconst SPECIAL_TREATMENT_DOMAINS = [\"localhost\", \"invalid\"];\n\nfunction getPublicSuffix(domain, options = {}) {\n const domainParts = domain.split(\".\");\n const topLevelDomain = domainParts[domainParts.length - 1];\n const allowSpecialUseDomain = !!options.allowSpecialUseDomain;\n const ignoreError = !!options.ignoreError;\n\n if (allowSpecialUseDomain && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) {\n if (domainParts.length > 1) {\n const secondLevelDomain = domainParts[domainParts.length - 2];\n // In aforementioned example, the eTLD/pubSuf will be apple.localhost\n return `${secondLevelDomain}.${topLevelDomain}`;\n } else if (SPECIAL_TREATMENT_DOMAINS.includes(topLevelDomain)) {\n // For a single word special use domain, e.g. 'localhost' or 'invalid', per RFC 6761,\n // \"Application software MAY recognize {localhost/invalid} names as special, or\n // MAY pass them to name resolution APIs as they would for other domain names.\"\n return `${topLevelDomain}`;\n }\n }\n\n if (!ignoreError && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) {\n throw new Error(\n `Cookie has domain set to the public suffix \"${topLevelDomain}\" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain:true, rejectPublicSuffixes: false}.`\n );\n }\n\n return psl.get(domain);\n}\n\nexports.getPublicSuffix = getPublicSuffix;\n\n},{\"psl\":531}],182:[function(require,module,exports){\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. 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 *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\"use strict\";\n/*jshint unused:false */\n\nclass Store {\n constructor() {\n this.synchronous = false;\n }\n\n findCookie(domain, path, key, cb) {\n throw new Error(\"findCookie is not implemented\");\n }\n\n findCookies(domain, path, allowSpecialUseDomain, cb) {\n throw new Error(\"findCookies is not implemented\");\n }\n\n putCookie(cookie, cb) {\n throw new Error(\"putCookie is not implemented\");\n }\n\n updateCookie(oldCookie, newCookie, cb) {\n // recommended default implementation:\n // return this.putCookie(newCookie, cb);\n throw new Error(\"updateCookie is not implemented\");\n }\n\n removeCookie(domain, path, key, cb) {\n throw new Error(\"removeCookie is not implemented\");\n }\n\n removeCookies(domain, path, cb) {\n throw new Error(\"removeCookies is not implemented\");\n }\n\n removeAllCookies(cb) {\n throw new Error(\"removeAllCookies is not implemented\");\n }\n\n getAllCookies(cb) {\n throw new Error(\n \"getAllCookies is not implemented (therefore jar cannot be serialized)\"\n );\n }\n}\n\nexports.Store = Store;\n\n},{}],183:[function(require,module,exports){\nfunction requireUtil() {\n try {\n // eslint-disable-next-line no-restricted-modules\n return require(\"util\");\n } catch (e) {\n return null;\n }\n}\n\n// for v10.12.0+\nfunction lookupCustomInspectSymbol() {\n return Symbol.for(\"nodejs.util.inspect.custom\");\n}\n\n// for older node environments\nfunction tryReadingCustomSymbolFromUtilInspect(options) {\n const _requireUtil = options.requireUtil || requireUtil;\n const util = _requireUtil();\n return util ? util.inspect.custom : null;\n}\n\nexports.getUtilInspect = function getUtilInspect(fallback, options = {}) {\n const _requireUtil = options.requireUtil || requireUtil;\n const util = _requireUtil();\n return function inspect(value, showHidden, depth) {\n return util ? util.inspect(value, showHidden, depth) : fallback(value);\n };\n};\n\nexports.getCustomInspectSymbol = function getCustomInspectSymbol(options = {}) {\n const _lookupCustomInspectSymbol =\n options.lookupCustomInspectSymbol || lookupCustomInspectSymbol;\n\n // get custom inspect symbol for node environments\n return (\n _lookupCustomInspectSymbol() ||\n tryReadingCustomSymbolFromUtilInspect(options)\n );\n};\n\n},{\"util\":\"util\"}],184:[function(require,module,exports){\n/* ************************************************************************************\nExtracted from check-types.js\nhttps://gitlab.com/philbooth/check-types.js\n\nMIT License\n\nCopyright (c) 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Phil Booth\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n************************************************************************************ */\n\"use strict\";\n\n/* Validation functions copied from check-types package - https://www.npmjs.com/package/check-types */\nfunction isFunction(data) {\n return typeof data === \"function\";\n}\n\nfunction isNonEmptyString(data) {\n return isString(data) && data !== \"\";\n}\n\nfunction isDate(data) {\n return isInstanceStrict(data, Date) && isInteger(data.getTime());\n}\n\nfunction isEmptyString(data) {\n return data === \"\" || (data instanceof String && data.toString() === \"\");\n}\n\nfunction isString(data) {\n return typeof data === \"string\" || data instanceof String;\n}\n\nfunction isObject(data) {\n return toString.call(data) === \"[object Object]\";\n}\nfunction isInstanceStrict(data, prototype) {\n try {\n return data instanceof prototype;\n } catch (error) {\n return false;\n }\n}\n\nfunction isUrlStringOrObject(data) {\n return (\n isNonEmptyString(data) ||\n isObject(data) || // TODO: Check for URL properties that are used.\n isInstanceStrict(data, URL)\n );\n}\n\nfunction isInteger(data) {\n return typeof data === \"number\" && data % 1 === 0;\n}\n/* End validation functions */\n\nfunction validate(bool, cb, options) {\n if (!isFunction(cb)) {\n options = cb;\n cb = null;\n }\n if (!isObject(options)) options = { Error: \"Failed Check\" };\n if (!bool) {\n if (cb) {\n cb(new ParameterError(options));\n } else {\n throw new ParameterError(options);\n }\n }\n}\n\nclass ParameterError extends Error {\n constructor(...params) {\n super(...params);\n }\n}\n\nexports.ParameterError = ParameterError;\nexports.isFunction = isFunction;\nexports.isNonEmptyString = isNonEmptyString;\nexports.isDate = isDate;\nexports.isEmptyString = isEmptyString;\nexports.isString = isString;\nexports.isObject = isObject;\nexports.isUrlStringOrObject = isUrlStringOrObject;\nexports.validate = validate;\n\n},{}],185:[function(require,module,exports){\n// generated by genversion\nmodule.exports = '4.1.2-postman.1'\n\n},{}],186:[function(require,module,exports){\n'use strict'\n\nexports.fromCallback = function (fn) {\n return Object.defineProperty(function () {\n if (typeof arguments[arguments.length - 1] === 'function') fn.apply(this, arguments)\n else {\n return new Promise((resolve, reject) => {\n arguments[arguments.length] = (err, res) => {\n if (err) return reject(err)\n resolve(res)\n }\n arguments.length++\n fn.apply(this, arguments)\n })\n }\n }, 'name', { value: fn.name })\n}\n\nexports.fromPromise = function (fn) {\n return Object.defineProperty(function () {\n const cb = arguments[arguments.length - 1]\n if (typeof cb !== 'function') return fn.apply(this, arguments)\n else {\n delete arguments[arguments.length - 1]\n arguments.length--\n fn.apply(this, arguments).then(r => cb(null, r), cb)\n }\n }, 'name', { value: fn.name })\n}\n\n},{}],187:[function(require,module,exports){\n'use strict';\n\n\nvar Cache = module.exports = function Cache() {\n this._cache = {};\n};\n\n\nCache.prototype.put = function Cache_put(key, value) {\n this._cache[key] = value;\n};\n\n\nCache.prototype.get = function Cache_get(key) {\n return this._cache[key];\n};\n\n\nCache.prototype.del = function Cache_del(key) {\n delete this._cache[key];\n};\n\n\nCache.prototype.clear = function Cache_clear() {\n this._cache = {};\n};\n\n},{}],188:[function(require,module,exports){\n'use strict';\n\nvar MissingRefError = require('./error_classes').MissingRef;\n\nmodule.exports = compileAsync;\n\n\n/**\n * Creates validating function for passed schema with asynchronous loading of missing schemas.\n * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped\n * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.\n * @return {Promise} promise that resolves with a validating function.\n */\nfunction compileAsync(schema, meta, callback) {\n /* eslint no-shadow: 0 */\n /* global Promise */\n /* jshint validthis: true */\n var self = this;\n if (typeof this._opts.loadSchema != 'function')\n throw new Error('options.loadSchema should be a function');\n\n if (typeof meta == 'function') {\n callback = meta;\n meta = undefined;\n }\n\n var p = loadMetaSchemaOf(schema).then(function () {\n var schemaObj = self._addSchema(schema, undefined, meta);\n return schemaObj.validate || _compileAsync(schemaObj);\n });\n\n if (callback) {\n p.then(\n function(v) { callback(null, v); },\n callback\n );\n }\n\n return p;\n\n\n function loadMetaSchemaOf(sch) {\n var $schema = sch.$schema;\n return $schema && !self.getSchema($schema)\n ? compileAsync.call(self, { $ref: $schema }, true)\n : Promise.resolve();\n }\n\n\n function _compileAsync(schemaObj) {\n try { return self._compile(schemaObj); }\n catch(e) {\n if (e instanceof MissingRefError) return loadMissingSchema(e);\n throw e;\n }\n\n\n function loadMissingSchema(e) {\n var ref = e.missingSchema;\n if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');\n\n var schemaPromise = self._loadingSchemas[ref];\n if (!schemaPromise) {\n schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);\n schemaPromise.then(removePromise, removePromise);\n }\n\n return schemaPromise.then(function (sch) {\n if (!added(ref)) {\n return loadMetaSchemaOf(sch).then(function () {\n if (!added(ref)) self.addSchema(sch, ref, undefined, meta);\n });\n }\n }).then(function() {\n return _compileAsync(schemaObj);\n });\n\n function removePromise() {\n delete self._loadingSchemas[ref];\n }\n\n function added(ref) {\n return self._refs[ref] || self._schemas[ref];\n }\n }\n }\n}\n\n},{\"./error_classes\":189}],189:[function(require,module,exports){\n'use strict';\n\nvar resolve = require('./resolve');\n\nmodule.exports = {\n Validation: errorSubclass(ValidationError),\n MissingRef: errorSubclass(MissingRefError)\n};\n\n\nfunction ValidationError(errors) {\n this.message = 'validation failed';\n this.errors = errors;\n this.ajv = this.validation = true;\n}\n\n\nMissingRefError.message = function (baseId, ref) {\n return 'can\\'t resolve reference ' + ref + ' from id ' + baseId;\n};\n\n\nfunction MissingRefError(baseId, ref, message) {\n this.message = message || MissingRefError.message(baseId, ref);\n this.missingRef = resolve.url(baseId, ref);\n this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));\n}\n\n\nfunction errorSubclass(Subclass) {\n Subclass.prototype = Object.create(Error.prototype);\n Subclass.prototype.constructor = Subclass;\n return Subclass;\n}\n\n},{\"./resolve\":192}],190:[function(require,module,exports){\n'use strict';\n\nvar util = require('./util');\n\nvar DATE = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/;\nvar DAYS = [0,31,28,31,30,31,30,31,31,30,31,30,31];\nvar TIME = /^(\\d\\d):(\\d\\d):(\\d\\d)(\\.\\d+)?(z|[+-]\\d\\d(?::?\\d\\d)?)?$/i;\nvar HOSTNAME = /^(?=.{1,253}\\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\\.?$/i;\nvar URI = /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;\nvar URIREF = /^(?:[a-z][a-z0-9+\\-.]*:)?(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'\"()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\\?(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;\n// uri-template: https://tools.ietf.org/html/rfc6570\nvar URITEMPLATE = /^(?:(?:[^\\x00-\\x20\"'<>%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i;\n// For the source: https://gist.github.com/dperini/729294\n// For test cases: https://mathiasbynens.be/demo/url-regex\n// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.\n// var URL = /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu;\nvar URL = /^(?:(?:http[s\\u017F]?|ftp):\\/\\/)(?:(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+(?::(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?@)?(?:(?!10(?:\\.[0-9]{1,3}){3})(?!127(?:\\.[0-9]{1,3}){3})(?!169\\.254(?:\\.[0-9]{1,3}){2})(?!192\\.168(?:\\.[0-9]{1,3}){2})(?!172\\.(?:1[6-9]|2[0-9]|3[01])(?:\\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)(?:\\.(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)*(?:\\.(?:(?:[KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\\/(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?$/i;\nvar UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;\nvar JSON_POINTER = /^(?:\\/(?:[^~/]|~0|~1)*)*$/;\nvar JSON_POINTER_URI_FRAGMENT = /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;\nvar RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/;\n\n\nmodule.exports = formats;\n\nfunction formats(mode) {\n mode = mode == 'full' ? 'full' : 'fast';\n return util.copy(formats[mode]);\n}\n\n\nformats.fast = {\n // date: http://tools.ietf.org/html/rfc3339#section-5.6\n date: /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/,\n // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n time: /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i,\n 'date-time': /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s](?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i,\n // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n uri: /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/)?[^\\s]*$/i,\n 'uri-reference': /^(?:(?:[a-z][a-z0-9+\\-.]*:)?\\/?\\/)?(?:[^\\\\\\s#][^\\s#]*)?(?:#[^\\\\\\s]*)?$/i,\n 'uri-template': URITEMPLATE,\n url: URL,\n // email (sources from jsen validator):\n // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363\n // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')\n email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,\n hostname: HOSTNAME,\n // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n // uuid: http://tools.ietf.org/html/rfc4122\n uuid: UUID,\n // JSON-pointer: https://tools.ietf.org/html/rfc6901\n // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nformats.full = {\n date: date,\n time: time,\n 'date-time': date_time,\n uri: uri,\n 'uri-reference': URIREF,\n 'uri-template': URITEMPLATE,\n url: URL,\n email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n hostname: HOSTNAME,\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n regex: regex,\n uuid: UUID,\n 'json-pointer': JSON_POINTER,\n 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT,\n 'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nfunction isLeapYear(year) {\n // https://tools.ietf.org/html/rfc3339#appendix-C\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\n\nfunction date(str) {\n // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n var matches = str.match(DATE);\n if (!matches) return false;\n\n var year = +matches[1];\n var month = +matches[2];\n var day = +matches[3];\n\n return month >= 1 && month <= 12 && day >= 1 &&\n day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]);\n}\n\n\nfunction time(str, full) {\n var matches = str.match(TIME);\n if (!matches) return false;\n\n var hour = matches[1];\n var minute = matches[2];\n var second = matches[3];\n var timeZone = matches[5];\n return ((hour <= 23 && minute <= 59 && second <= 59) ||\n (hour == 23 && minute == 59 && second == 60)) &&\n (!full || timeZone);\n}\n\n\nvar DATE_TIME_SEPARATOR = /t|\\s/i;\nfunction date_time(str) {\n // http://tools.ietf.org/html/rfc3339#section-5.6\n var dateTime = str.split(DATE_TIME_SEPARATOR);\n return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);\n}\n\n\nvar NOT_URI_FRAGMENT = /\\/|:/;\nfunction uri(str) {\n // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n return NOT_URI_FRAGMENT.test(str) && URI.test(str);\n}\n\n\nvar Z_ANCHOR = /[^\\\\]\\\\Z/;\nfunction regex(str) {\n if (Z_ANCHOR.test(str)) return false;\n try {\n new RegExp(str);\n return true;\n } catch(e) {\n return false;\n }\n}\n\n},{\"./util\":196}],191:[function(require,module,exports){\n'use strict';\n\nvar resolve = require('./resolve')\n , util = require('./util')\n , errorClasses = require('./error_classes')\n , stableStringify = require('fast-json-stable-stringify');\n\nvar validateGenerator = require('../dotjs/validate');\n\n/**\n * Functions below are used inside compiled validations function\n */\n\nvar ucs2length = util.ucs2length;\nvar equal = require('fast-deep-equal');\n\n// this error is thrown by async schemas to return validation errors via exception\nvar ValidationError = errorClasses.Validation;\n\nmodule.exports = compile;\n\n\n/**\n * Compiles schema to validation function\n * @this Ajv\n * @param {Object} schema schema object\n * @param {Object} root object with information about the root schema for this schema\n * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution\n * @param {String} baseId base ID for IDs in the schema\n * @return {Function} validation function\n */\nfunction compile(schema, root, localRefs, baseId) {\n /* jshint validthis: true, evil: true */\n /* eslint no-shadow: 0 */\n var self = this\n , opts = this._opts\n , refVal = [ undefined ]\n , refs = {}\n , patterns = []\n , patternsHash = {}\n , defaults = []\n , defaultsHash = {}\n , customRules = [];\n\n root = root || { schema: schema, refVal: refVal, refs: refs };\n\n var c = checkCompiling.call(this, schema, root, baseId);\n var compilation = this._compilations[c.index];\n if (c.compiling) return (compilation.callValidate = callValidate);\n\n var formats = this._formats;\n var RULES = this.RULES;\n\n try {\n var v = localCompile(schema, root, localRefs, baseId);\n compilation.validate = v;\n var cv = compilation.callValidate;\n if (cv) {\n cv.schema = v.schema;\n cv.errors = null;\n cv.refs = v.refs;\n cv.refVal = v.refVal;\n cv.root = v.root;\n cv.$async = v.$async;\n if (opts.sourceCode) cv.source = v.source;\n }\n return v;\n } finally {\n endCompiling.call(this, schema, root, baseId);\n }\n\n /* @this {*} - custom context, see passContext option */\n function callValidate() {\n /* jshint validthis: true */\n var validate = compilation.validate;\n var result = validate.apply(this, arguments);\n callValidate.errors = validate.errors;\n return result;\n }\n\n function localCompile(_schema, _root, localRefs, baseId) {\n var isRoot = !_root || (_root && _root.schema == _schema);\n if (_root.schema != root.schema)\n return compile.call(self, _schema, _root, localRefs, baseId);\n\n var $async = _schema.$async === true;\n\n var sourceCode = validateGenerator({\n isTop: true,\n schema: _schema,\n isRoot: isRoot,\n baseId: baseId,\n root: _root,\n schemaPath: '',\n errSchemaPath: '#',\n errorPath: '\"\"',\n MissingRefError: errorClasses.MissingRef,\n RULES: RULES,\n validate: validateGenerator,\n util: util,\n resolve: resolve,\n resolveRef: resolveRef,\n usePattern: usePattern,\n useDefault: useDefault,\n useCustomRule: useCustomRule,\n opts: opts,\n formats: formats,\n logger: self.logger,\n self: self\n });\n\n sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)\n + vars(defaults, defaultCode) + vars(customRules, customRuleCode)\n + sourceCode;\n\n if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema);\n // console.log('\\n\\n\\n *** \\n', JSON.stringify(sourceCode));\n var validate;\n try {\n var makeValidate = new Function(\n 'self',\n 'RULES',\n 'formats',\n 'root',\n 'refVal',\n 'defaults',\n 'customRules',\n 'equal',\n 'ucs2length',\n 'ValidationError',\n sourceCode\n );\n\n validate = makeValidate(\n self,\n RULES,\n formats,\n root,\n refVal,\n defaults,\n customRules,\n equal,\n ucs2length,\n ValidationError\n );\n\n refVal[0] = validate;\n } catch(e) {\n self.logger.error('Error compiling schema, function code:', sourceCode);\n throw e;\n }\n\n validate.schema = _schema;\n validate.errors = null;\n validate.refs = refs;\n validate.refVal = refVal;\n validate.root = isRoot ? validate : _root;\n if ($async) validate.$async = true;\n if (opts.sourceCode === true) {\n validate.source = {\n code: sourceCode,\n patterns: patterns,\n defaults: defaults\n };\n }\n\n return validate;\n }\n\n function resolveRef(baseId, ref, isRoot) {\n ref = resolve.url(baseId, ref);\n var refIndex = refs[ref];\n var _refVal, refCode;\n if (refIndex !== undefined) {\n _refVal = refVal[refIndex];\n refCode = 'refVal[' + refIndex + ']';\n return resolvedRef(_refVal, refCode);\n }\n if (!isRoot && root.refs) {\n var rootRefId = root.refs[ref];\n if (rootRefId !== undefined) {\n _refVal = root.refVal[rootRefId];\n refCode = addLocalRef(ref, _refVal);\n return resolvedRef(_refVal, refCode);\n }\n }\n\n refCode = addLocalRef(ref);\n var v = resolve.call(self, localCompile, root, ref);\n if (v === undefined) {\n var localSchema = localRefs && localRefs[ref];\n if (localSchema) {\n v = resolve.inlineRef(localSchema, opts.inlineRefs)\n ? localSchema\n : compile.call(self, localSchema, root, localRefs, baseId);\n }\n }\n\n if (v === undefined) {\n removeLocalRef(ref);\n } else {\n replaceLocalRef(ref, v);\n return resolvedRef(v, refCode);\n }\n }\n\n function addLocalRef(ref, v) {\n var refId = refVal.length;\n refVal[refId] = v;\n refs[ref] = refId;\n return 'refVal' + refId;\n }\n\n function removeLocalRef(ref) {\n delete refs[ref];\n }\n\n function replaceLocalRef(ref, v) {\n var refId = refs[ref];\n refVal[refId] = v;\n }\n\n function resolvedRef(refVal, code) {\n return typeof refVal == 'object' || typeof refVal == 'boolean'\n ? { code: code, schema: refVal, inline: true }\n : { code: code, $async: refVal && !!refVal.$async };\n }\n\n function usePattern(regexStr) {\n var index = patternsHash[regexStr];\n if (index === undefined) {\n index = patternsHash[regexStr] = patterns.length;\n patterns[index] = regexStr;\n }\n return 'pattern' + index;\n }\n\n function useDefault(value) {\n switch (typeof value) {\n case 'boolean':\n case 'number':\n return '' + value;\n case 'string':\n return util.toQuotedString(value);\n case 'object':\n if (value === null) return 'null';\n var valueStr = stableStringify(value);\n var index = defaultsHash[valueStr];\n if (index === undefined) {\n index = defaultsHash[valueStr] = defaults.length;\n defaults[index] = value;\n }\n return 'default' + index;\n }\n }\n\n function useCustomRule(rule, schema, parentSchema, it) {\n if (self._opts.validateSchema !== false) {\n var deps = rule.definition.dependencies;\n if (deps && !deps.every(function(keyword) {\n return Object.prototype.hasOwnProperty.call(parentSchema, keyword);\n }))\n throw new Error('parent schema must have all required keywords: ' + deps.join(','));\n\n var validateSchema = rule.definition.validateSchema;\n if (validateSchema) {\n var valid = validateSchema(schema);\n if (!valid) {\n var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);\n if (self._opts.validateSchema == 'log') self.logger.error(message);\n else throw new Error(message);\n }\n }\n }\n\n var compile = rule.definition.compile\n , inline = rule.definition.inline\n , macro = rule.definition.macro;\n\n var validate;\n if (compile) {\n validate = compile.call(self, schema, parentSchema, it);\n } else if (macro) {\n validate = macro.call(self, schema, parentSchema, it);\n if (opts.validateSchema !== false) self.validateSchema(validate, true);\n } else if (inline) {\n validate = inline.call(self, it, rule.keyword, schema, parentSchema);\n } else {\n validate = rule.definition.validate;\n if (!validate) return;\n }\n\n if (validate === undefined)\n throw new Error('custom keyword \"' + rule.keyword + '\"failed to compile');\n\n var index = customRules.length;\n customRules[index] = validate;\n\n return {\n code: 'customRule' + index,\n validate: validate\n };\n }\n}\n\n\n/**\n * Checks if the schema is currently compiled\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Object} object with properties \"index\" (compilation index) and \"compiling\" (boolean)\n */\nfunction checkCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var index = compIndex.call(this, schema, root, baseId);\n if (index >= 0) return { index: index, compiling: true };\n index = this._compilations.length;\n this._compilations[index] = {\n schema: schema,\n root: root,\n baseId: baseId\n };\n return { index: index, compiling: false };\n}\n\n\n/**\n * Removes the schema from the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n */\nfunction endCompiling(schema, root, baseId) {\n /* jshint validthis: true */\n var i = compIndex.call(this, schema, root, baseId);\n if (i >= 0) this._compilations.splice(i, 1);\n}\n\n\n/**\n * Index of schema compilation in the currently compiled list\n * @this Ajv\n * @param {Object} schema schema to compile\n * @param {Object} root root object\n * @param {String} baseId base schema ID\n * @return {Integer} compilation index\n */\nfunction compIndex(schema, root, baseId) {\n /* jshint validthis: true */\n for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos);\n if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate\n }\n }\n return length;\n};\n\n},{}],196:[function(require,module,exports){\n'use strict';\n\n\nmodule.exports = {\n copy: copy,\n checkDataType: checkDataType,\n checkDataTypes: checkDataTypes,\n coerceToTypes: coerceToTypes,\n toHash: toHash,\n getProperty: getProperty,\n escapeQuotes: escapeQuotes,\n equal: require('fast-deep-equal'),\n ucs2length: require('./ucs2length'),\n varOccurences: varOccurences,\n varReplace: varReplace,\n schemaHasRules: schemaHasRules,\n schemaHasRulesExcept: schemaHasRulesExcept,\n schemaUnknownRules: schemaUnknownRules,\n toQuotedString: toQuotedString,\n getPathExpr: getPathExpr,\n getPath: getPath,\n getData: getData,\n unescapeFragment: unescapeFragment,\n unescapeJsonPointer: unescapeJsonPointer,\n escapeFragment: escapeFragment,\n escapeJsonPointer: escapeJsonPointer\n};\n\n\nfunction copy(o, to) {\n to = to || {};\n for (var key in o) to[key] = o[key];\n return to;\n}\n\n\nfunction checkDataType(dataType, data, strictNumbers, negate) {\n var EQUAL = negate ? ' !== ' : ' === '\n , AND = negate ? ' || ' : ' && '\n , OK = negate ? '!' : ''\n , NOT = negate ? '' : '!';\n switch (dataType) {\n case 'null': return data + EQUAL + 'null';\n case 'array': return OK + 'Array.isArray(' + data + ')';\n case 'object': return '(' + OK + data + AND +\n 'typeof ' + data + EQUAL + '\"object\"' + AND +\n NOT + 'Array.isArray(' + data + '))';\n case 'integer': return '(typeof ' + data + EQUAL + '\"number\"' + AND +\n NOT + '(' + data + ' % 1)' +\n AND + data + EQUAL + data +\n (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';\n case 'number': return '(typeof ' + data + EQUAL + '\"' + dataType + '\"' +\n (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')';\n default: return 'typeof ' + data + EQUAL + '\"' + dataType + '\"';\n }\n}\n\n\nfunction checkDataTypes(dataTypes, data, strictNumbers) {\n switch (dataTypes.length) {\n case 1: return checkDataType(dataTypes[0], data, strictNumbers, true);\n default:\n var code = '';\n var types = toHash(dataTypes);\n if (types.array && types.object) {\n code = types.null ? '(': '(!' + data + ' || ';\n code += 'typeof ' + data + ' !== \"object\")';\n delete types.null;\n delete types.array;\n delete types.object;\n }\n if (types.number) delete types.integer;\n for (var t in types)\n code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true);\n\n return code;\n }\n}\n\n\nvar COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);\nfunction coerceToTypes(optionCoerceTypes, dataTypes) {\n if (Array.isArray(dataTypes)) {\n var types = [];\n for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n return paths[lvl - up];\n }\n\n if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n data = 'data' + ((lvl - up) || '');\n if (!jsonPointer) return data;\n }\n\n var expr = data;\n var segments = jsonPointer.split('/');\n for (var i=0; i',\n $notOp = $isMax ? '>' : '<',\n $errorKeyword = undefined;\n if (!($isData || typeof $schema == 'number' || $schema === undefined)) {\n throw new Error($keyword + ' must be number');\n }\n if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) {\n throw new Error($exclusiveKeyword + ' must be number or boolean');\n }\n if ($isDataExcl) {\n var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n $exclusive = 'exclusive' + $lvl,\n $exclType = 'exclType' + $lvl,\n $exclIsNumber = 'exclIsNumber' + $lvl,\n $opExpr = 'op' + $lvl,\n $opStr = '\\' + ' + $opExpr + ' + \\'';\n out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n $schemaValueExcl = 'schemaExcl' + $lvl;\n out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \\'boolean\\' && ' + ($exclType) + ' != \\'undefined\\' && ' + ($exclType) + ' != \\'number\\') { ';\n var $errorKeyword = $exclusiveKeyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($exclType) + ' == \\'number\\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\'; ';\n if ($schema === undefined) {\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaValueExcl;\n $isData = $isDataExcl;\n }\n } else {\n var $exclIsNumber = typeof $schemaExcl == 'number',\n $opStr = $op;\n if ($exclIsNumber && $isData) {\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';\n } else {\n if ($exclIsNumber && $schema === undefined) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $schemaValue = $schemaExcl;\n $notOp += '=';\n } else {\n if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);\n if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {\n $exclusive = true;\n $errorKeyword = $exclusiveKeyword;\n $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n $notOp += '=';\n } else {\n $exclusive = false;\n $opStr += '=';\n }\n }\n var $opExpr = '\\'' + $opStr + '\\'';\n out += ' if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';\n }\n }\n $errorKeyword = $errorKeyword || $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ' + ($opStr) + ' ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],200:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate__limitItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!($isData || typeof $schema == 'number')) {\n throw new Error($keyword + ' must be number');\n }\n var $op = $keyword == 'maxItems' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxItems') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],201:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate__limitLength(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!($isData || typeof $schema == 'number')) {\n throw new Error($keyword + ' must be number');\n }\n var $op = $keyword == 'maxLength' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n if (it.opts.unicode === false) {\n out += ' ' + ($data) + '.length ';\n } else {\n out += ' ucs2length(' + ($data) + ') ';\n }\n out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be ';\n if ($keyword == 'maxLength') {\n out += 'longer';\n } else {\n out += 'shorter';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' characters\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],202:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate__limitProperties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!($isData || typeof $schema == 'number')) {\n throw new Error($keyword + ' must be number');\n }\n var $op = $keyword == 'maxProperties' ? '>' : '<';\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n }\n out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n var $errorKeyword = $keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have ';\n if ($keyword == 'maxProperties') {\n out += 'more';\n } else {\n out += 'fewer';\n }\n out += ' than ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + ($schema);\n }\n out += ' properties\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],203:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_allOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $allSchemasEmpty = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n $allSchemasEmpty = false;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($breakOnError) {\n if ($allSchemasEmpty) {\n out += ' if (true) { ';\n } else {\n out += ' ' + ($closingBraces.slice(0, -1)) + ' ';\n }\n }\n return out;\n}\n\n},{}],204:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_anyOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $noEmptySchema = $schema.every(function($sch) {\n return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all));\n });\n if ($noEmptySchema) {\n var $currentBaseId = $it.baseId;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';\n $closingBraces += '}';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('anyOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match some schema in anyOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n\n},{}],205:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_comment(it, $keyword, $ruleType) {\n var out = ' ';\n var $schema = it.schema[$keyword];\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $comment = it.util.toQuotedString($schema);\n if (it.opts.$comment === true) {\n out += ' console.log(' + ($comment) + ');';\n } else if (typeof it.opts.$comment == 'function') {\n out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);';\n }\n return out;\n}\n\n},{}],206:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_const(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!$isData) {\n out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('const') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to constant\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],207:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_contains(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId,\n $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all));\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if ($nonEmptySchema) {\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (' + ($nextValid) + ') break; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';\n } else {\n out += ' if (' + ($data) + '.length == 0) {';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('contains') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should contain a valid item\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n if ($nonEmptySchema) {\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n }\n if (it.opts.allErrors) {\n out += ' } ';\n }\n return out;\n}\n\n},{}],208:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_custom(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $rule = this,\n $definition = 'definition' + $lvl,\n $rDef = $rule.definition,\n $closingBraces = '';\n var $compile, $inline, $macro, $ruleValidate, $validateCode;\n if ($isData && $rDef.$data) {\n $validateCode = 'keywordValidate' + $lvl;\n var $validateSchema = $rDef.validateSchema;\n out += ' var ' + ($definition) + ' = RULES.custom[\\'' + ($keyword) + '\\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';\n } else {\n $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);\n if (!$ruleValidate) return;\n $schemaValue = 'validate.schema' + $schemaPath;\n $validateCode = $ruleValidate.code;\n $compile = $rDef.compile;\n $inline = $rDef.inline;\n $macro = $rDef.macro;\n }\n var $ruleErrs = $validateCode + '.errors',\n $i = 'i' + $lvl,\n $ruleErr = 'ruleErr' + $lvl,\n $asyncKeyword = $rDef.async;\n if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');\n if (!($inline || $macro)) {\n out += '' + ($ruleErrs) + ' = null;';\n }\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if ($isData && $rDef.$data) {\n $closingBraces += '}';\n out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';\n if ($validateSchema) {\n $closingBraces += '}';\n out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';\n }\n }\n if ($inline) {\n if ($rDef.statements) {\n out += ' ' + ($ruleValidate.validate) + ' ';\n } else {\n out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';\n }\n } else if ($macro) {\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n $it.schema = $ruleValidate.validate;\n $it.schemaPath = '';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var $code = it.validate($it).replace(/validate\\.schema/g, $validateCode);\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' ' + ($code);\n } else {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = '';\n out += ' ' + ($validateCode) + '.call( ';\n if (it.opts.passContext) {\n out += 'this';\n } else {\n out += 'self';\n }\n if ($compile || $rDef.schema === false) {\n out += ' , ' + ($data) + ' ';\n } else {\n out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';\n }\n out += ' , (dataPath || \\'\\')';\n if (it.errorPath != '\"\"') {\n out += ' + ' + (it.errorPath);\n }\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) ';\n var def_callRuleValidate = out;\n out = $$outStack.pop();\n if ($rDef.errors === false) {\n out += ' ' + ($valid) + ' = ';\n if ($asyncKeyword) {\n out += 'await ';\n }\n out += '' + (def_callRuleValidate) + '; ';\n } else {\n if ($asyncKeyword) {\n $ruleErrs = 'customErrors' + $lvl;\n out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';\n } else {\n out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';\n }\n }\n }\n if ($rDef.modifying) {\n out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';\n }\n out += '' + ($closingBraces);\n if ($rDef.valid) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n } else {\n out += ' if ( ';\n if ($rDef.valid === undefined) {\n out += ' !';\n if ($macro) {\n out += '' + ($nextValid);\n } else {\n out += '' + ($valid);\n }\n } else {\n out += ' ' + (!$rDef.valid) + ' ';\n }\n out += ') { ';\n $errorKeyword = $rule.keyword;\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = '';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'custom') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \\'' + ($rule.keyword) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should pass \"' + ($rule.keyword) + '\" keyword validation\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n var def_customError = out;\n out = $$outStack.pop();\n if ($inline) {\n if ($rDef.errors) {\n if ($rDef.errors != 'full') {\n out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n }\n out += ') { ';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + it.util.getProperty($property);\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n return out;\n}\n\n},{}],210:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_enum(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $i = 'i' + $lvl,\n $vSchema = 'schema' + $lvl;\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';\n }\n out += 'var ' + ($valid) + ';';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('enum') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be equal to one of the allowed values\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' }';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],211:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_format(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n if (it.opts.format === false) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $unknownFormats = it.opts.unknownFormats,\n $allowUnknown = Array.isArray($unknownFormats);\n if ($isData) {\n var $format = 'format' + $lvl,\n $isObject = 'isObject' + $lvl,\n $formatType = 'formatType' + $lvl;\n out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \\'object\\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \\'string\\'; if (' + ($isObject) + ') { ';\n if (it.async) {\n out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';\n }\n out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' (';\n if ($unknownFormats != 'ignore') {\n out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';\n if ($allowUnknown) {\n out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';\n }\n out += ') || ';\n }\n out += ' (' + ($format) + ' && ' + ($formatType) + ' == \\'' + ($ruleType) + '\\' && !(typeof ' + ($format) + ' == \\'function\\' ? ';\n if (it.async) {\n out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';\n } else {\n out += ' ' + ($format) + '(' + ($data) + ') ';\n }\n out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';\n } else {\n var $format = it.formats[$schema];\n if (!$format) {\n if ($unknownFormats == 'ignore') {\n it.logger.warn('unknown format \"' + $schema + '\" ignored in schema at path \"' + it.errSchemaPath + '\"');\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n } else {\n throw new Error('unknown format \"' + $schema + '\" is used in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;\n var $formatType = $isObject && $format.type || 'string';\n if ($isObject) {\n var $async = $format.async === true;\n $format = $format.validate;\n }\n if ($formatType != $ruleType) {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n return out;\n }\n if ($async) {\n if (!it.async) throw new Error('async format in sync schema');\n var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';\n out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { ';\n } else {\n out += ' if (! ';\n var $formatRef = 'formats' + it.util.getProperty($schema);\n if ($isObject) $formatRef += '.validate';\n if (typeof $format == 'function') {\n out += ' ' + ($formatRef) + '(' + ($data) + ') ';\n } else {\n out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';\n }\n out += ') { ';\n }\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('format') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match format \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],212:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_if(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $thenSch = it.schema['then'],\n $elseSch = it.schema['else'],\n $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)),\n $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)),\n $currentBaseId = $it.baseId;\n if ($thenPresent || $elsePresent) {\n var $ifClause;\n $it.createErrors = false;\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n $it.createErrors = true;\n out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n if ($thenPresent) {\n out += ' if (' + ($nextValid) + ') { ';\n $it.schema = it.schema['then'];\n $it.schemaPath = it.schemaPath + '.then';\n $it.errSchemaPath = it.errSchemaPath + '/then';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'then\\'; ';\n } else {\n $ifClause = '\\'then\\'';\n }\n out += ' } ';\n if ($elsePresent) {\n out += ' else { ';\n }\n } else {\n out += ' if (!' + ($nextValid) + ') { ';\n }\n if ($elsePresent) {\n $it.schema = it.schema['else'];\n $it.schemaPath = it.schemaPath + '.else';\n $it.errSchemaPath = it.errSchemaPath + '/else';\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n out += ' ' + ($valid) + ' = ' + ($nextValid) + '; ';\n if ($thenPresent && $elsePresent) {\n $ifClause = 'ifClause' + $lvl;\n out += ' var ' + ($ifClause) + ' = \\'else\\'; ';\n } else {\n $ifClause = '\\'else\\'';\n }\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('if') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match \"\\' + ' + ($ifClause) + ' + \\'\" schema\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n\n},{}],213:[function(require,module,exports){\n'use strict';\n\n//all requires must be explicit because browserify won't work with dynamic requires\nmodule.exports = {\n '$ref': require('./ref'),\n allOf: require('./allOf'),\n anyOf: require('./anyOf'),\n '$comment': require('./comment'),\n const: require('./const'),\n contains: require('./contains'),\n dependencies: require('./dependencies'),\n 'enum': require('./enum'),\n format: require('./format'),\n 'if': require('./if'),\n items: require('./items'),\n maximum: require('./_limit'),\n minimum: require('./_limit'),\n maxItems: require('./_limitItems'),\n minItems: require('./_limitItems'),\n maxLength: require('./_limitLength'),\n minLength: require('./_limitLength'),\n maxProperties: require('./_limitProperties'),\n minProperties: require('./_limitProperties'),\n multipleOf: require('./multipleOf'),\n not: require('./not'),\n oneOf: require('./oneOf'),\n pattern: require('./pattern'),\n properties: require('./properties'),\n propertyNames: require('./propertyNames'),\n required: require('./required'),\n uniqueItems: require('./uniqueItems'),\n validate: require('./validate')\n};\n\n},{\"./_limit\":199,\"./_limitItems\":200,\"./_limitLength\":201,\"./_limitProperties\":202,\"./allOf\":203,\"./anyOf\":204,\"./comment\":205,\"./const\":206,\"./contains\":207,\"./dependencies\":209,\"./enum\":210,\"./format\":211,\"./if\":212,\"./items\":214,\"./multipleOf\":215,\"./not\":216,\"./oneOf\":217,\"./pattern\":218,\"./properties\":219,\"./propertyNames\":220,\"./ref\":221,\"./required\":222,\"./uniqueItems\":223,\"./validate\":224}],214:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_items(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $idx = 'i' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $currentBaseId = it.baseId;\n out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n if (Array.isArray($schema)) {\n var $additionalItems = it.schema.additionalItems;\n if ($additionalItems === false) {\n out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have more than ' + ($schema.length) + ' items\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n $closingBraces += '}';\n out += ' else { ';\n }\n }\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';\n var $passData = $data + '[' + $i + ']';\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);\n $it.dataPathArr[$dataNxt] = $i;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) {\n $it.schema = $additionalItems;\n $it.schemaPath = it.schemaPath + '.additionalItems';\n $it.errSchemaPath = it.errSchemaPath + '/additionalItems';\n out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n var $passData = $data + '[' + $idx + ']';\n $it.dataPathArr[$dataNxt] = $idx;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' }';\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n return out;\n}\n\n},{}],215:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_multipleOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (!($isData || typeof $schema == 'number')) {\n throw new Error($keyword + ' must be number');\n }\n out += 'var division' + ($lvl) + ';if (';\n if ($isData) {\n out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \\'number\\' || ';\n }\n out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';\n if (it.opts.multipleOfPrecision) {\n out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';\n } else {\n out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';\n }\n out += ' ) ';\n if ($isData) {\n out += ' ) ';\n }\n out += ' ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('multipleOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be multiple of ';\n if ($isData) {\n out += '\\' + ' + ($schemaValue);\n } else {\n out += '' + ($schemaValue) + '\\'';\n }\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],216:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_not(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.createErrors = false;\n var $allErrorsOption;\n if ($it.opts.allErrors) {\n $allErrorsOption = $it.opts.allErrors;\n $it.opts.allErrors = false;\n }\n out += ' ' + (it.validate($it)) + ' ';\n $it.createErrors = true;\n if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (' + ($nextValid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n } else {\n out += ' var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT be valid\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if ($breakOnError) {\n out += ' if (false) { ';\n }\n }\n return out;\n}\n\n},{}],217:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_oneOf(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $currentBaseId = $it.baseId,\n $prevValid = 'prevValid' + $lvl,\n $passingSchemas = 'passingSchemas' + $lvl;\n out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var arr1 = $schema;\n if (arr1) {\n var $sch, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $sch = arr1[$i += 1];\n if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + '[' + $i + ']';\n $it.errSchemaPath = $errSchemaPath + '/' + $i;\n out += ' ' + (it.validate($it)) + ' ';\n $it.baseId = $currentBaseId;\n } else {\n out += ' var ' + ($nextValid) + ' = true; ';\n }\n if ($i) {\n out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { ';\n $closingBraces += '}';\n }\n out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }';\n }\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('oneOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match exactly one schema in oneOf\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; return false; ';\n }\n }\n out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';\n if (it.opts.allErrors) {\n out += ' } ';\n }\n return out;\n}\n\n},{}],218:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_pattern(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);\n out += 'if ( ';\n if ($isData) {\n out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n }\n out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('pattern') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: ';\n if ($isData) {\n out += '' + ($schemaValue);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should match pattern \"';\n if ($isData) {\n out += '\\' + ' + ($schemaValue) + ' + \\'';\n } else {\n out += '' + (it.util.escapeQuotes($schema));\n }\n out += '\"\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + (it.util.toQuotedString($schema));\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += '} ';\n if ($breakOnError) {\n out += ' else { ';\n }\n return out;\n}\n\n},{}],219:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_properties(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl;\n var $schemaKeys = Object.keys($schema || {}).filter(notProto),\n $pProperties = it.schema.patternProperties || {},\n $pPropertyKeys = Object.keys($pProperties).filter(notProto),\n $aProperties = it.schema.additionalProperties,\n $someProperties = $schemaKeys.length || $pPropertyKeys.length,\n $noAdditional = $aProperties === false,\n $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,\n $removeAdditional = it.opts.removeAdditional,\n $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n var $required = it.schema.required;\n if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) {\n var $requiredHash = it.util.toHash($required);\n }\n\n function notProto(p) {\n return p !== '__proto__';\n }\n out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined;';\n }\n if ($checkAdditional) {\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n if ($someProperties) {\n out += ' var isAdditional' + ($lvl) + ' = !(false ';\n if ($schemaKeys.length) {\n if ($schemaKeys.length > 8) {\n out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') ';\n } else {\n var arr1 = $schemaKeys;\n if (arr1) {\n var $propertyKey, i1 = -1,\n l1 = arr1.length - 1;\n while (i1 < l1) {\n $propertyKey = arr1[i1 += 1];\n out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr2 = $pPropertyKeys;\n if (arr2) {\n var $pProperty, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $pProperty = arr2[$i += 1];\n out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';\n }\n }\n }\n out += ' ); if (isAdditional' + ($lvl) + ') { ';\n }\n if ($removeAdditional == 'all') {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n var $currentErrorPath = it.errorPath;\n var $additionalProperty = '\\' + ' + $key + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n }\n if ($noAdditional) {\n if ($removeAdditional) {\n out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n } else {\n out += ' ' + ($nextValid) + ' = false; ';\n var $currErrSchemaPath = $errSchemaPath;\n $errSchemaPath = it.errSchemaPath + '/additionalProperties';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('additionalProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \\'' + ($additionalProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is an invalid additional property';\n } else {\n out += 'should NOT have additional properties';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n if ($breakOnError) {\n out += ' break; ';\n }\n }\n } else if ($additionalIsSchema) {\n if ($removeAdditional == 'failing') {\n out += ' var ' + ($errs) + ' = errors; ';\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } ';\n it.compositeRule = $it.compositeRule = $wasComposite;\n } else {\n $it.schema = $aProperties;\n $it.schemaPath = it.schemaPath + '.additionalProperties';\n $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n }\n }\n it.errorPath = $currentErrorPath;\n }\n if ($someProperties) {\n out += ' } ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n var $useDefaults = it.opts.useDefaults && !it.compositeRule;\n if ($schemaKeys.length) {\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n var $prop = it.util.getProperty($propertyKey),\n $passData = $data + $prop,\n $hasDefault = $useDefaults && $sch.default !== undefined;\n $it.schema = $sch;\n $it.schemaPath = $schemaPath + $prop;\n $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);\n $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);\n $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n $code = it.util.varReplace($code, $nextData, $passData);\n var $useData = $passData;\n } else {\n var $useData = $nextData;\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';\n }\n if ($hasDefault) {\n out += ' ' + ($code) + ' ';\n } else {\n if ($requiredHash && $requiredHash[$propertyKey]) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = false; ';\n var $currentErrorPath = it.errorPath,\n $currErrSchemaPath = $errSchemaPath,\n $missingProperty = it.util.escapeQuotes($propertyKey);\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n $errSchemaPath = it.errSchemaPath + '/required';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n $errSchemaPath = $currErrSchemaPath;\n it.errorPath = $currentErrorPath;\n out += ' } else { ';\n } else {\n if ($breakOnError) {\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { ' + ($nextValid) + ' = true; } else { ';\n } else {\n out += ' if (' + ($useData) + ' !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ' ) { ';\n }\n }\n out += ' ' + ($code) + ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n if ($pPropertyKeys.length) {\n var arr4 = $pPropertyKeys;\n if (arr4) {\n var $pProperty, i4 = -1,\n l4 = arr4.length - 1;\n while (i4 < l4) {\n $pProperty = arr4[i4 += 1];\n var $sch = $pProperties[$pProperty];\n if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) {\n $it.schema = $sch;\n $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);\n $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';\n $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n var $passData = $data + '[' + $key + ']';\n $it.dataPathArr[$dataNxt] = $key;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n if ($breakOnError) {\n out += ' if (!' + ($nextValid) + ') break; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else ' + ($nextValid) + ' = true; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' if (' + ($nextValid) + ') { ';\n $closingBraces += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n }\n return out;\n}\n\n},{}],220:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_propertyNames(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $errs = 'errs__' + $lvl;\n var $it = it.util.copy(it);\n var $closingBraces = '';\n $it.level++;\n var $nextValid = 'valid' + $it.level;\n out += 'var ' + ($errs) + ' = errors;';\n if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) {\n $it.schema = $schema;\n $it.schemaPath = $schemaPath;\n $it.errSchemaPath = $errSchemaPath;\n var $key = 'key' + $lvl,\n $idx = 'idx' + $lvl,\n $i = 'i' + $lvl,\n $invalidName = '\\' + ' + $key + ' + \\'',\n $dataNxt = $it.dataLevel = it.dataLevel + 1,\n $nextData = 'data' + $dataNxt,\n $dataProperties = 'dataProperties' + $lvl,\n $ownProperties = it.opts.ownProperties,\n $currentBaseId = it.baseId;\n if ($ownProperties) {\n out += ' var ' + ($dataProperties) + ' = undefined; ';\n }\n if ($ownProperties) {\n out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n } else {\n out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n }\n out += ' var startErrs' + ($lvl) + ' = errors; ';\n var $passData = $key;\n var $wasComposite = it.compositeRule;\n it.compositeRule = $it.compositeRule = true;\n var $code = it.validate($it);\n $it.baseId = $currentBaseId;\n if (it.util.varOccurences($code, $nextData) < 2) {\n out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n } else {\n out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n }\n it.compositeRule = $it.compositeRule = $wasComposite;\n out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) {\n $required[$required.length] = $property;\n }\n }\n }\n } else {\n var $required = $schema;\n }\n }\n if ($isData || $required.length) {\n var $currentErrorPath = it.errorPath,\n $loopRequired = $isData || $required.length >= it.opts.loopRequired,\n $ownProperties = it.opts.ownProperties;\n if ($breakOnError) {\n out += ' var missing' + ($lvl) + '; ';\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n out += ' var ' + ($valid) + ' = true; ';\n if ($isData) {\n out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';\n if ($ownProperties) {\n out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += '; if (!' + ($valid) + ') break; } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n } else {\n out += ' if ( ';\n var arr2 = $required;\n if (arr2) {\n var $propertyKey, $i = -1,\n l2 = arr2.length - 1;\n while ($i < l2) {\n $propertyKey = arr2[$i += 1];\n if ($i) {\n out += ' || ';\n }\n var $prop = it.util.getProperty($propertyKey),\n $useData = $data + $prop;\n out += ' ( ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n }\n }\n out += ') { ';\n var $propertyPath = 'missing' + $lvl,\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } else { ';\n }\n } else {\n if ($loopRequired) {\n if (!$isData) {\n out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n }\n var $i = 'i' + $lvl,\n $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n }\n if ($isData) {\n out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';\n }\n out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';\n if ($isData) {\n out += ' } ';\n }\n } else {\n var arr3 = $required;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $prop = it.util.getProperty($propertyKey),\n $missingProperty = it.util.escapeQuotes($propertyKey),\n $useData = $data + $prop;\n if (it.opts._errorDataPathProperty) {\n it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n }\n out += ' if ( ' + ($useData) + ' === undefined ';\n if ($ownProperties) {\n out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n }\n out += ') { var err = '; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'';\n if (it.opts._errorDataPathProperty) {\n out += 'is a required property';\n } else {\n out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n }\n }\n }\n }\n it.errorPath = $currentErrorPath;\n } else if ($breakOnError) {\n out += ' if (true) {';\n }\n return out;\n}\n\n},{}],223:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_uniqueItems(it, $keyword, $ruleType) {\n var out = ' ';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n var $isData = it.opts.$data && $schema && $schema.$data,\n $schemaValue;\n if ($isData) {\n out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n $schemaValue = 'schema' + $lvl;\n } else {\n $schemaValue = $schema;\n }\n if (($schema || $isData) && it.opts.uniqueItems !== false) {\n if ($isData) {\n out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'boolean\\') ' + ($valid) + ' = false; else { ';\n }\n out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { ';\n var $itemType = it.schema.items && it.schema.items.type,\n $typeIsArray = Array.isArray($itemType);\n if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) {\n out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } ';\n } else {\n out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; ';\n var $method = 'checkDataType' + ($typeIsArray ? 's' : '');\n out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; ';\n if ($typeIsArray) {\n out += ' if (typeof item == \\'string\\') item = \\'\"\\' + item; ';\n }\n out += ' if (typeof itemIndices[item] == \\'number\\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } ';\n }\n out += ' } ';\n if ($isData) {\n out += ' } ';\n }\n out += ' if (!' + ($valid) + ') { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ('uniqueItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should NOT have duplicate items (items ## \\' + j + \\' and \\' + i + \\' are identical)\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: ';\n if ($isData) {\n out += 'validate.schema' + ($schemaPath);\n } else {\n out += '' + ($schema);\n }\n out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n if ($breakOnError) {\n out += ' else { ';\n }\n } else {\n if ($breakOnError) {\n out += ' if (true) { ';\n }\n }\n return out;\n}\n\n},{}],224:[function(require,module,exports){\n'use strict';\nmodule.exports = function generate_validate(it, $keyword, $ruleType) {\n var out = '';\n var $async = it.schema.$async === true,\n $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),\n $id = it.self._getId(it.schema);\n if (it.opts.strictKeywords) {\n var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords);\n if ($unknownKwd) {\n var $keywordsMsg = 'unknown keyword: ' + $unknownKwd;\n if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg);\n else throw new Error($keywordsMsg);\n }\n }\n if (it.isTop) {\n out += ' var validate = ';\n if ($async) {\n it.async = true;\n out += 'async ';\n }\n out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \\'use strict\\'; ';\n if ($id && (it.opts.sourceCode || it.opts.processCode)) {\n out += ' ' + ('/\\*# sourceURL=' + $id + ' */') + ' ';\n }\n }\n if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {\n var $keyword = 'false schema';\n var $lvl = it.level;\n var $dataLvl = it.dataLevel;\n var $schema = it.schema[$keyword];\n var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n var $breakOnError = !it.opts.allErrors;\n var $errorKeyword;\n var $data = 'data' + ($dataLvl || '');\n var $valid = 'valid' + $lvl;\n if (it.schema === false) {\n if (it.isTop) {\n $breakOnError = true;\n } else {\n out += ' var ' + ($valid) + ' = false; ';\n }\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'false schema') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'boolean schema is false\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n } else {\n if (it.isTop) {\n if ($async) {\n out += ' return data; ';\n } else {\n out += ' validate.errors = null; return true; ';\n }\n } else {\n out += ' var ' + ($valid) + ' = true; ';\n }\n }\n if (it.isTop) {\n out += ' }; return validate; ';\n }\n return out;\n }\n if (it.isTop) {\n var $top = it.isTop,\n $lvl = it.level = 0,\n $dataLvl = it.dataLevel = 0,\n $data = 'data';\n it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));\n it.baseId = it.baseId || it.rootId;\n delete it.isTop;\n it.dataPathArr = [\"\"];\n if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored in the schema root';\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n out += ' var vErrors = null; ';\n out += ' var errors = 0; ';\n out += ' if (rootData === undefined) rootData = data; ';\n } else {\n var $lvl = it.level,\n $dataLvl = it.dataLevel,\n $data = 'data' + ($dataLvl || '');\n if ($id) it.baseId = it.resolve.url(it.baseId, $id);\n if ($async && !it.async) throw new Error('async schema in sync schema');\n out += ' var errs_' + ($lvl) + ' = errors;';\n }\n var $valid = 'valid' + $lvl,\n $breakOnError = !it.opts.allErrors,\n $closingBraces1 = '',\n $closingBraces2 = '';\n var $errorKeyword;\n var $typeSchema = it.schema.type,\n $typeIsArray = Array.isArray($typeSchema);\n if ($typeSchema && it.opts.nullable && it.schema.nullable === true) {\n if ($typeIsArray) {\n if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null');\n } else if ($typeSchema != 'null') {\n $typeSchema = [$typeSchema, 'null'];\n $typeIsArray = true;\n }\n }\n if ($typeIsArray && $typeSchema.length == 1) {\n $typeSchema = $typeSchema[0];\n $typeIsArray = false;\n }\n if (it.schema.$ref && $refKeywords) {\n if (it.opts.extendRefs == 'fail') {\n throw new Error('$ref: validation keywords used in schema at path \"' + it.errSchemaPath + '\" (see option extendRefs)');\n } else if (it.opts.extendRefs !== true) {\n $refKeywords = false;\n it.logger.warn('$ref: keywords ignored in schema at path \"' + it.errSchemaPath + '\"');\n }\n }\n if (it.schema.$comment && it.opts.$comment) {\n out += ' ' + (it.RULES.all.$comment.code(it, '$comment'));\n }\n if ($typeSchema) {\n if (it.opts.coerceTypes) {\n var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);\n }\n var $rulesGroup = it.RULES.types[$typeSchema];\n if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type',\n $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { ';\n if ($coerceToTypes) {\n var $dataType = 'dataType' + $lvl,\n $coerced = 'coerced' + $lvl;\n out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; ';\n if (it.opts.coerceTypes == 'array') {\n out += ' if (' + ($dataType) + ' == \\'object\\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } ';\n }\n out += ' if (' + ($coerced) + ' !== undefined) ; ';\n var arr1 = $coerceToTypes;\n if (arr1) {\n var $type, $i = -1,\n l1 = arr1.length - 1;\n while ($i < l1) {\n $type = arr1[$i += 1];\n if ($type == 'string') {\n out += ' else if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n } else if ($type == 'number' || $type == 'integer') {\n out += ' else if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n if ($type == 'integer') {\n out += ' && !(' + ($data) + ' % 1)';\n }\n out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n } else if ($type == 'boolean') {\n out += ' else if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n } else if ($type == 'null') {\n out += ' else if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n } else if (it.opts.coerceTypes == 'array' && $type == 'array') {\n out += ' else if (' + ($dataType) + ' == \\'string\\' || ' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';\n }\n }\n }\n out += ' else { ';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } if (' + ($coerced) + ' !== undefined) { ';\n var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n out += ' ' + ($data) + ' = ' + ($coerced) + '; ';\n if (!$dataLvl) {\n out += 'if (' + ($parentData) + ' !== undefined)';\n }\n out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';\n } else {\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n }\n out += ' } ';\n }\n }\n if (it.schema.$ref && !$refKeywords) {\n out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';\n if ($breakOnError) {\n out += ' } if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n } else {\n var arr2 = it.RULES;\n if (arr2) {\n var $rulesGroup, i2 = -1,\n l2 = arr2.length - 1;\n while (i2 < l2) {\n $rulesGroup = arr2[i2 += 1];\n if ($shouldUseGroup($rulesGroup)) {\n if ($rulesGroup.type) {\n out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { ';\n }\n if (it.opts.useDefaults) {\n if ($rulesGroup.type == 'object' && it.schema.properties) {\n var $schema = it.schema.properties,\n $schemaKeys = Object.keys($schema);\n var arr3 = $schemaKeys;\n if (arr3) {\n var $propertyKey, i3 = -1,\n l3 = arr3.length - 1;\n while (i3 < l3) {\n $propertyKey = arr3[i3 += 1];\n var $sch = $schema[$propertyKey];\n if ($sch.default !== undefined) {\n var $passData = $data + it.util.getProperty($propertyKey);\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n var arr4 = it.schema.items;\n if (arr4) {\n var $sch, $i = -1,\n l4 = arr4.length - 1;\n while ($i < l4) {\n $sch = arr4[$i += 1];\n if ($sch.default !== undefined) {\n var $passData = $data + '[' + $i + ']';\n if (it.compositeRule) {\n if (it.opts.strictDefaults) {\n var $defaultMsg = 'default is ignored for: ' + $passData;\n if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg);\n else throw new Error($defaultMsg);\n }\n } else {\n out += ' if (' + ($passData) + ' === undefined ';\n if (it.opts.useDefaults == 'empty') {\n out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \\'\\' ';\n }\n out += ' ) ' + ($passData) + ' = ';\n if (it.opts.useDefaults == 'shared') {\n out += ' ' + (it.useDefault($sch.default)) + ' ';\n } else {\n out += ' ' + (JSON.stringify($sch.default)) + ' ';\n }\n out += '; ';\n }\n }\n }\n }\n }\n }\n var arr5 = $rulesGroup.rules;\n if (arr5) {\n var $rule, i5 = -1,\n l5 = arr5.length - 1;\n while (i5 < l5) {\n $rule = arr5[i5 += 1];\n if ($shouldUseRule($rule)) {\n var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);\n if ($code) {\n out += ' ' + ($code) + ' ';\n if ($breakOnError) {\n $closingBraces1 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces1) + ' ';\n $closingBraces1 = '';\n }\n if ($rulesGroup.type) {\n out += ' } ';\n if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {\n out += ' else { ';\n var $schemaPath = it.schemaPath + '.type',\n $errSchemaPath = it.errSchemaPath + '/type';\n var $$outStack = $$outStack || [];\n $$outStack.push(out);\n out = ''; /* istanbul ignore else */\n if (it.createErrors !== false) {\n out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' } ';\n if (it.opts.messages !== false) {\n out += ' , message: \\'should be ';\n if ($typeIsArray) {\n out += '' + ($typeSchema.join(\",\"));\n } else {\n out += '' + ($typeSchema);\n }\n out += '\\' ';\n }\n if (it.opts.verbose) {\n out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n }\n out += ' } ';\n } else {\n out += ' {} ';\n }\n var __err = out;\n out = $$outStack.pop();\n if (!it.compositeRule && $breakOnError) {\n /* istanbul ignore if */\n if (it.async) {\n out += ' throw new ValidationError([' + (__err) + ']); ';\n } else {\n out += ' validate.errors = [' + (__err) + ']; return false; ';\n }\n } else {\n out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n }\n out += ' } ';\n }\n }\n if ($breakOnError) {\n out += ' if (errors === ';\n if ($top) {\n out += '0';\n } else {\n out += 'errs_' + ($lvl);\n }\n out += ') { ';\n $closingBraces2 += '}';\n }\n }\n }\n }\n }\n if ($breakOnError) {\n out += ' ' + ($closingBraces2) + ' ';\n }\n if ($top) {\n if ($async) {\n out += ' if (errors === 0) return data; ';\n out += ' else throw new ValidationError(vErrors); ';\n } else {\n out += ' validate.errors = vErrors; ';\n out += ' return errors === 0; ';\n }\n out += ' }; return validate;';\n } else {\n out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';\n }\n\n function $shouldUseGroup($rulesGroup) {\n var rules = $rulesGroup.rules;\n for (var i = 0; i < rules.length; i++)\n if ($shouldUseRule(rules[i])) return true;\n }\n\n function $shouldUseRule($rule) {\n return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));\n }\n\n function $ruleImplementsSomeKeyword($rule) {\n var impl = $rule.implements;\n for (var i = 0; i < impl.length; i++)\n if (it.schema[impl[i]] !== undefined) return true;\n }\n return out;\n}\n\n},{}],225:[function(require,module,exports){\n'use strict';\n\nvar IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;\nvar customRuleCode = require('./dotjs/custom');\nvar definitionSchema = require('./definition_schema');\n\nmodule.exports = {\n add: addKeyword,\n get: getKeyword,\n remove: removeKeyword,\n validate: validateKeyword\n};\n\n\n/**\n * Define custom keyword\n * @this Ajv\n * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).\n * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.\n * @return {Ajv} this for method chaining\n */\nfunction addKeyword(keyword, definition) {\n /* jshint validthis: true */\n /* eslint no-shadow: 0 */\n var RULES = this.RULES;\n if (RULES.keywords[keyword])\n throw new Error('Keyword ' + keyword + ' is already defined');\n\n if (!IDENTIFIER.test(keyword))\n throw new Error('Keyword ' + keyword + ' is not a valid identifier');\n\n if (definition) {\n this.validateKeyword(definition, true);\n\n var dataType = definition.type;\n if (Array.isArray(dataType)) {\n for (var i=0; i str.length) {\n this_len = str.length;\n }\n\n return str.substring(this_len - search.length, this_len) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n\n\nfunction repeat(str, count) {\n count = Math.floor(count);\n if (str.length == 0 || count == 0) return '';\n var maxCount = str.length * count;\n count = Math.floor(Math.log(count) / Math.log(2));\n\n while (count) {\n str += str;\n count--;\n }\n\n str += str.substring(0, maxCount - str.length);\n return str;\n}\n\nvar blue = '';\nvar green = '';\nvar red = '';\nvar white = '';\nvar kReadableOperator = {\n deepStrictEqual: 'Expected values to be strictly deep-equal:',\n strictEqual: 'Expected values to be strictly equal:',\n strictEqualObject: 'Expected \"actual\" to be reference-equal to \"expected\":',\n deepEqual: 'Expected values to be loosely deep-equal:',\n equal: 'Expected values to be loosely equal:',\n notDeepStrictEqual: 'Expected \"actual\" not to be strictly deep-equal to:',\n notStrictEqual: 'Expected \"actual\" to be strictly unequal to:',\n notStrictEqualObject: 'Expected \"actual\" not to be reference-equal to \"expected\":',\n notDeepEqual: 'Expected \"actual\" not to be loosely deep-equal to:',\n notEqual: 'Expected \"actual\" to be loosely unequal to:',\n notIdentical: 'Values identical but not reference-equal:'\n}; // Comparing short primitives should just show === / !== instead of using the\n// diff.\n\nvar kMaxShortLength = 10;\n\nfunction copyError(source) {\n var keys = Object.keys(source);\n var target = Object.create(Object.getPrototypeOf(source));\n keys.forEach(function (key) {\n target[key] = source[key];\n });\n Object.defineProperty(target, 'message', {\n value: source.message\n });\n return target;\n}\n\nfunction inspectValue(val) {\n // The util.inspect default values could be changed. This makes sure the\n // error messages contain the necessary information nevertheless.\n return inspect(val, {\n compact: false,\n customInspect: false,\n depth: 1000,\n maxArrayLength: Infinity,\n // Assert compares only enumerable properties (with a few exceptions).\n showHidden: false,\n // Having a long line as error is better than wrapping the line for\n // comparison for now.\n // TODO(BridgeAR): `breakLength` should be limited as soon as soon as we\n // have meta information about the inspected properties (i.e., know where\n // in what line the property starts and ends).\n breakLength: Infinity,\n // Assert does not detect proxies currently.\n showProxy: false,\n sorted: true,\n // Inspect getters as we also check them when comparing entries.\n getters: true\n });\n}\n\nfunction createErrDiff(actual, expected, operator) {\n var other = '';\n var res = '';\n var lastPos = 0;\n var end = '';\n var skipped = false;\n var actualInspected = inspectValue(actual);\n var actualLines = actualInspected.split('\\n');\n var expectedLines = inspectValue(expected).split('\\n');\n var i = 0;\n var indicator = ''; // In case both values are objects explicitly mark them as not reference equal\n // for the `strictEqual` operator.\n\n if (operator === 'strictEqual' && _typeof(actual) === 'object' && _typeof(expected) === 'object' && actual !== null && expected !== null) {\n operator = 'strictEqualObject';\n } // If \"actual\" and \"expected\" fit on a single line and they are not strictly\n // equal, check further special handling.\n\n\n if (actualLines.length === 1 && expectedLines.length === 1 && actualLines[0] !== expectedLines[0]) {\n var inputLength = actualLines[0].length + expectedLines[0].length; // If the character length of \"actual\" and \"expected\" together is less than\n // kMaxShortLength and if neither is an object and at least one of them is\n // not `zero`, use the strict equal comparison to visualize the output.\n\n if (inputLength <= kMaxShortLength) {\n if ((_typeof(actual) !== 'object' || actual === null) && (_typeof(expected) !== 'object' || expected === null) && (actual !== 0 || expected !== 0)) {\n // -0 === +0\n return \"\".concat(kReadableOperator[operator], \"\\n\\n\") + \"\".concat(actualLines[0], \" !== \").concat(expectedLines[0], \"\\n\");\n }\n } else if (operator !== 'strictEqualObject') {\n // If the stderr is a tty and the input length is lower than the current\n // columns per line, add a mismatch indicator below the output. If it is\n // not a tty, use a default value of 80 characters.\n var maxLength = process.stderr && process.stderr.isTTY ? process.stderr.columns : 80;\n\n if (inputLength < maxLength) {\n while (actualLines[0][i] === expectedLines[0][i]) {\n i++;\n } // Ignore the first characters.\n\n\n if (i > 2) {\n // Add position indicator for the first mismatch in case it is a\n // single line and the input length is less than the column length.\n indicator = \"\\n \".concat(repeat(' ', i), \"^\");\n i = 0;\n }\n }\n }\n } // Remove all ending lines that match (this optimizes the output for\n // readability by reducing the number of total changed lines).\n\n\n var a = actualLines[actualLines.length - 1];\n var b = expectedLines[expectedLines.length - 1];\n\n while (a === b) {\n if (i++ < 2) {\n end = \"\\n \".concat(a).concat(end);\n } else {\n other = a;\n }\n\n actualLines.pop();\n expectedLines.pop();\n if (actualLines.length === 0 || expectedLines.length === 0) break;\n a = actualLines[actualLines.length - 1];\n b = expectedLines[expectedLines.length - 1];\n }\n\n var maxLines = Math.max(actualLines.length, expectedLines.length); // Strict equal with identical objects that are not identical by reference.\n // E.g., assert.deepStrictEqual({ a: Symbol() }, { a: Symbol() })\n\n if (maxLines === 0) {\n // We have to get the result again. The lines were all removed before.\n var _actualLines = actualInspected.split('\\n'); // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n\n\n if (_actualLines.length > 30) {\n _actualLines[26] = \"\".concat(blue, \"...\").concat(white);\n\n while (_actualLines.length > 27) {\n _actualLines.pop();\n }\n }\n\n return \"\".concat(kReadableOperator.notIdentical, \"\\n\\n\").concat(_actualLines.join('\\n'), \"\\n\");\n }\n\n if (i > 3) {\n end = \"\\n\".concat(blue, \"...\").concat(white).concat(end);\n skipped = true;\n }\n\n if (other !== '') {\n end = \"\\n \".concat(other).concat(end);\n other = '';\n }\n\n var printedLines = 0;\n var msg = kReadableOperator[operator] + \"\\n\".concat(green, \"+ actual\").concat(white, \" \").concat(red, \"- expected\").concat(white);\n var skippedMsg = \" \".concat(blue, \"...\").concat(white, \" Lines skipped\");\n\n for (i = 0; i < maxLines; i++) {\n // Only extra expected lines exist\n var cur = i - lastPos;\n\n if (actualLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(expectedLines[i - 2]);\n printedLines++;\n }\n\n res += \"\\n \".concat(expectedLines[i - 1]);\n printedLines++;\n } // Mark the current line as the last diverging one.\n\n\n lastPos = i; // Add the expected line to the cache.\n\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLines[i]);\n printedLines++; // Only extra actual lines exist\n } else if (expectedLines.length < i + 1) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n } // Mark the current line as the last diverging one.\n\n\n lastPos = i; // Add the actual line to the result.\n\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLines[i]);\n printedLines++; // Lines diverge\n } else {\n var expectedLine = expectedLines[i];\n var actualLine = actualLines[i]; // If the lines diverge, specifically check for lines that only diverge by\n // a trailing comma. In that case it is actually identical and we should\n // mark it as such.\n\n var divergingLines = actualLine !== expectedLine && (!endsWith(actualLine, ',') || actualLine.slice(0, -1) !== expectedLine); // If the expected line has a trailing comma but is otherwise identical,\n // add a comma at the end of the actual line. Otherwise the output could\n // look weird as in:\n //\n // [\n // 1 // No comma at the end!\n // + 2\n // ]\n //\n\n if (divergingLines && endsWith(expectedLine, ',') && expectedLine.slice(0, -1) === actualLine) {\n divergingLines = false;\n actualLine += ',';\n }\n\n if (divergingLines) {\n // If the last diverging line is more than one line above and the\n // current line is at least line three, add some of the former lines and\n // also add dots to indicate skipped entries.\n if (cur > 1 && i > 2) {\n if (cur > 4) {\n res += \"\\n\".concat(blue, \"...\").concat(white);\n skipped = true;\n } else if (cur > 3) {\n res += \"\\n \".concat(actualLines[i - 2]);\n printedLines++;\n }\n\n res += \"\\n \".concat(actualLines[i - 1]);\n printedLines++;\n } // Mark the current line as the last diverging one.\n\n\n lastPos = i; // Add the actual line to the result and cache the expected diverging\n // line so consecutive diverging lines show up as +++--- and not +-+-+-.\n\n res += \"\\n\".concat(green, \"+\").concat(white, \" \").concat(actualLine);\n other += \"\\n\".concat(red, \"-\").concat(white, \" \").concat(expectedLine);\n printedLines += 2; // Lines are identical\n } else {\n // Add all cached information to the result before adding other things\n // and reset the cache.\n res += other;\n other = ''; // If the last diverging line is exactly one line above or if it is the\n // very first line, add the line to the result.\n\n if (cur === 1 || i === 0) {\n res += \"\\n \".concat(actualLine);\n printedLines++;\n }\n }\n } // Inspected object to big (Show ~20 rows max)\n\n\n if (printedLines > 20 && i < maxLines - 2) {\n return \"\".concat(msg).concat(skippedMsg, \"\\n\").concat(res, \"\\n\").concat(blue, \"...\").concat(white).concat(other, \"\\n\") + \"\".concat(blue, \"...\").concat(white);\n }\n }\n\n return \"\".concat(msg).concat(skipped ? skippedMsg : '', \"\\n\").concat(res).concat(other).concat(end).concat(indicator);\n}\n\nvar AssertionError =\n/*#__PURE__*/\nfunction (_Error) {\n _inherits(AssertionError, _Error);\n\n function AssertionError(options) {\n var _this;\n\n _classCallCheck(this, AssertionError);\n\n if (_typeof(options) !== 'object' || options === null) {\n throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);\n }\n\n var message = options.message,\n operator = options.operator,\n stackStartFn = options.stackStartFn;\n var actual = options.actual,\n expected = options.expected;\n var limit = Error.stackTraceLimit;\n Error.stackTraceLimit = 0;\n\n if (message != null) {\n _this = _possibleConstructorReturn(this, _getPrototypeOf(AssertionError).call(this, String(message)));\n } else {\n if (process.stderr && process.stderr.isTTY) {\n // Reset on each call to make sure we handle dynamically set environment\n // variables correct.\n if (process.stderr && process.stderr.getColorDepth && process.stderr.getColorDepth() !== 1) {\n blue = \"\\x1B[34m\";\n green = \"\\x1B[32m\";\n white = \"\\x1B[39m\";\n red = \"\\x1B[31m\";\n } else {\n blue = '';\n green = '';\n white = '';\n red = '';\n }\n } // Prevent the error stack from being visible by duplicating the error\n // in a very close way to the original in case both sides are actually\n // instances of Error.\n\n\n if (_typeof(actual) === 'object' && actual !== null && _typeof(expected) === 'object' && expected !== null && 'stack' in actual && actual instanceof Error && 'stack' in expected && expected instanceof Error) {\n actual = copyError(actual);\n expected = copyError(expected);\n }\n\n if (operator === 'deepStrictEqual' || operator === 'strictEqual') {\n _this = _possibleConstructorReturn(this, _getPrototypeOf(AssertionError).call(this, createErrDiff(actual, expected, operator)));\n } else if (operator === 'notDeepStrictEqual' || operator === 'notStrictEqual') {\n // In case the objects are equal but the operator requires unequal, show\n // the first object and say A equals B\n var base = kReadableOperator[operator];\n var res = inspectValue(actual).split('\\n'); // In case \"actual\" is an object, it should not be reference equal.\n\n if (operator === 'notStrictEqual' && _typeof(actual) === 'object' && actual !== null) {\n base = kReadableOperator.notStrictEqualObject;\n } // Only remove lines in case it makes sense to collapse those.\n // TODO: Accept env to always show the full error.\n\n\n if (res.length > 30) {\n res[26] = \"\".concat(blue, \"...\").concat(white);\n\n while (res.length > 27) {\n res.pop();\n }\n } // Only print a single input.\n\n\n if (res.length === 1) {\n _this = _possibleConstructorReturn(this, _getPrototypeOf(AssertionError).call(this, \"\".concat(base, \" \").concat(res[0])));\n } else {\n _this = _possibleConstructorReturn(this, _getPrototypeOf(AssertionError).call(this, \"\".concat(base, \"\\n\\n\").concat(res.join('\\n'), \"\\n\")));\n }\n } else {\n var _res = inspectValue(actual);\n\n var other = '';\n var knownOperators = kReadableOperator[operator];\n\n if (operator === 'notDeepEqual' || operator === 'notEqual') {\n _res = \"\".concat(kReadableOperator[operator], \"\\n\\n\").concat(_res);\n\n if (_res.length > 1024) {\n _res = \"\".concat(_res.slice(0, 1021), \"...\");\n }\n } else {\n other = \"\".concat(inspectValue(expected));\n\n if (_res.length > 512) {\n _res = \"\".concat(_res.slice(0, 509), \"...\");\n }\n\n if (other.length > 512) {\n other = \"\".concat(other.slice(0, 509), \"...\");\n }\n\n if (operator === 'deepEqual' || operator === 'equal') {\n _res = \"\".concat(knownOperators, \"\\n\\n\").concat(_res, \"\\n\\nshould equal\\n\\n\");\n } else {\n other = \" \".concat(operator, \" \").concat(other);\n }\n }\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(AssertionError).call(this, \"\".concat(_res).concat(other)));\n }\n }\n\n Error.stackTraceLimit = limit;\n _this.generatedMessage = !message;\n Object.defineProperty(_assertThisInitialized(_this), 'name', {\n value: 'AssertionError [ERR_ASSERTION]',\n enumerable: false,\n writable: true,\n configurable: true\n });\n _this.code = 'ERR_ASSERTION';\n _this.actual = actual;\n _this.expected = expected;\n _this.operator = operator;\n\n if (Error.captureStackTrace) {\n // eslint-disable-next-line no-restricted-syntax\n Error.captureStackTrace(_assertThisInitialized(_this), stackStartFn);\n } // Create error message including the error code in the name.\n\n\n _this.stack; // Reset the name.\n\n _this.name = 'AssertionError';\n return _possibleConstructorReturn(_this);\n }\n\n _createClass(AssertionError, [{\n key: \"toString\",\n value: function toString() {\n return \"\".concat(this.name, \" [\").concat(this.code, \"]: \").concat(this.message);\n }\n }, {\n key: inspect.custom,\n value: function value(recurseTimes, ctx) {\n // This limits the `actual` and `expected` property default inspection to\n // the minimum depth. Otherwise those values would be too verbose compared\n // to the actual error message which contains a combined view of these two\n // input values.\n return inspect(this, _objectSpread({}, ctx, {\n customInspect: false,\n depth: 0\n }));\n }\n }]);\n\n return AssertionError;\n}(_wrapNativeSuper(Error));\n\nmodule.exports = AssertionError;\n}).call(this)}).call(this,require('_process'))\n},{\"../errors\":230,\"_process\":\"_process\",\"util/\":568}],230:[function(require,module,exports){\n// Currently in sync with Node.js lib/internal/errors.js\n// https://github.com/nodejs/node/commit/3b044962c48fe313905877a96b5d0894a5404f6f\n\n/* eslint node-core/documented-errors: \"error\" */\n\n/* eslint node-core/alphabetize-errors: \"error\" */\n\n/* eslint node-core/prefer-util-format-errors: \"error\" */\n'use strict'; // The whole point behind this internal module is to allow Node.js to no\n// longer be forced to treat every error message change as a semver-major\n// change. The NodeError classes here all expose a `code` property whose\n// value statically and permanently identifies the error. While the error\n// message may change, the code should not.\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar codes = {}; // Lazy loaded\n\nvar assert;\nvar util;\n\nfunction createErrorType(code, message, Base) {\n if (!Base) {\n Base = Error;\n }\n\n function getMessage(arg1, arg2, arg3) {\n if (typeof message === 'string') {\n return message;\n } else {\n return message(arg1, arg2, arg3);\n }\n }\n\n var NodeError =\n /*#__PURE__*/\n function (_Base) {\n _inherits(NodeError, _Base);\n\n function NodeError(arg1, arg2, arg3) {\n var _this;\n\n _classCallCheck(this, NodeError);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(NodeError).call(this, getMessage(arg1, arg2, arg3)));\n _this.code = code;\n return _this;\n }\n\n return NodeError;\n }(Base);\n\n codes[code] = NodeError;\n} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\n\n\nfunction oneOf(expected, thing) {\n if (Array.isArray(expected)) {\n var len = expected.length;\n expected = expected.map(function (i) {\n return String(i);\n });\n\n if (len > 2) {\n return \"one of \".concat(thing, \" \").concat(expected.slice(0, len - 1).join(', '), \", or \") + expected[len - 1];\n } else if (len === 2) {\n return \"one of \".concat(thing, \" \").concat(expected[0], \" or \").concat(expected[1]);\n } else {\n return \"of \".concat(thing, \" \").concat(expected[0]);\n }\n } else {\n return \"of \".concat(thing, \" \").concat(String(expected));\n }\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n\n\nfunction startsWith(str, search, pos) {\n return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\n\n\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n\n return str.substring(this_len - search.length, this_len) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n\n\nfunction includes(str, search, start) {\n if (typeof start !== 'number') {\n start = 0;\n }\n\n if (start + search.length > str.length) {\n return false;\n } else {\n return str.indexOf(search, start) !== -1;\n }\n}\n\ncreateErrorType('ERR_AMBIGUOUS_ARGUMENT', 'The \"%s\" argument is ambiguous. %s', TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n if (assert === undefined) assert = require('../assert');\n assert(typeof name === 'string', \"'name' must be a string\"); // determiner: 'must be' or 'must not be'\n\n var determiner;\n\n if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n\n var msg;\n\n if (endsWith(name, ' argument')) {\n // For cases like 'first argument'\n msg = \"The \".concat(name, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n } else {\n var type = includes(name, '.') ? 'property' : 'argument';\n msg = \"The \\\"\".concat(name, \"\\\" \").concat(type, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n } // TODO(BridgeAR): Improve the output by showing `null` and similar.\n\n\n msg += \". Received type \".concat(_typeof(actual));\n return msg;\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_VALUE', function (name, value) {\n var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'is invalid';\n if (util === undefined) util = require('util/');\n var inspected = util.inspect(value);\n\n if (inspected.length > 128) {\n inspected = \"\".concat(inspected.slice(0, 128), \"...\");\n }\n\n return \"The argument '\".concat(name, \"' \").concat(reason, \". Received \").concat(inspected);\n}, TypeError, RangeError);\ncreateErrorType('ERR_INVALID_RETURN_VALUE', function (input, name, value) {\n var type;\n\n if (value && value.constructor && value.constructor.name) {\n type = \"instance of \".concat(value.constructor.name);\n } else {\n type = \"type \".concat(_typeof(value));\n }\n\n return \"Expected \".concat(input, \" to be returned from the \\\"\").concat(name, \"\\\"\") + \" function but got \".concat(type, \".\");\n}, TypeError);\ncreateErrorType('ERR_MISSING_ARGS', function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (assert === undefined) assert = require('../assert');\n assert(args.length > 0, 'At least one arg needs to be specified');\n var msg = 'The ';\n var len = args.length;\n args = args.map(function (a) {\n return \"\\\"\".concat(a, \"\\\"\");\n });\n\n switch (len) {\n case 1:\n msg += \"\".concat(args[0], \" argument\");\n break;\n\n case 2:\n msg += \"\".concat(args[0], \" and \").concat(args[1], \" arguments\");\n break;\n\n default:\n msg += args.slice(0, len - 1).join(', ');\n msg += \", and \".concat(args[len - 1], \" arguments\");\n break;\n }\n\n return \"\".concat(msg, \" must be specified\");\n}, TypeError);\nmodule.exports.codes = codes;\n},{\"../assert\":\"assert\",\"util/\":568}],231:[function(require,module,exports){\n// Currently in sync with Node.js lib/internal/util/comparisons.js\n// https://github.com/nodejs/node/commit/112cc7c27551254aa2b17098fb774867f05ed0d9\n'use strict';\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nvar regexFlagsSupported = /a/g.flags !== undefined;\n\nvar arrayFromSet = function arrayFromSet(set) {\n var array = [];\n set.forEach(function (value) {\n return array.push(value);\n });\n return array;\n};\n\nvar arrayFromMap = function arrayFromMap(map) {\n var array = [];\n map.forEach(function (value, key) {\n return array.push([key, value]);\n });\n return array;\n};\n\nvar objectIs = Object.is ? Object.is : require('object-is');\nvar objectGetOwnPropertySymbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols : function () {\n return [];\n};\nvar numberIsNaN = Number.isNaN ? Number.isNaN : require('is-nan');\n\nfunction uncurryThis(f) {\n return f.call.bind(f);\n}\n\nvar hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\nvar propertyIsEnumerable = uncurryThis(Object.prototype.propertyIsEnumerable);\nvar objectToString = uncurryThis(Object.prototype.toString);\n\nvar _require$types = require('util/').types,\n isAnyArrayBuffer = _require$types.isAnyArrayBuffer,\n isArrayBufferView = _require$types.isArrayBufferView,\n isDate = _require$types.isDate,\n isMap = _require$types.isMap,\n isRegExp = _require$types.isRegExp,\n isSet = _require$types.isSet,\n isNativeError = _require$types.isNativeError,\n isBoxedPrimitive = _require$types.isBoxedPrimitive,\n isNumberObject = _require$types.isNumberObject,\n isStringObject = _require$types.isStringObject,\n isBooleanObject = _require$types.isBooleanObject,\n isBigIntObject = _require$types.isBigIntObject,\n isSymbolObject = _require$types.isSymbolObject,\n isFloat32Array = _require$types.isFloat32Array,\n isFloat64Array = _require$types.isFloat64Array;\n\nfunction isNonIndex(key) {\n if (key.length === 0 || key.length > 10) return true;\n\n for (var i = 0; i < key.length; i++) {\n var code = key.charCodeAt(i);\n if (code < 48 || code > 57) return true;\n } // The maximum size for an array is 2 ** 32 -1.\n\n\n return key.length === 10 && key >= Math.pow(2, 32);\n}\n\nfunction getOwnNonIndexProperties(value) {\n return Object.keys(value).filter(isNonIndex).concat(objectGetOwnPropertySymbols(value).filter(Object.prototype.propertyIsEnumerable.bind(value)));\n} // Taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\n\nfunction compare(a, b) {\n if (a === b) {\n return 0;\n }\n\n var x = a.length;\n var y = b.length;\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n\n if (x < y) {\n return -1;\n }\n\n if (y < x) {\n return 1;\n }\n\n return 0;\n}\n\nvar ONLY_ENUMERABLE = undefined;\nvar kStrict = true;\nvar kLoose = false;\nvar kNoIterator = 0;\nvar kIsArray = 1;\nvar kIsSet = 2;\nvar kIsMap = 3; // Check if they have the same source and flags\n\nfunction areSimilarRegExps(a, b) {\n return regexFlagsSupported ? a.source === b.source && a.flags === b.flags : RegExp.prototype.toString.call(a) === RegExp.prototype.toString.call(b);\n}\n\nfunction areSimilarFloatArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n for (var offset = 0; offset < a.byteLength; offset++) {\n if (a[offset] !== b[offset]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction areSimilarTypedArrays(a, b) {\n if (a.byteLength !== b.byteLength) {\n return false;\n }\n\n return compare(new Uint8Array(a.buffer, a.byteOffset, a.byteLength), new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) === 0;\n}\n\nfunction areEqualArrayBuffers(buf1, buf2) {\n return buf1.byteLength === buf2.byteLength && compare(new Uint8Array(buf1), new Uint8Array(buf2)) === 0;\n}\n\nfunction isEqualBoxedPrimitive(val1, val2) {\n if (isNumberObject(val1)) {\n return isNumberObject(val2) && objectIs(Number.prototype.valueOf.call(val1), Number.prototype.valueOf.call(val2));\n }\n\n if (isStringObject(val1)) {\n return isStringObject(val2) && String.prototype.valueOf.call(val1) === String.prototype.valueOf.call(val2);\n }\n\n if (isBooleanObject(val1)) {\n return isBooleanObject(val2) && Boolean.prototype.valueOf.call(val1) === Boolean.prototype.valueOf.call(val2);\n }\n\n if (isBigIntObject(val1)) {\n return isBigIntObject(val2) && BigInt.prototype.valueOf.call(val1) === BigInt.prototype.valueOf.call(val2);\n }\n\n return isSymbolObject(val2) && Symbol.prototype.valueOf.call(val1) === Symbol.prototype.valueOf.call(val2);\n} // Notes: Type tags are historical [[Class]] properties that can be set by\n// FunctionTemplate::SetClassName() in C++ or Symbol.toStringTag in JS\n// and retrieved using Object.prototype.toString.call(obj) in JS\n// See https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n// for a list of tags pre-defined in the spec.\n// There are some unspecified tags in the wild too (e.g. typed array tags).\n// Since tags can be altered, they only serve fast failures\n//\n// Typed arrays and buffers are checked by comparing the content in their\n// underlying ArrayBuffer. This optimization requires that it's\n// reasonable to interpret their underlying memory in the same way,\n// which is checked by comparing their type tags.\n// (e.g. a Uint8Array and a Uint16Array with the same memory content\n// could still be different because they will be interpreted differently).\n//\n// For strict comparison, objects should have\n// a) The same built-in type tags\n// b) The same prototypes.\n\n\nfunction innerDeepEqual(val1, val2, strict, memos) {\n // All identical values are equivalent, as determined by ===.\n if (val1 === val2) {\n if (val1 !== 0) return true;\n return strict ? objectIs(val1, val2) : true;\n } // Check more closely if val1 and val2 are equal.\n\n\n if (strict) {\n if (_typeof(val1) !== 'object') {\n return typeof val1 === 'number' && numberIsNaN(val1) && numberIsNaN(val2);\n }\n\n if (_typeof(val2) !== 'object' || val1 === null || val2 === null) {\n return false;\n }\n\n if (Object.getPrototypeOf(val1) !== Object.getPrototypeOf(val2)) {\n return false;\n }\n } else {\n if (val1 === null || _typeof(val1) !== 'object') {\n if (val2 === null || _typeof(val2) !== 'object') {\n // eslint-disable-next-line eqeqeq\n return val1 == val2;\n }\n\n return false;\n }\n\n if (val2 === null || _typeof(val2) !== 'object') {\n return false;\n }\n }\n\n var val1Tag = objectToString(val1);\n var val2Tag = objectToString(val2);\n\n if (val1Tag !== val2Tag) {\n return false;\n }\n\n if (Array.isArray(val1)) {\n // Check for sparse arrays and general fast path\n if (val1.length !== val2.length) {\n return false;\n }\n\n var keys1 = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n var keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n return keyCheck(val1, val2, strict, memos, kIsArray, keys1);\n } // [browserify] This triggers on certain types in IE (Map/Set) so we don't\n // wan't to early return out of the rest of the checks. However we can check\n // if the second value is one of these values and the first isn't.\n\n\n if (val1Tag === '[object Object]') {\n // return keyCheck(val1, val2, strict, memos, kNoIterator);\n if (!isMap(val1) && isMap(val2) || !isSet(val1) && isSet(val2)) {\n return false;\n }\n }\n\n if (isDate(val1)) {\n if (!isDate(val2) || Date.prototype.getTime.call(val1) !== Date.prototype.getTime.call(val2)) {\n return false;\n }\n } else if (isRegExp(val1)) {\n if (!isRegExp(val2) || !areSimilarRegExps(val1, val2)) {\n return false;\n }\n } else if (isNativeError(val1) || val1 instanceof Error) {\n // Do not compare the stack as it might differ even though the error itself\n // is otherwise identical.\n if (val1.message !== val2.message || val1.name !== val2.name) {\n return false;\n }\n } else if (isArrayBufferView(val1)) {\n if (!strict && (isFloat32Array(val1) || isFloat64Array(val1))) {\n if (!areSimilarFloatArrays(val1, val2)) {\n return false;\n }\n } else if (!areSimilarTypedArrays(val1, val2)) {\n return false;\n } // Buffer.compare returns true, so val1.length === val2.length. If they both\n // only contain numeric keys, we don't need to exam further than checking\n // the symbols.\n\n\n var _keys = getOwnNonIndexProperties(val1, ONLY_ENUMERABLE);\n\n var _keys2 = getOwnNonIndexProperties(val2, ONLY_ENUMERABLE);\n\n if (_keys.length !== _keys2.length) {\n return false;\n }\n\n return keyCheck(val1, val2, strict, memos, kNoIterator, _keys);\n } else if (isSet(val1)) {\n if (!isSet(val2) || val1.size !== val2.size) {\n return false;\n }\n\n return keyCheck(val1, val2, strict, memos, kIsSet);\n } else if (isMap(val1)) {\n if (!isMap(val2) || val1.size !== val2.size) {\n return false;\n }\n\n return keyCheck(val1, val2, strict, memos, kIsMap);\n } else if (isAnyArrayBuffer(val1)) {\n if (!areEqualArrayBuffers(val1, val2)) {\n return false;\n }\n } else if (isBoxedPrimitive(val1) && !isEqualBoxedPrimitive(val1, val2)) {\n return false;\n }\n\n return keyCheck(val1, val2, strict, memos, kNoIterator);\n}\n\nfunction getEnumerables(val, keys) {\n return keys.filter(function (k) {\n return propertyIsEnumerable(val, k);\n });\n}\n\nfunction keyCheck(val1, val2, strict, memos, iterationType, aKeys) {\n // For all remaining Object pairs, including Array, objects and Maps,\n // equivalence is determined by having:\n // a) The same number of owned enumerable properties\n // b) The same set of keys/indexes (although not necessarily the same order)\n // c) Equivalent values for every corresponding key/index\n // d) For Sets and Maps, equal contents\n // Note: this accounts for both named and indexed properties on Arrays.\n if (arguments.length === 5) {\n aKeys = Object.keys(val1);\n var bKeys = Object.keys(val2); // The pair must have the same number of owned properties.\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n } // Cheap key test\n\n\n var i = 0;\n\n for (; i < aKeys.length; i++) {\n if (!hasOwnProperty(val2, aKeys[i])) {\n return false;\n }\n }\n\n if (strict && arguments.length === 5) {\n var symbolKeysA = objectGetOwnPropertySymbols(val1);\n\n if (symbolKeysA.length !== 0) {\n var count = 0;\n\n for (i = 0; i < symbolKeysA.length; i++) {\n var key = symbolKeysA[i];\n\n if (propertyIsEnumerable(val1, key)) {\n if (!propertyIsEnumerable(val2, key)) {\n return false;\n }\n\n aKeys.push(key);\n count++;\n } else if (propertyIsEnumerable(val2, key)) {\n return false;\n }\n }\n\n var symbolKeysB = objectGetOwnPropertySymbols(val2);\n\n if (symbolKeysA.length !== symbolKeysB.length && getEnumerables(val2, symbolKeysB).length !== count) {\n return false;\n }\n } else {\n var _symbolKeysB = objectGetOwnPropertySymbols(val2);\n\n if (_symbolKeysB.length !== 0 && getEnumerables(val2, _symbolKeysB).length !== 0) {\n return false;\n }\n }\n }\n\n if (aKeys.length === 0 && (iterationType === kNoIterator || iterationType === kIsArray && val1.length === 0 || val1.size === 0)) {\n return true;\n } // Use memos to handle cycles.\n\n\n if (memos === undefined) {\n memos = {\n val1: new Map(),\n val2: new Map(),\n position: 0\n };\n } else {\n // We prevent up to two map.has(x) calls by directly retrieving the value\n // and checking for undefined. The map can only contain numbers, so it is\n // safe to check for undefined only.\n var val2MemoA = memos.val1.get(val1);\n\n if (val2MemoA !== undefined) {\n var val2MemoB = memos.val2.get(val2);\n\n if (val2MemoB !== undefined) {\n return val2MemoA === val2MemoB;\n }\n }\n\n memos.position++;\n }\n\n memos.val1.set(val1, memos.position);\n memos.val2.set(val2, memos.position);\n var areEq = objEquiv(val1, val2, strict, aKeys, memos, iterationType);\n memos.val1.delete(val1);\n memos.val2.delete(val2);\n return areEq;\n}\n\nfunction setHasEqualElement(set, val1, strict, memo) {\n // Go looking.\n var setValues = arrayFromSet(set);\n\n for (var i = 0; i < setValues.length; i++) {\n var val2 = setValues[i];\n\n if (innerDeepEqual(val1, val2, strict, memo)) {\n // Remove the matching element to make sure we do not check that again.\n set.delete(val2);\n return true;\n }\n }\n\n return false;\n} // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using\n// Sadly it is not possible to detect corresponding values properly in case the\n// type is a string, number, bigint or boolean. The reason is that those values\n// can match lots of different string values (e.g., 1n == '+00001').\n\n\nfunction findLooseMatchingPrimitives(prim) {\n switch (_typeof(prim)) {\n case 'undefined':\n return null;\n\n case 'object':\n // Only pass in null as object!\n return undefined;\n\n case 'symbol':\n return false;\n\n case 'string':\n prim = +prim;\n // Loose equal entries exist only if the string is possible to convert to\n // a regular number and not NaN.\n // Fall through\n\n case 'number':\n if (numberIsNaN(prim)) {\n return false;\n }\n\n }\n\n return true;\n}\n\nfunction setMightHaveLoosePrim(a, b, prim) {\n var altValue = findLooseMatchingPrimitives(prim);\n if (altValue != null) return altValue;\n return b.has(altValue) && !a.has(altValue);\n}\n\nfunction mapMightHaveLoosePrim(a, b, prim, item, memo) {\n var altValue = findLooseMatchingPrimitives(prim);\n\n if (altValue != null) {\n return altValue;\n }\n\n var curB = b.get(altValue);\n\n if (curB === undefined && !b.has(altValue) || !innerDeepEqual(item, curB, false, memo)) {\n return false;\n }\n\n return !a.has(altValue) && innerDeepEqual(item, curB, false, memo);\n}\n\nfunction setEquiv(a, b, strict, memo) {\n // This is a lazily initiated Set of entries which have to be compared\n // pairwise.\n var set = null;\n var aValues = arrayFromSet(a);\n\n for (var i = 0; i < aValues.length; i++) {\n var val = aValues[i]; // Note: Checking for the objects first improves the performance for object\n // heavy sets but it is a minor slow down for primitives. As they are fast\n // to check this improves the worst case scenario instead.\n\n if (_typeof(val) === 'object' && val !== null) {\n if (set === null) {\n set = new Set();\n } // If the specified value doesn't exist in the second set its an not null\n // object (or non strict only: a not matching primitive) we'll need to go\n // hunting for something thats deep-(strict-)equal to it. To make this\n // O(n log n) complexity we have to copy these values in a new set first.\n\n\n set.add(val);\n } else if (!b.has(val)) {\n if (strict) return false; // Fast path to detect missing string, symbol, undefined and null values.\n\n if (!setMightHaveLoosePrim(a, b, val)) {\n return false;\n }\n\n if (set === null) {\n set = new Set();\n }\n\n set.add(val);\n }\n }\n\n if (set !== null) {\n var bValues = arrayFromSet(b);\n\n for (var _i = 0; _i < bValues.length; _i++) {\n var _val = bValues[_i]; // We have to check if a primitive value is already\n // matching and only if it's not, go hunting for it.\n\n if (_typeof(_val) === 'object' && _val !== null) {\n if (!setHasEqualElement(set, _val, strict, memo)) return false;\n } else if (!strict && !a.has(_val) && !setHasEqualElement(set, _val, strict, memo)) {\n return false;\n }\n }\n\n return set.size === 0;\n }\n\n return true;\n}\n\nfunction mapHasEqualEntry(set, map, key1, item1, strict, memo) {\n // To be able to handle cases like:\n // Map([[{}, 'a'], [{}, 'b']]) vs Map([[{}, 'b'], [{}, 'a']])\n // ... we need to consider *all* matching keys, not just the first we find.\n var setValues = arrayFromSet(set);\n\n for (var i = 0; i < setValues.length; i++) {\n var key2 = setValues[i];\n\n if (innerDeepEqual(key1, key2, strict, memo) && innerDeepEqual(item1, map.get(key2), strict, memo)) {\n set.delete(key2);\n return true;\n }\n }\n\n return false;\n}\n\nfunction mapEquiv(a, b, strict, memo) {\n var set = null;\n var aEntries = arrayFromMap(a);\n\n for (var i = 0; i < aEntries.length; i++) {\n var _aEntries$i = _slicedToArray(aEntries[i], 2),\n key = _aEntries$i[0],\n item1 = _aEntries$i[1];\n\n if (_typeof(key) === 'object' && key !== null) {\n if (set === null) {\n set = new Set();\n }\n\n set.add(key);\n } else {\n // By directly retrieving the value we prevent another b.has(key) check in\n // almost all possible cases.\n var item2 = b.get(key);\n\n if (item2 === undefined && !b.has(key) || !innerDeepEqual(item1, item2, strict, memo)) {\n if (strict) return false; // Fast path to detect missing string, symbol, undefined and null\n // keys.\n\n if (!mapMightHaveLoosePrim(a, b, key, item1, memo)) return false;\n\n if (set === null) {\n set = new Set();\n }\n\n set.add(key);\n }\n }\n }\n\n if (set !== null) {\n var bEntries = arrayFromMap(b);\n\n for (var _i2 = 0; _i2 < bEntries.length; _i2++) {\n var _bEntries$_i = _slicedToArray(bEntries[_i2], 2),\n key = _bEntries$_i[0],\n item = _bEntries$_i[1];\n\n if (_typeof(key) === 'object' && key !== null) {\n if (!mapHasEqualEntry(set, a, key, item, strict, memo)) return false;\n } else if (!strict && (!a.has(key) || !innerDeepEqual(a.get(key), item, false, memo)) && !mapHasEqualEntry(set, a, key, item, false, memo)) {\n return false;\n }\n }\n\n return set.size === 0;\n }\n\n return true;\n}\n\nfunction objEquiv(a, b, strict, keys, memos, iterationType) {\n // Sets and maps don't have their entries accessible via normal object\n // properties.\n var i = 0;\n\n if (iterationType === kIsSet) {\n if (!setEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsMap) {\n if (!mapEquiv(a, b, strict, memos)) {\n return false;\n }\n } else if (iterationType === kIsArray) {\n for (; i < a.length; i++) {\n if (hasOwnProperty(a, i)) {\n if (!hasOwnProperty(b, i) || !innerDeepEqual(a[i], b[i], strict, memos)) {\n return false;\n }\n } else if (hasOwnProperty(b, i)) {\n return false;\n } else {\n // Array is sparse.\n var keysA = Object.keys(a);\n\n for (; i < keysA.length; i++) {\n var key = keysA[i];\n\n if (!hasOwnProperty(b, key) || !innerDeepEqual(a[key], b[key], strict, memos)) {\n return false;\n }\n }\n\n if (keysA.length !== Object.keys(b).length) {\n return false;\n }\n\n return true;\n }\n }\n } // The pair must have equivalent values for every corresponding key.\n // Possibly expensive deep test:\n\n\n for (i = 0; i < keys.length; i++) {\n var _key = keys[i];\n\n if (!innerDeepEqual(a[_key], b[_key], strict, memos)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isDeepEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kLoose);\n}\n\nfunction isDeepStrictEqual(val1, val2) {\n return innerDeepEqual(val1, val2, kStrict);\n}\n\nmodule.exports = {\n isDeepEqual: isDeepEqual,\n isDeepStrictEqual: isDeepStrictEqual\n};\n},{\"is-nan\":381,\"object-is\":415,\"util/\":568}],232:[function(require,module,exports){\n/*!\n * assertion-error\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Return a function that will copy properties from\n * one object to another excluding any originally\n * listed. Returned function will create a new `{}`.\n *\n * @param {String} excluded properties ...\n * @return {Function}\n */\n\nfunction exclude () {\n var excludes = [].slice.call(arguments);\n\n function excludeProps (res, obj) {\n Object.keys(obj).forEach(function (key) {\n if (!~excludes.indexOf(key)) res[key] = obj[key];\n });\n }\n\n return function extendExclude () {\n var args = [].slice.call(arguments)\n , i = 0\n , res = {};\n\n for (; i < args.length; i++) {\n excludeProps(res, args[i]);\n }\n\n return res;\n };\n};\n\n/*!\n * Primary Exports\n */\n\nmodule.exports = AssertionError;\n\n/**\n * ### AssertionError\n *\n * An extension of the JavaScript `Error` constructor for\n * assertion and validation scenarios.\n *\n * @param {String} message\n * @param {Object} properties to include (optional)\n * @param {callee} start stack function (optional)\n */\n\nfunction AssertionError (message, _props, ssf) {\n var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')\n , props = extend(_props || {});\n\n // default values\n this.message = message || 'Unspecified AssertionError';\n this.showDiff = false;\n\n // copy from properties\n for (var key in props) {\n this[key] = props[key];\n }\n\n // capture stack trace\n ssf = ssf || AssertionError;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ssf);\n } else {\n try {\n throw new Error();\n } catch(e) {\n this.stack = e.stack;\n }\n }\n}\n\n/*!\n * Inherit from Error.prototype\n */\n\nAssertionError.prototype = Object.create(Error.prototype);\n\n/*!\n * Statically set name\n */\n\nAssertionError.prototype.name = 'AssertionError';\n\n/*!\n * Ensure correct constructor\n */\n\nAssertionError.prototype.constructor = AssertionError;\n\n/**\n * Allow errors to be converted to JSON for static transfer.\n *\n * @param {Boolean} include stack (default: `true`)\n * @return {Object} object that can be `JSON.stringify`\n */\n\nAssertionError.prototype.toJSON = function (stack) {\n var extend = exclude('constructor', 'toJSON', 'stack')\n , props = extend({ name: this.name }, this);\n\n // include stack if exists and not turned off\n if (false !== stack && this.stack) {\n props.stack = this.stack;\n }\n\n return props;\n};\n\n},{}],233:[function(require,module,exports){\n(function (global){(function (){\n'use strict';\n\nvar filter = require('array-filter');\n\nmodule.exports = function availableTypedArrays() {\n\treturn filter([\n\t\t'BigInt64Array',\n\t\t'BigUint64Array',\n\t\t'Float32Array',\n\t\t'Float64Array',\n\t\t'Int16Array',\n\t\t'Int32Array',\n\t\t'Int8Array',\n\t\t'Uint16Array',\n\t\t'Uint32Array',\n\t\t'Uint8Array',\n\t\t'Uint8ClampedArray'\n\t], function (typedArray) {\n\t\treturn typeof global[typedArray] === 'function';\n\t});\n};\n\n}).call(this)}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"array-filter\":228}],234:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n\n},{}],235:[function(require,module,exports){\nmodule.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};\n},{}],236:[function(require,module,exports){\n\n},{}],237:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n},{}],238:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],239:[function(require,module,exports){\n'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n\n},{\"./\":240,\"get-intrinsic\":361}],240:[function(require,module,exports){\n'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n\n},{\"function-bind\":359,\"get-intrinsic\":361}],241:[function(require,module,exports){\nmodule.exports = require('./lib');\n\n},{\"./lib\":242}],242:[function(require,module,exports){\nconst FIRST_LINE = /(.*?)\\n.*/g,\n\n statusClassReasons = {\n info: 1,\n success: 2,\n redirection: 3,\n clientError: 4,\n serverError: 5\n },\n\n statusCodeReasons = {\n // ok: 200, // cannot add 'ok' directly since it violates underlying 'ok' property\n accepted: { statusCode: 202, name: 'Accepted' },\n withoutContent: { statusCode: 204, name: 'No Content' }, // @todo add 1223 status code\n badRequest: { statusCode: 400, name: 'Bad Request' },\n unauthorised: { statusCode: 401, name: 'Unauthorised' },\n unauthorized: { statusCode: 401, name: 'Unauthorized' },\n forbidden: { statusCode: 403, name: 'Forbidden' },\n notFound: { statusCode: 404, name: 'Not Found' },\n notAcceptable: { statusCode: 406, name: 'Acceptable' },\n rateLimited: { statusCode: 429, name: 'Too Many Requests' }\n };\n\n/**\n * Accepts the postman collection sdk module, in order to instantiate postman specific assertions.\n *\n * @param {Object} sdk - The collection sdk library instance.\n * @param {Object} _ - An instance of Lodash, passed from the Sandbox.\n * @param {Function} Ajv - An instance of Ajv, passed from the Sandbox.\n * @returns {Function} - A chai assertion extension method that references the sdk in a closure.\n */\nmodule.exports = function (sdk, _, Ajv) {\n const requestOrResponse = function (what) {\n return sdk.Request.isRequest(what) && 'request' || sdk.Response.isResponse(what) && 'response' || undefined;\n };\n\n /**\n * Adds postman-collection assertions via the chai-postman plugin interface.\n *\n * @param {Object} chai - A Chai assertion wrapper class provided by the chai library.\n */\n return function (chai) {\n var Assertion = chai.Assertion;\n\n Assertion.addProperty('postmanRequest', function () {\n this.assert(sdk.Request.isRequest(this._obj),\n 'expecting a postman request object but got #{this}',\n 'not expecting a postman request object');\n });\n\n Assertion.addProperty('postmanResponse', function () {\n this.assert(sdk.Response.isResponse(this._obj),\n 'expecting a postman response object but got #{this}',\n 'not expecting a postman response object');\n });\n\n Assertion.addProperty('postmanRequestOrResponse', function () {\n this.assert(sdk.Response.isResponse(this._obj) || sdk.Request.isRequest(this._obj),\n 'expecting a postman request or response object but got #{this}',\n 'not expecting a postman request or response object');\n });\n\n Assertion.addMethod('statusCodeClass', function (classCode) {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('code');\n new Assertion(this._obj.code).to.be.a('number');\n\n const statusClass = Math.floor(this._obj.code / 100);\n\n this.assert(statusClass === classCode,\n 'expected response code to be #{exp}XX but found #{act}',\n 'expected response code to not be #{exp}XX',\n classCode, this._obj.code);\n });\n\n _.forOwn(statusClassReasons, function (classCode, reason) {\n Assertion.addProperty(reason, function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('code');\n new Assertion(this._obj.code).to.be.a('number');\n\n const statusClass = Math.floor(this._obj.code / 100);\n\n this.assert(statusClass === classCode,\n 'expected response code to be #{exp}XX but found #{act}',\n 'expected response code to not be #{exp}XX',\n classCode, this._obj.code);\n });\n });\n\n Assertion.addProperty('error', function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('code');\n new Assertion(this._obj.code).to.be.a('number');\n\n const statusClass = Math.floor(this._obj.code / 100);\n\n this.assert(statusClass === 4 || statusClass === 5,\n 'expected response code to be 4XX or 5XX but found #{act}',\n 'expected response code to not be 4XX or 5XX',\n null, this._obj.code);\n });\n\n Assertion.addMethod('statusCode', function (code) {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('code');\n new Assertion(this._obj.code).to.be.a('number');\n\n this.assert(this._obj.code === Number(code),\n 'expected response to have status code #{exp} but got #{act}',\n 'expected response to not have status code #{act}',\n Number(code), this._obj.code);\n });\n\n Assertion.addMethod('statusReason', function (reason) {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('reason');\n new Assertion(this._obj.reason).to.be.a('function');\n\n reason = String(reason);\n\n this.assert(this._obj.reason() === reason,\n 'expected response to have status reason #{exp} but got #{act}',\n 'expected response to not have status reason #{act}',\n reason, this._obj.reason());\n });\n\n _.forOwn(statusCodeReasons, function (reason, assertionName) {\n Assertion.addProperty(assertionName, function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('reason');\n new Assertion(this._obj.reason).to.be.a('function');\n new Assertion(this._obj).to.have.property('details');\n new Assertion(this._obj.details).to.be.a('function');\n\n const wantedReason = reason.name.toUpperCase(),\n actualReason = String(this._obj.reason()).toUpperCase(),\n actualStatusCode = Number(this._obj.details().code);\n\n this.assert(actualReason === wantedReason,\n 'expected response to have status reason #{exp} but got #{act}',\n 'expected response to not have status reason #{act}',\n wantedReason, actualReason);\n this.assert(actualStatusCode === reason.statusCode,\n 'expected response to have status code #{exp} but got #{act}',\n 'expected response to not have status code #{act}',\n reason.statusCode, actualStatusCode);\n });\n });\n\n // handle ok status code reason separately\n Assertion.addProperty('ok', function () {\n if (!sdk.Response.isResponse(this._obj)) { // if asserted object is not response, use underlying `ok`\n this.assert(chai.util.flag(this, 'object'),\n 'expected #{this} to be truthy',\n 'expected #{this} to be falsy');\n\n return;\n }\n\n new Assertion(this._obj).to.have.property('reason');\n new Assertion(this._obj.reason).to.be.a('function');\n new Assertion(this._obj).to.have.property('details');\n new Assertion(this._obj.details).to.be.a('function');\n\n const wantedReason = 'OK',\n actualReason = String(this._obj.reason()).toUpperCase(),\n actualStatusCode = Number(this._obj.details().code);\n\n this.assert(actualReason === wantedReason,\n 'expected response to have status reason #{exp} but got #{act}',\n 'expected response to not have status reason #{act}',\n wantedReason, actualReason);\n this.assert(actualStatusCode === 200,\n 'expected response to have status code #{exp} but got #{act}',\n 'expected response to not have status code #{act}',\n 200, actualStatusCode);\n });\n\n Assertion.addMethod('status', function (codeOrReason) {\n new Assertion(this._obj).to.be.postmanResponse;\n\n if (_.isNumber(codeOrReason)) {\n new Assertion(this._obj).to.have.property('code');\n new Assertion(this._obj.code).to.be.a('number');\n\n this.assert(this._obj.code === Number(codeOrReason),\n 'expected response to have status code #{exp} but got #{act}',\n 'expected response to not have status code #{act}',\n Number(codeOrReason), this._obj.code);\n }\n else {\n new Assertion(this._obj).to.have.property('reason');\n new Assertion(this._obj.reason).to.be.a('function');\n\n this.assert(this._obj.reason() === codeOrReason,\n 'expected response to have status reason #{exp} but got #{act}',\n 'expected response to not have status reason #{act}',\n codeOrReason, this._obj.reason());\n }\n });\n\n Assertion.addMethod('header', function (headerKey, headerValue) {\n new Assertion(this._obj).to.be.postmanRequestOrResponse;\n new Assertion(this._obj).to.have.property('headers');\n\n const ror = requestOrResponse(this._obj);\n\n this.assert(this._obj.headers.has(headerKey),\n 'expected ' + ror + ' to have header with key \\'' + String(headerKey) + '\\'',\n 'expected ' + ror + ' to not have header with key \\'' + String(headerKey) + '\\'',\n true, this._obj.headers.has(headerKey));\n\n if (arguments.length < 2) { return; } // in case no check is done on value\n\n this.assert(this._obj.headers.one(headerKey).value === headerValue,\n 'expected \\'' + String(headerKey) + '\\' ' + ror + ' header to be #{exp} but got #{act}',\n 'expected \\'' + String(headerKey) + '\\' ' + ror + ' header to not be #{act}',\n headerValue, this._obj.headers.one(headerKey).value);\n });\n\n Assertion.addProperty('withBody', function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('text');\n new Assertion(this._obj.text).to.be.a('function');\n\n const bodyText = this._obj.text();\n\n this.assert(_.isString(bodyText) && bodyText.length,\n 'expected response to have content in body',\n 'expected response to not have content in body');\n });\n\n Assertion.addProperty('json', function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('json');\n new Assertion(this._obj.json).to.be.a('function');\n\n var parseError;\n\n try { this._obj.json(); }\n catch (e) {\n if (e.name === 'JSONError' && e.message) {\n parseError = e.message.replace(FIRST_LINE, '$1');\n }\n else {\n parseError = e.name + ': ' + e.message;\n }\n }\n\n this.assert(!parseError,\n 'expected response body to be a valid json but got error ' + parseError,\n 'expected response body not to be a valid json');\n });\n\n Assertion.addMethod('body', function (content) {\n var bodyData;\n\n new Assertion(this._obj).to.be.postmanResponse;\n\n // assert equality with json\n if (_.isPlainObject(content)) {\n new Assertion(this._obj).to.have.property('json');\n new Assertion(this._obj.json).to.be.a('function');\n\n try { bodyData = this._obj.json(); }\n catch (e) { } // eslint-disable-line no-empty\n\n this.assert(_.isEqual(bodyData, content),\n 'expected response body json to equal #{exp} but got #{act}',\n 'expected response body json to not equal #{exp} but got #{act}',\n content, bodyData);\n\n return;\n }\n\n new Assertion(this._obj).to.have.property('text');\n new Assertion(this._obj.text).to.be.a('function');\n bodyData = this._obj.text();\n\n // assert only presence of body\n if (arguments.length === 0) {\n this.assert(_.isString(bodyData) && bodyData.length,\n 'expected response to have content in body',\n 'expected response to not have content in body');\n\n return;\n }\n\n // assert regexp\n if (content instanceof RegExp) {\n this.assert(content.exec(bodyData) !== null,\n 'expected response body text to match #{exp} but got #{act}',\n 'expected response body text #{act} to not match #{exp}',\n content, bodyData);\n\n return;\n }\n\n // assert text or remaining stuff\n this.assert(_.isEqual(bodyData, content),\n 'expected response body to equal #{exp} but got #{act}',\n 'expected response body to not equal #{exp}',\n content, bodyData);\n });\n\n Assertion.addMethod('jsonBody', function (path, value) {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('json');\n new Assertion(this._obj.json).to.be.a('function');\n\n var jsonBody,\n parseError;\n\n try { jsonBody = this._obj.json(); }\n catch (e) {\n if (e.name === 'JSONError' && e.message) {\n parseError = e.message.replace(FIRST_LINE, '$1');\n }\n else {\n parseError = e.name + ': ' + e.message;\n }\n }\n\n if (arguments.length === 0) {\n this.assert(!parseError, 'expected response body to be a valid json but got error ' + parseError,\n 'expected response body not to be a valid json');\n\n return;\n }\n\n if (_.isString(path)) {\n this.assert(_.has(jsonBody, path),\n 'expected #{act} in response to contain property #{exp}',\n 'expected #{act} in response to not contain property #{exp}',\n path, jsonBody);\n\n if (arguments.length > 1) {\n jsonBody = _.get(jsonBody, path);\n this.assert(_.isEqual(jsonBody, value),\n 'expected response body json at \"' + path + '\" to contain #{exp} but got #{act}',\n 'expected response body json at \"' + path + '\" to not contain #{exp} but got #{act}',\n value, jsonBody);\n }\n }\n });\n\n Assertion.addChainableMethod('responseTime', function (value) {\n const time = chai.util.flag(this, 'number');\n\n this.assert(_.isNumber(time),\n 'expected response to have a valid response time but got #{act}',\n 'expected response to not have a valid response time but got #{act}', null, time);\n\n arguments.length && this.assert(_.isEqual(time, value),\n 'expected response to have a valid response time but got #{act}',\n 'expected response to not have a valid response time but got #{act}', null, time);\n }, function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('responseTime');\n\n chai.util.flag(this, 'number', this._obj.responseTime);\n this._obj = _.get(this._obj, 'responseTime'); // @todo: do this the right way adhering to chai standards\n });\n\n Assertion.addChainableMethod('responseSize', function (value) {\n const size = chai.util.flag(this, 'number');\n\n this.assert(_.isNumber(size),\n 'expected response to have a valid response size but got #{act}',\n 'expected response to not have a valid response size but got #{act}', null, size);\n\n arguments.length && this.assert(_.isEqual(size, value),\n 'expected response size to equal #{act} but got #{exp}',\n 'expected response size to not equal #{act} but got #{exp}', value, size);\n }, function () {\n new Assertion(this._obj).to.be.postmanResponse;\n new Assertion(this._obj).to.have.property('size');\n new Assertion(this._obj.size).to.be.a('function');\n\n const size = this._obj.size(),\n total = (size.header || 0) + (size.body || 0);\n\n chai.util.flag(this, 'number', total);\n this._obj = total; // @todo: do this the right way adhering to chai standards\n });\n\n Assertion.addMethod('jsonSchema', function (schema, options) {\n new Assertion(schema).to.be.an('object');\n\n var ajv,\n valid,\n data;\n\n // eslint-disable-next-line prefer-object-spread\n options = Object.assign({\n allErrors: true, // check all rules collecting all errors\n logger: false // logging is disabled\n }, options);\n\n if (sdk.Response.isResponse(this._obj) || sdk.Request.isRequest(this._obj) &&\n typeof this._obj.json === 'function') {\n data = this._obj.json();\n }\n else {\n data = this._obj;\n }\n\n ajv = new Ajv(options);\n valid = ajv.validate(schema, data);\n\n this.assert(valid && !ajv.errors,\n 'expected data to satisfy schema but found following errors: \\n' +\n ajv.errorsText(),\n 'expected data to not satisfy schema', true, valid);\n });\n\n // @todo add tests for:\n // 1. request and response content type\n // 2. response encoding\n // 4. response size\n // 5. cookies\n // 6. assert on http/https\n // 7. assert property \"secured\" and include auth flags\n };\n};\n\n},{}],243:[function(require,module,exports){\n/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar used = [];\n\n/*!\n * Chai version\n */\n\nexports.version = '4.3.3';\n\n/*!\n * Assertion Error\n */\n\nexports.AssertionError = require('assertion-error');\n\n/*!\n * Utils for plugins (not exported)\n */\n\nvar util = require('./chai/utils');\n\n/**\n * # .use(function)\n *\n * Provides a way to extend the internals of Chai.\n *\n * @param {Function}\n * @returns {this} for chaining\n * @api public\n */\n\nexports.use = function (fn) {\n if (!~used.indexOf(fn)) {\n fn(exports, util);\n used.push(fn);\n }\n\n return exports;\n};\n\n/*!\n * Utility Functions\n */\n\nexports.util = util;\n\n/*!\n * Configuration\n */\n\nvar config = require('./chai/config');\nexports.config = config;\n\n/*!\n * Primary `Assertion` prototype\n */\n\nvar assertion = require('./chai/assertion');\nexports.use(assertion);\n\n/*!\n * Core Assertions\n */\n\nvar core = require('./chai/core/assertions');\nexports.use(core);\n\n/*!\n * Expect interface\n */\n\nvar expect = require('./chai/interface/expect');\nexports.use(expect);\n\n/*!\n * Should interface\n */\n\nvar should = require('./chai/interface/should');\nexports.use(should);\n\n/*!\n * Assert interface\n */\n\nvar assert = require('./chai/interface/assert');\nexports.use(assert);\n\n},{\"./chai/assertion\":244,\"./chai/config\":245,\"./chai/core/assertions\":246,\"./chai/interface/assert\":247,\"./chai/interface/expect\":248,\"./chai/interface/should\":249,\"./chai/utils\":263,\"assertion-error\":232}],244:[function(require,module,exports){\n/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('./config');\n\nmodule.exports = function (_chai, util) {\n /*!\n * Module dependencies.\n */\n\n var AssertionError = _chai.AssertionError\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n _chai.Assertion = Assertion;\n\n /*!\n * Assertion Constructor\n *\n * Creates object for chaining.\n *\n * `Assertion` objects contain metadata in the form of flags. Three flags can\n * be assigned during instantiation by passing arguments to this constructor:\n *\n * - `object`: This flag contains the target of the assertion. For example, in\n * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will\n * contain `numKittens` so that the `equal` assertion can reference it when\n * needed.\n *\n * - `message`: This flag contains an optional custom error message to be\n * prepended to the error message that's generated by the assertion when it\n * fails.\n *\n * - `ssfi`: This flag stands for \"start stack function indicator\". It\n * contains a function reference that serves as the starting point for\n * removing frames from the stack trace of the error that's created by the\n * assertion when it fails. The goal is to provide a cleaner stack trace to\n * end users by removing Chai's internal functions. Note that it only works\n * in environments that support `Error.captureStackTrace`, and only when\n * `Chai.config.includeStack` hasn't been set to `false`.\n *\n * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag\n * should retain its current value, even as assertions are chained off of\n * this object. This is usually set to `true` when creating a new assertion\n * from within another assertion. It's also temporarily set to `true` before\n * an overwritten assertion gets called by the overwriting assertion.\n *\n * @param {Mixed} obj target of the assertion\n * @param {String} msg (optional) custom error message\n * @param {Function} ssfi (optional) starting point for removing stack frames\n * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked\n * @api private\n */\n\n function Assertion (obj, msg, ssfi, lockSsfi) {\n flag(this, 'ssfi', ssfi || Assertion);\n flag(this, 'lockSsfi', lockSsfi);\n flag(this, 'object', obj);\n flag(this, 'message', msg);\n\n return util.proxify(this);\n }\n\n Object.defineProperty(Assertion, 'includeStack', {\n get: function() {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n return config.includeStack;\n },\n set: function(value) {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n config.includeStack = value;\n }\n });\n\n Object.defineProperty(Assertion, 'showDiff', {\n get: function() {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n return config.showDiff;\n },\n set: function(value) {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n config.showDiff = value;\n }\n });\n\n Assertion.addProperty = function (name, fn) {\n util.addProperty(this.prototype, name, fn);\n };\n\n Assertion.addMethod = function (name, fn) {\n util.addMethod(this.prototype, name, fn);\n };\n\n Assertion.addChainableMethod = function (name, fn, chainingBehavior) {\n util.addChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n Assertion.overwriteProperty = function (name, fn) {\n util.overwriteProperty(this.prototype, name, fn);\n };\n\n Assertion.overwriteMethod = function (name, fn) {\n util.overwriteMethod(this.prototype, name, fn);\n };\n\n Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {\n util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n /**\n * ### .assert(expression, message, negateMessage, expected, actual, showDiff)\n *\n * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.\n *\n * @name assert\n * @param {Philosophical} expression to be tested\n * @param {String|Function} message or function that returns message to display if expression fails\n * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails\n * @param {Mixed} expected value (remember to check for negation)\n * @param {Mixed} actual (optional) will default to `this.obj`\n * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails\n * @api private\n */\n\n Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {\n var ok = util.test(this, arguments);\n if (false !== showDiff) showDiff = true;\n if (undefined === expected && undefined === _actual) showDiff = false;\n if (true !== config.showDiff) showDiff = false;\n\n if (!ok) {\n msg = util.getMessage(this, arguments);\n var actual = util.getActual(this, arguments);\n var assertionErrorObjectProperties = {\n actual: actual\n , expected: expected\n , showDiff: showDiff\n };\n\n var operator = util.getOperator(this, arguments);\n if (operator) {\n assertionErrorObjectProperties.operator = operator;\n }\n\n throw new AssertionError(\n msg,\n assertionErrorObjectProperties,\n (config.includeStack) ? this.assert : flag(this, 'ssfi'));\n }\n };\n\n /*!\n * ### ._obj\n *\n * Quick reference to stored `actual` value for plugin developers.\n *\n * @api private\n */\n\n Object.defineProperty(Assertion.prototype, '_obj',\n { get: function () {\n return flag(this, 'object');\n }\n , set: function (val) {\n flag(this, 'object', val);\n }\n });\n};\n\n},{\"./config\":245}],245:[function(require,module,exports){\nmodule.exports = {\n\n /**\n * ### config.includeStack\n *\n * User configurable property, influences whether stack trace\n * is included in Assertion error message. Default of false\n * suppresses stack trace in the error message.\n *\n * chai.config.includeStack = true; // enable stack on error\n *\n * @param {Boolean}\n * @api public\n */\n\n includeStack: false,\n\n /**\n * ### config.showDiff\n *\n * User configurable property, influences whether or not\n * the `showDiff` flag should be included in the thrown\n * AssertionErrors. `false` will always be `false`; `true`\n * will be true when the assertion has requested a diff\n * be shown.\n *\n * @param {Boolean}\n * @api public\n */\n\n showDiff: true,\n\n /**\n * ### config.truncateThreshold\n *\n * User configurable property, sets length threshold for actual and\n * expected values in assertion errors. If this threshold is exceeded, for\n * example for large data structures, the value is replaced with something\n * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.\n *\n * Set it to zero if you want to disable truncating altogether.\n *\n * This is especially userful when doing assertions on arrays: having this\n * set to a reasonable large value makes the failure messages readily\n * inspectable.\n *\n * chai.config.truncateThreshold = 0; // disable truncating\n *\n * @param {Number}\n * @api public\n */\n\n truncateThreshold: 40,\n\n /**\n * ### config.useProxy\n *\n * User configurable property, defines if chai will use a Proxy to throw\n * an error when a non-existent property is read, which protects users\n * from typos when using property-based assertions.\n *\n * Set it to false if you want to disable this feature.\n *\n * chai.config.useProxy = false; // disable use of Proxy\n *\n * This feature is automatically disabled regardless of this config value\n * in environments that don't support proxies.\n *\n * @param {Boolean}\n * @api public\n */\n\n useProxy: true,\n\n /**\n * ### config.proxyExcludedKeys\n *\n * User configurable property, defines which properties should be ignored\n * instead of throwing an error if they do not exist on the assertion.\n * This is only applied if the environment Chai is running in supports proxies and\n * if the `useProxy` configuration setting is enabled.\n * By default, `then` and `inspect` will not throw an error if they do not exist on the\n * assertion object because the `.inspect` property is read by `util.inspect` (for example, when\n * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking.\n *\n * // By default these keys will not throw an error if they do not exist on the assertion object\n * chai.config.proxyExcludedKeys = ['then', 'inspect'];\n *\n * @param {Array}\n * @api public\n */\n\n proxyExcludedKeys: ['then', 'catch', 'inspect', 'toJSON']\n};\n\n},{}],246:[function(require,module,exports){\n/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, _) {\n var Assertion = chai.Assertion\n , AssertionError = chai.AssertionError\n , flag = _.flag;\n\n /**\n * ### Language Chains\n *\n * The following are provided as chainable getters to improve the readability\n * of your assertions.\n *\n * **Chains**\n *\n * - to\n * - be\n * - been\n * - is\n * - that\n * - which\n * - and\n * - has\n * - have\n * - with\n * - at\n * - of\n * - same\n * - but\n * - does\n * - still\n * - also\n *\n * @name language chains\n * @namespace BDD\n * @api public\n */\n\n [ 'to', 'be', 'been', 'is'\n , 'and', 'has', 'have', 'with'\n , 'that', 'which', 'at', 'of'\n , 'same', 'but', 'does', 'still', \"also\" ].forEach(function (chain) {\n Assertion.addProperty(chain);\n });\n\n /**\n * ### .not\n *\n * Negates all assertions that follow in the chain.\n *\n * expect(function () {}).to.not.throw();\n * expect({a: 1}).to.not.have.property('b');\n * expect([1, 2]).to.be.an('array').that.does.not.include(3);\n *\n * Just because you can negate any assertion with `.not` doesn't mean you\n * should. With great power comes great responsibility. It's often best to\n * assert that the one expected output was produced, rather than asserting\n * that one of countless unexpected outputs wasn't produced. See individual\n * assertions for specific guidance.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.not.equal(1); // Not recommended\n *\n * @name not\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('not', function () {\n flag(this, 'negate', true);\n });\n\n /**\n * ### .deep\n *\n * Causes all `.equal`, `.include`, `.members`, `.keys`, and `.property`\n * assertions that follow in the chain to use deep equality instead of strict\n * (`===`) equality. See the `deep-eql` project page for info on the deep\n * equality algorithm: https://github.com/chaijs/deep-eql.\n *\n * // Target object deeply (but not strictly) equals `{a: 1}`\n * expect({a: 1}).to.deep.equal({a: 1});\n * expect({a: 1}).to.not.equal({a: 1});\n *\n * // Target array deeply (but not strictly) includes `{a: 1}`\n * expect([{a: 1}]).to.deep.include({a: 1});\n * expect([{a: 1}]).to.not.include({a: 1});\n *\n * // Target object deeply (but not strictly) includes `x: {a: 1}`\n * expect({x: {a: 1}}).to.deep.include({x: {a: 1}});\n * expect({x: {a: 1}}).to.not.include({x: {a: 1}});\n *\n * // Target array deeply (but not strictly) has member `{a: 1}`\n * expect([{a: 1}]).to.have.deep.members([{a: 1}]);\n * expect([{a: 1}]).to.not.have.members([{a: 1}]);\n *\n * // Target set deeply (but not strictly) has key `{a: 1}`\n * expect(new Set([{a: 1}])).to.have.deep.keys([{a: 1}]);\n * expect(new Set([{a: 1}])).to.not.have.keys([{a: 1}]);\n *\n * // Target object deeply (but not strictly) has property `x: {a: 1}`\n * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1});\n * expect({x: {a: 1}}).to.not.have.property('x', {a: 1});\n *\n * @name deep\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('deep', function () {\n flag(this, 'deep', true);\n });\n\n /**\n * ### .nested\n *\n * Enables dot- and bracket-notation in all `.property` and `.include`\n * assertions that follow in the chain.\n *\n * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]');\n * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'});\n *\n * If `.` or `[]` are part of an actual property name, they can be escaped by\n * adding two backslashes before them.\n *\n * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\\\.a.\\\\[b\\\\]');\n * expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\\\.a.\\\\[b\\\\]': 'x'});\n *\n * `.nested` cannot be combined with `.own`.\n *\n * @name nested\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('nested', function () {\n flag(this, 'nested', true);\n });\n\n /**\n * ### .own\n *\n * Causes all `.property` and `.include` assertions that follow in the chain\n * to ignore inherited properties.\n *\n * Object.prototype.b = 2;\n *\n * expect({a: 1}).to.have.own.property('a');\n * expect({a: 1}).to.have.property('b');\n * expect({a: 1}).to.not.have.own.property('b');\n *\n * expect({a: 1}).to.own.include({a: 1});\n * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2});\n *\n * `.own` cannot be combined with `.nested`.\n *\n * @name own\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('own', function () {\n flag(this, 'own', true);\n });\n\n /**\n * ### .ordered\n *\n * Causes all `.members` assertions that follow in the chain to require that\n * members be in the same order.\n *\n * expect([1, 2]).to.have.ordered.members([1, 2])\n * .but.not.have.ordered.members([2, 1]);\n *\n * When `.include` and `.ordered` are combined, the ordering begins at the\n * start of both arrays.\n *\n * expect([1, 2, 3]).to.include.ordered.members([1, 2])\n * .but.not.include.ordered.members([2, 3]);\n *\n * @name ordered\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ordered', function () {\n flag(this, 'ordered', true);\n });\n\n /**\n * ### .any\n *\n * Causes all `.keys` assertions that follow in the chain to only require that\n * the target have at least one of the given keys. This is the opposite of\n * `.all`, which requires that the target have all of the given keys.\n *\n * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');\n *\n * See the `.keys` doc for guidance on when to use `.any` or `.all`.\n *\n * @name any\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('any', function () {\n flag(this, 'any', true);\n flag(this, 'all', false);\n });\n\n /**\n * ### .all\n *\n * Causes all `.keys` assertions that follow in the chain to require that the\n * target have all of the given keys. This is the opposite of `.any`, which\n * only requires that the target have at least one of the given keys.\n *\n * expect({a: 1, b: 2}).to.have.all.keys('a', 'b');\n *\n * Note that `.all` is used by default when neither `.all` nor `.any` are\n * added earlier in the chain. However, it's often best to add `.all` anyway\n * because it improves readability.\n *\n * See the `.keys` doc for guidance on when to use `.any` or `.all`.\n *\n * @name all\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('all', function () {\n flag(this, 'all', true);\n flag(this, 'any', false);\n });\n\n /**\n * ### .a(type[, msg])\n *\n * Asserts that the target's type is equal to the given string `type`. Types\n * are case insensitive. See the `type-detect` project page for info on the\n * type detection algorithm: https://github.com/chaijs/type-detect.\n *\n * expect('foo').to.be.a('string');\n * expect({a: 1}).to.be.an('object');\n * expect(null).to.be.a('null');\n * expect(undefined).to.be.an('undefined');\n * expect(new Error).to.be.an('error');\n * expect(Promise.resolve()).to.be.a('promise');\n * expect(new Float32Array).to.be.a('float32array');\n * expect(Symbol()).to.be.a('symbol');\n *\n * `.a` supports objects that have a custom type set via `Symbol.toStringTag`.\n *\n * var myObj = {\n * [Symbol.toStringTag]: 'myCustomType'\n * };\n *\n * expect(myObj).to.be.a('myCustomType').but.not.an('object');\n *\n * It's often best to use `.a` to check a target's type before making more\n * assertions on the same target. That way, you avoid unexpected behavior from\n * any assertion that does different things based on the target's type.\n *\n * expect([1, 2, 3]).to.be.an('array').that.includes(2);\n * expect([]).to.be.an('array').that.is.empty;\n *\n * Add `.not` earlier in the chain to negate `.a`. However, it's often best to\n * assert that the target is the expected type, rather than asserting that it\n * isn't one of many unexpected types.\n *\n * expect('foo').to.be.a('string'); // Recommended\n * expect('foo').to.not.be.an('array'); // Not recommended\n *\n * `.a` accepts an optional `msg` argument which is a custom error message to\n * show when the assertion fails. The message can also be given as the second\n * argument to `expect`.\n *\n * expect(1).to.be.a('string', 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.be.a('string');\n *\n * `.a` can also be used as a language chain to improve the readability of\n * your assertions.\n *\n * expect({b: 2}).to.have.a.property('b');\n *\n * The alias `.an` can be used interchangeably with `.a`.\n *\n * @name a\n * @alias an\n * @param {String} type\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function an (type, msg) {\n if (msg) flag(this, 'message', msg);\n type = type.toLowerCase();\n var obj = flag(this, 'object')\n , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';\n\n this.assert(\n type === _.type(obj).toLowerCase()\n , 'expected #{this} to be ' + article + type\n , 'expected #{this} not to be ' + article + type\n );\n }\n\n Assertion.addChainableMethod('an', an);\n Assertion.addChainableMethod('a', an);\n\n /**\n * ### .include(val[, msg])\n *\n * When the target is a string, `.include` asserts that the given string `val`\n * is a substring of the target.\n *\n * expect('foobar').to.include('foo');\n *\n * When the target is an array, `.include` asserts that the given `val` is a\n * member of the target.\n *\n * expect([1, 2, 3]).to.include(2);\n *\n * When the target is an object, `.include` asserts that the given object\n * `val`'s properties are a subset of the target's properties.\n *\n * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2});\n *\n * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a\n * member of the target. SameValueZero equality algorithm is used.\n *\n * expect(new Set([1, 2])).to.include(2);\n *\n * When the target is a Map, `.include` asserts that the given `val` is one of\n * the values of the target. SameValueZero equality algorithm is used.\n *\n * expect(new Map([['a', 1], ['b', 2]])).to.include(2);\n *\n * Because `.include` does different things based on the target's type, it's\n * important to check the target's type before using `.include`. See the `.a`\n * doc for info on testing a target's type.\n *\n * expect([1, 2, 3]).to.be.an('array').that.includes(2);\n *\n * By default, strict (`===`) equality is used to compare array members and\n * object properties. Add `.deep` earlier in the chain to use deep equality\n * instead (WeakSet targets are not supported). See the `deep-eql` project\n * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql.\n *\n * // Target array deeply (but not strictly) includes `{a: 1}`\n * expect([{a: 1}]).to.deep.include({a: 1});\n * expect([{a: 1}]).to.not.include({a: 1});\n *\n * // Target object deeply (but not strictly) includes `x: {a: 1}`\n * expect({x: {a: 1}}).to.deep.include({x: {a: 1}});\n * expect({x: {a: 1}}).to.not.include({x: {a: 1}});\n *\n * By default, all of the target's properties are searched when working with\n * objects. This includes properties that are inherited and/or non-enumerable.\n * Add `.own` earlier in the chain to exclude the target's inherited\n * properties from the search.\n *\n * Object.prototype.b = 2;\n *\n * expect({a: 1}).to.own.include({a: 1});\n * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2});\n *\n * Note that a target object is always only searched for `val`'s own\n * enumerable properties.\n *\n * `.deep` and `.own` can be combined.\n *\n * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}});\n *\n * Add `.nested` earlier in the chain to enable dot- and bracket-notation when\n * referencing nested properties.\n *\n * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'});\n *\n * If `.` or `[]` are part of an actual property name, they can be escaped by\n * adding two backslashes before them.\n *\n * expect({'.a': {'[b]': 2}}).to.nested.include({'\\\\.a.\\\\[b\\\\]': 2});\n *\n * `.deep` and `.nested` can be combined.\n *\n * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}});\n *\n * `.own` and `.nested` cannot be combined.\n *\n * Add `.not` earlier in the chain to negate `.include`.\n *\n * expect('foobar').to.not.include('taco');\n * expect([1, 2, 3]).to.not.include(4);\n *\n * However, it's dangerous to negate `.include` when the target is an object.\n * The problem is that it creates uncertain expectations by asserting that the\n * target object doesn't have all of `val`'s key/value pairs but may or may\n * not have some of them. It's often best to identify the exact output that's\n * expected, and then write an assertion that only accepts that exact output.\n *\n * When the target object isn't even expected to have `val`'s keys, it's\n * often best to assert exactly that.\n *\n * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended\n * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended\n *\n * When the target object is expected to have `val`'s keys, it's often best to\n * assert that each of the properties has its expected value, rather than\n * asserting that each property doesn't have one of many unexpected values.\n *\n * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended\n * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended\n *\n * `.include` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect([1, 2, 3]).to.include(4, 'nooo why fail??');\n * expect([1, 2, 3], 'nooo why fail??').to.include(4);\n *\n * `.include` can also be used as a language chain, causing all `.members` and\n * `.keys` assertions that follow in the chain to require the target to be a\n * superset of the expected set, rather than an identical set. Note that\n * `.members` ignores duplicates in the subset when `.include` is added.\n *\n * // Target object's keys are a superset of ['a', 'b'] but not identical\n * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b');\n * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b');\n *\n * // Target array is a superset of [1, 2] but not identical\n * expect([1, 2, 3]).to.include.members([1, 2]);\n * expect([1, 2, 3]).to.not.have.members([1, 2]);\n *\n * // Duplicates in the subset are ignored\n * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);\n *\n * Note that adding `.any` earlier in the chain causes the `.keys` assertion\n * to ignore `.include`.\n *\n * // Both assertions are identical\n * expect({a: 1}).to.include.any.keys('a', 'b');\n * expect({a: 1}).to.have.any.keys('a', 'b');\n *\n * The aliases `.includes`, `.contain`, and `.contains` can be used\n * interchangeably with `.include`.\n *\n * @name include\n * @alias contain\n * @alias includes\n * @alias contains\n * @param {Mixed} val\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function SameValueZero(a, b) {\n return (_.isNaN(a) && _.isNaN(b)) || a === b;\n }\n\n function includeChainingBehavior () {\n flag(this, 'contains', true);\n }\n\n function include (val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var obj = flag(this, 'object')\n , objType = _.type(obj).toLowerCase()\n , flagMsg = flag(this, 'message')\n , negate = flag(this, 'negate')\n , ssfi = flag(this, 'ssfi')\n , isDeep = flag(this, 'deep')\n , descriptor = isDeep ? 'deep ' : '';\n\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n\n var included = false;\n\n switch (objType) {\n case 'string':\n included = obj.indexOf(val) !== -1;\n break;\n\n case 'weakset':\n if (isDeep) {\n throw new AssertionError(\n flagMsg + 'unable to use .deep.include with WeakSet',\n undefined,\n ssfi\n );\n }\n\n included = obj.has(val);\n break;\n\n case 'map':\n var isEql = isDeep ? _.eql : SameValueZero;\n obj.forEach(function (item) {\n included = included || isEql(item, val);\n });\n break;\n\n case 'set':\n if (isDeep) {\n obj.forEach(function (item) {\n included = included || _.eql(item, val);\n });\n } else {\n included = obj.has(val);\n }\n break;\n\n case 'array':\n if (isDeep) {\n included = obj.some(function (item) {\n return _.eql(item, val);\n })\n } else {\n included = obj.indexOf(val) !== -1;\n }\n break;\n\n default:\n // This block is for asserting a subset of properties in an object.\n // `_.expectTypes` isn't used here because `.include` should work with\n // objects with a custom `@@toStringTag`.\n if (val !== Object(val)) {\n throw new AssertionError(\n flagMsg + 'the given combination of arguments ('\n + objType + ' and '\n + _.type(val).toLowerCase() + ')'\n + ' is invalid for this assertion. '\n + 'You can use an array, a map, an object, a set, a string, '\n + 'or a weakset instead of a '\n + _.type(val).toLowerCase(),\n undefined,\n ssfi\n );\n }\n\n var props = Object.keys(val)\n , firstErr = null\n , numErrs = 0;\n\n props.forEach(function (prop) {\n var propAssertion = new Assertion(obj);\n _.transferFlags(this, propAssertion, true);\n flag(propAssertion, 'lockSsfi', true);\n\n if (!negate || props.length === 1) {\n propAssertion.property(prop, val[prop]);\n return;\n }\n\n try {\n propAssertion.property(prop, val[prop]);\n } catch (err) {\n if (!_.checkError.compatibleConstructor(err, AssertionError)) {\n throw err;\n }\n if (firstErr === null) firstErr = err;\n numErrs++;\n }\n }, this);\n\n // When validating .not.include with multiple properties, we only want\n // to throw an assertion error if all of the properties are included,\n // in which case we throw the first property assertion error that we\n // encountered.\n if (negate && props.length > 1 && numErrs === props.length) {\n throw firstErr;\n }\n return;\n }\n\n // Assert inclusion in collection or substring in a string.\n this.assert(\n included\n , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val)\n , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val));\n }\n\n Assertion.addChainableMethod('include', include, includeChainingBehavior);\n Assertion.addChainableMethod('contain', include, includeChainingBehavior);\n Assertion.addChainableMethod('contains', include, includeChainingBehavior);\n Assertion.addChainableMethod('includes', include, includeChainingBehavior);\n\n /**\n * ### .ok\n *\n * Asserts that the target is a truthy value (considered `true` in boolean context).\n * However, it's often best to assert that the target is strictly (`===`) or\n * deeply equal to its expected value.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.be.ok; // Not recommended\n *\n * expect(true).to.be.true; // Recommended\n * expect(true).to.be.ok; // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.ok`.\n *\n * expect(0).to.equal(0); // Recommended\n * expect(0).to.not.be.ok; // Not recommended\n *\n * expect(false).to.be.false; // Recommended\n * expect(false).to.not.be.ok; // Not recommended\n *\n * expect(null).to.be.null; // Recommended\n * expect(null).to.not.be.ok; // Not recommended\n *\n * expect(undefined).to.be.undefined; // Recommended\n * expect(undefined).to.not.be.ok; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(false, 'nooo why fail??').to.be.ok;\n *\n * @name ok\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ok', function () {\n this.assert(\n flag(this, 'object')\n , 'expected #{this} to be truthy'\n , 'expected #{this} to be falsy');\n });\n\n /**\n * ### .true\n *\n * Asserts that the target is strictly (`===`) equal to `true`.\n *\n * expect(true).to.be.true;\n *\n * Add `.not` earlier in the chain to negate `.true`. However, it's often best\n * to assert that the target is equal to its expected value, rather than not\n * equal to `true`.\n *\n * expect(false).to.be.false; // Recommended\n * expect(false).to.not.be.true; // Not recommended\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.true; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(false, 'nooo why fail??').to.be.true;\n *\n * @name true\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('true', function () {\n this.assert(\n true === flag(this, 'object')\n , 'expected #{this} to be true'\n , 'expected #{this} to be false'\n , flag(this, 'negate') ? false : true\n );\n });\n\n /**\n * ### .false\n *\n * Asserts that the target is strictly (`===`) equal to `false`.\n *\n * expect(false).to.be.false;\n *\n * Add `.not` earlier in the chain to negate `.false`. However, it's often\n * best to assert that the target is equal to its expected value, rather than\n * not equal to `false`.\n *\n * expect(true).to.be.true; // Recommended\n * expect(true).to.not.be.false; // Not recommended\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.false; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(true, 'nooo why fail??').to.be.false;\n *\n * @name false\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('false', function () {\n this.assert(\n false === flag(this, 'object')\n , 'expected #{this} to be false'\n , 'expected #{this} to be true'\n , flag(this, 'negate') ? true : false\n );\n });\n\n /**\n * ### .null\n *\n * Asserts that the target is strictly (`===`) equal to `null`.\n *\n * expect(null).to.be.null;\n *\n * Add `.not` earlier in the chain to negate `.null`. However, it's often best\n * to assert that the target is equal to its expected value, rather than not\n * equal to `null`.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.null; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(42, 'nooo why fail??').to.be.null;\n *\n * @name null\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('null', function () {\n this.assert(\n null === flag(this, 'object')\n , 'expected #{this} to be null'\n , 'expected #{this} not to be null'\n );\n });\n\n /**\n * ### .undefined\n *\n * Asserts that the target is strictly (`===`) equal to `undefined`.\n *\n * expect(undefined).to.be.undefined;\n *\n * Add `.not` earlier in the chain to negate `.undefined`. However, it's often\n * best to assert that the target is equal to its expected value, rather than\n * not equal to `undefined`.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.undefined; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(42, 'nooo why fail??').to.be.undefined;\n *\n * @name undefined\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('undefined', function () {\n this.assert(\n undefined === flag(this, 'object')\n , 'expected #{this} to be undefined'\n , 'expected #{this} not to be undefined'\n );\n });\n\n /**\n * ### .NaN\n *\n * Asserts that the target is exactly `NaN`.\n *\n * expect(NaN).to.be.NaN;\n *\n * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best\n * to assert that the target is equal to its expected value, rather than not\n * equal to `NaN`.\n *\n * expect('foo').to.equal('foo'); // Recommended\n * expect('foo').to.not.be.NaN; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(42, 'nooo why fail??').to.be.NaN;\n *\n * @name NaN\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('NaN', function () {\n this.assert(\n _.isNaN(flag(this, 'object'))\n , 'expected #{this} to be NaN'\n , 'expected #{this} not to be NaN'\n );\n });\n\n /**\n * ### .exist\n *\n * Asserts that the target is not strictly (`===`) equal to either `null` or\n * `undefined`. However, it's often best to assert that the target is equal to\n * its expected value.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.exist; // Not recommended\n *\n * expect(0).to.equal(0); // Recommended\n * expect(0).to.exist; // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.exist`.\n *\n * expect(null).to.be.null; // Recommended\n * expect(null).to.not.exist; // Not recommended\n *\n * expect(undefined).to.be.undefined; // Recommended\n * expect(undefined).to.not.exist; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(null, 'nooo why fail??').to.exist;\n *\n * The alias `.exists` can be used interchangeably with `.exist`.\n *\n * @name exist\n * @alias exists\n * @namespace BDD\n * @api public\n */\n\n function assertExist () {\n var val = flag(this, 'object');\n this.assert(\n val !== null && val !== undefined\n , 'expected #{this} to exist'\n , 'expected #{this} to not exist'\n );\n }\n\n Assertion.addProperty('exist', assertExist);\n Assertion.addProperty('exists', assertExist);\n\n /**\n * ### .empty\n *\n * When the target is a string or array, `.empty` asserts that the target's\n * `length` property is strictly (`===`) equal to `0`.\n *\n * expect([]).to.be.empty;\n * expect('').to.be.empty;\n *\n * When the target is a map or set, `.empty` asserts that the target's `size`\n * property is strictly equal to `0`.\n *\n * expect(new Set()).to.be.empty;\n * expect(new Map()).to.be.empty;\n *\n * When the target is a non-function object, `.empty` asserts that the target\n * doesn't have any own enumerable properties. Properties with Symbol-based\n * keys are excluded from the count.\n *\n * expect({}).to.be.empty;\n *\n * Because `.empty` does different things based on the target's type, it's\n * important to check the target's type before using `.empty`. See the `.a`\n * doc for info on testing a target's type.\n *\n * expect([]).to.be.an('array').that.is.empty;\n *\n * Add `.not` earlier in the chain to negate `.empty`. However, it's often\n * best to assert that the target contains its expected number of values,\n * rather than asserting that it's not empty.\n *\n * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended\n * expect([1, 2, 3]).to.not.be.empty; // Not recommended\n *\n * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended\n * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended\n *\n * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended\n * expect({a: 1}).to.not.be.empty; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect([1, 2, 3], 'nooo why fail??').to.be.empty;\n *\n * @name empty\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('empty', function () {\n var val = flag(this, 'object')\n , ssfi = flag(this, 'ssfi')\n , flagMsg = flag(this, 'message')\n , itemsCount;\n\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n\n switch (_.type(val).toLowerCase()) {\n case 'array':\n case 'string':\n itemsCount = val.length;\n break;\n case 'map':\n case 'set':\n itemsCount = val.size;\n break;\n case 'weakmap':\n case 'weakset':\n throw new AssertionError(\n flagMsg + '.empty was passed a weak collection',\n undefined,\n ssfi\n );\n case 'function':\n var msg = flagMsg + '.empty was passed a function ' + _.getName(val);\n throw new AssertionError(msg.trim(), undefined, ssfi);\n default:\n if (val !== Object(val)) {\n throw new AssertionError(\n flagMsg + '.empty was passed non-string primitive ' + _.inspect(val),\n undefined,\n ssfi\n );\n }\n itemsCount = Object.keys(val).length;\n }\n\n this.assert(\n 0 === itemsCount\n , 'expected #{this} to be empty'\n , 'expected #{this} not to be empty'\n );\n });\n\n /**\n * ### .arguments\n *\n * Asserts that the target is an `arguments` object.\n *\n * function test () {\n * expect(arguments).to.be.arguments;\n * }\n *\n * test();\n *\n * Add `.not` earlier in the chain to negate `.arguments`. However, it's often\n * best to assert which type the target is expected to be, rather than\n * asserting that it’s not an `arguments` object.\n *\n * expect('foo').to.be.a('string'); // Recommended\n * expect('foo').to.not.be.arguments; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect({}, 'nooo why fail??').to.be.arguments;\n *\n * The alias `.Arguments` can be used interchangeably with `.arguments`.\n *\n * @name arguments\n * @alias Arguments\n * @namespace BDD\n * @api public\n */\n\n function checkArguments () {\n var obj = flag(this, 'object')\n , type = _.type(obj);\n this.assert(\n 'Arguments' === type\n , 'expected #{this} to be arguments but got ' + type\n , 'expected #{this} to not be arguments'\n );\n }\n\n Assertion.addProperty('arguments', checkArguments);\n Assertion.addProperty('Arguments', checkArguments);\n\n /**\n * ### .equal(val[, msg])\n *\n * Asserts that the target is strictly (`===`) equal to the given `val`.\n *\n * expect(1).to.equal(1);\n * expect('foo').to.equal('foo');\n *\n * Add `.deep` earlier in the chain to use deep equality instead. See the\n * `deep-eql` project page for info on the deep equality algorithm:\n * https://github.com/chaijs/deep-eql.\n *\n * // Target object deeply (but not strictly) equals `{a: 1}`\n * expect({a: 1}).to.deep.equal({a: 1});\n * expect({a: 1}).to.not.equal({a: 1});\n *\n * // Target array deeply (but not strictly) equals `[1, 2]`\n * expect([1, 2]).to.deep.equal([1, 2]);\n * expect([1, 2]).to.not.equal([1, 2]);\n *\n * Add `.not` earlier in the chain to negate `.equal`. However, it's often\n * best to assert that the target is equal to its expected value, rather than\n * not equal to one of countless unexpected values.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.equal(2); // Not recommended\n *\n * `.equal` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(1).to.equal(2, 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.equal(2);\n *\n * The aliases `.equals` and `eq` can be used interchangeably with `.equal`.\n *\n * @name equal\n * @alias equals\n * @alias eq\n * @param {Mixed} val\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEqual (val, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'deep')) {\n var prevLockSsfi = flag(this, 'lockSsfi');\n flag(this, 'lockSsfi', true);\n this.eql(val);\n flag(this, 'lockSsfi', prevLockSsfi);\n } else {\n this.assert(\n val === obj\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{exp}'\n , val\n , this._obj\n , true\n );\n }\n }\n\n Assertion.addMethod('equal', assertEqual);\n Assertion.addMethod('equals', assertEqual);\n Assertion.addMethod('eq', assertEqual);\n\n /**\n * ### .eql(obj[, msg])\n *\n * Asserts that the target is deeply equal to the given `obj`. See the\n * `deep-eql` project page for info on the deep equality algorithm:\n * https://github.com/chaijs/deep-eql.\n *\n * // Target object is deeply (but not strictly) equal to {a: 1}\n * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1});\n *\n * // Target array is deeply (but not strictly) equal to [1, 2]\n * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]);\n *\n * Add `.not` earlier in the chain to negate `.eql`. However, it's often best\n * to assert that the target is deeply equal to its expected value, rather\n * than not deeply equal to one of countless unexpected values.\n *\n * expect({a: 1}).to.eql({a: 1}); // Recommended\n * expect({a: 1}).to.not.eql({b: 2}); // Not recommended\n *\n * `.eql` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??');\n * expect({a: 1}, 'nooo why fail??').to.eql({b: 2});\n *\n * The alias `.eqls` can be used interchangeably with `.eql`.\n *\n * The `.deep.equal` assertion is almost identical to `.eql` but with one\n * difference: `.deep.equal` causes deep equality comparisons to also be used\n * for any other assertions that follow in the chain.\n *\n * @name eql\n * @alias eqls\n * @param {Mixed} obj\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEql(obj, msg) {\n if (msg) flag(this, 'message', msg);\n this.assert(\n _.eql(obj, flag(this, 'object'))\n , 'expected #{this} to deeply equal #{exp}'\n , 'expected #{this} to not deeply equal #{exp}'\n , obj\n , this._obj\n , true\n );\n }\n\n Assertion.addMethod('eql', assertEql);\n Assertion.addMethod('eqls', assertEql);\n\n /**\n * ### .above(n[, msg])\n *\n * Asserts that the target is a number or a date greater than the given number or date `n` respectively.\n * However, it's often best to assert that the target is equal to its expected\n * value.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.be.above(1); // Not recommended\n *\n * Add `.lengthOf` earlier in the chain to assert that the target's `length`\n * or `size` is greater than the given number `n`.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.have.lengthOf.above(2); // Not recommended\n *\n * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended\n * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.above`.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(1).to.not.be.above(2); // Not recommended\n *\n * `.above` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(1).to.be.above(2, 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.be.above(2);\n *\n * The aliases `.gt` and `.greaterThan` can be used interchangeably with\n * `.above`.\n *\n * @name above\n * @alias gt\n * @alias greaterThan\n * @param {Number} n\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertAbove (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , doLength = flag(this, 'doLength')\n , flagMsg = flag(this, 'message')\n , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')\n , ssfi = flag(this, 'ssfi')\n , objType = _.type(obj).toLowerCase()\n , nType = _.type(n).toLowerCase()\n , errorMessage\n , shouldThrow = true;\n\n if (doLength && objType !== 'map' && objType !== 'set') {\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n }\n\n if (!doLength && (objType === 'date' && nType !== 'date')) {\n errorMessage = msgPrefix + 'the argument to above must be a date';\n } else if (nType !== 'number' && (doLength || objType === 'number')) {\n errorMessage = msgPrefix + 'the argument to above must be a number';\n } else if (!doLength && (objType !== 'date' && objType !== 'number')) {\n var printObj = (objType === 'string') ? \"'\" + obj + \"'\" : obj;\n errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';\n } else {\n shouldThrow = false;\n }\n\n if (shouldThrow) {\n throw new AssertionError(errorMessage, undefined, ssfi);\n }\n\n if (doLength) {\n var descriptor = 'length'\n , itemsCount;\n if (objType === 'map' || objType === 'set') {\n descriptor = 'size';\n itemsCount = obj.size;\n } else {\n itemsCount = obj.length;\n }\n this.assert(\n itemsCount > n\n , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + ' above #{exp}'\n , n\n , itemsCount\n );\n } else {\n this.assert(\n obj > n\n , 'expected #{this} to be above #{exp}'\n , 'expected #{this} to be at most #{exp}'\n , n\n );\n }\n }\n\n Assertion.addMethod('above', assertAbove);\n Assertion.addMethod('gt', assertAbove);\n Assertion.addMethod('greaterThan', assertAbove);\n\n /**\n * ### .least(n[, msg])\n *\n * Asserts that the target is a number or a date greater than or equal to the given\n * number or date `n` respectively. However, it's often best to assert that the target is equal to\n * its expected value.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.be.at.least(1); // Not recommended\n * expect(2).to.be.at.least(2); // Not recommended\n *\n * Add `.lengthOf` earlier in the chain to assert that the target's `length`\n * or `size` is greater than or equal to the given number `n`.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.have.lengthOf.at.least(2); // Not recommended\n *\n * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended\n * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.least`.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.at.least(2); // Not recommended\n *\n * `.least` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(1).to.be.at.least(2, 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.be.at.least(2);\n *\n * The aliases `.gte` and `.greaterThanOrEqual` can be used interchangeably with\n * `.least`.\n *\n * @name least\n * @alias gte\n * @alias greaterThanOrEqual\n * @param {Number} n\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLeast (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , doLength = flag(this, 'doLength')\n , flagMsg = flag(this, 'message')\n , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')\n , ssfi = flag(this, 'ssfi')\n , objType = _.type(obj).toLowerCase()\n , nType = _.type(n).toLowerCase()\n , errorMessage\n , shouldThrow = true;\n\n if (doLength && objType !== 'map' && objType !== 'set') {\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n }\n\n if (!doLength && (objType === 'date' && nType !== 'date')) {\n errorMessage = msgPrefix + 'the argument to least must be a date';\n } else if (nType !== 'number' && (doLength || objType === 'number')) {\n errorMessage = msgPrefix + 'the argument to least must be a number';\n } else if (!doLength && (objType !== 'date' && objType !== 'number')) {\n var printObj = (objType === 'string') ? \"'\" + obj + \"'\" : obj;\n errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';\n } else {\n shouldThrow = false;\n }\n\n if (shouldThrow) {\n throw new AssertionError(errorMessage, undefined, ssfi);\n }\n\n if (doLength) {\n var descriptor = 'length'\n , itemsCount;\n if (objType === 'map' || objType === 'set') {\n descriptor = 'size';\n itemsCount = obj.size;\n } else {\n itemsCount = obj.length;\n }\n this.assert(\n itemsCount >= n\n , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}'\n , 'expected #{this} to have a ' + descriptor + ' below #{exp}'\n , n\n , itemsCount\n );\n } else {\n this.assert(\n obj >= n\n , 'expected #{this} to be at least #{exp}'\n , 'expected #{this} to be below #{exp}'\n , n\n );\n }\n }\n\n Assertion.addMethod('least', assertLeast);\n Assertion.addMethod('gte', assertLeast);\n Assertion.addMethod('greaterThanOrEqual', assertLeast);\n\n /**\n * ### .below(n[, msg])\n *\n * Asserts that the target is a number or a date less than the given number or date `n` respectively.\n * However, it's often best to assert that the target is equal to its expected\n * value.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.be.below(2); // Not recommended\n *\n * Add `.lengthOf` earlier in the chain to assert that the target's `length`\n * or `size` is less than the given number `n`.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.have.lengthOf.below(4); // Not recommended\n *\n * expect([1, 2, 3]).to.have.length(3); // Recommended\n * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.below`.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.not.be.below(1); // Not recommended\n *\n * `.below` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(2).to.be.below(1, 'nooo why fail??');\n * expect(2, 'nooo why fail??').to.be.below(1);\n *\n * The aliases `.lt` and `.lessThan` can be used interchangeably with\n * `.below`.\n *\n * @name below\n * @alias lt\n * @alias lessThan\n * @param {Number} n\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertBelow (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , doLength = flag(this, 'doLength')\n , flagMsg = flag(this, 'message')\n , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')\n , ssfi = flag(this, 'ssfi')\n , objType = _.type(obj).toLowerCase()\n , nType = _.type(n).toLowerCase()\n , errorMessage\n , shouldThrow = true;\n\n if (doLength && objType !== 'map' && objType !== 'set') {\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n }\n\n if (!doLength && (objType === 'date' && nType !== 'date')) {\n errorMessage = msgPrefix + 'the argument to below must be a date';\n } else if (nType !== 'number' && (doLength || objType === 'number')) {\n errorMessage = msgPrefix + 'the argument to below must be a number';\n } else if (!doLength && (objType !== 'date' && objType !== 'number')) {\n var printObj = (objType === 'string') ? \"'\" + obj + \"'\" : obj;\n errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';\n } else {\n shouldThrow = false;\n }\n\n if (shouldThrow) {\n throw new AssertionError(errorMessage, undefined, ssfi);\n }\n\n if (doLength) {\n var descriptor = 'length'\n , itemsCount;\n if (objType === 'map' || objType === 'set') {\n descriptor = 'size';\n itemsCount = obj.size;\n } else {\n itemsCount = obj.length;\n }\n this.assert(\n itemsCount < n\n , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + ' below #{exp}'\n , n\n , itemsCount\n );\n } else {\n this.assert(\n obj < n\n , 'expected #{this} to be below #{exp}'\n , 'expected #{this} to be at least #{exp}'\n , n\n );\n }\n }\n\n Assertion.addMethod('below', assertBelow);\n Assertion.addMethod('lt', assertBelow);\n Assertion.addMethod('lessThan', assertBelow);\n\n /**\n * ### .most(n[, msg])\n *\n * Asserts that the target is a number or a date less than or equal to the given number\n * or date `n` respectively. However, it's often best to assert that the target is equal to its\n * expected value.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.be.at.most(2); // Not recommended\n * expect(1).to.be.at.most(1); // Not recommended\n *\n * Add `.lengthOf` earlier in the chain to assert that the target's `length`\n * or `size` is less than or equal to the given number `n`.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.have.lengthOf.at.most(4); // Not recommended\n *\n * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended\n * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.most`.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.not.be.at.most(1); // Not recommended\n *\n * `.most` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(2).to.be.at.most(1, 'nooo why fail??');\n * expect(2, 'nooo why fail??').to.be.at.most(1);\n *\n * The aliases `.lte` and `.lessThanOrEqual` can be used interchangeably with\n * `.most`.\n *\n * @name most\n * @alias lte\n * @alias lessThanOrEqual\n * @param {Number} n\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertMost (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , doLength = flag(this, 'doLength')\n , flagMsg = flag(this, 'message')\n , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')\n , ssfi = flag(this, 'ssfi')\n , objType = _.type(obj).toLowerCase()\n , nType = _.type(n).toLowerCase()\n , errorMessage\n , shouldThrow = true;\n\n if (doLength && objType !== 'map' && objType !== 'set') {\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n }\n\n if (!doLength && (objType === 'date' && nType !== 'date')) {\n errorMessage = msgPrefix + 'the argument to most must be a date';\n } else if (nType !== 'number' && (doLength || objType === 'number')) {\n errorMessage = msgPrefix + 'the argument to most must be a number';\n } else if (!doLength && (objType !== 'date' && objType !== 'number')) {\n var printObj = (objType === 'string') ? \"'\" + obj + \"'\" : obj;\n errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';\n } else {\n shouldThrow = false;\n }\n\n if (shouldThrow) {\n throw new AssertionError(errorMessage, undefined, ssfi);\n }\n\n if (doLength) {\n var descriptor = 'length'\n , itemsCount;\n if (objType === 'map' || objType === 'set') {\n descriptor = 'size';\n itemsCount = obj.size;\n } else {\n itemsCount = obj.length;\n }\n this.assert(\n itemsCount <= n\n , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}'\n , 'expected #{this} to have a ' + descriptor + ' above #{exp}'\n , n\n , itemsCount\n );\n } else {\n this.assert(\n obj <= n\n , 'expected #{this} to be at most #{exp}'\n , 'expected #{this} to be above #{exp}'\n , n\n );\n }\n }\n\n Assertion.addMethod('most', assertMost);\n Assertion.addMethod('lte', assertMost);\n Assertion.addMethod('lessThanOrEqual', assertMost);\n\n /**\n * ### .within(start, finish[, msg])\n *\n * Asserts that the target is a number or a date greater than or equal to the given\n * number or date `start`, and less than or equal to the given number or date `finish` respectively.\n * However, it's often best to assert that the target is equal to its expected\n * value.\n *\n * expect(2).to.equal(2); // Recommended\n * expect(2).to.be.within(1, 3); // Not recommended\n * expect(2).to.be.within(2, 3); // Not recommended\n * expect(2).to.be.within(1, 2); // Not recommended\n *\n * Add `.lengthOf` earlier in the chain to assert that the target's `length`\n * or `size` is greater than or equal to the given number `start`, and less\n * than or equal to the given number `finish`.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended\n *\n * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended\n * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.within`.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.within(2, 4); // Not recommended\n *\n * `.within` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect(4).to.be.within(1, 3, 'nooo why fail??');\n * expect(4, 'nooo why fail??').to.be.within(1, 3);\n *\n * @name within\n * @param {Number} start lower bound inclusive\n * @param {Number} finish upper bound inclusive\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('within', function (start, finish, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , doLength = flag(this, 'doLength')\n , flagMsg = flag(this, 'message')\n , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')\n , ssfi = flag(this, 'ssfi')\n , objType = _.type(obj).toLowerCase()\n , startType = _.type(start).toLowerCase()\n , finishType = _.type(finish).toLowerCase()\n , errorMessage\n , shouldThrow = true\n , range = (startType === 'date' && finishType === 'date')\n ? start.toISOString() + '..' + finish.toISOString()\n : start + '..' + finish;\n\n if (doLength && objType !== 'map' && objType !== 'set') {\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n }\n\n if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) {\n errorMessage = msgPrefix + 'the arguments to within must be dates';\n } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) {\n errorMessage = msgPrefix + 'the arguments to within must be numbers';\n } else if (!doLength && (objType !== 'date' && objType !== 'number')) {\n var printObj = (objType === 'string') ? \"'\" + obj + \"'\" : obj;\n errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';\n } else {\n shouldThrow = false;\n }\n\n if (shouldThrow) {\n throw new AssertionError(errorMessage, undefined, ssfi);\n }\n\n if (doLength) {\n var descriptor = 'length'\n , itemsCount;\n if (objType === 'map' || objType === 'set') {\n descriptor = 'size';\n itemsCount = obj.size;\n } else {\n itemsCount = obj.length;\n }\n this.assert(\n itemsCount >= start && itemsCount <= finish\n , 'expected #{this} to have a ' + descriptor + ' within ' + range\n , 'expected #{this} to not have a ' + descriptor + ' within ' + range\n );\n } else {\n this.assert(\n obj >= start && obj <= finish\n , 'expected #{this} to be within ' + range\n , 'expected #{this} to not be within ' + range\n );\n }\n });\n\n /**\n * ### .instanceof(constructor[, msg])\n *\n * Asserts that the target is an instance of the given `constructor`.\n *\n * function Cat () { }\n *\n * expect(new Cat()).to.be.an.instanceof(Cat);\n * expect([1, 2]).to.be.an.instanceof(Array);\n *\n * Add `.not` earlier in the chain to negate `.instanceof`.\n *\n * expect({a: 1}).to.not.be.an.instanceof(Array);\n *\n * `.instanceof` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect(1).to.be.an.instanceof(Array, 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.be.an.instanceof(Array);\n *\n * Due to limitations in ES5, `.instanceof` may not always work as expected\n * when using a transpiler such as Babel or TypeScript. In particular, it may\n * produce unexpected results when subclassing built-in object such as\n * `Array`, `Error`, and `Map`. See your transpiler's docs for details:\n *\n * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes))\n * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work))\n *\n * The alias `.instanceOf` can be used interchangeably with `.instanceof`.\n *\n * @name instanceof\n * @param {Constructor} constructor\n * @param {String} msg _optional_\n * @alias instanceOf\n * @namespace BDD\n * @api public\n */\n\n function assertInstanceOf (constructor, msg) {\n if (msg) flag(this, 'message', msg);\n\n var target = flag(this, 'object')\n var ssfi = flag(this, 'ssfi');\n var flagMsg = flag(this, 'message');\n\n try {\n var isInstanceOf = target instanceof constructor;\n } catch (err) {\n if (err instanceof TypeError) {\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n throw new AssertionError(\n flagMsg + 'The instanceof assertion needs a constructor but '\n + _.type(constructor) + ' was given.',\n undefined,\n ssfi\n );\n }\n throw err;\n }\n\n var name = _.getName(constructor);\n if (name === null) {\n name = 'an unnamed constructor';\n }\n\n this.assert(\n isInstanceOf\n , 'expected #{this} to be an instance of ' + name\n , 'expected #{this} to not be an instance of ' + name\n );\n };\n\n Assertion.addMethod('instanceof', assertInstanceOf);\n Assertion.addMethod('instanceOf', assertInstanceOf);\n\n /**\n * ### .property(name[, val[, msg]])\n *\n * Asserts that the target has a property with the given key `name`.\n *\n * expect({a: 1}).to.have.property('a');\n *\n * When `val` is provided, `.property` also asserts that the property's value\n * is equal to the given `val`.\n *\n * expect({a: 1}).to.have.property('a', 1);\n *\n * By default, strict (`===`) equality is used. Add `.deep` earlier in the\n * chain to use deep equality instead. See the `deep-eql` project page for\n * info on the deep equality algorithm: https://github.com/chaijs/deep-eql.\n *\n * // Target object deeply (but not strictly) has property `x: {a: 1}`\n * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1});\n * expect({x: {a: 1}}).to.not.have.property('x', {a: 1});\n *\n * The target's enumerable and non-enumerable properties are always included\n * in the search. By default, both own and inherited properties are included.\n * Add `.own` earlier in the chain to exclude inherited properties from the\n * search.\n *\n * Object.prototype.b = 2;\n *\n * expect({a: 1}).to.have.own.property('a');\n * expect({a: 1}).to.have.own.property('a', 1);\n * expect({a: 1}).to.have.property('b');\n * expect({a: 1}).to.not.have.own.property('b');\n *\n * `.deep` and `.own` can be combined.\n *\n * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1});\n *\n * Add `.nested` earlier in the chain to enable dot- and bracket-notation when\n * referencing nested properties.\n *\n * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]');\n * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y');\n *\n * If `.` or `[]` are part of an actual property name, they can be escaped by\n * adding two backslashes before them.\n *\n * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\\\.a.\\\\[b\\\\]');\n *\n * `.deep` and `.nested` can be combined.\n *\n * expect({a: {b: [{c: 3}]}})\n * .to.have.deep.nested.property('a.b[0]', {c: 3});\n *\n * `.own` and `.nested` cannot be combined.\n *\n * Add `.not` earlier in the chain to negate `.property`.\n *\n * expect({a: 1}).to.not.have.property('b');\n *\n * However, it's dangerous to negate `.property` when providing `val`. The\n * problem is that it creates uncertain expectations by asserting that the\n * target either doesn't have a property with the given key `name`, or that it\n * does have a property with the given key `name` but its value isn't equal to\n * the given `val`. It's often best to identify the exact output that's\n * expected, and then write an assertion that only accepts that exact output.\n *\n * When the target isn't expected to have a property with the given key\n * `name`, it's often best to assert exactly that.\n *\n * expect({b: 2}).to.not.have.property('a'); // Recommended\n * expect({b: 2}).to.not.have.property('a', 1); // Not recommended\n *\n * When the target is expected to have a property with the given key `name`,\n * it's often best to assert that the property has its expected value, rather\n * than asserting that it doesn't have one of many unexpected values.\n *\n * expect({a: 3}).to.have.property('a', 3); // Recommended\n * expect({a: 3}).to.not.have.property('a', 1); // Not recommended\n *\n * `.property` changes the target of any assertions that follow in the chain\n * to be the value of the property from the original target object.\n *\n * expect({a: 1}).to.have.property('a').that.is.a('number');\n *\n * `.property` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`. When not providing `val`, only use the\n * second form.\n *\n * // Recommended\n * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??');\n * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2);\n * expect({a: 1}, 'nooo why fail??').to.have.property('b');\n *\n * // Not recommended\n * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??');\n *\n * The above assertion isn't the same thing as not providing `val`. Instead,\n * it's asserting that the target object has a `b` property that's equal to\n * `undefined`.\n *\n * The assertions `.ownProperty` and `.haveOwnProperty` can be used\n * interchangeably with `.own.property`.\n *\n * @name property\n * @param {String} name\n * @param {Mixed} val (optional)\n * @param {String} msg _optional_\n * @returns value of property for chaining\n * @namespace BDD\n * @api public\n */\n\n function assertProperty (name, val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var isNested = flag(this, 'nested')\n , isOwn = flag(this, 'own')\n , flagMsg = flag(this, 'message')\n , obj = flag(this, 'object')\n , ssfi = flag(this, 'ssfi')\n , nameType = typeof name;\n\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n\n if (isNested) {\n if (nameType !== 'string') {\n throw new AssertionError(\n flagMsg + 'the argument to property must be a string when using nested syntax',\n undefined,\n ssfi\n );\n }\n } else {\n if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') {\n throw new AssertionError(\n flagMsg + 'the argument to property must be a string, number, or symbol',\n undefined,\n ssfi\n );\n }\n }\n\n if (isNested && isOwn) {\n throw new AssertionError(\n flagMsg + 'The \"nested\" and \"own\" flags cannot be combined.',\n undefined,\n ssfi\n );\n }\n\n if (obj === null || obj === undefined) {\n throw new AssertionError(\n flagMsg + 'Target cannot be null or undefined.',\n undefined,\n ssfi\n );\n }\n\n var isDeep = flag(this, 'deep')\n , negate = flag(this, 'negate')\n , pathInfo = isNested ? _.getPathInfo(obj, name) : null\n , value = isNested ? pathInfo.value : obj[name];\n\n var descriptor = '';\n if (isDeep) descriptor += 'deep ';\n if (isOwn) descriptor += 'own ';\n if (isNested) descriptor += 'nested ';\n descriptor += 'property ';\n\n var hasProperty;\n if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name);\n else if (isNested) hasProperty = pathInfo.exists;\n else hasProperty = _.hasProperty(obj, name);\n\n // When performing a negated assertion for both name and val, merely having\n // a property with the given name isn't enough to cause the assertion to\n // fail. It must both have a property with the given name, and the value of\n // that property must equal the given val. Therefore, skip this assertion in\n // favor of the next.\n if (!negate || arguments.length === 1) {\n this.assert(\n hasProperty\n , 'expected #{this} to have ' + descriptor + _.inspect(name)\n , 'expected #{this} to not have ' + descriptor + _.inspect(name));\n }\n\n if (arguments.length > 1) {\n this.assert(\n hasProperty && (isDeep ? _.eql(val, value) : val === value)\n , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'\n , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}'\n , val\n , value\n );\n }\n\n flag(this, 'object', value);\n }\n\n Assertion.addMethod('property', assertProperty);\n\n function assertOwnProperty (name, value, msg) {\n flag(this, 'own', true);\n assertProperty.apply(this, arguments);\n }\n\n Assertion.addMethod('ownProperty', assertOwnProperty);\n Assertion.addMethod('haveOwnProperty', assertOwnProperty);\n\n /**\n * ### .ownPropertyDescriptor(name[, descriptor[, msg]])\n *\n * Asserts that the target has its own property descriptor with the given key\n * `name`. Enumerable and non-enumerable properties are included in the\n * search.\n *\n * expect({a: 1}).to.have.ownPropertyDescriptor('a');\n *\n * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that\n * the property's descriptor is deeply equal to the given `descriptor`. See\n * the `deep-eql` project page for info on the deep equality algorithm:\n * https://github.com/chaijs/deep-eql.\n *\n * expect({a: 1}).to.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 1,\n * });\n *\n * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`.\n *\n * expect({a: 1}).to.not.have.ownPropertyDescriptor('b');\n *\n * However, it's dangerous to negate `.ownPropertyDescriptor` when providing\n * a `descriptor`. The problem is that it creates uncertain expectations by\n * asserting that the target either doesn't have a property descriptor with\n * the given key `name`, or that it does have a property descriptor with the\n * given key `name` but it’s not deeply equal to the given `descriptor`. It's\n * often best to identify the exact output that's expected, and then write an\n * assertion that only accepts that exact output.\n *\n * When the target isn't expected to have a property descriptor with the given\n * key `name`, it's often best to assert exactly that.\n *\n * // Recommended\n * expect({b: 2}).to.not.have.ownPropertyDescriptor('a');\n *\n * // Not recommended\n * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 1,\n * });\n *\n * When the target is expected to have a property descriptor with the given\n * key `name`, it's often best to assert that the property has its expected\n * descriptor, rather than asserting that it doesn't have one of many\n * unexpected descriptors.\n *\n * // Recommended\n * expect({a: 3}).to.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 3,\n * });\n *\n * // Not recommended\n * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 1,\n * });\n *\n * `.ownPropertyDescriptor` changes the target of any assertions that follow\n * in the chain to be the value of the property descriptor from the original\n * target object.\n *\n * expect({a: 1}).to.have.ownPropertyDescriptor('a')\n * .that.has.property('enumerable', true);\n *\n * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a\n * custom error message to show when the assertion fails. The message can also\n * be given as the second argument to `expect`. When not providing\n * `descriptor`, only use the second form.\n *\n * // Recommended\n * expect({a: 1}).to.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 2,\n * }, 'nooo why fail??');\n *\n * // Recommended\n * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', {\n * configurable: true,\n * enumerable: true,\n * writable: true,\n * value: 2,\n * });\n *\n * // Recommended\n * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b');\n *\n * // Not recommended\n * expect({a: 1})\n * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??');\n *\n * The above assertion isn't the same thing as not providing `descriptor`.\n * Instead, it's asserting that the target object has a `b` property\n * descriptor that's deeply equal to `undefined`.\n *\n * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with\n * `.ownPropertyDescriptor`.\n *\n * @name ownPropertyDescriptor\n * @alias haveOwnPropertyDescriptor\n * @param {String} name\n * @param {Object} descriptor _optional_\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnPropertyDescriptor (name, descriptor, msg) {\n if (typeof descriptor === 'string') {\n msg = descriptor;\n descriptor = null;\n }\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);\n if (actualDescriptor && descriptor) {\n this.assert(\n _.eql(descriptor, actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)\n , descriptor\n , actualDescriptor\n , true\n );\n } else {\n this.assert(\n actualDescriptor\n , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)\n , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)\n );\n }\n flag(this, 'object', actualDescriptor);\n }\n\n Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);\n Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);\n\n /**\n * ### .lengthOf(n[, msg])\n *\n * Asserts that the target's `length` or `size` is equal to the given number\n * `n`.\n *\n * expect([1, 2, 3]).to.have.lengthOf(3);\n * expect('foo').to.have.lengthOf(3);\n * expect(new Set([1, 2, 3])).to.have.lengthOf(3);\n * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3);\n *\n * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often\n * best to assert that the target's `length` property is equal to its expected\n * value, rather than not equal to one of many unexpected values.\n *\n * expect('foo').to.have.lengthOf(3); // Recommended\n * expect('foo').to.not.have.lengthOf(4); // Not recommended\n *\n * `.lengthOf` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??');\n * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2);\n *\n * `.lengthOf` can also be used as a language chain, causing all `.above`,\n * `.below`, `.least`, `.most`, and `.within` assertions that follow in the\n * chain to use the target's `length` property as the target. However, it's\n * often best to assert that the target's `length` property is equal to its\n * expected length, rather than asserting that its `length` property falls\n * within some range of values.\n *\n * // Recommended\n * expect([1, 2, 3]).to.have.lengthOf(3);\n *\n * // Not recommended\n * expect([1, 2, 3]).to.have.lengthOf.above(2);\n * expect([1, 2, 3]).to.have.lengthOf.below(4);\n * expect([1, 2, 3]).to.have.lengthOf.at.least(3);\n * expect([1, 2, 3]).to.have.lengthOf.at.most(3);\n * expect([1, 2, 3]).to.have.lengthOf.within(2,4);\n *\n * Due to a compatibility issue, the alias `.length` can't be chained directly\n * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used\n * interchangeably with `.lengthOf` in every situation. It's recommended to\n * always use `.lengthOf` instead of `.length`.\n *\n * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error\n * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected\n *\n * @name lengthOf\n * @alias length\n * @param {Number} n\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLengthChain () {\n flag(this, 'doLength', true);\n }\n\n function assertLength (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , objType = _.type(obj).toLowerCase()\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi')\n , descriptor = 'length'\n , itemsCount;\n\n switch (objType) {\n case 'map':\n case 'set':\n descriptor = 'size';\n itemsCount = obj.size;\n break;\n default:\n new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');\n itemsCount = obj.length;\n }\n\n this.assert(\n itemsCount == n\n , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + ' of #{act}'\n , n\n , itemsCount\n );\n }\n\n Assertion.addChainableMethod('length', assertLength, assertLengthChain);\n Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain);\n\n /**\n * ### .match(re[, msg])\n *\n * Asserts that the target matches the given regular expression `re`.\n *\n * expect('foobar').to.match(/^foo/);\n *\n * Add `.not` earlier in the chain to negate `.match`.\n *\n * expect('foobar').to.not.match(/taco/);\n *\n * `.match` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect('foobar').to.match(/taco/, 'nooo why fail??');\n * expect('foobar', 'nooo why fail??').to.match(/taco/);\n *\n * The alias `.matches` can be used interchangeably with `.match`.\n *\n * @name match\n * @alias matches\n * @param {RegExp} re\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n function assertMatch(re, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n re.exec(obj)\n , 'expected #{this} to match ' + re\n , 'expected #{this} not to match ' + re\n );\n }\n\n Assertion.addMethod('match', assertMatch);\n Assertion.addMethod('matches', assertMatch);\n\n /**\n * ### .string(str[, msg])\n *\n * Asserts that the target string contains the given substring `str`.\n *\n * expect('foobar').to.have.string('bar');\n *\n * Add `.not` earlier in the chain to negate `.string`.\n *\n * expect('foobar').to.not.have.string('taco');\n *\n * `.string` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect('foobar').to.have.string('taco', 'nooo why fail??');\n * expect('foobar', 'nooo why fail??').to.have.string('taco');\n *\n * @name string\n * @param {String} str\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('string', function (str, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n new Assertion(obj, flagMsg, ssfi, true).is.a('string');\n\n this.assert(\n ~obj.indexOf(str)\n , 'expected #{this} to contain ' + _.inspect(str)\n , 'expected #{this} to not contain ' + _.inspect(str)\n );\n });\n\n /**\n * ### .keys(key1[, key2[, ...]])\n *\n * Asserts that the target object, array, map, or set has the given keys. Only\n * the target's own inherited properties are included in the search.\n *\n * When the target is an object or array, keys can be provided as one or more\n * string arguments, a single array argument, or a single object argument. In\n * the latter case, only the keys in the given object matter; the values are\n * ignored.\n *\n * expect({a: 1, b: 2}).to.have.all.keys('a', 'b');\n * expect(['x', 'y']).to.have.all.keys(0, 1);\n *\n * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']);\n * expect(['x', 'y']).to.have.all.keys([0, 1]);\n *\n * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5\n * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5\n *\n * When the target is a map or set, each key must be provided as a separate\n * argument.\n *\n * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b');\n * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b');\n *\n * Because `.keys` does different things based on the target's type, it's\n * important to check the target's type before using `.keys`. See the `.a` doc\n * for info on testing a target's type.\n *\n * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b');\n *\n * By default, strict (`===`) equality is used to compare keys of maps and\n * sets. Add `.deep` earlier in the chain to use deep equality instead. See\n * the `deep-eql` project page for info on the deep equality algorithm:\n * https://github.com/chaijs/deep-eql.\n *\n * // Target set deeply (but not strictly) has key `{a: 1}`\n * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]);\n * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]);\n *\n * By default, the target must have all of the given keys and no more. Add\n * `.any` earlier in the chain to only require that the target have at least\n * one of the given keys. Also, add `.not` earlier in the chain to negate\n * `.keys`. It's often best to add `.any` when negating `.keys`, and to use\n * `.all` when asserting `.keys` without negation.\n *\n * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts\n * exactly what's expected of the output, whereas `.not.all.keys` creates\n * uncertain expectations.\n *\n * // Recommended; asserts that target doesn't have any of the given keys\n * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');\n *\n * // Not recommended; asserts that target doesn't have all of the given\n * // keys but may or may not have some of them\n * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd');\n *\n * When asserting `.keys` without negation, `.all` is preferred because\n * `.all.keys` asserts exactly what's expected of the output, whereas\n * `.any.keys` creates uncertain expectations.\n *\n * // Recommended; asserts that target has all the given keys\n * expect({a: 1, b: 2}).to.have.all.keys('a', 'b');\n *\n * // Not recommended; asserts that target has at least one of the given\n * // keys but may or may not have more of them\n * expect({a: 1, b: 2}).to.have.any.keys('a', 'b');\n *\n * Note that `.all` is used by default when neither `.all` nor `.any` appear\n * earlier in the chain. However, it's often best to add `.all` anyway because\n * it improves readability.\n *\n * // Both assertions are identical\n * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended\n * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended\n *\n * Add `.include` earlier in the chain to require that the target's keys be a\n * superset of the expected keys, rather than identical sets.\n *\n * // Target object's keys are a superset of ['a', 'b'] but not identical\n * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b');\n * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b');\n *\n * However, if `.any` and `.include` are combined, only the `.any` takes\n * effect. The `.include` is ignored in this case.\n *\n * // Both assertions are identical\n * expect({a: 1}).to.have.any.keys('a', 'b');\n * expect({a: 1}).to.include.any.keys('a', 'b');\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect({a: 1}, 'nooo why fail??').to.have.key('b');\n *\n * The alias `.key` can be used interchangeably with `.keys`.\n *\n * @name keys\n * @alias key\n * @param {...String|Array|Object} keys\n * @namespace BDD\n * @api public\n */\n\n function assertKeys (keys) {\n var obj = flag(this, 'object')\n , objType = _.type(obj)\n , keysType = _.type(keys)\n , ssfi = flag(this, 'ssfi')\n , isDeep = flag(this, 'deep')\n , str\n , deepStr = ''\n , actual\n , ok = true\n , flagMsg = flag(this, 'message');\n\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments';\n\n if (objType === 'Map' || objType === 'Set') {\n deepStr = isDeep ? 'deeply ' : '';\n actual = [];\n\n // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach.\n obj.forEach(function (val, key) { actual.push(key) });\n\n if (keysType !== 'Array') {\n keys = Array.prototype.slice.call(arguments);\n }\n } else {\n actual = _.getOwnEnumerableProperties(obj);\n\n switch (keysType) {\n case 'Array':\n if (arguments.length > 1) {\n throw new AssertionError(mixedArgsMsg, undefined, ssfi);\n }\n break;\n case 'Object':\n if (arguments.length > 1) {\n throw new AssertionError(mixedArgsMsg, undefined, ssfi);\n }\n keys = Object.keys(keys);\n break;\n default:\n keys = Array.prototype.slice.call(arguments);\n }\n\n // Only stringify non-Symbols because Symbols would become \"Symbol()\"\n keys = keys.map(function (val) {\n return typeof val === 'symbol' ? val : String(val);\n });\n }\n\n if (!keys.length) {\n throw new AssertionError(flagMsg + 'keys required', undefined, ssfi);\n }\n\n var len = keys.length\n , any = flag(this, 'any')\n , all = flag(this, 'all')\n , expected = keys;\n\n if (!any && !all) {\n all = true;\n }\n\n // Has any\n if (any) {\n ok = expected.some(function(expectedKey) {\n return actual.some(function(actualKey) {\n if (isDeep) {\n return _.eql(expectedKey, actualKey);\n } else {\n return expectedKey === actualKey;\n }\n });\n });\n }\n\n // Has all\n if (all) {\n ok = expected.every(function(expectedKey) {\n return actual.some(function(actualKey) {\n if (isDeep) {\n return _.eql(expectedKey, actualKey);\n } else {\n return expectedKey === actualKey;\n }\n });\n });\n\n if (!flag(this, 'contains')) {\n ok = ok && keys.length == actual.length;\n }\n }\n\n // Key string\n if (len > 1) {\n keys = keys.map(function(key) {\n return _.inspect(key);\n });\n var last = keys.pop();\n if (all) {\n str = keys.join(', ') + ', and ' + last;\n }\n if (any) {\n str = keys.join(', ') + ', or ' + last;\n }\n } else {\n str = _.inspect(keys[0]);\n }\n\n // Form\n str = (len > 1 ? 'keys ' : 'key ') + str;\n\n // Have / include\n str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;\n\n // Assertion\n this.assert(\n ok\n , 'expected #{this} to ' + deepStr + str\n , 'expected #{this} to not ' + deepStr + str\n , expected.slice(0).sort(_.compareByInspect)\n , actual.sort(_.compareByInspect)\n , true\n );\n }\n\n Assertion.addMethod('keys', assertKeys);\n Assertion.addMethod('key', assertKeys);\n\n /**\n * ### .throw([errorLike], [errMsgMatcher], [msg])\n *\n * When no arguments are provided, `.throw` invokes the target function and\n * asserts that an error is thrown.\n *\n * var badFn = function () { throw new TypeError('Illegal salmon!'); };\n *\n * expect(badFn).to.throw();\n *\n * When one argument is provided, and it's an error constructor, `.throw`\n * invokes the target function and asserts that an error is thrown that's an\n * instance of that error constructor.\n *\n * var badFn = function () { throw new TypeError('Illegal salmon!'); };\n *\n * expect(badFn).to.throw(TypeError);\n *\n * When one argument is provided, and it's an error instance, `.throw` invokes\n * the target function and asserts that an error is thrown that's strictly\n * (`===`) equal to that error instance.\n *\n * var err = new TypeError('Illegal salmon!');\n * var badFn = function () { throw err; };\n *\n * expect(badFn).to.throw(err);\n *\n * When one argument is provided, and it's a string, `.throw` invokes the\n * target function and asserts that an error is thrown with a message that\n * contains that string.\n *\n * var badFn = function () { throw new TypeError('Illegal salmon!'); };\n *\n * expect(badFn).to.throw('salmon');\n *\n * When one argument is provided, and it's a regular expression, `.throw`\n * invokes the target function and asserts that an error is thrown with a\n * message that matches that regular expression.\n *\n * var badFn = function () { throw new TypeError('Illegal salmon!'); };\n *\n * expect(badFn).to.throw(/salmon/);\n *\n * When two arguments are provided, and the first is an error instance or\n * constructor, and the second is a string or regular expression, `.throw`\n * invokes the function and asserts that an error is thrown that fulfills both\n * conditions as described above.\n *\n * var err = new TypeError('Illegal salmon!');\n * var badFn = function () { throw err; };\n *\n * expect(badFn).to.throw(TypeError, 'salmon');\n * expect(badFn).to.throw(TypeError, /salmon/);\n * expect(badFn).to.throw(err, 'salmon');\n * expect(badFn).to.throw(err, /salmon/);\n *\n * Add `.not` earlier in the chain to negate `.throw`.\n *\n * var goodFn = function () {};\n *\n * expect(goodFn).to.not.throw();\n *\n * However, it's dangerous to negate `.throw` when providing any arguments.\n * The problem is that it creates uncertain expectations by asserting that the\n * target either doesn't throw an error, or that it throws an error but of a\n * different type than the given type, or that it throws an error of the given\n * type but with a message that doesn't include the given string. It's often\n * best to identify the exact output that's expected, and then write an\n * assertion that only accepts that exact output.\n *\n * When the target isn't expected to throw an error, it's often best to assert\n * exactly that.\n *\n * var goodFn = function () {};\n *\n * expect(goodFn).to.not.throw(); // Recommended\n * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended\n *\n * When the target is expected to throw an error, it's often best to assert\n * that the error is of its expected type, and has a message that includes an\n * expected string, rather than asserting that it doesn't have one of many\n * unexpected types, and doesn't have a message that includes some string.\n *\n * var badFn = function () { throw new TypeError('Illegal salmon!'); };\n *\n * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended\n * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended\n *\n * `.throw` changes the target of any assertions that follow in the chain to\n * be the error object that's thrown.\n *\n * var err = new TypeError('Illegal salmon!');\n * err.code = 42;\n * var badFn = function () { throw err; };\n *\n * expect(badFn).to.throw(TypeError).with.property('code', 42);\n *\n * `.throw` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`. When not providing two arguments, always use\n * the second form.\n *\n * var goodFn = function () {};\n *\n * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??');\n * expect(goodFn, 'nooo why fail??').to.throw();\n *\n * Due to limitations in ES5, `.throw` may not always work as expected when\n * using a transpiler such as Babel or TypeScript. In particular, it may\n * produce unexpected results when subclassing the built-in `Error` object and\n * then passing the subclassed constructor to `.throw`. See your transpiler's\n * docs for details:\n *\n * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes))\n * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work))\n *\n * Beware of some common mistakes when using the `throw` assertion. One common\n * mistake is to accidentally invoke the function yourself instead of letting\n * the `throw` assertion invoke the function for you. For example, when\n * testing if a function named `fn` throws, provide `fn` instead of `fn()` as\n * the target for the assertion.\n *\n * expect(fn).to.throw(); // Good! Tests `fn` as desired\n * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn`\n *\n * If you need to assert that your function `fn` throws when passed certain\n * arguments, then wrap a call to `fn` inside of another function.\n *\n * expect(function () { fn(42); }).to.throw(); // Function expression\n * expect(() => fn(42)).to.throw(); // ES6 arrow function\n *\n * Another common mistake is to provide an object method (or any stand-alone\n * function that relies on `this`) as the target of the assertion. Doing so is\n * problematic because the `this` context will be lost when the function is\n * invoked by `.throw`; there's no way for it to know what `this` is supposed\n * to be. There are two ways around this problem. One solution is to wrap the\n * method or function call inside of another function. Another solution is to\n * use `bind`.\n *\n * expect(function () { cat.meow(); }).to.throw(); // Function expression\n * expect(() => cat.meow()).to.throw(); // ES6 arrow function\n * expect(cat.meow.bind(cat)).to.throw(); // Bind\n *\n * Finally, it's worth mentioning that it's a best practice in JavaScript to\n * only throw `Error` and derivatives of `Error` such as `ReferenceError`,\n * `TypeError`, and user-defined objects that extend `Error`. No other type of\n * value will generate a stack trace when initialized. With that said, the\n * `throw` assertion does technically support any type of value being thrown,\n * not just `Error` and its derivatives.\n *\n * The aliases `.throws` and `.Throw` can be used interchangeably with\n * `.throw`.\n *\n * @name throw\n * @alias throws\n * @alias Throw\n * @param {Error|ErrorConstructor} errorLike\n * @param {String|RegExp} errMsgMatcher error message\n * @param {String} msg _optional_\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @returns error for chaining (null if no error)\n * @namespace BDD\n * @api public\n */\n\n function assertThrows (errorLike, errMsgMatcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , ssfi = flag(this, 'ssfi')\n , flagMsg = flag(this, 'message')\n , negate = flag(this, 'negate') || false;\n new Assertion(obj, flagMsg, ssfi, true).is.a('function');\n\n if (errorLike instanceof RegExp || typeof errorLike === 'string') {\n errMsgMatcher = errorLike;\n errorLike = null;\n }\n\n var caughtErr;\n try {\n obj();\n } catch (err) {\n caughtErr = err;\n }\n\n // If we have the negate flag enabled and at least one valid argument it means we do expect an error\n // but we want it to match a given set of criteria\n var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined;\n\n // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible\n // See Issue #551 and PR #683@GitHub\n var everyArgIsDefined = Boolean(errorLike && errMsgMatcher);\n var errorLikeFail = false;\n var errMsgMatcherFail = false;\n\n // Checking if error was thrown\n if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {\n // We need this to display results correctly according to their types\n var errorLikeString = 'an error';\n if (errorLike instanceof Error) {\n errorLikeString = '#{exp}';\n } else if (errorLike) {\n errorLikeString = _.checkError.getConstructorName(errorLike);\n }\n\n this.assert(\n caughtErr\n , 'expected #{this} to throw ' + errorLikeString\n , 'expected #{this} to not throw an error but #{act} was thrown'\n , errorLike && errorLike.toString()\n , (caughtErr instanceof Error ?\n caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr &&\n _.checkError.getConstructorName(caughtErr)))\n );\n }\n\n if (errorLike && caughtErr) {\n // We should compare instances only if `errorLike` is an instance of `Error`\n if (errorLike instanceof Error) {\n var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike);\n\n if (isCompatibleInstance === negate) {\n // These checks were created to ensure we won't fail too soon when we've got both args and a negate\n // See Issue #551 and PR #683@GitHub\n if (everyArgIsDefined && negate) {\n errorLikeFail = true;\n } else {\n this.assert(\n negate\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '')\n , errorLike.toString()\n , caughtErr.toString()\n );\n }\n }\n }\n\n var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike);\n if (isCompatibleConstructor === negate) {\n if (everyArgIsDefined && negate) {\n errorLikeFail = true;\n } else {\n this.assert(\n negate\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '')\n , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike))\n , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr))\n );\n }\n }\n }\n\n if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) {\n // Here we check compatible messages\n var placeholder = 'including';\n if (errMsgMatcher instanceof RegExp) {\n placeholder = 'matching'\n }\n\n var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher);\n if (isCompatibleMessage === negate) {\n if (everyArgIsDefined && negate) {\n errMsgMatcherFail = true;\n } else {\n this.assert(\n negate\n , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}'\n , 'expected #{this} to throw error not ' + placeholder + ' #{exp}'\n , errMsgMatcher\n , _.checkError.getMessage(caughtErr)\n );\n }\n }\n }\n\n // If both assertions failed and both should've matched we throw an error\n if (errorLikeFail && errMsgMatcherFail) {\n this.assert(\n negate\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '')\n , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike))\n , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr))\n );\n }\n\n flag(this, 'object', caughtErr);\n };\n\n Assertion.addMethod('throw', assertThrows);\n Assertion.addMethod('throws', assertThrows);\n Assertion.addMethod('Throw', assertThrows);\n\n /**\n * ### .respondTo(method[, msg])\n *\n * When the target is a non-function object, `.respondTo` asserts that the\n * target has a method with the given name `method`. The method can be own or\n * inherited, and it can be enumerable or non-enumerable.\n *\n * function Cat () {}\n * Cat.prototype.meow = function () {};\n *\n * expect(new Cat()).to.respondTo('meow');\n *\n * When the target is a function, `.respondTo` asserts that the target's\n * `prototype` property has a method with the given name `method`. Again, the\n * method can be own or inherited, and it can be enumerable or non-enumerable.\n *\n * function Cat () {}\n * Cat.prototype.meow = function () {};\n *\n * expect(Cat).to.respondTo('meow');\n *\n * Add `.itself` earlier in the chain to force `.respondTo` to treat the\n * target as a non-function object, even if it's a function. Thus, it asserts\n * that the target has a method with the given name `method`, rather than\n * asserting that the target's `prototype` property has a method with the\n * given name `method`.\n *\n * function Cat () {}\n * Cat.prototype.meow = function () {};\n * Cat.hiss = function () {};\n *\n * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');\n *\n * When not adding `.itself`, it's important to check the target's type before\n * using `.respondTo`. See the `.a` doc for info on checking a target's type.\n *\n * function Cat () {}\n * Cat.prototype.meow = function () {};\n *\n * expect(new Cat()).to.be.an('object').that.respondsTo('meow');\n *\n * Add `.not` earlier in the chain to negate `.respondTo`.\n *\n * function Dog () {}\n * Dog.prototype.bark = function () {};\n *\n * expect(new Dog()).to.not.respondTo('meow');\n *\n * `.respondTo` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect({}).to.respondTo('meow', 'nooo why fail??');\n * expect({}, 'nooo why fail??').to.respondTo('meow');\n *\n * The alias `.respondsTo` can be used interchangeably with `.respondTo`.\n *\n * @name respondTo\n * @alias respondsTo\n * @param {String} method\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function respondTo (method, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , itself = flag(this, 'itself')\n , context = ('function' === typeof obj && !itself)\n ? obj.prototype[method]\n : obj[method];\n\n this.assert(\n 'function' === typeof context\n , 'expected #{this} to respond to ' + _.inspect(method)\n , 'expected #{this} to not respond to ' + _.inspect(method)\n );\n }\n\n Assertion.addMethod('respondTo', respondTo);\n Assertion.addMethod('respondsTo', respondTo);\n\n /**\n * ### .itself\n *\n * Forces all `.respondTo` assertions that follow in the chain to behave as if\n * the target is a non-function object, even if it's a function. Thus, it\n * causes `.respondTo` to assert that the target has a method with the given\n * name, rather than asserting that the target's `prototype` property has a\n * method with the given name.\n *\n * function Cat () {}\n * Cat.prototype.meow = function () {};\n * Cat.hiss = function () {};\n *\n * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');\n *\n * @name itself\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('itself', function () {\n flag(this, 'itself', true);\n });\n\n /**\n * ### .satisfy(matcher[, msg])\n *\n * Invokes the given `matcher` function with the target being passed as the\n * first argument, and asserts that the value returned is truthy.\n *\n * expect(1).to.satisfy(function(num) {\n * return num > 0;\n * });\n *\n * Add `.not` earlier in the chain to negate `.satisfy`.\n *\n * expect(1).to.not.satisfy(function(num) {\n * return num > 2;\n * });\n *\n * `.satisfy` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect(1).to.satisfy(function(num) {\n * return num > 2;\n * }, 'nooo why fail??');\n *\n * expect(1, 'nooo why fail??').to.satisfy(function(num) {\n * return num > 2;\n * });\n *\n * The alias `.satisfies` can be used interchangeably with `.satisfy`.\n *\n * @name satisfy\n * @alias satisfies\n * @param {Function} matcher\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function satisfy (matcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var result = matcher(obj);\n this.assert(\n result\n , 'expected #{this} to satisfy ' + _.objDisplay(matcher)\n , 'expected #{this} to not satisfy' + _.objDisplay(matcher)\n , flag(this, 'negate') ? false : true\n , result\n );\n }\n\n Assertion.addMethod('satisfy', satisfy);\n Assertion.addMethod('satisfies', satisfy);\n\n /**\n * ### .closeTo(expected, delta[, msg])\n *\n * Asserts that the target is a number that's within a given +/- `delta` range\n * of the given number `expected`. However, it's often best to assert that the\n * target is equal to its expected value.\n *\n * // Recommended\n * expect(1.5).to.equal(1.5);\n *\n * // Not recommended\n * expect(1.5).to.be.closeTo(1, 0.5);\n * expect(1.5).to.be.closeTo(2, 0.5);\n * expect(1.5).to.be.closeTo(1, 1);\n *\n * Add `.not` earlier in the chain to negate `.closeTo`.\n *\n * expect(1.5).to.equal(1.5); // Recommended\n * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended\n *\n * `.closeTo` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??');\n * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1);\n *\n * The alias `.approximately` can be used interchangeably with `.closeTo`.\n *\n * @name closeTo\n * @alias approximately\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function closeTo(expected, delta, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n\n new Assertion(obj, flagMsg, ssfi, true).is.a('number');\n if (typeof expected !== 'number' || typeof delta !== 'number') {\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n var deltaMessage = delta === undefined ? \", and a delta is required\" : \"\";\n throw new AssertionError(\n flagMsg + 'the arguments to closeTo or approximately must be numbers' + deltaMessage,\n undefined,\n ssfi\n );\n }\n\n this.assert(\n Math.abs(obj - expected) <= delta\n , 'expected #{this} to be close to ' + expected + ' +/- ' + delta\n , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta\n );\n }\n\n Assertion.addMethod('closeTo', closeTo);\n Assertion.addMethod('approximately', closeTo);\n\n // Note: Duplicates are ignored if testing for inclusion instead of sameness.\n function isSubsetOf(subset, superset, cmp, contains, ordered) {\n if (!contains) {\n if (subset.length !== superset.length) return false;\n superset = superset.slice();\n }\n\n return subset.every(function(elem, idx) {\n if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];\n\n if (!cmp) {\n var matchIdx = superset.indexOf(elem);\n if (matchIdx === -1) return false;\n\n // Remove match from superset so not counted twice if duplicate in subset.\n if (!contains) superset.splice(matchIdx, 1);\n return true;\n }\n\n return superset.some(function(elem2, matchIdx) {\n if (!cmp(elem, elem2)) return false;\n\n // Remove match from superset so not counted twice if duplicate in subset.\n if (!contains) superset.splice(matchIdx, 1);\n return true;\n });\n });\n }\n\n /**\n * ### .members(set[, msg])\n *\n * Asserts that the target array has the same members as the given array\n * `set`.\n *\n * expect([1, 2, 3]).to.have.members([2, 1, 3]);\n * expect([1, 2, 2]).to.have.members([2, 1, 2]);\n *\n * By default, members are compared using strict (`===`) equality. Add `.deep`\n * earlier in the chain to use deep equality instead. See the `deep-eql`\n * project page for info on the deep equality algorithm:\n * https://github.com/chaijs/deep-eql.\n *\n * // Target array deeply (but not strictly) has member `{a: 1}`\n * expect([{a: 1}]).to.have.deep.members([{a: 1}]);\n * expect([{a: 1}]).to.not.have.members([{a: 1}]);\n *\n * By default, order doesn't matter. Add `.ordered` earlier in the chain to\n * require that members appear in the same order.\n *\n * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]);\n * expect([1, 2, 3]).to.have.members([2, 1, 3])\n * .but.not.ordered.members([2, 1, 3]);\n *\n * By default, both arrays must be the same size. Add `.include` earlier in\n * the chain to require that the target's members be a superset of the\n * expected members. Note that duplicates are ignored in the subset when\n * `.include` is added.\n *\n * // Target array is a superset of [1, 2] but not identical\n * expect([1, 2, 3]).to.include.members([1, 2]);\n * expect([1, 2, 3]).to.not.have.members([1, 2]);\n *\n * // Duplicates in the subset are ignored\n * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);\n *\n * `.deep`, `.ordered`, and `.include` can all be combined. However, if\n * `.include` and `.ordered` are combined, the ordering begins at the start of\n * both arrays.\n *\n * expect([{a: 1}, {b: 2}, {c: 3}])\n * .to.include.deep.ordered.members([{a: 1}, {b: 2}])\n * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]);\n *\n * Add `.not` earlier in the chain to negate `.members`. However, it's\n * dangerous to do so. The problem is that it creates uncertain expectations\n * by asserting that the target array doesn't have all of the same members as\n * the given array `set` but may or may not have some of them. It's often best\n * to identify the exact output that's expected, and then write an assertion\n * that only accepts that exact output.\n *\n * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended\n * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended\n *\n * `.members` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`.\n *\n * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??');\n * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]);\n *\n * @name members\n * @param {Array} set\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('members', function (subset, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n\n new Assertion(obj, flagMsg, ssfi, true).to.be.an('array');\n new Assertion(subset, flagMsg, ssfi, true).to.be.an('array');\n\n var contains = flag(this, 'contains');\n var ordered = flag(this, 'ordered');\n\n var subject, failMsg, failNegateMsg;\n\n if (contains) {\n subject = ordered ? 'an ordered superset' : 'a superset';\n failMsg = 'expected #{this} to be ' + subject + ' of #{exp}';\n failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}';\n } else {\n subject = ordered ? 'ordered members' : 'members';\n failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}';\n failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}';\n }\n\n var cmp = flag(this, 'deep') ? _.eql : undefined;\n\n this.assert(\n isSubsetOf(subset, obj, cmp, contains, ordered)\n , failMsg\n , failNegateMsg\n , subset\n , obj\n , true\n );\n });\n\n /**\n * ### .oneOf(list[, msg])\n *\n * Asserts that the target is a member of the given array `list`. However,\n * it's often best to assert that the target is equal to its expected value.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended\n *\n * Comparisons are performed using strict (`===`) equality.\n *\n * Add `.not` earlier in the chain to negate `.oneOf`.\n *\n * expect(1).to.equal(1); // Recommended\n * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended\n *\n * It can also be chained with `.contain` or `.include`, which will work with\n * both arrays and strings:\n *\n * expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy'])\n * expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy'])\n * expect([1,2,3]).to.contain.oneOf([3,4,5])\n * expect([1,2,3]).to.not.contain.oneOf([4,5,6])\n *\n * `.oneOf` accepts an optional `msg` argument which is a custom error message\n * to show when the assertion fails. The message can also be given as the\n * second argument to `expect`.\n *\n * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??');\n * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]);\n *\n * @name oneOf\n * @param {Array<*>} list\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function oneOf (list, msg) {\n if (msg) flag(this, 'message', msg);\n var expected = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi')\n , contains = flag(this, 'contains')\n , isDeep = flag(this, 'deep');\n new Assertion(list, flagMsg, ssfi, true).to.be.an('array');\n\n if (contains) {\n this.assert(\n list.some(function(possibility) { return expected.indexOf(possibility) > -1 })\n , 'expected #{this} to contain one of #{exp}'\n , 'expected #{this} to not contain one of #{exp}'\n , list\n , expected\n );\n } else {\n if (isDeep) {\n this.assert(\n list.some(function(possibility) { return _.eql(expected, possibility) })\n , 'expected #{this} to deeply equal one of #{exp}'\n , 'expected #{this} to deeply equal one of #{exp}'\n , list\n , expected\n );\n } else {\n this.assert(\n list.indexOf(expected) > -1\n , 'expected #{this} to be one of #{exp}'\n , 'expected #{this} to not be one of #{exp}'\n , list\n , expected\n );\n }\n }\n }\n\n Assertion.addMethod('oneOf', oneOf);\n\n /**\n * ### .change(subject[, prop[, msg]])\n *\n * When one argument is provided, `.change` asserts that the given function\n * `subject` returns a different value when it's invoked before the target\n * function compared to when it's invoked afterward. However, it's often best\n * to assert that `subject` is equal to its expected value.\n *\n * var dots = ''\n * , addDot = function () { dots += '.'; }\n * , getDots = function () { return dots; };\n *\n * // Recommended\n * expect(getDots()).to.equal('');\n * addDot();\n * expect(getDots()).to.equal('.');\n *\n * // Not recommended\n * expect(addDot).to.change(getDots);\n *\n * When two arguments are provided, `.change` asserts that the value of the\n * given object `subject`'s `prop` property is different before invoking the\n * target function compared to afterward.\n *\n * var myObj = {dots: ''}\n * , addDot = function () { myObj.dots += '.'; };\n *\n * // Recommended\n * expect(myObj).to.have.property('dots', '');\n * addDot();\n * expect(myObj).to.have.property('dots', '.');\n *\n * // Not recommended\n * expect(addDot).to.change(myObj, 'dots');\n *\n * Strict (`===`) equality is used to compare before and after values.\n *\n * Add `.not` earlier in the chain to negate `.change`.\n *\n * var dots = ''\n * , noop = function () {}\n * , getDots = function () { return dots; };\n *\n * expect(noop).to.not.change(getDots);\n *\n * var myObj = {dots: ''}\n * , noop = function () {};\n *\n * expect(noop).to.not.change(myObj, 'dots');\n *\n * `.change` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`. When not providing two arguments, always\n * use the second form.\n *\n * var myObj = {dots: ''}\n * , addDot = function () { myObj.dots += '.'; };\n *\n * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??');\n *\n * var dots = ''\n * , addDot = function () { dots += '.'; }\n * , getDots = function () { return dots; };\n *\n * expect(addDot, 'nooo why fail??').to.not.change(getDots);\n *\n * `.change` also causes all `.by` assertions that follow in the chain to\n * assert how much a numeric subject was increased or decreased by. However,\n * it's dangerous to use `.change.by`. The problem is that it creates\n * uncertain expectations by asserting that the subject either increases by\n * the given delta, or that it decreases by the given delta. It's often best\n * to identify the exact output that's expected, and then write an assertion\n * that only accepts that exact output.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; }\n * , subtractTwo = function () { myObj.val -= 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended\n * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended\n *\n * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended\n * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended\n *\n * The alias `.changes` can be used interchangeably with `.change`.\n *\n * @name change\n * @alias changes\n * @param {String} subject\n * @param {String} prop name _optional_\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertChanges (subject, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n new Assertion(fn, flagMsg, ssfi, true).is.a('function');\n\n var initial;\n if (!prop) {\n new Assertion(subject, flagMsg, ssfi, true).is.a('function');\n initial = subject();\n } else {\n new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);\n initial = subject[prop];\n }\n\n fn();\n\n var final = prop === undefined || prop === null ? subject() : subject[prop];\n var msgObj = prop === undefined || prop === null ? initial : '.' + prop;\n\n // This gets flagged because of the .by(delta) assertion\n flag(this, 'deltaMsgObj', msgObj);\n flag(this, 'initialDeltaValue', initial);\n flag(this, 'finalDeltaValue', final);\n flag(this, 'deltaBehavior', 'change');\n flag(this, 'realDelta', final !== initial);\n\n this.assert(\n initial !== final\n , 'expected ' + msgObj + ' to change'\n , 'expected ' + msgObj + ' to not change'\n );\n }\n\n Assertion.addMethod('change', assertChanges);\n Assertion.addMethod('changes', assertChanges);\n\n /**\n * ### .increase(subject[, prop[, msg]])\n *\n * When one argument is provided, `.increase` asserts that the given function\n * `subject` returns a greater number when it's invoked after invoking the\n * target function compared to when it's invoked beforehand. `.increase` also\n * causes all `.by` assertions that follow in the chain to assert how much\n * greater of a number is returned. It's often best to assert that the return\n * value increased by the expected amount, rather than asserting it increased\n * by any amount.\n *\n * var val = 1\n * , addTwo = function () { val += 2; }\n * , getVal = function () { return val; };\n *\n * expect(addTwo).to.increase(getVal).by(2); // Recommended\n * expect(addTwo).to.increase(getVal); // Not recommended\n *\n * When two arguments are provided, `.increase` asserts that the value of the\n * given object `subject`'s `prop` property is greater after invoking the\n * target function compared to beforehand.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended\n * expect(addTwo).to.increase(myObj, 'val'); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.increase`. However, it's\n * dangerous to do so. The problem is that it creates uncertain expectations\n * by asserting that the subject either decreases, or that it stays the same.\n * It's often best to identify the exact output that's expected, and then\n * write an assertion that only accepts that exact output.\n *\n * When the subject is expected to decrease, it's often best to assert that it\n * decreased by the expected amount.\n *\n * var myObj = {val: 1}\n * , subtractTwo = function () { myObj.val -= 2; };\n *\n * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended\n * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended\n *\n * When the subject is expected to stay the same, it's often best to assert\n * exactly that.\n *\n * var myObj = {val: 1}\n * , noop = function () {};\n *\n * expect(noop).to.not.change(myObj, 'val'); // Recommended\n * expect(noop).to.not.increase(myObj, 'val'); // Not recommended\n *\n * `.increase` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`. When not providing two arguments, always\n * use the second form.\n *\n * var myObj = {val: 1}\n * , noop = function () {};\n *\n * expect(noop).to.increase(myObj, 'val', 'nooo why fail??');\n *\n * var val = 1\n * , noop = function () {}\n * , getVal = function () { return val; };\n *\n * expect(noop, 'nooo why fail??').to.increase(getVal);\n *\n * The alias `.increases` can be used interchangeably with `.increase`.\n *\n * @name increase\n * @alias increases\n * @param {String|Function} subject\n * @param {String} prop name _optional_\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertIncreases (subject, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n new Assertion(fn, flagMsg, ssfi, true).is.a('function');\n\n var initial;\n if (!prop) {\n new Assertion(subject, flagMsg, ssfi, true).is.a('function');\n initial = subject();\n } else {\n new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);\n initial = subject[prop];\n }\n\n // Make sure that the target is a number\n new Assertion(initial, flagMsg, ssfi, true).is.a('number');\n\n fn();\n\n var final = prop === undefined || prop === null ? subject() : subject[prop];\n var msgObj = prop === undefined || prop === null ? initial : '.' + prop;\n\n flag(this, 'deltaMsgObj', msgObj);\n flag(this, 'initialDeltaValue', initial);\n flag(this, 'finalDeltaValue', final);\n flag(this, 'deltaBehavior', 'increase');\n flag(this, 'realDelta', final - initial);\n\n this.assert(\n final - initial > 0\n , 'expected ' + msgObj + ' to increase'\n , 'expected ' + msgObj + ' to not increase'\n );\n }\n\n Assertion.addMethod('increase', assertIncreases);\n Assertion.addMethod('increases', assertIncreases);\n\n /**\n * ### .decrease(subject[, prop[, msg]])\n *\n * When one argument is provided, `.decrease` asserts that the given function\n * `subject` returns a lesser number when it's invoked after invoking the\n * target function compared to when it's invoked beforehand. `.decrease` also\n * causes all `.by` assertions that follow in the chain to assert how much\n * lesser of a number is returned. It's often best to assert that the return\n * value decreased by the expected amount, rather than asserting it decreased\n * by any amount.\n *\n * var val = 1\n * , subtractTwo = function () { val -= 2; }\n * , getVal = function () { return val; };\n *\n * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended\n * expect(subtractTwo).to.decrease(getVal); // Not recommended\n *\n * When two arguments are provided, `.decrease` asserts that the value of the\n * given object `subject`'s `prop` property is lesser after invoking the\n * target function compared to beforehand.\n *\n * var myObj = {val: 1}\n * , subtractTwo = function () { myObj.val -= 2; };\n *\n * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended\n * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.decrease`. However, it's\n * dangerous to do so. The problem is that it creates uncertain expectations\n * by asserting that the subject either increases, or that it stays the same.\n * It's often best to identify the exact output that's expected, and then\n * write an assertion that only accepts that exact output.\n *\n * When the subject is expected to increase, it's often best to assert that it\n * increased by the expected amount.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended\n * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended\n *\n * When the subject is expected to stay the same, it's often best to assert\n * exactly that.\n *\n * var myObj = {val: 1}\n * , noop = function () {};\n *\n * expect(noop).to.not.change(myObj, 'val'); // Recommended\n * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended\n *\n * `.decrease` accepts an optional `msg` argument which is a custom error\n * message to show when the assertion fails. The message can also be given as\n * the second argument to `expect`. When not providing two arguments, always\n * use the second form.\n *\n * var myObj = {val: 1}\n * , noop = function () {};\n *\n * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??');\n *\n * var val = 1\n * , noop = function () {}\n * , getVal = function () { return val; };\n *\n * expect(noop, 'nooo why fail??').to.decrease(getVal);\n *\n * The alias `.decreases` can be used interchangeably with `.decrease`.\n *\n * @name decrease\n * @alias decreases\n * @param {String|Function} subject\n * @param {String} prop name _optional_\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDecreases (subject, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object')\n , flagMsg = flag(this, 'message')\n , ssfi = flag(this, 'ssfi');\n new Assertion(fn, flagMsg, ssfi, true).is.a('function');\n\n var initial;\n if (!prop) {\n new Assertion(subject, flagMsg, ssfi, true).is.a('function');\n initial = subject();\n } else {\n new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);\n initial = subject[prop];\n }\n\n // Make sure that the target is a number\n new Assertion(initial, flagMsg, ssfi, true).is.a('number');\n\n fn();\n\n var final = prop === undefined || prop === null ? subject() : subject[prop];\n var msgObj = prop === undefined || prop === null ? initial : '.' + prop;\n\n flag(this, 'deltaMsgObj', msgObj);\n flag(this, 'initialDeltaValue', initial);\n flag(this, 'finalDeltaValue', final);\n flag(this, 'deltaBehavior', 'decrease');\n flag(this, 'realDelta', initial - final);\n\n this.assert(\n final - initial < 0\n , 'expected ' + msgObj + ' to decrease'\n , 'expected ' + msgObj + ' to not decrease'\n );\n }\n\n Assertion.addMethod('decrease', assertDecreases);\n Assertion.addMethod('decreases', assertDecreases);\n\n /**\n * ### .by(delta[, msg])\n *\n * When following an `.increase` assertion in the chain, `.by` asserts that\n * the subject of the `.increase` assertion increased by the given `delta`.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(2);\n *\n * When following a `.decrease` assertion in the chain, `.by` asserts that the\n * subject of the `.decrease` assertion decreased by the given `delta`.\n *\n * var myObj = {val: 1}\n * , subtractTwo = function () { myObj.val -= 2; };\n *\n * expect(subtractTwo).to.decrease(myObj, 'val').by(2);\n *\n * When following a `.change` assertion in the chain, `.by` asserts that the\n * subject of the `.change` assertion either increased or decreased by the\n * given `delta`. However, it's dangerous to use `.change.by`. The problem is\n * that it creates uncertain expectations. It's often best to identify the\n * exact output that's expected, and then write an assertion that only accepts\n * that exact output.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; }\n * , subtractTwo = function () { myObj.val -= 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended\n * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended\n *\n * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended\n * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended\n *\n * Add `.not` earlier in the chain to negate `.by`. However, it's often best\n * to assert that the subject changed by its expected delta, rather than\n * asserting that it didn't change by one of countless unexpected deltas.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; };\n *\n * // Recommended\n * expect(addTwo).to.increase(myObj, 'val').by(2);\n *\n * // Not recommended\n * expect(addTwo).to.increase(myObj, 'val').but.not.by(3);\n *\n * `.by` accepts an optional `msg` argument which is a custom error message to\n * show when the assertion fails. The message can also be given as the second\n * argument to `expect`.\n *\n * var myObj = {val: 1}\n * , addTwo = function () { myObj.val += 2; };\n *\n * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??');\n * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3);\n *\n * @name by\n * @param {Number} delta\n * @param {String} msg _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDelta(delta, msg) {\n if (msg) flag(this, 'message', msg);\n\n var msgObj = flag(this, 'deltaMsgObj');\n var initial = flag(this, 'initialDeltaValue');\n var final = flag(this, 'finalDeltaValue');\n var behavior = flag(this, 'deltaBehavior');\n var realDelta = flag(this, 'realDelta');\n\n var expression;\n if (behavior === 'change') {\n expression = Math.abs(final - initial) === Math.abs(delta);\n } else {\n expression = realDelta === Math.abs(delta);\n }\n\n this.assert(\n expression\n , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta\n , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta\n );\n }\n\n Assertion.addMethod('by', assertDelta);\n\n /**\n * ### .extensible\n *\n * Asserts that the target is extensible, which means that new properties can\n * be added to it. Primitives are never extensible.\n *\n * expect({a: 1}).to.be.extensible;\n *\n * Add `.not` earlier in the chain to negate `.extensible`.\n *\n * var nonExtensibleObject = Object.preventExtensions({})\n * , sealedObject = Object.seal({})\n * , frozenObject = Object.freeze({});\n *\n * expect(nonExtensibleObject).to.not.be.extensible;\n * expect(sealedObject).to.not.be.extensible;\n * expect(frozenObject).to.not.be.extensible;\n * expect(1).to.not.be.extensible;\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect(1, 'nooo why fail??').to.be.extensible;\n *\n * @name extensible\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('extensible', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n // The following provides ES6 behavior for ES5 environments.\n\n var isExtensible = obj === Object(obj) && Object.isExtensible(obj);\n\n this.assert(\n isExtensible\n , 'expected #{this} to be extensible'\n , 'expected #{this} to not be extensible'\n );\n });\n\n /**\n * ### .sealed\n *\n * Asserts that the target is sealed, which means that new properties can't be\n * added to it, and its existing properties can't be reconfigured or deleted.\n * However, it's possible that its existing properties can still be reassigned\n * to different values. Primitives are always sealed.\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect(sealedObject).to.be.sealed;\n * expect(frozenObject).to.be.sealed;\n * expect(1).to.be.sealed;\n *\n * Add `.not` earlier in the chain to negate `.sealed`.\n *\n * expect({a: 1}).to.not.be.sealed;\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect({a: 1}, 'nooo why fail??').to.be.sealed;\n *\n * @name sealed\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('sealed', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n // The following provides ES6 behavior for ES5 environments.\n\n var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;\n\n this.assert(\n isSealed\n , 'expected #{this} to be sealed'\n , 'expected #{this} to not be sealed'\n );\n });\n\n /**\n * ### .frozen\n *\n * Asserts that the target is frozen, which means that new properties can't be\n * added to it, and its existing properties can't be reassigned to different\n * values, reconfigured, or deleted. Primitives are always frozen.\n *\n * var frozenObject = Object.freeze({});\n *\n * expect(frozenObject).to.be.frozen;\n * expect(1).to.be.frozen;\n *\n * Add `.not` earlier in the chain to negate `.frozen`.\n *\n * expect({a: 1}).to.not.be.frozen;\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect({a: 1}, 'nooo why fail??').to.be.frozen;\n *\n * @name frozen\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('frozen', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n // The following provides ES6 behavior for ES5 environments.\n\n var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;\n\n this.assert(\n isFrozen\n , 'expected #{this} to be frozen'\n , 'expected #{this} to not be frozen'\n );\n });\n\n /**\n * ### .finite\n *\n * Asserts that the target is a number, and isn't `NaN` or positive/negative\n * `Infinity`.\n *\n * expect(1).to.be.finite;\n *\n * Add `.not` earlier in the chain to negate `.finite`. However, it's\n * dangerous to do so. The problem is that it creates uncertain expectations\n * by asserting that the subject either isn't a number, or that it's `NaN`, or\n * that it's positive `Infinity`, or that it's negative `Infinity`. It's often\n * best to identify the exact output that's expected, and then write an\n * assertion that only accepts that exact output.\n *\n * When the target isn't expected to be a number, it's often best to assert\n * that it's the expected type, rather than asserting that it isn't one of\n * many unexpected types.\n *\n * expect('foo').to.be.a('string'); // Recommended\n * expect('foo').to.not.be.finite; // Not recommended\n *\n * When the target is expected to be `NaN`, it's often best to assert exactly\n * that.\n *\n * expect(NaN).to.be.NaN; // Recommended\n * expect(NaN).to.not.be.finite; // Not recommended\n *\n * When the target is expected to be positive infinity, it's often best to\n * assert exactly that.\n *\n * expect(Infinity).to.equal(Infinity); // Recommended\n * expect(Infinity).to.not.be.finite; // Not recommended\n *\n * When the target is expected to be negative infinity, it's often best to\n * assert exactly that.\n *\n * expect(-Infinity).to.equal(-Infinity); // Recommended\n * expect(-Infinity).to.not.be.finite; // Not recommended\n *\n * A custom error message can be given as the second argument to `expect`.\n *\n * expect('foo', 'nooo why fail??').to.be.finite;\n *\n * @name finite\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('finite', function(msg) {\n var obj = flag(this, 'object');\n\n this.assert(\n typeof obj === 'number' && isFinite(obj)\n , 'expected #{this} to be a finite number'\n , 'expected #{this} to not be a finite number'\n );\n });\n};\n\n},{}],247:[function(require,module,exports){\n/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n /*!\n * Chai dependencies.\n */\n\n var Assertion = chai.Assertion\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n /**\n * ### assert(expression, message)\n *\n * Write your own test expressions.\n *\n * assert('foo' !== 'bar', 'foo is not bar');\n * assert(Array.isArray([]), 'empty arrays are arrays');\n *\n * @param {Mixed} expression to test for truthiness\n * @param {String} message to display on error\n * @name assert\n * @namespace Assert\n * @api public\n */\n\n var assert = chai.assert = function (express, errmsg) {\n var test = new Assertion(null, null, chai.assert, true);\n test.assert(\n express\n , errmsg\n , '[ negation message unavailable ]'\n );\n };\n\n /**\n * ### .fail([message])\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure. Node.js `assert` module-compatible.\n *\n * assert.fail();\n * assert.fail(\"custom error message\");\n * assert.fail(1, 2);\n * assert.fail(1, 2, \"custom error message\");\n * assert.fail(1, 2, \"custom error message\", \">\");\n * assert.fail(1, 2, undefined, \">\");\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Assert\n * @api public\n */\n\n assert.fail = function (actual, expected, message, operator) {\n if (arguments.length < 2) {\n // Comply with Node's fail([message]) interface\n\n message = actual;\n actual = undefined;\n }\n\n message = message || 'assert.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, assert.fail);\n };\n\n /**\n * ### .isOk(object, [message])\n *\n * Asserts that `object` is truthy.\n *\n * assert.isOk('everything', 'everything is ok');\n * assert.isOk(false, 'this will fail');\n *\n * @name isOk\n * @alias ok\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isOk = function (val, msg) {\n new Assertion(val, msg, assert.isOk, true).is.ok;\n };\n\n /**\n * ### .isNotOk(object, [message])\n *\n * Asserts that `object` is falsy.\n *\n * assert.isNotOk('everything', 'this will fail');\n * assert.isNotOk(false, 'this will pass');\n *\n * @name isNotOk\n * @alias notOk\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotOk = function (val, msg) {\n new Assertion(val, msg, assert.isNotOk, true).is.not.ok;\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * assert.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.equal = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.equal, true);\n\n test.assert(\n exp == flag(test, 'object')\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{act}'\n , exp\n , act\n , true\n );\n };\n\n /**\n * ### .notEqual(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * assert.notEqual(3, 4, 'these numbers are not equal');\n *\n * @name notEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notEqual = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.notEqual, true);\n\n test.assert(\n exp != flag(test, 'object')\n , 'expected #{this} to not equal #{exp}'\n , 'expected #{this} to equal #{act}'\n , exp\n , act\n , true\n );\n };\n\n /**\n * ### .strictEqual(actual, expected, [message])\n *\n * Asserts strict equality (`===`) of `actual` and `expected`.\n *\n * assert.strictEqual(true, true, 'these booleans are strictly equal');\n *\n * @name strictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.strictEqual = function (act, exp, msg) {\n new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);\n };\n\n /**\n * ### .notStrictEqual(actual, expected, [message])\n *\n * Asserts strict inequality (`!==`) of `actual` and `expected`.\n *\n * assert.notStrictEqual(3, '3', 'no coercion for strict equality');\n *\n * @name notStrictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);\n };\n\n /**\n * ### .deepEqual(actual, expected, [message])\n *\n * Asserts that `actual` is deeply equal to `expected`.\n *\n * assert.deepEqual({ tea: 'green' }, { tea: 'green' });\n *\n * @name deepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @alias deepStrictEqual\n * @namespace Assert\n * @api public\n */\n\n assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);\n };\n\n /**\n * ### .notDeepEqual(actual, expected, [message])\n *\n * Assert that `actual` is not deeply equal to `expected`.\n *\n * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });\n *\n * @name notDeepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepEqual = function (act, exp, msg) {\n new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);\n };\n\n /**\n * ### .isAbove(valueToCheck, valueToBeAbove, [message])\n *\n * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`.\n *\n * assert.isAbove(5, 2, '5 is strictly greater than 2');\n *\n * @name isAbove\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAbove\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAbove = function (val, abv, msg) {\n new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);\n };\n\n /**\n * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])\n *\n * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`.\n *\n * assert.isAtLeast(5, 2, '5 is greater or equal to 2');\n * assert.isAtLeast(3, 3, '3 is greater or equal to 3');\n *\n * @name isAtLeast\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtLeast\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtLeast = function (val, atlst, msg) {\n new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);\n };\n\n /**\n * ### .isBelow(valueToCheck, valueToBeBelow, [message])\n *\n * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`.\n *\n * assert.isBelow(3, 6, '3 is strictly less than 6');\n *\n * @name isBelow\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeBelow\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBelow = function (val, blw, msg) {\n new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);\n };\n\n /**\n * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])\n *\n * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`.\n *\n * assert.isAtMost(3, 6, '3 is less than or equal to 6');\n * assert.isAtMost(4, 4, '4 is less than or equal to 4');\n *\n * @name isAtMost\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtMost\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtMost = function (val, atmst, msg) {\n new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);\n };\n\n /**\n * ### .isTrue(value, [message])\n *\n * Asserts that `value` is true.\n *\n * var teaServed = true;\n * assert.isTrue(teaServed, 'the tea has been served');\n *\n * @name isTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isTrue = function (val, msg) {\n new Assertion(val, msg, assert.isTrue, true).is['true'];\n };\n\n /**\n * ### .isNotTrue(value, [message])\n *\n * Asserts that `value` is not true.\n *\n * var tea = 'tasty chai';\n * assert.isNotTrue(tea, 'great, time for tea!');\n *\n * @name isNotTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotTrue = function (val, msg) {\n new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);\n };\n\n /**\n * ### .isFalse(value, [message])\n *\n * Asserts that `value` is false.\n *\n * var teaServed = false;\n * assert.isFalse(teaServed, 'no tea yet? hmm...');\n *\n * @name isFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFalse = function (val, msg) {\n new Assertion(val, msg, assert.isFalse, true).is['false'];\n };\n\n /**\n * ### .isNotFalse(value, [message])\n *\n * Asserts that `value` is not false.\n *\n * var tea = 'tasty chai';\n * assert.isNotFalse(tea, 'great, time for tea!');\n *\n * @name isNotFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFalse = function (val, msg) {\n new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);\n };\n\n /**\n * ### .isNull(value, [message])\n *\n * Asserts that `value` is null.\n *\n * assert.isNull(err, 'there was no error');\n *\n * @name isNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNull = function (val, msg) {\n new Assertion(val, msg, assert.isNull, true).to.equal(null);\n };\n\n /**\n * ### .isNotNull(value, [message])\n *\n * Asserts that `value` is not null.\n *\n * var tea = 'tasty chai';\n * assert.isNotNull(tea, 'great, time for tea!');\n *\n * @name isNotNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNull = function (val, msg) {\n new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);\n };\n\n /**\n * ### .isNaN\n *\n * Asserts that value is NaN.\n *\n * assert.isNaN(NaN, 'NaN is NaN');\n *\n * @name isNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNaN = function (val, msg) {\n new Assertion(val, msg, assert.isNaN, true).to.be.NaN;\n };\n\n /**\n * ### .isNotNaN\n *\n * Asserts that value is not NaN.\n *\n * assert.isNotNaN(4, '4 is not NaN');\n *\n * @name isNotNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n assert.isNotNaN = function (val, msg) {\n new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN;\n };\n\n /**\n * ### .exists\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * assert.exists(foo, 'foo is neither `null` nor `undefined`');\n *\n * @name exists\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.exists = function (val, msg) {\n new Assertion(val, msg, assert.exists, true).to.exist;\n };\n\n /**\n * ### .notExists\n *\n * Asserts that the target is either `null` or `undefined`.\n *\n * var bar = null\n * , baz;\n *\n * assert.notExists(bar);\n * assert.notExists(baz, 'baz is either null or undefined');\n *\n * @name notExists\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notExists = function (val, msg) {\n new Assertion(val, msg, assert.notExists, true).to.not.exist;\n };\n\n /**\n * ### .isUndefined(value, [message])\n *\n * Asserts that `value` is `undefined`.\n *\n * var tea;\n * assert.isUndefined(tea, 'no tea defined');\n *\n * @name isUndefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isUndefined = function (val, msg) {\n new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined);\n };\n\n /**\n * ### .isDefined(value, [message])\n *\n * Asserts that `value` is not `undefined`.\n *\n * var tea = 'cup of chai';\n * assert.isDefined(tea, 'tea has been defined');\n *\n * @name isDefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isDefined = function (val, msg) {\n new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined);\n };\n\n /**\n * ### .isFunction(value, [message])\n *\n * Asserts that `value` is a function.\n *\n * function serveTea() { return 'cup of tea'; };\n * assert.isFunction(serveTea, 'great, we can have tea now');\n *\n * @name isFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFunction = function (val, msg) {\n new Assertion(val, msg, assert.isFunction, true).to.be.a('function');\n };\n\n /**\n * ### .isNotFunction(value, [message])\n *\n * Asserts that `value` is _not_ a function.\n *\n * var serveTea = [ 'heat', 'pour', 'sip' ];\n * assert.isNotFunction(serveTea, 'great, we have listed the steps');\n *\n * @name isNotFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFunction = function (val, msg) {\n new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function');\n };\n\n /**\n * ### .isObject(value, [message])\n *\n * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).\n * _The assertion does not match subclassed objects._\n *\n * var selection = { name: 'Chai', serve: 'with spices' };\n * assert.isObject(selection, 'tea selection is an object');\n *\n * @name isObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isObject = function (val, msg) {\n new Assertion(val, msg, assert.isObject, true).to.be.a('object');\n };\n\n /**\n * ### .isNotObject(value, [message])\n *\n * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).\n *\n * var selection = 'chai'\n * assert.isNotObject(selection, 'tea selection is not an object');\n * assert.isNotObject(null, 'null is not an object');\n *\n * @name isNotObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotObject = function (val, msg) {\n new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object');\n };\n\n /**\n * ### .isArray(value, [message])\n *\n * Asserts that `value` is an array.\n *\n * var menu = [ 'green', 'chai', 'oolong' ];\n * assert.isArray(menu, 'what kind of tea do we want?');\n *\n * @name isArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isArray = function (val, msg) {\n new Assertion(val, msg, assert.isArray, true).to.be.an('array');\n };\n\n /**\n * ### .isNotArray(value, [message])\n *\n * Asserts that `value` is _not_ an array.\n *\n * var menu = 'green|chai|oolong';\n * assert.isNotArray(menu, 'what kind of tea do we want?');\n *\n * @name isNotArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotArray = function (val, msg) {\n new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array');\n };\n\n /**\n * ### .isString(value, [message])\n *\n * Asserts that `value` is a string.\n *\n * var teaOrder = 'chai';\n * assert.isString(teaOrder, 'order placed');\n *\n * @name isString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isString = function (val, msg) {\n new Assertion(val, msg, assert.isString, true).to.be.a('string');\n };\n\n /**\n * ### .isNotString(value, [message])\n *\n * Asserts that `value` is _not_ a string.\n *\n * var teaOrder = 4;\n * assert.isNotString(teaOrder, 'order placed');\n *\n * @name isNotString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotString = function (val, msg) {\n new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string');\n };\n\n /**\n * ### .isNumber(value, [message])\n *\n * Asserts that `value` is a number.\n *\n * var cups = 2;\n * assert.isNumber(cups, 'how many cups');\n *\n * @name isNumber\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNumber = function (val, msg) {\n new Assertion(val, msg, assert.isNumber, true).to.be.a('number');\n };\n\n /**\n * ### .isNotNumber(value, [message])\n *\n * Asserts that `value` is _not_ a number.\n *\n * var cups = '2 cups please';\n * assert.isNotNumber(cups, 'how many cups');\n *\n * @name isNotNumber\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNumber = function (val, msg) {\n new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number');\n };\n\n /**\n * ### .isFinite(value, [message])\n *\n * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`.\n *\n * var cups = 2;\n * assert.isFinite(cups, 'how many cups');\n *\n * assert.isFinite(NaN); // throws\n *\n * @name isFinite\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFinite = function (val, msg) {\n new Assertion(val, msg, assert.isFinite, true).to.be.finite;\n };\n\n /**\n * ### .isBoolean(value, [message])\n *\n * Asserts that `value` is a boolean.\n *\n * var teaReady = true\n * , teaServed = false;\n *\n * assert.isBoolean(teaReady, 'is the tea ready');\n * assert.isBoolean(teaServed, 'has tea been served');\n *\n * @name isBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBoolean = function (val, msg) {\n new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean');\n };\n\n /**\n * ### .isNotBoolean(value, [message])\n *\n * Asserts that `value` is _not_ a boolean.\n *\n * var teaReady = 'yep'\n * , teaServed = 'nope';\n *\n * assert.isNotBoolean(teaReady, 'is the tea ready');\n * assert.isNotBoolean(teaServed, 'has tea been served');\n *\n * @name isNotBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotBoolean = function (val, msg) {\n new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean');\n };\n\n /**\n * ### .typeOf(value, name, [message])\n *\n * Asserts that `value`'s type is `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');\n * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');\n * assert.typeOf('tea', 'string', 'we have a string');\n * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');\n * assert.typeOf(null, 'null', 'we have a null');\n * assert.typeOf(undefined, 'undefined', 'we have an undefined');\n *\n * @name typeOf\n * @param {Mixed} value\n * @param {String} name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.typeOf = function (val, type, msg) {\n new Assertion(val, msg, assert.typeOf, true).to.be.a(type);\n };\n\n /**\n * ### .notTypeOf(value, name, [message])\n *\n * Asserts that `value`'s type is _not_ `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.notTypeOf('tea', 'number', 'strings are not numbers');\n *\n * @name notTypeOf\n * @param {Mixed} value\n * @param {String} typeof name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notTypeOf = function (val, type, msg) {\n new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type);\n };\n\n /**\n * ### .instanceOf(object, constructor, [message])\n *\n * Asserts that `value` is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new Tea('chai');\n *\n * assert.instanceOf(chai, Tea, 'chai is an instance of tea');\n *\n * @name instanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.instanceOf = function (val, type, msg) {\n new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type);\n };\n\n /**\n * ### .notInstanceOf(object, constructor, [message])\n *\n * Asserts `value` is not an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new String('chai');\n *\n * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');\n *\n * @name notInstanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInstanceOf = function (val, type, msg) {\n new Assertion(val, msg, assert.notInstanceOf, true)\n .to.not.be.instanceOf(type);\n };\n\n /**\n * ### .include(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Can be used to assert the\n * inclusion of a value in an array, a substring in a string, or a subset of\n * properties in an object.\n *\n * assert.include([1,2,3], 2, 'array contains value');\n * assert.include('foobar', 'foo', 'string contains substring');\n * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property');\n *\n * Strict equality (===) is used. When asserting the inclusion of a value in\n * an array, the array is searched for an element that's strictly equal to the\n * given value. When asserting a subset of properties in an object, the object\n * is searched for the given property keys, checking that each one is present\n * and strictly equal to the given property value. For instance:\n *\n * var obj1 = {a: 1}\n * , obj2 = {b: 2};\n * assert.include([obj1, obj2], obj1);\n * assert.include({foo: obj1, bar: obj2}, {foo: obj1});\n * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2});\n *\n * @name include\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.include = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.include, true).include(inc);\n };\n\n /**\n * ### .notInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Can be used to assert\n * the absence of a value in an array, a substring in a string, or a subset of\n * properties in an object.\n *\n * assert.notInclude([1,2,3], 4, \"array doesn't contain value\");\n * assert.notInclude('foobar', 'baz', \"string doesn't contain substring\");\n * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property');\n *\n * Strict equality (===) is used. When asserting the absence of a value in an\n * array, the array is searched to confirm the absence of an element that's\n * strictly equal to the given value. When asserting a subset of properties in\n * an object, the object is searched to confirm that at least one of the given\n * property keys is either not present or not strictly equal to the given\n * property value. For instance:\n *\n * var obj1 = {a: 1}\n * , obj2 = {b: 2};\n * assert.notInclude([obj1, obj2], {a: 1});\n * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}});\n * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}});\n *\n * @name notInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notInclude, true).not.include(inc);\n };\n\n /**\n * ### .deepInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Can be used to assert the\n * inclusion of a value in an array or a subset of properties in an object.\n * Deep equality is used.\n *\n * var obj1 = {a: 1}\n * , obj2 = {b: 2};\n * assert.deepInclude([obj1, obj2], {a: 1});\n * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}});\n * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}});\n *\n * @name deepInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);\n };\n\n /**\n * ### .notDeepInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Can be used to assert\n * the absence of a value in an array or a subset of properties in an object.\n * Deep equality is used.\n *\n * var obj1 = {a: 1}\n * , obj2 = {b: 2};\n * assert.notDeepInclude([obj1, obj2], {a: 9});\n * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}});\n * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}});\n *\n * @name notDeepInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);\n };\n\n /**\n * ### .nestedInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the inclusion of a subset of properties in an\n * object.\n * Enables the use of dot- and bracket-notation for referencing nested\n * properties.\n * '[]' and '.' in property names can be escaped using double backslashes.\n *\n * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\\\.a.[b]': 'x'});\n * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\\\[b\\\\]': 'x'});\n *\n * @name nestedInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.nestedInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);\n };\n\n /**\n * ### .notNestedInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' does not include 'needle'.\n * Can be used to assert the absence of a subset of properties in an\n * object.\n * Enables the use of dot- and bracket-notation for referencing nested\n * properties.\n * '[]' and '.' in property names can be escaped using double backslashes.\n *\n * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\\\.a.b': 'y'});\n * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\\\[b\\\\]': 'y'});\n *\n * @name notNestedInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notNestedInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notNestedInclude, true)\n .not.nested.include(inc);\n };\n\n /**\n * ### .deepNestedInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the inclusion of a subset of properties in an\n * object while checking for deep equality.\n * Enables the use of dot- and bracket-notation for referencing nested\n * properties.\n * '[]' and '.' in property names can be escaped using double backslashes.\n *\n * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}});\n * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\\\.a.\\\\[b\\\\]': {x: 1}});\n *\n * @name deepNestedInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepNestedInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.deepNestedInclude, true)\n .deep.nested.include(inc);\n };\n\n /**\n * ### .notDeepNestedInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' does not include 'needle'.\n * Can be used to assert the absence of a subset of properties in an\n * object while checking for deep equality.\n * Enables the use of dot- and bracket-notation for referencing nested\n * properties.\n * '[]' and '.' in property names can be escaped using double backslashes.\n *\n * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}})\n * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\\\.a.\\\\[b\\\\]': {y: 2}});\n *\n * @name notDeepNestedInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepNestedInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.notDeepNestedInclude, true)\n .not.deep.nested.include(inc);\n };\n\n /**\n * ### .ownInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the inclusion of a subset of properties in an\n * object while ignoring inherited properties.\n *\n * assert.ownInclude({ a: 1 }, { a: 1 });\n *\n * @name ownInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.ownInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);\n };\n\n /**\n * ### .notOwnInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the absence of a subset of properties in an\n * object while ignoring inherited properties.\n *\n * Object.prototype.b = 2;\n *\n * assert.notOwnInclude({ a: 1 }, { b: 2 });\n *\n * @name notOwnInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notOwnInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);\n };\n\n /**\n * ### .deepOwnInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the inclusion of a subset of properties in an\n * object while ignoring inherited properties and checking for deep equality.\n *\n * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}});\n *\n * @name deepOwnInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepOwnInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.deepOwnInclude, true)\n .deep.own.include(inc);\n };\n\n /**\n * ### .notDeepOwnInclude(haystack, needle, [message])\n *\n * Asserts that 'haystack' includes 'needle'.\n * Can be used to assert the absence of a subset of properties in an\n * object while ignoring inherited properties and checking for deep equality.\n *\n * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}});\n *\n * @name notDeepOwnInclude\n * @param {Object} haystack\n * @param {Object} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepOwnInclude = function(exp, inc, msg) {\n new Assertion(exp, msg, assert.notDeepOwnInclude, true)\n .not.deep.own.include(inc);\n };\n\n /**\n * ### .match(value, regexp, [message])\n *\n * Asserts that `value` matches the regular expression `regexp`.\n *\n * assert.match('foobar', /^foo/, 'regexp matches');\n *\n * @name match\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.match = function (exp, re, msg) {\n new Assertion(exp, msg, assert.match, true).to.match(re);\n };\n\n /**\n * ### .notMatch(value, regexp, [message])\n *\n * Asserts that `value` does not match the regular expression `regexp`.\n *\n * assert.notMatch('foobar', /^foo/, 'regexp does not match');\n *\n * @name notMatch\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notMatch = function (exp, re, msg) {\n new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);\n };\n\n /**\n * ### .property(object, property, [message])\n *\n * Asserts that `object` has a direct or inherited property named by\n * `property`.\n *\n * assert.property({ tea: { green: 'matcha' }}, 'tea');\n * assert.property({ tea: { green: 'matcha' }}, 'toString');\n *\n * @name property\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.property = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.property, true).to.have.property(prop);\n };\n\n /**\n * ### .notProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a direct or inherited property named\n * by `property`.\n *\n * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');\n *\n * @name notProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notProperty = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.notProperty, true)\n .to.not.have.property(prop);\n };\n\n /**\n * ### .propertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a direct or inherited property named by\n * `property` with a value given by `value`. Uses a strict equality check\n * (===).\n *\n * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');\n *\n * @name propertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.propertyVal, true)\n .to.have.property(prop, val);\n };\n\n /**\n * ### .notPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a direct or inherited property named\n * by `property` with value given by `value`. Uses a strict equality check\n * (===).\n *\n * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad');\n * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good');\n *\n * @name notPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.notPropertyVal, true)\n .to.not.have.property(prop, val);\n };\n\n /**\n * ### .deepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a direct or inherited property named by\n * `property` with a value given by `value`. Uses a deep equality check.\n *\n * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' });\n *\n * @name deepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.deepPropertyVal, true)\n .to.have.deep.property(prop, val);\n };\n\n /**\n * ### .notDeepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a direct or inherited property named\n * by `property` with value given by `value`. Uses a deep equality check.\n *\n * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' });\n * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' });\n * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' });\n *\n * @name notDeepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.notDeepPropertyVal, true)\n .to.not.have.deep.property(prop, val);\n };\n\n /**\n * ### .ownProperty(object, property, [message])\n *\n * Asserts that `object` has a direct property named by `property`. Inherited\n * properties aren't checked.\n *\n * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea');\n *\n * @name ownProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @api public\n */\n\n assert.ownProperty = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.ownProperty, true)\n .to.have.own.property(prop);\n };\n\n /**\n * ### .notOwnProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a direct property named by\n * `property`. Inherited properties aren't checked.\n *\n * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee');\n * assert.notOwnProperty({}, 'toString');\n *\n * @name notOwnProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @api public\n */\n\n assert.notOwnProperty = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.notOwnProperty, true)\n .to.not.have.own.property(prop);\n };\n\n /**\n * ### .ownPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a direct property named by `property` and a value\n * equal to the provided `value`. Uses a strict equality check (===).\n * Inherited properties aren't checked.\n *\n * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good');\n *\n * @name ownPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @api public\n */\n\n assert.ownPropertyVal = function (obj, prop, value, msg) {\n new Assertion(obj, msg, assert.ownPropertyVal, true)\n .to.have.own.property(prop, value);\n };\n\n /**\n * ### .notOwnPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a direct property named by `property`\n * with a value equal to the provided `value`. Uses a strict equality check\n * (===). Inherited properties aren't checked.\n *\n * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse');\n * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString);\n *\n * @name notOwnPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @api public\n */\n\n assert.notOwnPropertyVal = function (obj, prop, value, msg) {\n new Assertion(obj, msg, assert.notOwnPropertyVal, true)\n .to.not.have.own.property(prop, value);\n };\n\n /**\n * ### .deepOwnPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a direct property named by `property` and a value\n * equal to the provided `value`. Uses a deep equality check. Inherited\n * properties aren't checked.\n *\n * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' });\n *\n * @name deepOwnPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @api public\n */\n\n assert.deepOwnPropertyVal = function (obj, prop, value, msg) {\n new Assertion(obj, msg, assert.deepOwnPropertyVal, true)\n .to.have.deep.own.property(prop, value);\n };\n\n /**\n * ### .notDeepOwnPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a direct property named by `property`\n * with a value equal to the provided `value`. Uses a deep equality check.\n * Inherited properties aren't checked.\n *\n * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' });\n * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' });\n * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' });\n * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString);\n *\n * @name notDeepOwnPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @api public\n */\n\n assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) {\n new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true)\n .to.not.have.deep.own.property(prop, value);\n };\n\n /**\n * ### .nestedProperty(object, property, [message])\n *\n * Asserts that `object` has a direct or inherited property named by\n * `property`, which can be a string using dot- and bracket-notation for\n * nested reference.\n *\n * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green');\n *\n * @name nestedProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.nestedProperty = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.nestedProperty, true)\n .to.have.nested.property(prop);\n };\n\n /**\n * ### .notNestedProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`, which\n * can be a string using dot- and bracket-notation for nested reference. The\n * property cannot exist on the object nor anywhere in its prototype chain.\n *\n * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong');\n *\n * @name notNestedProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notNestedProperty = function (obj, prop, msg) {\n new Assertion(obj, msg, assert.notNestedProperty, true)\n .to.not.have.nested.property(prop);\n };\n\n /**\n * ### .nestedPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`. `property` can use dot- and bracket-notation for nested\n * reference. Uses a strict equality check (===).\n *\n * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');\n *\n * @name nestedPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.nestedPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.nestedPropertyVal, true)\n .to.have.nested.property(prop, val);\n };\n\n /**\n * ### .notNestedPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property` with\n * value given by `value`. `property` can use dot- and bracket-notation for\n * nested reference. Uses a strict equality check (===).\n *\n * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');\n * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha');\n *\n * @name notNestedPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notNestedPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.notNestedPropertyVal, true)\n .to.not.have.nested.property(prop, val);\n };\n\n /**\n * ### .deepNestedPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with a value given\n * by `value`. `property` can use dot- and bracket-notation for nested\n * reference. Uses a deep equality check.\n *\n * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' });\n *\n * @name deepNestedPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepNestedPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.deepNestedPropertyVal, true)\n .to.have.deep.nested.property(prop, val);\n };\n\n /**\n * ### .notDeepNestedPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property` with\n * value given by `value`. `property` can use dot- and bracket-notation for\n * nested reference. Uses a deep equality check.\n *\n * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' });\n * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' });\n * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' });\n *\n * @name notDeepNestedPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true)\n .to.not.have.deep.nested.property(prop, val);\n }\n\n /**\n * ### .lengthOf(object, length, [message])\n *\n * Asserts that `object` has a `length` or `size` with the expected value.\n *\n * assert.lengthOf([1,2,3], 3, 'array has length of 3');\n * assert.lengthOf('foobar', 6, 'string has length of 6');\n * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3');\n * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3');\n *\n * @name lengthOf\n * @param {Mixed} object\n * @param {Number} length\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.lengthOf = function (exp, len, msg) {\n new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);\n };\n\n /**\n * ### .hasAnyKeys(object, [keys], [message])\n *\n * Asserts that `object` has at least one of the `keys` provided.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']);\n * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337});\n * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);\n * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']);\n *\n * @name hasAnyKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.hasAnyKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);\n }\n\n /**\n * ### .hasAllKeys(object, [keys], [message])\n *\n * Asserts that `object` has all and only all of the `keys` provided.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']);\n * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]);\n * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);\n * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']);\n *\n * @name hasAllKeys\n * @param {Mixed} object\n * @param {String[]} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.hasAllKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);\n }\n\n /**\n * ### .containsAllKeys(object, [keys], [message])\n *\n * Asserts that `object` has all of the `keys` provided but may have more keys not listed.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']);\n * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']);\n * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337});\n * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337});\n * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]);\n * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);\n * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]);\n * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']);\n *\n * @name containsAllKeys\n * @param {Mixed} object\n * @param {String[]} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.containsAllKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.containsAllKeys, true)\n .to.contain.all.keys(keys);\n }\n\n /**\n * ### .doesNotHaveAnyKeys(object, [keys], [message])\n *\n * Asserts that `object` has none of the `keys` provided.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']);\n * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'});\n * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']);\n * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']);\n *\n * @name doesNotHaveAnyKeys\n * @param {Mixed} object\n * @param {String[]} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotHaveAnyKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true)\n .to.not.have.any.keys(keys);\n }\n\n /**\n * ### .doesNotHaveAllKeys(object, [keys], [message])\n *\n * Asserts that `object` does not have at least one of the `keys` provided.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']);\n * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'});\n * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']);\n * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']);\n *\n * @name doesNotHaveAllKeys\n * @param {Mixed} object\n * @param {String[]} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotHaveAllKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.doesNotHaveAllKeys, true)\n .to.not.have.all.keys(keys);\n }\n\n /**\n * ### .hasAnyDeepKeys(object, [keys], [message])\n *\n * Asserts that `object` has at least one of the `keys` provided.\n * Since Sets and Maps can have objects as keys you can use this assertion to perform\n * a deep comparison.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'});\n * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]);\n * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);\n * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'});\n * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]);\n * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);\n *\n * @name hasAnyDeepKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.hasAnyDeepKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.hasAnyDeepKeys, true)\n .to.have.any.deep.keys(keys);\n }\n\n /**\n * ### .hasAllDeepKeys(object, [keys], [message])\n *\n * Asserts that `object` has all and only all of the `keys` provided.\n * Since Sets and Maps can have objects as keys you can use this assertion to perform\n * a deep comparison.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'});\n * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);\n * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'});\n * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);\n *\n * @name hasAllDeepKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.hasAllDeepKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.hasAllDeepKeys, true)\n .to.have.all.deep.keys(keys);\n }\n\n /**\n * ### .containsAllDeepKeys(object, [keys], [message])\n *\n * Asserts that `object` contains all of the `keys` provided.\n * Since Sets and Maps can have objects as keys you can use this assertion to perform\n * a deep comparison.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'});\n * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);\n * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'});\n * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);\n *\n * @name containsAllDeepKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.containsAllDeepKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.containsAllDeepKeys, true)\n .to.contain.all.deep.keys(keys);\n }\n\n /**\n * ### .doesNotHaveAnyDeepKeys(object, [keys], [message])\n *\n * Asserts that `object` has none of the `keys` provided.\n * Since Sets and Maps can have objects as keys you can use this assertion to perform\n * a deep comparison.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'});\n * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]);\n * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'});\n * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]);\n *\n * @name doesNotHaveAnyDeepKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true)\n .to.not.have.any.deep.keys(keys);\n }\n\n /**\n * ### .doesNotHaveAllDeepKeys(object, [keys], [message])\n *\n * Asserts that `object` does not have at least one of the `keys` provided.\n * Since Sets and Maps can have objects as keys you can use this assertion to perform\n * a deep comparison.\n * You can also provide a single object instead of a `keys` array and its keys\n * will be used as the expected set of keys.\n *\n * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'});\n * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]);\n * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'});\n * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]);\n *\n * @name doesNotHaveAllDeepKeys\n * @param {Mixed} object\n * @param {Array|Object} keys\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) {\n new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true)\n .to.not.have.all.deep.keys(keys);\n }\n\n /**\n * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message])\n *\n * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an\n * instance of `errorLike`.\n * If `errorLike` is an `Error` instance, asserts that the error thrown is the same\n * instance as `errorLike`.\n * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a\n * message matching `errMsgMatcher`.\n *\n * assert.throws(fn, 'Error thrown must have this msg');\n * assert.throws(fn, /Error thrown must have a msg that matches this/);\n * assert.throws(fn, ReferenceError);\n * assert.throws(fn, errorInstance);\n * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg');\n * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg');\n * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/);\n * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/);\n *\n * @name throws\n * @alias throw\n * @alias Throw\n * @param {Function} fn\n * @param {ErrorConstructor|Error} errorLike\n * @param {RegExp|String} errMsgMatcher\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.throws = function (fn, errorLike, errMsgMatcher, msg) {\n if ('string' === typeof errorLike || errorLike instanceof RegExp) {\n errMsgMatcher = errorLike;\n errorLike = null;\n }\n\n var assertErr = new Assertion(fn, msg, assert.throws, true)\n .to.throw(errorLike, errMsgMatcher);\n return flag(assertErr, 'object');\n };\n\n /**\n * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message])\n *\n * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an\n * instance of `errorLike`.\n * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same\n * instance as `errorLike`.\n * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a\n * message matching `errMsgMatcher`.\n *\n * assert.doesNotThrow(fn, 'Any Error thrown must not have this message');\n * assert.doesNotThrow(fn, /Any Error thrown must not match this/);\n * assert.doesNotThrow(fn, Error);\n * assert.doesNotThrow(fn, errorInstance);\n * assert.doesNotThrow(fn, Error, 'Error must not have this message');\n * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message');\n * assert.doesNotThrow(fn, Error, /Error must not match this/);\n * assert.doesNotThrow(fn, errorInstance, /Error must not match this/);\n *\n * @name doesNotThrow\n * @param {Function} fn\n * @param {ErrorConstructor} errorLike\n * @param {RegExp|String} errMsgMatcher\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) {\n if ('string' === typeof errorLike || errorLike instanceof RegExp) {\n errMsgMatcher = errorLike;\n errorLike = null;\n }\n\n new Assertion(fn, msg, assert.doesNotThrow, true)\n .to.not.throw(errorLike, errMsgMatcher);\n };\n\n /**\n * ### .operator(val1, operator, val2, [message])\n *\n * Compares two values using `operator`.\n *\n * assert.operator(1, '<', 2, 'everything is ok');\n * assert.operator(1, '>', 2, 'this will fail');\n *\n * @name operator\n * @param {Mixed} val1\n * @param {String} operator\n * @param {Mixed} val2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.operator = function (val, operator, val2, msg) {\n var ok;\n switch(operator) {\n case '==':\n ok = val == val2;\n break;\n case '===':\n ok = val === val2;\n break;\n case '>':\n ok = val > val2;\n break;\n case '>=':\n ok = val >= val2;\n break;\n case '<':\n ok = val < val2;\n break;\n case '<=':\n ok = val <= val2;\n break;\n case '!=':\n ok = val != val2;\n break;\n case '!==':\n ok = val !== val2;\n break;\n default:\n msg = msg ? msg + ': ' : msg;\n throw new chai.AssertionError(\n msg + 'Invalid operator \"' + operator + '\"',\n undefined,\n assert.operator\n );\n }\n var test = new Assertion(ok, msg, assert.operator, true);\n test.assert(\n true === flag(test, 'object')\n , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)\n , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );\n };\n\n /**\n * ### .closeTo(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.closeTo(1.5, 1, 0.5, 'numbers are close');\n *\n * @name closeTo\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.closeTo = function (act, exp, delta, msg) {\n new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);\n };\n\n /**\n * ### .approximately(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.approximately(1.5, 1, 0.5, 'numbers are close');\n *\n * @name approximately\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.approximately = function (act, exp, delta, msg) {\n new Assertion(act, msg, assert.approximately, true)\n .to.be.approximately(exp, delta);\n };\n\n /**\n * ### .sameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members in any order. Uses a\n * strict equality check (===).\n *\n * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');\n *\n * @name sameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.sameMembers, true)\n .to.have.same.members(set2);\n }\n\n /**\n * ### .notSameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` don't have the same members in any order.\n * Uses a strict equality check (===).\n *\n * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members');\n *\n * @name notSameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notSameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.notSameMembers, true)\n .to.not.have.same.members(set2);\n }\n\n /**\n * ### .sameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members in any order. Uses a\n * deep equality check.\n *\n * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members');\n *\n * @name sameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.sameDeepMembers, true)\n .to.have.same.deep.members(set2);\n }\n\n /**\n * ### .notSameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` don't have the same members in any order.\n * Uses a deep equality check.\n *\n * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members');\n *\n * @name notSameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notSameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.notSameDeepMembers, true)\n .to.not.have.same.deep.members(set2);\n }\n\n /**\n * ### .sameOrderedMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members in the same order.\n * Uses a strict equality check (===).\n *\n * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members');\n *\n * @name sameOrderedMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameOrderedMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.sameOrderedMembers, true)\n .to.have.same.ordered.members(set2);\n }\n\n /**\n * ### .notSameOrderedMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` don't have the same members in the same\n * order. Uses a strict equality check (===).\n *\n * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members');\n *\n * @name notSameOrderedMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notSameOrderedMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.notSameOrderedMembers, true)\n .to.not.have.same.ordered.members(set2);\n }\n\n /**\n * ### .sameDeepOrderedMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members in the same order.\n * Uses a deep equality check.\n *\n * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members');\n *\n * @name sameDeepOrderedMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepOrderedMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.sameDeepOrderedMembers, true)\n .to.have.same.deep.ordered.members(set2);\n }\n\n /**\n * ### .notSameDeepOrderedMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` don't have the same members in the same\n * order. Uses a deep equality check.\n *\n * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members');\n * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members');\n *\n * @name notSameDeepOrderedMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notSameDeepOrderedMembers = function (set1, set2, msg) {\n new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true)\n .to.not.have.same.deep.ordered.members(set2);\n }\n\n /**\n * ### .includeMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` in any order. Uses a\n * strict equality check (===). Duplicates are ignored.\n *\n * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members');\n *\n * @name includeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.includeMembers, true)\n .to.include.members(subset);\n }\n\n /**\n * ### .notIncludeMembers(superset, subset, [message])\n *\n * Asserts that `subset` isn't included in `superset` in any order. Uses a\n * strict equality check (===). Duplicates are ignored.\n *\n * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members');\n *\n * @name notIncludeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notIncludeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.notIncludeMembers, true)\n .to.not.include.members(subset);\n }\n\n /**\n * ### .includeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` in any order. Uses a deep\n * equality check. Duplicates are ignored.\n *\n * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members');\n *\n * @name includeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.includeDeepMembers, true)\n .to.include.deep.members(subset);\n }\n\n /**\n * ### .notIncludeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` isn't included in `superset` in any order. Uses a\n * deep equality check. Duplicates are ignored.\n *\n * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members');\n *\n * @name notIncludeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notIncludeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.notIncludeDeepMembers, true)\n .to.not.include.deep.members(subset);\n }\n\n /**\n * ### .includeOrderedMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` in the same order\n * beginning with the first element in `superset`. Uses a strict equality\n * check (===).\n *\n * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members');\n *\n * @name includeOrderedMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeOrderedMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.includeOrderedMembers, true)\n .to.include.ordered.members(subset);\n }\n\n /**\n * ### .notIncludeOrderedMembers(superset, subset, [message])\n *\n * Asserts that `subset` isn't included in `superset` in the same order\n * beginning with the first element in `superset`. Uses a strict equality\n * check (===).\n *\n * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members');\n * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members');\n *\n * @name notIncludeOrderedMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notIncludeOrderedMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.notIncludeOrderedMembers, true)\n .to.not.include.ordered.members(subset);\n }\n\n /**\n * ### .includeDeepOrderedMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` in the same order\n * beginning with the first element in `superset`. Uses a deep equality\n * check.\n *\n * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members');\n *\n * @name includeDeepOrderedMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepOrderedMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.includeDeepOrderedMembers, true)\n .to.include.deep.ordered.members(subset);\n }\n\n /**\n * ### .notIncludeDeepOrderedMembers(superset, subset, [message])\n *\n * Asserts that `subset` isn't included in `superset` in the same order\n * beginning with the first element in `superset`. Uses a deep equality\n * check.\n *\n * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members');\n * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members');\n * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members');\n *\n * @name notIncludeDeepOrderedMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) {\n new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true)\n .to.not.include.deep.ordered.members(subset);\n }\n\n /**\n * ### .oneOf(inList, list, [message])\n *\n * Asserts that non-object, non-array value `inList` appears in the flat array `list`.\n *\n * assert.oneOf(1, [ 2, 1 ], 'Not found in list');\n *\n * @name oneOf\n * @param {*} inList\n * @param {Array<*>} list\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.oneOf = function (inList, list, msg) {\n new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);\n }\n\n /**\n * ### .changes(function, object, property, [message])\n *\n * Asserts that a function changes the value of a property.\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 22 };\n * assert.changes(fn, obj, 'val');\n *\n * @name changes\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changes = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);\n }\n\n /**\n * ### .changesBy(function, object, property, delta, [message])\n *\n * Asserts that a function changes the value of a property by an amount (delta).\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 2 };\n * assert.changesBy(fn, obj, 'val', 2);\n *\n * @name changesBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changesBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.changesBy, true)\n .to.change(obj, prop).by(delta);\n }\n\n /**\n * ### .doesNotChange(function, object, property, [message])\n *\n * Asserts that a function does not change the value of a property.\n *\n * var obj = { val: 10 };\n * var fn = function() { console.log('foo'); };\n * assert.doesNotChange(fn, obj, 'val');\n *\n * @name doesNotChange\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotChange = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.doesNotChange, true)\n .to.not.change(obj, prop);\n }\n\n /**\n * ### .changesButNotBy(function, object, property, delta, [message])\n *\n * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta)\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 10 };\n * assert.changesButNotBy(fn, obj, 'val', 5);\n *\n * @name changesButNotBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changesButNotBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.changesButNotBy, true)\n .to.change(obj, prop).but.not.by(delta);\n }\n\n /**\n * ### .increases(function, object, property, [message])\n *\n * Asserts that a function increases a numeric object property.\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 13 };\n * assert.increases(fn, obj, 'val');\n *\n * @name increases\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increases = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.increases, true)\n .to.increase(obj, prop);\n }\n\n /**\n * ### .increasesBy(function, object, property, delta, [message])\n *\n * Asserts that a function increases a numeric object property or a function's return value by an amount (delta).\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 10 };\n * assert.increasesBy(fn, obj, 'val', 10);\n *\n * @name increasesBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increasesBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.increasesBy, true)\n .to.increase(obj, prop).by(delta);\n }\n\n /**\n * ### .doesNotIncrease(function, object, property, [message])\n *\n * Asserts that a function does not increase a numeric object property.\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 8 };\n * assert.doesNotIncrease(fn, obj, 'val');\n *\n * @name doesNotIncrease\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotIncrease = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.doesNotIncrease, true)\n .to.not.increase(obj, prop);\n }\n\n /**\n * ### .increasesButNotBy(function, object, property, delta, [message])\n *\n * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta).\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.increasesButNotBy(fn, obj, 'val', 10);\n *\n * @name increasesButNotBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increasesButNotBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.increasesButNotBy, true)\n .to.increase(obj, prop).but.not.by(delta);\n }\n\n /**\n * ### .decreases(function, object, property, [message])\n *\n * Asserts that a function decreases a numeric object property.\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreases(fn, obj, 'val');\n *\n * @name decreases\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreases = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.decreases, true)\n .to.decrease(obj, prop);\n }\n\n /**\n * ### .decreasesBy(function, object, property, delta, [message])\n *\n * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta)\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val -= 5 };\n * assert.decreasesBy(fn, obj, 'val', 5);\n *\n * @name decreasesBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreasesBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.decreasesBy, true)\n .to.decrease(obj, prop).by(delta);\n }\n\n /**\n * ### .doesNotDecrease(function, object, property, [message])\n *\n * Asserts that a function does not decreases a numeric object property.\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.doesNotDecrease(fn, obj, 'val');\n *\n * @name doesNotDecrease\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecrease = function (fn, obj, prop, msg) {\n if (arguments.length === 3 && typeof obj === 'function') {\n msg = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.doesNotDecrease, true)\n .to.not.decrease(obj, prop);\n }\n\n /**\n * ### .doesNotDecreaseBy(function, object, property, delta, [message])\n *\n * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta)\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.doesNotDecreaseBy(fn, obj, 'val', 1);\n *\n * @name doesNotDecreaseBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n return new Assertion(fn, msg, assert.doesNotDecreaseBy, true)\n .to.not.decrease(obj, prop).by(delta);\n }\n\n /**\n * ### .decreasesButNotBy(function, object, property, delta, [message])\n *\n * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta)\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreasesButNotBy(fn, obj, 'val', 1);\n *\n * @name decreasesButNotBy\n * @param {Function} modifier function\n * @param {Object} object or getter function\n * @param {String} property name _optional_\n * @param {Number} change amount (delta)\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) {\n if (arguments.length === 4 && typeof obj === 'function') {\n var tmpMsg = delta;\n delta = prop;\n msg = tmpMsg;\n } else if (arguments.length === 3) {\n delta = prop;\n prop = null;\n }\n\n new Assertion(fn, msg, assert.decreasesButNotBy, true)\n .to.decrease(obj, prop).but.not.by(delta);\n }\n\n /*!\n * ### .ifError(object)\n *\n * Asserts if value is not a false value, and throws if it is a true value.\n * This is added to allow for chai to be a drop-in replacement for Node's\n * assert class.\n *\n * var err = new Error('I am a custom error');\n * assert.ifError(err); // Rethrows err!\n *\n * @name ifError\n * @param {Object} object\n * @namespace Assert\n * @api public\n */\n\n assert.ifError = function (val) {\n if (val) {\n throw(val);\n }\n };\n\n /**\n * ### .isExtensible(object)\n *\n * Asserts that `object` is extensible (can have new properties added to it).\n *\n * assert.isExtensible({});\n *\n * @name isExtensible\n * @alias extensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isExtensible = function (obj, msg) {\n new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;\n };\n\n /**\n * ### .isNotExtensible(object)\n *\n * Asserts that `object` is _not_ extensible.\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * assert.isNotExtensible(nonExtensibleObject);\n * assert.isNotExtensible(sealedObject);\n * assert.isNotExtensible(frozenObject);\n *\n * @name isNotExtensible\n * @alias notExtensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotExtensible = function (obj, msg) {\n new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;\n };\n\n /**\n * ### .isSealed(object)\n *\n * Asserts that `object` is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.seal({});\n *\n * assert.isSealed(sealedObject);\n * assert.isSealed(frozenObject);\n *\n * @name isSealed\n * @alias sealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isSealed = function (obj, msg) {\n new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;\n };\n\n /**\n * ### .isNotSealed(object)\n *\n * Asserts that `object` is _not_ sealed.\n *\n * assert.isNotSealed({});\n *\n * @name isNotSealed\n * @alias notSealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotSealed = function (obj, msg) {\n new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;\n };\n\n /**\n * ### .isFrozen(object)\n *\n * Asserts that `object` is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n * assert.frozen(frozenObject);\n *\n * @name isFrozen\n * @alias frozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isFrozen = function (obj, msg) {\n new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;\n };\n\n /**\n * ### .isNotFrozen(object)\n *\n * Asserts that `object` is _not_ frozen.\n *\n * assert.isNotFrozen({});\n *\n * @name isNotFrozen\n * @alias notFrozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFrozen = function (obj, msg) {\n new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;\n };\n\n /**\n * ### .isEmpty(target)\n *\n * Asserts that the target does not contain any values.\n * For arrays and strings, it checks the `length` property.\n * For `Map` and `Set` instances, it checks the `size` property.\n * For non-function objects, it gets the count of own\n * enumerable string keys.\n *\n * assert.isEmpty([]);\n * assert.isEmpty('');\n * assert.isEmpty(new Map);\n * assert.isEmpty({});\n *\n * @name isEmpty\n * @alias empty\n * @param {Object|Array|String|Map|Set} target\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isEmpty = function(val, msg) {\n new Assertion(val, msg, assert.isEmpty, true).to.be.empty;\n };\n\n /**\n * ### .isNotEmpty(target)\n *\n * Asserts that the target contains values.\n * For arrays and strings, it checks the `length` property.\n * For `Map` and `Set` instances, it checks the `size` property.\n * For non-function objects, it gets the count of own\n * enumerable string keys.\n *\n * assert.isNotEmpty([1, 2]);\n * assert.isNotEmpty('34');\n * assert.isNotEmpty(new Set([5, 6]));\n * assert.isNotEmpty({ key: 7 });\n *\n * @name isNotEmpty\n * @alias notEmpty\n * @param {Object|Array|String|Map|Set} target\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotEmpty = function(val, msg) {\n new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;\n };\n\n /*!\n * Aliases.\n */\n\n (function alias(name, as){\n assert[as] = assert[name];\n return alias;\n })\n ('isOk', 'ok')\n ('isNotOk', 'notOk')\n ('throws', 'throw')\n ('throws', 'Throw')\n ('isExtensible', 'extensible')\n ('isNotExtensible', 'notExtensible')\n ('isSealed', 'sealed')\n ('isNotSealed', 'notSealed')\n ('isFrozen', 'frozen')\n ('isNotFrozen', 'notFrozen')\n ('isEmpty', 'empty')\n ('isNotEmpty', 'notEmpty');\n};\n\n},{}],248:[function(require,module,exports){\n/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n chai.expect = function (val, message) {\n return new chai.Assertion(val, message);\n };\n\n /**\n * ### .fail([message])\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * expect.fail();\n * expect.fail(\"custom error message\");\n * expect.fail(1, 2);\n * expect.fail(1, 2, \"custom error message\");\n * expect.fail(1, 2, \"custom error message\", \">\");\n * expect.fail(1, 2, undefined, \">\");\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace BDD\n * @api public\n */\n\n chai.expect.fail = function (actual, expected, message, operator) {\n if (arguments.length < 2) {\n message = actual;\n actual = undefined;\n }\n\n message = message || 'expect.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, chai.expect.fail);\n };\n};\n\n},{}],249:[function(require,module,exports){\n/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n var Assertion = chai.Assertion;\n\n function loadShould () {\n // explicitly define this method as function as to have it's name to include as `ssfi`\n function shouldGetter() {\n if (this instanceof String\n || this instanceof Number\n || this instanceof Boolean\n || typeof Symbol === 'function' && this instanceof Symbol\n || typeof BigInt === 'function' && this instanceof BigInt) {\n return new Assertion(this.valueOf(), null, shouldGetter);\n }\n return new Assertion(this, null, shouldGetter);\n }\n function shouldSetter(value) {\n // See https://github.com/chaijs/chai/issues/86: this makes\n // `whatever.should = someValue` actually set `someValue`, which is\n // especially useful for `global.should = require('chai').should()`.\n //\n // Note that we have to use [[DefineProperty]] instead of [[Put]]\n // since otherwise we would trigger this very setter!\n Object.defineProperty(this, 'should', {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n // modify Object.prototype to have `should`\n Object.defineProperty(Object.prototype, 'should', {\n set: shouldSetter\n , get: shouldGetter\n , configurable: true\n });\n\n var should = {};\n\n /**\n * ### .fail([message])\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * should.fail();\n * should.fail(\"custom error message\");\n * should.fail(1, 2);\n * should.fail(1, 2, \"custom error message\");\n * should.fail(1, 2, \"custom error message\", \">\");\n * should.fail(1, 2, undefined, \">\");\n *\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace BDD\n * @api public\n */\n\n should.fail = function (actual, expected, message, operator) {\n if (arguments.length < 2) {\n message = actual;\n actual = undefined;\n }\n\n message = message || 'should.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, should.fail);\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * should.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * should.throw(fn, 'function throws a reference error');\n * should.throw(fn, /function throws a reference error/);\n * should.throw(fn, ReferenceError);\n * should.throw(fn, ReferenceError, 'function throws a reference error');\n * should.throw(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.Throw(errt, errs);\n };\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * should.exist(foo, 'foo exists');\n *\n * @name exist\n * @namespace Should\n * @api public\n */\n\n should.exist = function (val, msg) {\n new Assertion(val, msg).to.exist;\n }\n\n // negation\n should.not = {}\n\n /**\n * ### .not.equal(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * should.not.equal(3, 4, 'these numbers are not equal');\n *\n * @name not.equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.not.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.not.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * should.not.throw(fn, Error, 'function does not throw');\n *\n * @name not.throw\n * @alias not.Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.not.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.not.Throw(errt, errs);\n };\n\n /**\n * ### .not.exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var bar = null;\n *\n * should.not.exist(bar, 'bar does not exist');\n *\n * @name not.exist\n * @namespace Should\n * @api public\n */\n\n should.not.exist = function (val, msg) {\n new Assertion(val, msg).to.not.exist;\n }\n\n should['throw'] = should['Throw'];\n should.not['throw'] = should.not['Throw'];\n\n return should;\n };\n\n chai.should = loadShould;\n chai.Should = loadShould;\n};\n\n},{}],250:[function(require,module,exports){\n/*!\n * Chai - addChainingMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar addLengthGuard = require('./addLengthGuard');\nvar chai = require('../../chai');\nvar flag = require('./flag');\nvar proxify = require('./proxify');\nvar transferFlags = require('./transferFlags');\n\n/*!\n * Module variables\n */\n\n// Check whether `Object.setPrototypeOf` is supported\nvar canSetPrototype = typeof Object.setPrototypeOf === 'function';\n\n// Without `Object.setPrototypeOf` support, this module will need to add properties to a function.\n// However, some of functions' own props are not configurable and should be skipped.\nvar testFn = function() {};\nvar excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {\n var propDesc = Object.getOwnPropertyDescriptor(testFn, name);\n\n // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties,\n // but then returns `undefined` as the property descriptor for `callee`. As a\n // workaround, we perform an otherwise unnecessary type-check for `propDesc`,\n // and then filter it out if it's not an object as it should be.\n if (typeof propDesc !== 'object')\n return true;\n\n return !propDesc.configurable;\n});\n\n// Cache `Function` properties\nvar call = Function.prototype.call,\n apply = Function.prototype.apply;\n\n/**\n * ### .addChainableMethod(ctx, name, method, chainingBehavior)\n *\n * Adds a method to an object, such that the method can also be chained.\n *\n * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);\n *\n * The result can then be used as both a method assertion, executing both `method` and\n * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.\n *\n * expect(fooStr).to.be.foo('bar');\n * expect(fooStr).to.be.foo.equal('foo');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for `name`, when called\n * @param {Function} chainingBehavior function to be called every time the property is accessed\n * @namespace Utils\n * @name addChainableMethod\n * @api public\n */\n\nmodule.exports = function addChainableMethod(ctx, name, method, chainingBehavior) {\n if (typeof chainingBehavior !== 'function') {\n chainingBehavior = function () { };\n }\n\n var chainableBehavior = {\n method: method\n , chainingBehavior: chainingBehavior\n };\n\n // save the methods so we can overwrite them later, if we need to.\n if (!ctx.__methods) {\n ctx.__methods = {};\n }\n ctx.__methods[name] = chainableBehavior;\n\n Object.defineProperty(ctx, name,\n { get: function chainableMethodGetter() {\n chainableBehavior.chainingBehavior.call(this);\n\n var chainableMethodWrapper = function () {\n // Setting the `ssfi` flag to `chainableMethodWrapper` causes this\n // function to be the starting point for removing implementation\n // frames from the stack trace of a failed assertion.\n //\n // However, we only want to use this function as the starting point if\n // the `lockSsfi` flag isn't set.\n //\n // If the `lockSsfi` flag is set, then this assertion is being\n // invoked from inside of another assertion. In this case, the `ssfi`\n // flag has already been set by the outer assertion.\n //\n // Note that overwriting a chainable method merely replaces the saved\n // methods in `ctx.__methods` instead of completely replacing the\n // overwritten assertion. Therefore, an overwriting assertion won't\n // set the `ssfi` or `lockSsfi` flags.\n if (!flag(this, 'lockSsfi')) {\n flag(this, 'ssfi', chainableMethodWrapper);\n }\n\n var result = chainableBehavior.method.apply(this, arguments);\n if (result !== undefined) {\n return result;\n }\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n };\n\n addLengthGuard(chainableMethodWrapper, name, true);\n\n // Use `Object.setPrototypeOf` if available\n if (canSetPrototype) {\n // Inherit all properties from the object by replacing the `Function` prototype\n var prototype = Object.create(this);\n // Restore the `call` and `apply` methods from `Function`\n prototype.call = call;\n prototype.apply = apply;\n Object.setPrototypeOf(chainableMethodWrapper, prototype);\n }\n // Otherwise, redefine all properties (slow!)\n else {\n var asserterNames = Object.getOwnPropertyNames(ctx);\n asserterNames.forEach(function (asserterName) {\n if (excludeNames.indexOf(asserterName) !== -1) {\n return;\n }\n\n var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);\n Object.defineProperty(chainableMethodWrapper, asserterName, pd);\n });\n }\n\n transferFlags(this, chainableMethodWrapper);\n return proxify(chainableMethodWrapper);\n }\n , configurable: true\n });\n};\n\n},{\"../../chai\":243,\"./addLengthGuard\":251,\"./flag\":256,\"./proxify\":271,\"./transferFlags\":273}],251:[function(require,module,exports){\nvar fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length');\n\n/*!\n * Chai - addLengthGuard utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .addLengthGuard(fn, assertionName, isChainable)\n *\n * Define `length` as a getter on the given uninvoked method assertion. The\n * getter acts as a guard against chaining `length` directly off of an uninvoked\n * method assertion, which is a problem because it references `function`'s\n * built-in `length` property instead of Chai's `length` assertion. When the\n * getter catches the user making this mistake, it throws an error with a\n * helpful message.\n *\n * There are two ways in which this mistake can be made. The first way is by\n * chaining the `length` assertion directly off of an uninvoked chainable\n * method. In this case, Chai suggests that the user use `lengthOf` instead. The\n * second way is by chaining the `length` assertion directly off of an uninvoked\n * non-chainable method. Non-chainable methods must be invoked prior to\n * chaining. In this case, Chai suggests that the user consult the docs for the\n * given assertion.\n *\n * If the `length` property of functions is unconfigurable, then return `fn`\n * without modification.\n *\n * Note that in ES6, the function's `length` property is configurable, so once\n * support for legacy environments is dropped, Chai's `length` property can\n * replace the built-in function's `length` property, and this length guard will\n * no longer be necessary. In the mean time, maintaining consistency across all\n * environments is the priority.\n *\n * @param {Function} fn\n * @param {String} assertionName\n * @param {Boolean} isChainable\n * @namespace Utils\n * @name addLengthGuard\n */\n\nmodule.exports = function addLengthGuard (fn, assertionName, isChainable) {\n if (!fnLengthDesc.configurable) return fn;\n\n Object.defineProperty(fn, 'length', {\n get: function () {\n if (isChainable) {\n throw Error('Invalid Chai property: ' + assertionName + '.length. Due' +\n ' to a compatibility issue, \"length\" cannot directly follow \"' +\n assertionName + '\". Use \"' + assertionName + '.lengthOf\" instead.');\n }\n\n throw Error('Invalid Chai property: ' + assertionName + '.length. See' +\n ' docs for proper usage of \"' + assertionName + '\".');\n }\n });\n\n return fn;\n};\n\n},{}],252:[function(require,module,exports){\n/*!\n * Chai - addMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar addLengthGuard = require('./addLengthGuard');\nvar chai = require('../../chai');\nvar flag = require('./flag');\nvar proxify = require('./proxify');\nvar transferFlags = require('./transferFlags');\n\n/**\n * ### .addMethod(ctx, name, method)\n *\n * Adds a method to the prototype of an object.\n *\n * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(fooStr).to.be.foo('bar');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for name\n * @namespace Utils\n * @name addMethod\n * @api public\n */\n\nmodule.exports = function addMethod(ctx, name, method) {\n var methodWrapper = function () {\n // Setting the `ssfi` flag to `methodWrapper` causes this function to be the\n // starting point for removing implementation frames from the stack trace of\n // a failed assertion.\n //\n // However, we only want to use this function as the starting point if the\n // `lockSsfi` flag isn't set.\n //\n // If the `lockSsfi` flag is set, then either this assertion has been\n // overwritten by another assertion, or this assertion is being invoked from\n // inside of another assertion. In the first case, the `ssfi` flag has\n // already been set by the overwriting assertion. In the second case, the\n // `ssfi` flag has already been set by the outer assertion.\n if (!flag(this, 'lockSsfi')) {\n flag(this, 'ssfi', methodWrapper);\n }\n\n var result = method.apply(this, arguments);\n if (result !== undefined)\n return result;\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n };\n\n addLengthGuard(methodWrapper, name, false);\n ctx[name] = proxify(methodWrapper, name);\n};\n\n},{\"../../chai\":243,\"./addLengthGuard\":251,\"./flag\":256,\"./proxify\":271,\"./transferFlags\":273}],253:[function(require,module,exports){\n/*!\n * Chai - addProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar chai = require('../../chai');\nvar flag = require('./flag');\nvar isProxyEnabled = require('./isProxyEnabled');\nvar transferFlags = require('./transferFlags');\n\n/**\n * ### .addProperty(ctx, name, getter)\n *\n * Adds a property to the prototype of an object.\n *\n * utils.addProperty(chai.Assertion.prototype, 'foo', function () {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.instanceof(Foo);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.foo;\n *\n * @param {Object} ctx object to which the property is added\n * @param {String} name of property to add\n * @param {Function} getter function to be used for name\n * @namespace Utils\n * @name addProperty\n * @api public\n */\n\nmodule.exports = function addProperty(ctx, name, getter) {\n getter = getter === undefined ? function () {} : getter;\n\n Object.defineProperty(ctx, name,\n { get: function propertyGetter() {\n // Setting the `ssfi` flag to `propertyGetter` causes this function to\n // be the starting point for removing implementation frames from the\n // stack trace of a failed assertion.\n //\n // However, we only want to use this function as the starting point if\n // the `lockSsfi` flag isn't set and proxy protection is disabled.\n //\n // If the `lockSsfi` flag is set, then either this assertion has been\n // overwritten by another assertion, or this assertion is being invoked\n // from inside of another assertion. In the first case, the `ssfi` flag\n // has already been set by the overwriting assertion. In the second\n // case, the `ssfi` flag has already been set by the outer assertion.\n //\n // If proxy protection is enabled, then the `ssfi` flag has already been\n // set by the proxy getter.\n if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {\n flag(this, 'ssfi', propertyGetter);\n }\n\n var result = getter.call(this);\n if (result !== undefined)\n return result;\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n }\n , configurable: true\n });\n};\n\n},{\"../../chai\":243,\"./flag\":256,\"./isProxyEnabled\":266,\"./transferFlags\":273}],254:[function(require,module,exports){\n/*!\n * Chai - compareByInspect utility\n * Copyright(c) 2011-2016 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar inspect = require('./inspect');\n\n/**\n * ### .compareByInspect(mixed, mixed)\n *\n * To be used as a compareFunction with Array.prototype.sort. Compares elements\n * using inspect instead of default behavior of using toString so that Symbols\n * and objects with irregular/missing toString can still be sorted without a\n * TypeError.\n *\n * @param {Mixed} first element to compare\n * @param {Mixed} second element to compare\n * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1\n * @name compareByInspect\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function compareByInspect(a, b) {\n return inspect(a) < inspect(b) ? -1 : 1;\n};\n\n},{\"./inspect\":264}],255:[function(require,module,exports){\n/*!\n * Chai - expectTypes utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .expectTypes(obj, types)\n *\n * Ensures that the object being tested against is of a valid type.\n *\n * utils.expectTypes(this, ['array', 'object', 'string']);\n *\n * @param {Mixed} obj constructed Assertion\n * @param {Array} type A list of allowed types for this assertion\n * @namespace Utils\n * @name expectTypes\n * @api public\n */\n\nvar AssertionError = require('assertion-error');\nvar flag = require('./flag');\nvar type = require('type-detect');\n\nmodule.exports = function expectTypes(obj, types) {\n var flagMsg = flag(obj, 'message');\n var ssfi = flag(obj, 'ssfi');\n\n flagMsg = flagMsg ? flagMsg + ': ' : '';\n\n obj = flag(obj, 'object');\n types = types.map(function (t) { return t.toLowerCase(); });\n types.sort();\n\n // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum'\n var str = types.map(function (t, index) {\n var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';\n var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';\n return or + art + ' ' + t;\n }).join(', ');\n\n var objType = type(obj).toLowerCase();\n\n if (!types.some(function (expected) { return objType === expected; })) {\n throw new AssertionError(\n flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given',\n undefined,\n ssfi\n );\n }\n};\n\n},{\"./flag\":256,\"assertion-error\":232,\"type-detect\":275}],256:[function(require,module,exports){\n/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .flag(object, key, [value])\n *\n * Get or set a flag value on an object. If a\n * value is provided it will be set, else it will\n * return the currently set value or `undefined` if\n * the value is not set.\n *\n * utils.flag(this, 'foo', 'bar'); // setter\n * utils.flag(this, 'foo'); // getter, returns `bar`\n *\n * @param {Object} object constructed Assertion\n * @param {String} key\n * @param {Mixed} value (optional)\n * @namespace Utils\n * @name flag\n * @api private\n */\n\nmodule.exports = function flag(obj, key, value) {\n var flags = obj.__flags || (obj.__flags = Object.create(null));\n if (arguments.length === 3) {\n flags[key] = value;\n } else {\n return flags[key];\n }\n};\n\n},{}],257:[function(require,module,exports){\n/*!\n * Chai - getActual utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getActual(object, [actual])\n *\n * Returns the `actual` value for an Assertion.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getActual\n */\n\nmodule.exports = function getActual(obj, args) {\n return args.length > 4 ? args[4] : obj._obj;\n};\n\n},{}],258:[function(require,module,exports){\n/*!\n * Chai - message composition utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar flag = require('./flag')\n , getActual = require('./getActual')\n , objDisplay = require('./objDisplay');\n\n/**\n * ### .getMessage(object, message, negateMessage)\n *\n * Construct the error message based on flags\n * and template tags. Template tags will return\n * a stringified inspection of the object referenced.\n *\n * Message template tags:\n * - `#{this}` current asserted object\n * - `#{act}` actual value\n * - `#{exp}` expected value\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getMessage\n * @api public\n */\n\nmodule.exports = function getMessage(obj, args) {\n var negate = flag(obj, 'negate')\n , val = flag(obj, 'object')\n , expected = args[3]\n , actual = getActual(obj, args)\n , msg = negate ? args[2] : args[1]\n , flagMsg = flag(obj, 'message');\n\n if(typeof msg === \"function\") msg = msg();\n msg = msg || '';\n msg = msg\n .replace(/#\\{this\\}/g, function () { return objDisplay(val); })\n .replace(/#\\{act\\}/g, function () { return objDisplay(actual); })\n .replace(/#\\{exp\\}/g, function () { return objDisplay(expected); });\n\n return flagMsg ? flagMsg + ': ' + msg : msg;\n};\n\n},{\"./flag\":256,\"./getActual\":257,\"./objDisplay\":267}],259:[function(require,module,exports){\nvar type = require('type-detect');\n\nvar flag = require('./flag');\n\nfunction isObjectType(obj) {\n var objectType = type(obj);\n var objectTypes = ['Array', 'Object', 'function'];\n\n return objectTypes.indexOf(objectType) !== -1;\n}\n\n/**\n * ### .getOperator(message)\n *\n * Extract the operator from error message.\n * Operator defined is based on below link\n * https://nodejs.org/api/assert.html#assert_assert.\n *\n * Returns the `operator` or `undefined` value for an Assertion.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getOperator\n * @api public\n */\n\nmodule.exports = function getOperator(obj, args) {\n var operator = flag(obj, 'operator');\n var negate = flag(obj, 'negate');\n var expected = args[3];\n var msg = negate ? args[2] : args[1];\n\n if (operator) {\n return operator;\n }\n\n if (typeof msg === 'function') msg = msg();\n\n msg = msg || '';\n if (!msg) {\n return undefined;\n }\n\n if (/\\shave\\s/.test(msg)) {\n return undefined;\n }\n\n var isObject = isObjectType(expected);\n if (/\\snot\\s/.test(msg)) {\n return isObject ? 'notDeepStrictEqual' : 'notStrictEqual';\n }\n\n return isObject ? 'deepStrictEqual' : 'strictEqual';\n};\n\n},{\"./flag\":256,\"type-detect\":275}],260:[function(require,module,exports){\n/*!\n * Chai - getOwnEnumerableProperties utility\n * Copyright(c) 2011-2016 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols');\n\n/**\n * ### .getOwnEnumerableProperties(object)\n *\n * This allows the retrieval of directly-owned enumerable property names and\n * symbols of an object. This function is necessary because Object.keys only\n * returns enumerable property names, not enumerable property symbols.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getOwnEnumerableProperties\n * @api public\n */\n\nmodule.exports = function getOwnEnumerableProperties(obj) {\n return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));\n};\n\n},{\"./getOwnEnumerablePropertySymbols\":261}],261:[function(require,module,exports){\n/*!\n * Chai - getOwnEnumerablePropertySymbols utility\n * Copyright(c) 2011-2016 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getOwnEnumerablePropertySymbols(object)\n *\n * This allows the retrieval of directly-owned enumerable property symbols of an\n * object. This function is necessary because Object.getOwnPropertySymbols\n * returns both enumerable and non-enumerable property symbols.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getOwnEnumerablePropertySymbols\n * @api public\n */\n\nmodule.exports = function getOwnEnumerablePropertySymbols(obj) {\n if (typeof Object.getOwnPropertySymbols !== 'function') return [];\n\n return Object.getOwnPropertySymbols(obj).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(obj, sym).enumerable;\n });\n};\n\n},{}],262:[function(require,module,exports){\n/*!\n * Chai - getProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getProperties(object)\n *\n * This allows the retrieval of property names of an object, enumerable or not,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getProperties\n * @api public\n */\n\nmodule.exports = function getProperties(object) {\n var result = Object.getOwnPropertyNames(object);\n\n function addProperty(property) {\n if (result.indexOf(property) === -1) {\n result.push(property);\n }\n }\n\n var proto = Object.getPrototypeOf(object);\n while (proto !== null) {\n Object.getOwnPropertyNames(proto).forEach(addProperty);\n proto = Object.getPrototypeOf(proto);\n }\n\n return result;\n};\n\n},{}],263:[function(require,module,exports){\n/*!\n * chai\n * Copyright(c) 2011 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Dependencies that are used for multiple exports are required here only once\n */\n\nvar pathval = require('pathval');\n\n/*!\n * test utility\n */\n\nexports.test = require('./test');\n\n/*!\n * type utility\n */\n\nexports.type = require('type-detect');\n\n/*!\n * expectTypes utility\n */\nexports.expectTypes = require('./expectTypes');\n\n/*!\n * message utility\n */\n\nexports.getMessage = require('./getMessage');\n\n/*!\n * actual utility\n */\n\nexports.getActual = require('./getActual');\n\n/*!\n * Inspect util\n */\n\nexports.inspect = require('./inspect');\n\n/*!\n * Object Display util\n */\n\nexports.objDisplay = require('./objDisplay');\n\n/*!\n * Flag utility\n */\n\nexports.flag = require('./flag');\n\n/*!\n * Flag transferring utility\n */\n\nexports.transferFlags = require('./transferFlags');\n\n/*!\n * Deep equal utility\n */\n\nexports.eql = require('deep-eql');\n\n/*!\n * Deep path info\n */\n\nexports.getPathInfo = pathval.getPathInfo;\n\n/*!\n * Check if a property exists\n */\n\nexports.hasProperty = pathval.hasProperty;\n\n/*!\n * Function name\n */\n\nexports.getName = require('get-func-name');\n\n/*!\n * add Property\n */\n\nexports.addProperty = require('./addProperty');\n\n/*!\n * add Method\n */\n\nexports.addMethod = require('./addMethod');\n\n/*!\n * overwrite Property\n */\n\nexports.overwriteProperty = require('./overwriteProperty');\n\n/*!\n * overwrite Method\n */\n\nexports.overwriteMethod = require('./overwriteMethod');\n\n/*!\n * Add a chainable method\n */\n\nexports.addChainableMethod = require('./addChainableMethod');\n\n/*!\n * Overwrite chainable method\n */\n\nexports.overwriteChainableMethod = require('./overwriteChainableMethod');\n\n/*!\n * Compare by inspect method\n */\n\nexports.compareByInspect = require('./compareByInspect');\n\n/*!\n * Get own enumerable property symbols method\n */\n\nexports.getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols');\n\n/*!\n * Get own enumerable properties method\n */\n\nexports.getOwnEnumerableProperties = require('./getOwnEnumerableProperties');\n\n/*!\n * Checks error against a given set of criteria\n */\n\nexports.checkError = require('check-error');\n\n/*!\n * Proxify util\n */\n\nexports.proxify = require('./proxify');\n\n/*!\n * addLengthGuard util\n */\n\nexports.addLengthGuard = require('./addLengthGuard');\n\n/*!\n * isProxyEnabled helper\n */\n\nexports.isProxyEnabled = require('./isProxyEnabled');\n\n/*!\n * isNaN method\n */\n\nexports.isNaN = require('./isNaN');\n\n/*!\n * getOperator method\n */\n\nexports.getOperator = require('./getOperator');\n},{\"./addChainableMethod\":250,\"./addLengthGuard\":251,\"./addMethod\":252,\"./addProperty\":253,\"./compareByInspect\":254,\"./expectTypes\":255,\"./flag\":256,\"./getActual\":257,\"./getMessage\":258,\"./getOperator\":259,\"./getOwnEnumerableProperties\":260,\"./getOwnEnumerablePropertySymbols\":261,\"./inspect\":264,\"./isNaN\":265,\"./isProxyEnabled\":266,\"./objDisplay\":267,\"./overwriteChainableMethod\":268,\"./overwriteMethod\":269,\"./overwriteProperty\":270,\"./proxify\":271,\"./test\":272,\"./transferFlags\":273,\"check-error\":277,\"deep-eql\":274,\"get-func-name\":360,\"pathval\":421,\"type-detect\":275}],264:[function(require,module,exports){\n// This is (almost) directly from Node.js utils\n// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js\n\nvar getName = require('get-func-name');\nvar loupe = require('loupe');\nvar config = require('../config');\n\nmodule.exports = inspect;\n\n/**\n * ### .inspect(obj, [showHidden], [depth], [colors])\n *\n * Echoes the value of a value. Tries to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Boolean} showHidden Flag that shows hidden (not enumerable)\n * properties of objects. Default is false.\n * @param {Number} depth Depth in which to descend in object. Default is 2.\n * @param {Boolean} colors Flag to turn on ANSI escape codes to color the\n * output. Default is false (no coloring).\n * @namespace Utils\n * @name inspect\n */\nfunction inspect(obj, showHidden, depth, colors) {\n var options = {\n colors: colors,\n depth: (typeof depth === 'undefined' ? 2 : depth),\n showHidden: showHidden,\n truncate: config.truncateThreshold ? config.truncateThreshold : Infinity,\n };\n return loupe.inspect(obj, options);\n}\n\n},{\"../config\":245,\"get-func-name\":360,\"loupe\":405}],265:[function(require,module,exports){\n/*!\n * Chai - isNaN utility\n * Copyright(c) 2012-2015 Sakthipriyan Vairamani \n * MIT Licensed\n */\n\n/**\n * ### .isNaN(value)\n *\n * Checks if the given value is NaN or not.\n *\n * utils.isNaN(NaN); // true\n *\n * @param {Value} The value which has to be checked if it is NaN\n * @name isNaN\n * @api private\n */\n\nfunction isNaN(value) {\n // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number\n // section's NOTE.\n return value !== value;\n}\n\n// If ECMAScript 6's Number.isNaN is present, prefer that.\nmodule.exports = Number.isNaN || isNaN;\n\n},{}],266:[function(require,module,exports){\nvar config = require('../config');\n\n/*!\n * Chai - isProxyEnabled helper\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .isProxyEnabled()\n *\n * Helper function to check if Chai's proxy protection feature is enabled. If\n * proxies are unsupported or disabled via the user's Chai config, then return\n * false. Otherwise, return true.\n *\n * @namespace Utils\n * @name isProxyEnabled\n */\n\nmodule.exports = function isProxyEnabled() {\n return config.useProxy &&\n typeof Proxy !== 'undefined' &&\n typeof Reflect !== 'undefined';\n};\n\n},{\"../config\":245}],267:[function(require,module,exports){\n/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar inspect = require('./inspect');\nvar config = require('../config');\n\n/**\n * ### .objDisplay(object)\n *\n * Determines if an object or an array matches\n * criteria to be inspected in-line for error\n * messages or should be truncated.\n *\n * @param {Mixed} javascript object to inspect\n * @name objDisplay\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function objDisplay(obj) {\n var str = inspect(obj)\n , type = Object.prototype.toString.call(obj);\n\n if (config.truncateThreshold && str.length >= config.truncateThreshold) {\n if (type === '[object Function]') {\n return !obj.name || obj.name === ''\n ? '[Function]'\n : '[Function: ' + obj.name + ']';\n } else if (type === '[object Array]') {\n return '[ Array(' + obj.length + ') ]';\n } else if (type === '[object Object]') {\n var keys = Object.keys(obj)\n , kstr = keys.length > 2\n ? keys.splice(0, 2).join(', ') + ', ...'\n : keys.join(', ');\n return '{ Object (' + kstr + ') }';\n } else {\n return str;\n }\n } else {\n return str;\n }\n};\n\n},{\"../config\":245,\"./inspect\":264}],268:[function(require,module,exports){\n/*!\n * Chai - overwriteChainableMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar chai = require('../../chai');\nvar transferFlags = require('./transferFlags');\n\n/**\n * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior)\n *\n * Overwrites an already existing chainable method\n * and provides access to the previous function or\n * property. Must return functions to be used for\n * name.\n *\n * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf',\n * function (_super) {\n * }\n * , function (_super) {\n * }\n * );\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteChainableMethod('foo', fn, fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.have.lengthOf(3);\n * expect(myFoo).to.have.lengthOf.above(3);\n *\n * @param {Object} ctx object whose method / property is to be overwritten\n * @param {String} name of method / property to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @param {Function} chainingBehavior function that returns a function to be used for property\n * @namespace Utils\n * @name overwriteChainableMethod\n * @api public\n */\n\nmodule.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) {\n var chainableBehavior = ctx.__methods[name];\n\n var _chainingBehavior = chainableBehavior.chainingBehavior;\n chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() {\n var result = chainingBehavior(_chainingBehavior).call(this);\n if (result !== undefined) {\n return result;\n }\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n };\n\n var _method = chainableBehavior.method;\n chainableBehavior.method = function overwritingChainableMethodWrapper() {\n var result = method(_method).apply(this, arguments);\n if (result !== undefined) {\n return result;\n }\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n };\n};\n\n},{\"../../chai\":243,\"./transferFlags\":273}],269:[function(require,module,exports){\n/*!\n * Chai - overwriteMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar addLengthGuard = require('./addLengthGuard');\nvar chai = require('../../chai');\nvar flag = require('./flag');\nvar proxify = require('./proxify');\nvar transferFlags = require('./transferFlags');\n\n/**\n * ### .overwriteMethod(ctx, name, fn)\n *\n * Overwrites an already existing method and provides\n * access to previous function. Must return function\n * to be used for name.\n *\n * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {\n * return function (str) {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.value).to.equal(str);\n * } else {\n * _super.apply(this, arguments);\n * }\n * }\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.equal('bar');\n *\n * @param {Object} ctx object whose method is to be overwritten\n * @param {String} name of method to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @namespace Utils\n * @name overwriteMethod\n * @api public\n */\n\nmodule.exports = function overwriteMethod(ctx, name, method) {\n var _method = ctx[name]\n , _super = function () {\n throw new Error(name + ' is not a function');\n };\n\n if (_method && 'function' === typeof _method)\n _super = _method;\n\n var overwritingMethodWrapper = function () {\n // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this\n // function to be the starting point for removing implementation frames from\n // the stack trace of a failed assertion.\n //\n // However, we only want to use this function as the starting point if the\n // `lockSsfi` flag isn't set.\n //\n // If the `lockSsfi` flag is set, then either this assertion has been\n // overwritten by another assertion, or this assertion is being invoked from\n // inside of another assertion. In the first case, the `ssfi` flag has\n // already been set by the overwriting assertion. In the second case, the\n // `ssfi` flag has already been set by the outer assertion.\n if (!flag(this, 'lockSsfi')) {\n flag(this, 'ssfi', overwritingMethodWrapper);\n }\n\n // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion\n // from changing the `ssfi` flag. By this point, the `ssfi` flag is already\n // set to the correct starting point for this assertion.\n var origLockSsfi = flag(this, 'lockSsfi');\n flag(this, 'lockSsfi', true);\n var result = method(_super).apply(this, arguments);\n flag(this, 'lockSsfi', origLockSsfi);\n\n if (result !== undefined) {\n return result;\n }\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n }\n\n addLengthGuard(overwritingMethodWrapper, name, false);\n ctx[name] = proxify(overwritingMethodWrapper, name);\n};\n\n},{\"../../chai\":243,\"./addLengthGuard\":251,\"./flag\":256,\"./proxify\":271,\"./transferFlags\":273}],270:[function(require,module,exports){\n/*!\n * Chai - overwriteProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar chai = require('../../chai');\nvar flag = require('./flag');\nvar isProxyEnabled = require('./isProxyEnabled');\nvar transferFlags = require('./transferFlags');\n\n/**\n * ### .overwriteProperty(ctx, name, fn)\n *\n * Overwrites an already existing property getter and provides\n * access to previous value. Must return function to use as getter.\n *\n * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {\n * return function () {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.name).to.equal('bar');\n * } else {\n * _super.call(this);\n * }\n * }\n * });\n *\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.ok;\n *\n * @param {Object} ctx object whose property is to be overwritten\n * @param {String} name of property to overwrite\n * @param {Function} getter function that returns a getter function to be used for name\n * @namespace Utils\n * @name overwriteProperty\n * @api public\n */\n\nmodule.exports = function overwriteProperty(ctx, name, getter) {\n var _get = Object.getOwnPropertyDescriptor(ctx, name)\n , _super = function () {};\n\n if (_get && 'function' === typeof _get.get)\n _super = _get.get\n\n Object.defineProperty(ctx, name,\n { get: function overwritingPropertyGetter() {\n // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this\n // function to be the starting point for removing implementation frames\n // from the stack trace of a failed assertion.\n //\n // However, we only want to use this function as the starting point if\n // the `lockSsfi` flag isn't set and proxy protection is disabled.\n //\n // If the `lockSsfi` flag is set, then either this assertion has been\n // overwritten by another assertion, or this assertion is being invoked\n // from inside of another assertion. In the first case, the `ssfi` flag\n // has already been set by the overwriting assertion. In the second\n // case, the `ssfi` flag has already been set by the outer assertion.\n //\n // If proxy protection is enabled, then the `ssfi` flag has already been\n // set by the proxy getter.\n if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {\n flag(this, 'ssfi', overwritingPropertyGetter);\n }\n\n // Setting the `lockSsfi` flag to `true` prevents the overwritten\n // assertion from changing the `ssfi` flag. By this point, the `ssfi`\n // flag is already set to the correct starting point for this assertion.\n var origLockSsfi = flag(this, 'lockSsfi');\n flag(this, 'lockSsfi', true);\n var result = getter(_super).call(this);\n flag(this, 'lockSsfi', origLockSsfi);\n\n if (result !== undefined) {\n return result;\n }\n\n var newAssertion = new chai.Assertion();\n transferFlags(this, newAssertion);\n return newAssertion;\n }\n , configurable: true\n });\n};\n\n},{\"../../chai\":243,\"./flag\":256,\"./isProxyEnabled\":266,\"./transferFlags\":273}],271:[function(require,module,exports){\nvar config = require('../config');\nvar flag = require('./flag');\nvar getProperties = require('./getProperties');\nvar isProxyEnabled = require('./isProxyEnabled');\n\n/*!\n * Chai - proxify utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .proxify(object)\n *\n * Return a proxy of given object that throws an error when a non-existent\n * property is read. By default, the root cause is assumed to be a misspelled\n * property, and thus an attempt is made to offer a reasonable suggestion from\n * the list of existing properties. However, if a nonChainableMethodName is\n * provided, then the root cause is instead a failure to invoke a non-chainable\n * method prior to reading the non-existent property.\n *\n * If proxies are unsupported or disabled via the user's Chai config, then\n * return object without modification.\n *\n * @param {Object} obj\n * @param {String} nonChainableMethodName\n * @namespace Utils\n * @name proxify\n */\n\nvar builtins = ['__flags', '__methods', '_obj', 'assert'];\n\nmodule.exports = function proxify(obj, nonChainableMethodName) {\n if (!isProxyEnabled()) return obj;\n\n return new Proxy(obj, {\n get: function proxyGetter(target, property) {\n // This check is here because we should not throw errors on Symbol properties\n // such as `Symbol.toStringTag`.\n // The values for which an error should be thrown can be configured using\n // the `config.proxyExcludedKeys` setting.\n if (typeof property === 'string' &&\n config.proxyExcludedKeys.indexOf(property) === -1 &&\n !Reflect.has(target, property)) {\n // Special message for invalid property access of non-chainable methods.\n if (nonChainableMethodName) {\n throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' +\n property + '. See docs for proper usage of \"' +\n nonChainableMethodName + '\".');\n }\n\n // If the property is reasonably close to an existing Chai property,\n // suggest that property to the user. Only suggest properties with a\n // distance less than 4.\n var suggestion = null;\n var suggestionDistance = 4;\n getProperties(target).forEach(function(prop) {\n if (\n !Object.prototype.hasOwnProperty(prop) &&\n builtins.indexOf(prop) === -1\n ) {\n var dist = stringDistanceCapped(\n property,\n prop,\n suggestionDistance\n );\n if (dist < suggestionDistance) {\n suggestion = prop;\n suggestionDistance = dist;\n }\n }\n });\n\n if (suggestion !== null) {\n throw Error('Invalid Chai property: ' + property +\n '. Did you mean \"' + suggestion + '\"?');\n } else {\n throw Error('Invalid Chai property: ' + property);\n }\n }\n\n // Use this proxy getter as the starting point for removing implementation\n // frames from the stack trace of a failed assertion. For property\n // assertions, this prevents the proxy getter from showing up in the stack\n // trace since it's invoked before the property getter. For method and\n // chainable method assertions, this flag will end up getting changed to\n // the method wrapper, which is good since this frame will no longer be in\n // the stack once the method is invoked. Note that Chai builtin assertion\n // properties such as `__flags` are skipped since this is only meant to\n // capture the starting point of an assertion. This step is also skipped\n // if the `lockSsfi` flag is set, thus indicating that this assertion is\n // being called from within another assertion. In that case, the `ssfi`\n // flag is already set to the outer assertion's starting point.\n if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) {\n flag(target, 'ssfi', proxyGetter);\n }\n\n return Reflect.get(target, property);\n }\n });\n};\n\n/**\n * # stringDistanceCapped(strA, strB, cap)\n * Return the Levenshtein distance between two strings, but no more than cap.\n * @param {string} strA\n * @param {string} strB\n * @param {number} number\n * @return {number} min(string distance between strA and strB, cap)\n * @api private\n */\n\nfunction stringDistanceCapped(strA, strB, cap) {\n if (Math.abs(strA.length - strB.length) >= cap) {\n return cap;\n }\n\n var memo = [];\n // `memo` is a two-dimensional array containing distances.\n // memo[i][j] is the distance between strA.slice(0, i) and\n // strB.slice(0, j).\n for (var i = 0; i <= strA.length; i++) {\n memo[i] = Array(strB.length + 1).fill(0);\n memo[i][0] = i;\n }\n for (var j = 0; j < strB.length; j++) {\n memo[0][j] = j;\n }\n\n for (var i = 1; i <= strA.length; i++) {\n var ch = strA.charCodeAt(i - 1);\n for (var j = 1; j <= strB.length; j++) {\n if (Math.abs(i - j) >= cap) {\n memo[i][j] = cap;\n continue;\n }\n memo[i][j] = Math.min(\n memo[i - 1][j] + 1,\n memo[i][j - 1] + 1,\n memo[i - 1][j - 1] +\n (ch === strB.charCodeAt(j - 1) ? 0 : 1)\n );\n }\n }\n\n return memo[strA.length][strB.length];\n}\n\n},{\"../config\":245,\"./flag\":256,\"./getProperties\":262,\"./isProxyEnabled\":266}],272:[function(require,module,exports){\n/*!\n * Chai - test utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar flag = require('./flag');\n\n/**\n * ### .test(object, expression)\n *\n * Test and object for expression.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name test\n */\n\nmodule.exports = function test(obj, args) {\n var negate = flag(obj, 'negate')\n , expr = args[0];\n return negate ? !expr : expr;\n};\n\n},{\"./flag\":256}],273:[function(require,module,exports){\n/*!\n * Chai - transferFlags utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .transferFlags(assertion, object, includeAll = true)\n *\n * Transfer all the flags for `assertion` to `object`. If\n * `includeAll` is set to `false`, then the base Chai\n * assertion flags (namely `object`, `ssfi`, `lockSsfi`,\n * and `message`) will not be transferred.\n *\n *\n * var newAssertion = new Assertion();\n * utils.transferFlags(assertion, newAssertion);\n *\n * var anotherAssertion = new Assertion(myObj);\n * utils.transferFlags(assertion, anotherAssertion, false);\n *\n * @param {Assertion} assertion the assertion to transfer the flags from\n * @param {Object} object the object to transfer the flags to; usually a new assertion\n * @param {Boolean} includeAll\n * @namespace Utils\n * @name transferFlags\n * @api private\n */\n\nmodule.exports = function transferFlags(assertion, object, includeAll) {\n var flags = assertion.__flags || (assertion.__flags = Object.create(null));\n\n if (!object.__flags) {\n object.__flags = Object.create(null);\n }\n\n includeAll = arguments.length === 3 ? includeAll : true;\n\n for (var flag in flags) {\n if (includeAll ||\n (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) {\n object.__flags[flag] = flags[flag];\n }\n }\n};\n\n},{}],274:[function(require,module,exports){\n'use strict';\n/* globals Symbol: false, Uint8Array: false, WeakMap: false */\n/*!\n * deep-eql\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\nvar type = require('type-detect');\nfunction FakeMap() {\n this._key = 'chai/deep-eql__' + Math.random() + Date.now();\n}\n\nFakeMap.prototype = {\n get: function get(key) {\n return key[this._key];\n },\n set: function set(key, value) {\n if (Object.isExtensible(key)) {\n Object.defineProperty(key, this._key, {\n value: value,\n configurable: true,\n });\n }\n },\n};\n\nvar MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap;\n/*!\n * Check to see if the MemoizeMap has recorded a result of the two operands\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {MemoizeMap} memoizeMap\n * @returns {Boolean|null} result\n*/\nfunction memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {\n // Technically, WeakMap keys can *only* be objects, not primitives.\n if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {\n return null;\n }\n var leftHandMap = memoizeMap.get(leftHandOperand);\n if (leftHandMap) {\n var result = leftHandMap.get(rightHandOperand);\n if (typeof result === 'boolean') {\n return result;\n }\n }\n return null;\n}\n\n/*!\n * Set the result of the equality into the MemoizeMap\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {MemoizeMap} memoizeMap\n * @param {Boolean} result\n*/\nfunction memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {\n // Technically, WeakMap keys can *only* be objects, not primitives.\n if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {\n return;\n }\n var leftHandMap = memoizeMap.get(leftHandOperand);\n if (leftHandMap) {\n leftHandMap.set(rightHandOperand, result);\n } else {\n leftHandMap = new MemoizeMap();\n leftHandMap.set(rightHandOperand, result);\n memoizeMap.set(leftHandOperand, leftHandMap);\n }\n}\n\n/*!\n * Primary Export\n */\n\nmodule.exports = deepEqual;\nmodule.exports.MemoizeMap = MemoizeMap;\n\n/**\n * Assert deeply nested sameValue equality between two objects of any type.\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {Object} [options] (optional) Additional options\n * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.\n * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of\n complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular\n references to blow the stack.\n * @return {Boolean} equal match\n */\nfunction deepEqual(leftHandOperand, rightHandOperand, options) {\n // If we have a comparator, we can't assume anything; so bail to its check first.\n if (options && options.comparator) {\n return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);\n }\n\n var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);\n if (simpleResult !== null) {\n return simpleResult;\n }\n\n // Deeper comparisons are pushed through to a larger function\n return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);\n}\n\n/**\n * Many comparisons can be canceled out early via simple equality or primitive checks.\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @return {Boolean|null} equal match\n */\nfunction simpleEqual(leftHandOperand, rightHandOperand) {\n // Equal references (except for Numbers) can be returned early\n if (leftHandOperand === rightHandOperand) {\n // Handle +-0 cases\n return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;\n }\n\n // handle NaN cases\n if (\n leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare\n rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare\n ) {\n return true;\n }\n\n // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers,\n // strings, and undefined, can be compared by reference.\n if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {\n // Easy out b/c it would have passed the first equality check\n return false;\n }\n return null;\n}\n\n/*!\n * The main logic of the `deepEqual` function.\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {Object} [options] (optional) Additional options\n * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.\n * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of\n complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular\n references to blow the stack.\n * @return {Boolean} equal match\n*/\nfunction extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {\n options = options || {};\n options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();\n var comparator = options && options.comparator;\n\n // Check if a memoized result exists.\n var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);\n if (memoizeResultLeft !== null) {\n return memoizeResultLeft;\n }\n var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);\n if (memoizeResultRight !== null) {\n return memoizeResultRight;\n }\n\n // If a comparator is present, use it.\n if (comparator) {\n var comparatorResult = comparator(leftHandOperand, rightHandOperand);\n // Comparators may return null, in which case we want to go back to default behavior.\n if (comparatorResult === false || comparatorResult === true) {\n memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);\n return comparatorResult;\n }\n // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide\n // what to do, we need to make sure to return the basic tests first before we move on.\n var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);\n if (simpleResult !== null) {\n // Don't memoize this, it takes longer to set/retrieve than to just compare.\n return simpleResult;\n }\n }\n\n var leftHandType = type(leftHandOperand);\n if (leftHandType !== type(rightHandOperand)) {\n memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);\n return false;\n }\n\n // Temporarily set the operands in the memoize object to prevent blowing the stack\n memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);\n\n var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);\n memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);\n return result;\n}\n\nfunction extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {\n switch (leftHandType) {\n case 'String':\n case 'Number':\n case 'Boolean':\n case 'Date':\n // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values\n return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());\n case 'Promise':\n case 'Symbol':\n case 'function':\n case 'WeakMap':\n case 'WeakSet':\n return leftHandOperand === rightHandOperand;\n case 'Error':\n return keysEqual(leftHandOperand, rightHandOperand, [ 'name', 'message', 'code' ], options);\n case 'Arguments':\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n case 'Array':\n return iterableEqual(leftHandOperand, rightHandOperand, options);\n case 'RegExp':\n return regexpEqual(leftHandOperand, rightHandOperand);\n case 'Generator':\n return generatorEqual(leftHandOperand, rightHandOperand, options);\n case 'DataView':\n return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);\n case 'ArrayBuffer':\n return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);\n case 'Set':\n return entriesEqual(leftHandOperand, rightHandOperand, options);\n case 'Map':\n return entriesEqual(leftHandOperand, rightHandOperand, options);\n case 'Temporal.PlainDate':\n case 'Temporal.PlainTime':\n case 'Temporal.PlainDateTime':\n case 'Temporal.Instant':\n case 'Temporal.ZonedDateTime':\n case 'Temporal.PlainYearMonth':\n case 'Temporal.PlainMonthDay':\n return leftHandOperand.equals(rightHandOperand);\n case 'Temporal.Duration':\n return leftHandOperand.total('nanoseconds') === rightHandOperand.total('nanoseconds');\n case 'Temporal.TimeZone':\n case 'Temporal.Calendar':\n return leftHandOperand.toString() === rightHandOperand.toString();\n default:\n return objectEqual(leftHandOperand, rightHandOperand, options);\n }\n}\n\n/*!\n * Compare two Regular Expressions for equality.\n *\n * @param {RegExp} leftHandOperand\n * @param {RegExp} rightHandOperand\n * @return {Boolean} result\n */\n\nfunction regexpEqual(leftHandOperand, rightHandOperand) {\n return leftHandOperand.toString() === rightHandOperand.toString();\n}\n\n/*!\n * Compare two Sets/Maps for equality. Faster than other equality functions.\n *\n * @param {Set} leftHandOperand\n * @param {Set} rightHandOperand\n * @param {Object} [options] (Optional)\n * @return {Boolean} result\n */\n\nfunction entriesEqual(leftHandOperand, rightHandOperand, options) {\n // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach\n if (leftHandOperand.size !== rightHandOperand.size) {\n return false;\n }\n if (leftHandOperand.size === 0) {\n return true;\n }\n var leftHandItems = [];\n var rightHandItems = [];\n leftHandOperand.forEach(function gatherEntries(key, value) {\n leftHandItems.push([ key, value ]);\n });\n rightHandOperand.forEach(function gatherEntries(key, value) {\n rightHandItems.push([ key, value ]);\n });\n return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);\n}\n\n/*!\n * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers.\n *\n * @param {Iterable} leftHandOperand\n * @param {Iterable} rightHandOperand\n * @param {Object} [options] (Optional)\n * @return {Boolean} result\n */\n\nfunction iterableEqual(leftHandOperand, rightHandOperand, options) {\n var length = leftHandOperand.length;\n if (length !== rightHandOperand.length) {\n return false;\n }\n if (length === 0) {\n return true;\n }\n var index = -1;\n while (++index < length) {\n if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) {\n return false;\n }\n }\n return true;\n}\n\n/*!\n * Simple equality for generator objects such as those returned by generator functions.\n *\n * @param {Iterable} leftHandOperand\n * @param {Iterable} rightHandOperand\n * @param {Object} [options] (Optional)\n * @return {Boolean} result\n */\n\nfunction generatorEqual(leftHandOperand, rightHandOperand, options) {\n return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);\n}\n\n/*!\n * Determine if the given object has an @@iterator function.\n *\n * @param {Object} target\n * @return {Boolean} `true` if the object has an @@iterator function.\n */\nfunction hasIteratorFunction(target) {\n return typeof Symbol !== 'undefined' &&\n typeof target === 'object' &&\n typeof Symbol.iterator !== 'undefined' &&\n typeof target[Symbol.iterator] === 'function';\n}\n\n/*!\n * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array.\n * This will consume the iterator - which could have side effects depending on the @@iterator implementation.\n *\n * @param {Object} target\n * @returns {Array} an array of entries from the @@iterator function\n */\nfunction getIteratorEntries(target) {\n if (hasIteratorFunction(target)) {\n try {\n return getGeneratorEntries(target[Symbol.iterator]());\n } catch (iteratorError) {\n return [];\n }\n }\n return [];\n}\n\n/*!\n * Gets all entries from a Generator. This will consume the generator - which could have side effects.\n *\n * @param {Generator} target\n * @returns {Array} an array of entries from the Generator.\n */\nfunction getGeneratorEntries(generator) {\n var generatorResult = generator.next();\n var accumulator = [ generatorResult.value ];\n while (generatorResult.done === false) {\n generatorResult = generator.next();\n accumulator.push(generatorResult.value);\n }\n return accumulator;\n}\n\n/*!\n * Gets all own and inherited enumerable keys from a target.\n *\n * @param {Object} target\n * @returns {Array} an array of own and inherited enumerable keys from the target.\n */\nfunction getEnumerableKeys(target) {\n var keys = [];\n for (var key in target) {\n keys.push(key);\n }\n return keys;\n}\n\nfunction getNonEnumerableSymbols(target) {\n var keys = Object.getOwnPropertySymbols(target);\n return keys;\n}\n\n/*!\n * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of\n * each key. If any value of the given key is not equal, the function will return false (early).\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against\n * @param {Object} [options] (Optional)\n * @return {Boolean} result\n */\nfunction keysEqual(leftHandOperand, rightHandOperand, keys, options) {\n var length = keys.length;\n if (length === 0) {\n return true;\n }\n for (var i = 0; i < length; i += 1) {\n if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) {\n return false;\n }\n }\n return true;\n}\n\n/*!\n * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual`\n * for each enumerable key in the object.\n *\n * @param {Mixed} leftHandOperand\n * @param {Mixed} rightHandOperand\n * @param {Object} [options] (Optional)\n * @return {Boolean} result\n */\nfunction objectEqual(leftHandOperand, rightHandOperand, options) {\n var leftHandKeys = getEnumerableKeys(leftHandOperand);\n var rightHandKeys = getEnumerableKeys(rightHandOperand);\n var leftHandSymbols = getNonEnumerableSymbols(leftHandOperand);\n var rightHandSymbols = getNonEnumerableSymbols(rightHandOperand);\n leftHandKeys = leftHandKeys.concat(leftHandSymbols);\n rightHandKeys = rightHandKeys.concat(rightHandSymbols);\n\n if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {\n if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) {\n return false;\n }\n return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);\n }\n\n var leftHandEntries = getIteratorEntries(leftHandOperand);\n var rightHandEntries = getIteratorEntries(rightHandOperand);\n if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {\n leftHandEntries.sort();\n rightHandEntries.sort();\n return iterableEqual(leftHandEntries, rightHandEntries, options);\n }\n\n if (leftHandKeys.length === 0 &&\n leftHandEntries.length === 0 &&\n rightHandKeys.length === 0 &&\n rightHandEntries.length === 0) {\n return true;\n }\n\n return false;\n}\n\n/*!\n * Returns true if the argument is a primitive.\n *\n * This intentionally returns true for all objects that can be compared by reference,\n * including functions and symbols.\n *\n * @param {Mixed} value\n * @return {Boolean} result\n */\nfunction isPrimitive(value) {\n return value === null || typeof value !== 'object';\n}\n\nfunction mapSymbols(arr) {\n return arr.map(function mapSymbol(entry) {\n if (typeof entry === 'symbol') {\n return entry.toString();\n }\n\n return entry;\n });\n}\n\n},{\"type-detect\":275}],275:[function(require,module,exports){\n(function (global){(function (){\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.typeDetect = factory());\n}(this, (function () { 'use strict';\n\n/* !\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\nvar promiseExists = typeof Promise === 'function';\n\n/* eslint-disable no-undef */\nvar globalObject = typeof self === 'object' ? self : global; // eslint-disable-line id-blacklist\n\nvar symbolExists = typeof Symbol !== 'undefined';\nvar mapExists = typeof Map !== 'undefined';\nvar setExists = typeof Set !== 'undefined';\nvar weakMapExists = typeof WeakMap !== 'undefined';\nvar weakSetExists = typeof WeakSet !== 'undefined';\nvar dataViewExists = typeof DataView !== 'undefined';\nvar symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';\nvar symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';\nvar setEntriesExists = setExists && typeof Set.prototype.entries === 'function';\nvar mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';\nvar setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());\nvar mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());\nvar arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';\nvar arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());\nvar stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';\nvar stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]());\nvar toStringLeftSliceLength = 8;\nvar toStringRightSliceLength = -1;\n/**\n * ### typeOf (obj)\n *\n * Uses `Object.prototype.toString` to determine the type of an object,\n * normalising behaviour across engine versions & well optimised.\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nfunction typeDetect(obj) {\n /* ! Speed optimisation\n * Pre:\n * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled)\n * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled)\n * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled)\n * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled)\n * function x 2,556,769 ops/sec ±1.73% (77 runs sampled)\n * Post:\n * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled)\n * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled)\n * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled)\n * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled)\n * function x 31,296,870 ops/sec ±0.96% (83 runs sampled)\n */\n var typeofObj = typeof obj;\n if (typeofObj !== 'object') {\n return typeofObj;\n }\n\n /* ! Speed optimisation\n * Pre:\n * null x 28,645,765 ops/sec ±1.17% (82 runs sampled)\n * Post:\n * null x 36,428,962 ops/sec ±1.37% (84 runs sampled)\n */\n if (obj === null) {\n return 'null';\n }\n\n /* ! Spec Conformance\n * Test: `Object.prototype.toString.call(window)``\n * - Node === \"[object global]\"\n * - Chrome === \"[object global]\"\n * - Firefox === \"[object Window]\"\n * - PhantomJS === \"[object Window]\"\n * - Safari === \"[object Window]\"\n * - IE 11 === \"[object Window]\"\n * - IE Edge === \"[object Window]\"\n * Test: `Object.prototype.toString.call(this)``\n * - Chrome Worker === \"[object global]\"\n * - Firefox Worker === \"[object DedicatedWorkerGlobalScope]\"\n * - Safari Worker === \"[object DedicatedWorkerGlobalScope]\"\n * - IE 11 Worker === \"[object WorkerGlobalScope]\"\n * - IE Edge Worker === \"[object WorkerGlobalScope]\"\n */\n if (obj === globalObject) {\n return 'global';\n }\n\n /* ! Speed optimisation\n * Pre:\n * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled)\n * Post:\n * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled)\n */\n if (\n Array.isArray(obj) &&\n (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))\n ) {\n return 'Array';\n }\n\n // Not caching existence of `window` and related properties due to potential\n // for `window` to be unset before tests in quasi-browser environments.\n if (typeof window === 'object' && window !== null) {\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/multipage/browsers.html#location)\n * WhatWG HTML$7.7.3 - The `Location` interface\n * Test: `Object.prototype.toString.call(window.location)``\n * - IE <=11 === \"[object Object]\"\n * - IE Edge <=13 === \"[object Object]\"\n */\n if (typeof window.location === 'object' && obj === window.location) {\n return 'Location';\n }\n\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/#document)\n * WhatWG HTML$3.1.1 - The `Document` object\n * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268)\n * which suggests that browsers should use HTMLTableCellElement for\n * both TD and TH elements. WhatWG separates these.\n * WhatWG HTML states:\n * > For historical reasons, Window objects must also have a\n * > writable, configurable, non-enumerable property named\n * > HTMLDocument whose value is the Document interface object.\n * Test: `Object.prototype.toString.call(document)``\n * - Chrome === \"[object HTMLDocument]\"\n * - Firefox === \"[object HTMLDocument]\"\n * - Safari === \"[object HTMLDocument]\"\n * - IE <=10 === \"[object Document]\"\n * - IE 11 === \"[object HTMLDocument]\"\n * - IE Edge <=13 === \"[object HTMLDocument]\"\n */\n if (typeof window.document === 'object' && obj === window.document) {\n return 'Document';\n }\n\n if (typeof window.navigator === 'object') {\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray)\n * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray\n * Test: `Object.prototype.toString.call(navigator.mimeTypes)``\n * - IE <=10 === \"[object MSMimeTypesCollection]\"\n */\n if (typeof window.navigator.mimeTypes === 'object' &&\n obj === window.navigator.mimeTypes) {\n return 'MimeTypeArray';\n }\n\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray\n * Test: `Object.prototype.toString.call(navigator.plugins)``\n * - IE <=10 === \"[object MSPluginsCollection]\"\n */\n if (typeof window.navigator.plugins === 'object' &&\n obj === window.navigator.plugins) {\n return 'PluginArray';\n }\n }\n\n if ((typeof window.HTMLElement === 'function' ||\n typeof window.HTMLElement === 'object') &&\n obj instanceof window.HTMLElement) {\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)\n * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement`\n * Test: `Object.prototype.toString.call(document.createElement('blockquote'))``\n * - IE <=10 === \"[object HTMLBlockElement]\"\n */\n if (obj.tagName === 'BLOCKQUOTE') {\n return 'HTMLQuoteElement';\n }\n\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/#htmltabledatacellelement)\n * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement`\n * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n * which suggests that browsers should use HTMLTableCellElement for\n * both TD and TH elements. WhatWG separates these.\n * Test: Object.prototype.toString.call(document.createElement('td'))\n * - Chrome === \"[object HTMLTableCellElement]\"\n * - Firefox === \"[object HTMLTableCellElement]\"\n * - Safari === \"[object HTMLTableCellElement]\"\n */\n if (obj.tagName === 'TD') {\n return 'HTMLTableDataCellElement';\n }\n\n /* ! Spec Conformance\n * (https://html.spec.whatwg.org/#htmltableheadercellelement)\n * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement`\n * Note: Most browsers currently adher to the W3C DOM Level 2 spec\n * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)\n * which suggests that browsers should use HTMLTableCellElement for\n * both TD and TH elements. WhatWG separates these.\n * Test: Object.prototype.toString.call(document.createElement('th'))\n * - Chrome === \"[object HTMLTableCellElement]\"\n * - Firefox === \"[object HTMLTableCellElement]\"\n * - Safari === \"[object HTMLTableCellElement]\"\n */\n if (obj.tagName === 'TH') {\n return 'HTMLTableHeaderCellElement';\n }\n }\n }\n\n /* ! Speed optimisation\n * Pre:\n * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled)\n * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled)\n * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled)\n * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled)\n * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled)\n * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled)\n * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled)\n * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled)\n * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled)\n * Post:\n * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled)\n * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled)\n * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled)\n * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled)\n * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled)\n * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled)\n * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled)\n * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled)\n * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled)\n */\n var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);\n if (typeof stringTag === 'string') {\n return stringTag;\n }\n\n var objPrototype = Object.getPrototypeOf(obj);\n /* ! Speed optimisation\n * Pre:\n * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled)\n * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled)\n * Post:\n * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled)\n * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled)\n */\n if (objPrototype === RegExp.prototype) {\n return 'RegExp';\n }\n\n /* ! Speed optimisation\n * Pre:\n * date x 2,130,074 ops/sec ±4.42% (68 runs sampled)\n * Post:\n * date x 3,953,779 ops/sec ±1.35% (77 runs sampled)\n */\n if (objPrototype === Date.prototype) {\n return 'Date';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag)\n * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be \"Promise\":\n * Test: `Object.prototype.toString.call(Promise.resolve())``\n * - Chrome <=47 === \"[object Object]\"\n * - Edge <=20 === \"[object Object]\"\n * - Firefox 29-Latest === \"[object Promise]\"\n * - Safari 7.1-Latest === \"[object Promise]\"\n */\n if (promiseExists && objPrototype === Promise.prototype) {\n return 'Promise';\n }\n\n /* ! Speed optimisation\n * Pre:\n * set x 2,222,186 ops/sec ±1.31% (82 runs sampled)\n * Post:\n * set x 4,545,879 ops/sec ±1.13% (83 runs sampled)\n */\n if (setExists && objPrototype === Set.prototype) {\n return 'Set';\n }\n\n /* ! Speed optimisation\n * Pre:\n * map x 2,396,842 ops/sec ±1.59% (81 runs sampled)\n * Post:\n * map x 4,183,945 ops/sec ±6.59% (82 runs sampled)\n */\n if (mapExists && objPrototype === Map.prototype) {\n return 'Map';\n }\n\n /* ! Speed optimisation\n * Pre:\n * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled)\n * Post:\n * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled)\n */\n if (weakSetExists && objPrototype === WeakSet.prototype) {\n return 'WeakSet';\n }\n\n /* ! Speed optimisation\n * Pre:\n * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled)\n * Post:\n * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled)\n */\n if (weakMapExists && objPrototype === WeakMap.prototype) {\n return 'WeakMap';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag)\n * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be \"DataView\":\n * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))``\n * - Edge <=13 === \"[object Object]\"\n */\n if (dataViewExists && objPrototype === DataView.prototype) {\n return 'DataView';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag)\n * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be \"Map Iterator\":\n * Test: `Object.prototype.toString.call(new Map().entries())``\n * - Edge <=13 === \"[object Object]\"\n */\n if (mapExists && objPrototype === mapIteratorPrototype) {\n return 'Map Iterator';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag)\n * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be \"Set Iterator\":\n * Test: `Object.prototype.toString.call(new Set().entries())``\n * - Edge <=13 === \"[object Object]\"\n */\n if (setExists && objPrototype === setIteratorPrototype) {\n return 'Set Iterator';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag)\n * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be \"Array Iterator\":\n * Test: `Object.prototype.toString.call([][Symbol.iterator]())``\n * - Edge <=13 === \"[object Object]\"\n */\n if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {\n return 'Array Iterator';\n }\n\n /* ! Spec Conformance\n * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag)\n * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be \"String Iterator\":\n * Test: `Object.prototype.toString.call(''[Symbol.iterator]())``\n * - Edge <=13 === \"[object Object]\"\n */\n if (stringIteratorExists && objPrototype === stringIteratorPrototype) {\n return 'String Iterator';\n }\n\n /* ! Speed optimisation\n * Pre:\n * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled)\n * Post:\n * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled)\n */\n if (objPrototype === null) {\n return 'Object';\n }\n\n return Object\n .prototype\n .toString\n .call(obj)\n .slice(toStringLeftSliceLength, toStringRightSliceLength);\n}\n\nreturn typeDetect;\n\n})));\n\n}).call(this)}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],276:[function(require,module,exports){\n'use strict';\n\nconst CHARTSET_RE = /(?:charset|encoding)\\s{0,10}=\\s{0,10}['\"]? {0,10}([\\w\\-]{1,100})/i;\n\nmodule.exports = charset;\n\n/**\n * guest data charset from req.headers, xml, html content-type meta tag\n * headers:\n * 'content-type': 'text/html;charset=gbk'\n * meta tag:\n * \n * xml file:\n * \n *\n * @param {Object} obj `Content-Type` String, or `res.headers`, or `res` Object\n * @param {Buffer} [data] content buffer\n * @param {Number} [peekSize] max content peek size, default is 512\n * @return {String} charset, lower case, e.g.: utf8, gbk, gb2312, ....\n * If can\\'t guest, return null\n * @api public\n */\nfunction charset(obj, data, peekSize) {\n let matchs = null;\n let end = 0;\n if (data) {\n peekSize = peekSize || 512;\n // https://github.com/node-modules/charset/issues/4\n end = data.length > peekSize ? peekSize : data.length;\n }\n // charset('text/html;charset=gbk')\n let contentType = obj;\n if (contentType && typeof contentType !== 'string') {\n // charset(res.headers)\n let headers = obj;\n if (obj.headers) {\n // charset(res)\n headers = obj.headers;\n }\n contentType = headers['content-type'] || headers['Content-Type'];\n }\n if (contentType) {\n // guest from obj first\n matchs = CHARTSET_RE.exec(contentType);\n }\n if (!matchs && end > 0) {\n // guest from content body (html/xml) header\n contentType = data.slice(0, end).toString();\n matchs = CHARTSET_RE.exec(contentType);\n }\n let cs = null;\n if (matchs) {\n cs = matchs[1].toLowerCase();\n if (cs === 'utf-8') {\n cs = 'utf8';\n }\n }\n return cs;\n}\n\n},{}],277:[function(require,module,exports){\n'use strict';\n\n/* !\n * Chai - checkError utility\n * Copyright(c) 2012-2016 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .checkError\n *\n * Checks that an error conforms to a given set of criteria and/or retrieves information about it.\n *\n * @api public\n */\n\n/**\n * ### .compatibleInstance(thrown, errorLike)\n *\n * Checks if two instances are compatible (strict equal).\n * Returns false if errorLike is not an instance of Error, because instances\n * can only be compatible if they're both error instances.\n *\n * @name compatibleInstance\n * @param {Error} thrown error\n * @param {Error|ErrorConstructor} errorLike object to compare against\n * @namespace Utils\n * @api public\n */\n\nfunction compatibleInstance(thrown, errorLike) {\n return errorLike instanceof Error && thrown === errorLike;\n}\n\n/**\n * ### .compatibleConstructor(thrown, errorLike)\n *\n * Checks if two constructors are compatible.\n * This function can receive either an error constructor or\n * an error instance as the `errorLike` argument.\n * Constructors are compatible if they're the same or if one is\n * an instance of another.\n *\n * @name compatibleConstructor\n * @param {Error} thrown error\n * @param {Error|ErrorConstructor} errorLike object to compare against\n * @namespace Utils\n * @api public\n */\n\nfunction compatibleConstructor(thrown, errorLike) {\n if (errorLike instanceof Error) {\n // If `errorLike` is an instance of any error we compare their constructors\n return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;\n } else if (errorLike.prototype instanceof Error || errorLike === Error) {\n // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly\n return thrown.constructor === errorLike || thrown instanceof errorLike;\n }\n\n return false;\n}\n\n/**\n * ### .compatibleMessage(thrown, errMatcher)\n *\n * Checks if an error's message is compatible with a matcher (String or RegExp).\n * If the message contains the String or passes the RegExp test,\n * it is considered compatible.\n *\n * @name compatibleMessage\n * @param {Error} thrown error\n * @param {String|RegExp} errMatcher to look for into the message\n * @namespace Utils\n * @api public\n */\n\nfunction compatibleMessage(thrown, errMatcher) {\n var comparisonString = typeof thrown === 'string' ? thrown : thrown.message;\n if (errMatcher instanceof RegExp) {\n return errMatcher.test(comparisonString);\n } else if (typeof errMatcher === 'string') {\n return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers\n }\n\n return false;\n}\n\n/**\n * ### .getFunctionName(constructorFn)\n *\n * Returns the name of a function.\n * This also includes a polyfill function if `constructorFn.name` is not defined.\n *\n * @name getFunctionName\n * @param {Function} constructorFn\n * @namespace Utils\n * @api private\n */\n\nvar functionNameMatch = /\\s*function(?:\\s|\\s*\\/\\*[^(?:*\\/)]+\\*\\/\\s*)*([^\\(\\/]+)/;\nfunction getFunctionName(constructorFn) {\n var name = '';\n if (typeof constructorFn.name === 'undefined') {\n // Here we run a polyfill if constructorFn.name is not defined\n var match = String(constructorFn).match(functionNameMatch);\n if (match) {\n name = match[1];\n }\n } else {\n name = constructorFn.name;\n }\n\n return name;\n}\n\n/**\n * ### .getConstructorName(errorLike)\n *\n * Gets the constructor name for an Error instance or constructor itself.\n *\n * @name getConstructorName\n * @param {Error|ErrorConstructor} errorLike\n * @namespace Utils\n * @api public\n */\n\nfunction getConstructorName(errorLike) {\n var constructorName = errorLike;\n if (errorLike instanceof Error) {\n constructorName = getFunctionName(errorLike.constructor);\n } else if (typeof errorLike === 'function') {\n // If `err` is not an instance of Error it is an error constructor itself or another function.\n // If we've got a common function we get its name, otherwise we may need to create a new instance\n // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more.\n constructorName = getFunctionName(errorLike).trim() ||\n getFunctionName(new errorLike()); // eslint-disable-line new-cap\n }\n\n return constructorName;\n}\n\n/**\n * ### .getMessage(errorLike)\n *\n * Gets the error message from an error.\n * If `err` is a String itself, we return it.\n * If the error has no message, we return an empty string.\n *\n * @name getMessage\n * @param {Error|String} errorLike\n * @namespace Utils\n * @api public\n */\n\nfunction getMessage(errorLike) {\n var msg = '';\n if (errorLike && errorLike.message) {\n msg = errorLike.message;\n } else if (typeof errorLike === 'string') {\n msg = errorLike;\n }\n\n return msg;\n}\n\nmodule.exports = {\n compatibleInstance: compatibleInstance,\n compatibleConstructor: compatibleConstructor,\n compatibleMessage: compatibleMessage,\n getMessage: getMessage,\n getConstructorName: getConstructorName,\n};\n\n},{}],278:[function(require,module,exports){\nvar $ = require('../static'),\n utils = require('../utils'),\n isTag = utils.isTag,\n domEach = utils.domEach,\n hasOwn = Object.prototype.hasOwnProperty,\n camelCase = utils.camelCase,\n cssCase = utils.cssCase,\n rspace = /\\s+/,\n dataAttrPrefix = 'data-',\n _ = {\n forEach: require('lodash.foreach'),\n extend: require('lodash.assignin'),\n some: require('lodash.some')\n },\n\n // Lookup table for coercing string data-* attributes to their corresponding\n // JavaScript primitives\n primitives = {\n null: null,\n true: true,\n false: false\n },\n\n // Attributes that are booleans\n rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n // Matches strings that look like JSON objects or arrays\n rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/;\n\n\nvar getAttr = function(elem, name) {\n if (!elem || !isTag(elem)) return;\n\n if (!elem.attribs) {\n elem.attribs = {};\n }\n\n // Return the entire attribs object if no attribute specified\n if (!name) {\n return elem.attribs;\n }\n\n if (hasOwn.call(elem.attribs, name)) {\n // Get the (decoded) attribute\n return rboolean.test(name) ? name : elem.attribs[name];\n }\n\n // Mimic the DOM and return text content as value for `option's`\n if (elem.name === 'option' && name === 'value') {\n return $.text(elem.children);\n }\n\n // Mimic DOM with default value for radios/checkboxes\n if (elem.name === 'input' &&\n (elem.attribs.type === 'radio' || elem.attribs.type === 'checkbox') &&\n name === 'value') {\n return 'on';\n }\n};\n\nvar setAttr = function(el, name, value) {\n\n if (value === null) {\n removeAttribute(el, name);\n } else {\n el.attribs[name] = value+'';\n }\n};\n\nexports.attr = function(name, value) {\n // Set the value (with attr map support)\n if (typeof name === 'object' || value !== undefined) {\n if (typeof value === 'function') {\n return domEach(this, function(i, el) {\n setAttr(el, name, value.call(el, i, el.attribs[name]));\n });\n }\n return domEach(this, function(i, el) {\n if (!isTag(el)) return;\n\n if (typeof name === 'object') {\n _.forEach(name, function(value, name) {\n setAttr(el, name, value);\n });\n } else {\n setAttr(el, name, value);\n }\n });\n }\n\n return getAttr(this[0], name);\n};\n\nvar getProp = function (el, name) {\n if (!el || !isTag(el)) return;\n \n return el.hasOwnProperty(name)\n ? el[name]\n : rboolean.test(name)\n ? getAttr(el, name) !== undefined\n : getAttr(el, name);\n};\n\nvar setProp = function (el, name, value) {\n el[name] = rboolean.test(name) ? !!value : value;\n};\n\nexports.prop = function (name, value) {\n var i = 0,\n property;\n\n if (typeof name === 'string' && value === undefined) {\n\n switch (name) {\n case 'style':\n property = this.css();\n\n _.forEach(property, function (v, p) {\n property[i++] = p;\n });\n\n property.length = i;\n\n break;\n case 'tagName':\n case 'nodeName':\n property = this[0].name.toUpperCase();\n break;\n default:\n property = getProp(this[0], name);\n }\n\n return property;\n }\n\n if (typeof name === 'object' || value !== undefined) {\n\n if (typeof value === 'function') {\n return domEach(this, function(i, el) {\n setProp(el, name, value.call(el, i, getProp(el, name)));\n });\n }\n\n return domEach(this, function(i, el) {\n if (!isTag(el)) return;\n\n if (typeof name === 'object') {\n\n _.forEach(name, function(val, name) {\n setProp(el, name, val);\n });\n\n } else {\n setProp(el, name, value);\n }\n });\n\n }\n};\n\nvar setData = function(el, name, value) {\n if (!el.data) {\n el.data = {};\n }\n\n if (typeof name === 'object') return _.extend(el.data, name);\n if (typeof name === 'string' && value !== undefined) {\n el.data[name] = value;\n } else if (typeof name === 'object') {\n _.extend(el.data, name);\n }\n};\n\n// Read the specified attribute from the equivalent HTML5 `data-*` attribute,\n// and (if present) cache the value in the node's internal data store. If no\n// attribute name is specified, read *all* HTML5 `data-*` attributes in this\n// manner.\nvar readData = function(el, name) {\n var readAll = arguments.length === 1;\n var domNames, domName, jsNames, jsName, value, idx, length;\n\n if (readAll) {\n domNames = Object.keys(el.attribs).filter(function(attrName) {\n return attrName.slice(0, dataAttrPrefix.length) === dataAttrPrefix;\n });\n jsNames = domNames.map(function(domName) {\n return camelCase(domName.slice(dataAttrPrefix.length));\n });\n } else {\n domNames = [dataAttrPrefix + cssCase(name)];\n jsNames = [name];\n }\n\n for (idx = 0, length = domNames.length; idx < length; ++idx) {\n domName = domNames[idx];\n jsName = jsNames[idx];\n if (hasOwn.call(el.attribs, domName)) {\n value = el.attribs[domName];\n\n if (hasOwn.call(primitives, value)) {\n value = primitives[value];\n } else if (value === String(Number(value))) {\n value = Number(value);\n } else if (rbrace.test(value)) {\n try {\n value = JSON.parse(value);\n } catch(e){ }\n }\n\n el.data[jsName] = value;\n }\n }\n\n return readAll ? el.data : value;\n};\n\nexports.data = function(name, value) {\n var elem = this[0];\n\n if (!elem || !isTag(elem)) return;\n\n if (!elem.data) {\n elem.data = {};\n }\n\n // Return the entire data object if no data specified\n if (!name) {\n return readData(elem);\n }\n\n // Set the value (with attr map support)\n if (typeof name === 'object' || value !== undefined) {\n domEach(this, function(i, el) {\n setData(el, name, value);\n });\n return this;\n } else if (hasOwn.call(elem.data, name)) {\n return elem.data[name];\n }\n\n return readData(elem, name);\n};\n\n/**\n * Get the value of an element\n */\n\nexports.val = function(value) {\n var querying = arguments.length === 0,\n element = this[0];\n\n if(!element) return;\n\n switch (element.name) {\n case 'textarea':\n return this.text(value);\n case 'input':\n switch (this.attr('type')) {\n case 'radio':\n if (querying) {\n return this.attr('value');\n } else {\n this.attr('value', value);\n return this;\n }\n break;\n default:\n return this.attr('value', value);\n }\n return;\n case 'select':\n var option = this.find('option:selected'),\n returnValue;\n if (option === undefined) return undefined;\n if (!querying) {\n if (!this.attr().hasOwnProperty('multiple') && typeof value == 'object') {\n return this;\n }\n if (typeof value != 'object') {\n value = [value];\n }\n this.find('option').removeAttr('selected');\n for (var i = 0; i < value.length; i++) {\n this.find('option[value=\"' + value[i] + '\"]').attr('selected', '');\n }\n return this;\n }\n returnValue = option.attr('value');\n if (this.attr().hasOwnProperty('multiple')) {\n returnValue = [];\n domEach(option, function(i, el) {\n returnValue.push(getAttr(el, 'value'));\n });\n }\n return returnValue;\n case 'option':\n if (!querying) {\n this.attr('value', value);\n return this;\n }\n return this.attr('value');\n }\n};\n\n/**\n * Remove an attribute\n */\n\nvar removeAttribute = function(elem, name) {\n if (!elem.attribs || !hasOwn.call(elem.attribs, name))\n return;\n\n delete elem.attribs[name];\n};\n\n\nexports.removeAttr = function(name) {\n domEach(this, function(i, elem) {\n removeAttribute(elem, name);\n });\n\n return this;\n};\n\nexports.hasClass = function(className) {\n return _.some(this, function(elem) {\n var attrs = elem.attribs,\n clazz = attrs && attrs['class'],\n idx = -1,\n end;\n\n if (clazz) {\n while ((idx = clazz.indexOf(className, idx+1)) > -1) {\n end = idx + className.length;\n\n if ((idx === 0 || rspace.test(clazz[idx-1]))\n && (end === clazz.length || rspace.test(clazz[end]))) {\n return true;\n }\n }\n }\n });\n};\n\nexports.addClass = function(value) {\n // Support functions\n if (typeof value === 'function') {\n return domEach(this, function(i, el) {\n var className = el.attribs['class'] || '';\n exports.addClass.call([el], value.call(el, i, className));\n });\n }\n\n // Return if no value or not a string or function\n if (!value || typeof value !== 'string') return this;\n\n var classNames = value.split(rspace),\n numElements = this.length;\n\n\n for (var i = 0; i < numElements; i++) {\n // If selected element isn't a tag, move on\n if (!isTag(this[i])) continue;\n\n // If we don't already have classes\n var className = getAttr(this[i], 'class'),\n numClasses,\n setClass;\n\n if (!className) {\n setAttr(this[i], 'class', classNames.join(' ').trim());\n } else {\n setClass = ' ' + className + ' ';\n numClasses = classNames.length;\n\n // Check if class already exists\n for (var j = 0; j < numClasses; j++) {\n var appendClass = classNames[j] + ' ';\n if (setClass.indexOf(' ' + appendClass) < 0)\n setClass += appendClass;\n }\n\n setAttr(this[i], 'class', setClass.trim());\n }\n }\n\n return this;\n};\n\nvar splitClass = function(className) {\n return className ? className.trim().split(rspace) : [];\n};\n\nexports.removeClass = function(value) {\n var classes,\n numClasses,\n removeAll;\n\n // Handle if value is a function\n if (typeof value === 'function') {\n return domEach(this, function(i, el) {\n exports.removeClass.call(\n [el], value.call(el, i, el.attribs['class'] || '')\n );\n });\n }\n\n classes = splitClass(value);\n numClasses = classes.length;\n removeAll = arguments.length === 0;\n\n return domEach(this, function(i, el) {\n if (!isTag(el)) return;\n\n if (removeAll) {\n // Short circuit the remove all case as this is the nice one\n el.attribs.class = '';\n } else {\n var elClasses = splitClass(el.attribs.class),\n index,\n changed;\n\n for (var j = 0; j < numClasses; j++) {\n index = elClasses.indexOf(classes[j]);\n\n if (index >= 0) {\n elClasses.splice(index, 1);\n changed = true;\n\n // We have to do another pass to ensure that there are not duplicate\n // classes listed\n j--;\n }\n }\n if (changed) {\n el.attribs.class = elClasses.join(' ');\n }\n }\n });\n};\n\nexports.toggleClass = function(value, stateVal) {\n // Support functions\n if (typeof value === 'function') {\n return domEach(this, function(i, el) {\n exports.toggleClass.call(\n [el],\n value.call(el, i, el.attribs['class'] || '', stateVal),\n stateVal\n );\n });\n }\n\n // Return if no value or not a string or function\n if (!value || typeof value !== 'string') return this;\n\n var classNames = value.split(rspace),\n numClasses = classNames.length,\n state = typeof stateVal === 'boolean' ? stateVal ? 1 : -1 : 0,\n numElements = this.length,\n elementClasses,\n index;\n\n for (var i = 0; i < numElements; i++) {\n // If selected element isn't a tag, move on\n if (!isTag(this[i])) continue;\n\n elementClasses = splitClass(this[i].attribs.class);\n\n // Check if class already exists\n for (var j = 0; j < numClasses; j++) {\n // Check if the class name is currently defined\n index = elementClasses.indexOf(classNames[j]);\n\n // Add if stateValue === true or we are toggling and there is no value\n if (state >= 0 && index < 0) {\n elementClasses.push(classNames[j]);\n } else if (state <= 0 && index >= 0) {\n // Otherwise remove but only if the item exists\n elementClasses.splice(index, 1);\n }\n }\n\n this[i].attribs.class = elementClasses.join(' ');\n }\n\n return this;\n};\n\nexports.is = function (selector) {\n if (selector) {\n return this.filter(selector).length > 0;\n }\n return false;\n};\n\n\n},{\"../static\":285,\"../utils\":286,\"lodash.assignin\":392,\"lodash.foreach\":397,\"lodash.some\":403}],279:[function(require,module,exports){\nvar domEach = require('../utils').domEach,\n _ = {\n pick: require('lodash.pick'),\n };\n\nvar toString = Object.prototype.toString;\n\n/**\n * Set / Get css.\n *\n * @param {String|Object} prop\n * @param {String} val\n * @return {self}\n * @api public\n */\n\nexports.css = function(prop, val) {\n if (arguments.length === 2 ||\n // When `prop` is a \"plain\" object\n (toString.call(prop) === '[object Object]')) {\n return domEach(this, function(idx, el) {\n setCss(el, prop, val, idx);\n });\n } else {\n return getCss(this[0], prop);\n }\n};\n\n/**\n * Set styles of all elements.\n *\n * @param {String|Object} prop\n * @param {String} val\n * @param {Number} idx - optional index within the selection\n * @return {self}\n * @api private\n */\n\nfunction setCss(el, prop, val, idx) {\n if ('string' == typeof prop) {\n var styles = getCss(el);\n if (typeof val === 'function') {\n val = val.call(el, idx, styles[prop]);\n }\n\n if (val === '') {\n delete styles[prop];\n } else if (val != null) {\n styles[prop] = val;\n }\n\n el.attribs.style = stringify(styles);\n } else if ('object' == typeof prop) {\n Object.keys(prop).forEach(function(k){\n setCss(el, k, prop[k]);\n });\n }\n}\n\n/**\n * Get parsed styles of the first element.\n *\n * @param {String} prop\n * @return {Object}\n * @api private\n */\n\nfunction getCss(el, prop) {\n var styles = parse(el.attribs.style);\n if (typeof prop === 'string') {\n return styles[prop];\n } else if (Array.isArray(prop)) {\n return _.pick(styles, prop);\n } else {\n return styles;\n }\n}\n\n/**\n * Stringify `obj` to styles.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction stringify(obj) {\n return Object.keys(obj || {})\n .reduce(function(str, prop){\n return str += ''\n + (str ? ' ' : '')\n + prop\n + ': '\n + obj[prop]\n + ';';\n }, '');\n}\n\n/**\n * Parse `styles`.\n *\n * @param {String} styles\n * @return {Object}\n * @api private\n */\n\nfunction parse(styles) {\n styles = (styles || '').trim();\n\n if (!styles) return {};\n\n return styles\n .split(';')\n .reduce(function(obj, str){\n var n = str.indexOf(':');\n // skip if there is no :, or if it is the first/last character\n if (n < 1 || n === str.length-1) return obj;\n obj[str.slice(0,n).trim()] = str.slice(n+1).trim();\n return obj;\n }, {});\n}\n\n},{\"../utils\":286,\"lodash.pick\":400}],280:[function(require,module,exports){\n// https://github.com/jquery/jquery/blob/2.1.3/src/manipulation/var/rcheckableType.js\n// https://github.com/jquery/jquery/blob/2.1.3/src/serialize.js\nvar submittableSelector = 'input,select,textarea,keygen',\n r20 = /%20/g,\n rCRLF = /\\r?\\n/g,\n _ = {\n map: require('lodash.map')\n };\n\nexports.serialize = function() {\n // Convert form elements into name/value objects\n var arr = this.serializeArray();\n\n // Serialize each element into a key/value string\n var retArr = _.map(arr, function(data) {\n return encodeURIComponent(data.name) + '=' + encodeURIComponent(data.value);\n });\n\n // Return the resulting serialization\n return retArr.join('&').replace(r20, '+');\n};\n\nexports.serializeArray = function() {\n // Resolve all form elements from either forms or collections of form elements\n var Cheerio = this.constructor;\n return this.map(function() {\n var elem = this;\n var $elem = Cheerio(elem);\n if (elem.name === 'form') {\n return $elem.find(submittableSelector).toArray();\n } else {\n return $elem.filter(submittableSelector).toArray();\n }\n }).filter(\n // Verify elements have a name (`attr.name`) and are not disabled (`:disabled`)\n '[name!=\"\"]:not(:disabled)'\n // and cannot be clicked (`[type=submit]`) or are used in `x-www-form-urlencoded` (`[type=file]`)\n + ':not(:submit, :button, :image, :reset, :file)'\n // and are either checked/don't have a checkable state\n + ':matches([checked], :not(:checkbox, :radio))'\n // Convert each of the elements to its value(s)\n ).map(function(i, elem) {\n var $elem = Cheerio(elem);\n var name = $elem.attr('name');\n var val = $elem.val();\n\n // If there is no value set (e.g. `undefined`, `null`), then return nothing\n if (val == null) {\n return null;\n } else {\n // If we have an array of values (e.g. `\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces \";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, \"\", \"
\" ],\n\tcol: [ 2, \"\", \"
\" ],\n\ttr: [ 2, \"\", \"
\" ],\n\ttd: [ 3, \"\", \"
\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\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\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\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// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, 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 = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\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 !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\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// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\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 if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( 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},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( 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( rnothtmlwhite ) || [ \"\" ];\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 ] &&\n\t\t\t\tnew 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 ||\n\t\t\t\t\t\tselector === \"**\" && 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 ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\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 data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ 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\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\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++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.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 ||\n\t\t\t\t\t\thandleObj.handler ).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 i, handleObj, sel, matchedHandlers, matchedSelectors,\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\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\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 (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\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 ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\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\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\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\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\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\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\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 ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\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 || Date.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// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\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 mouseenter/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\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, 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\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 ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.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\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\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\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\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\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\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, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], 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\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\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// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, 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 domManip( this, arguments, 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\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\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 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 && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\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!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\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() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\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\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\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// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, trac-12537)\n\t// .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// 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\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\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\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// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": 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\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\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 = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then 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 \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !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 ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\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 val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\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// Make numeric 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 || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\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 ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.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} );\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 || jQuery.easing._default;\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\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && 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// 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\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\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if 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.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\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// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\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.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\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise 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\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\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\n\t\t\t// Ensure the complete handler is called 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// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.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 won't overwrite existing keys.\n\t\t\t// Reusing 'index' 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\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\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\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-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\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\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, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, 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\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\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; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\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 = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.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\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\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\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\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\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\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\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 ( 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.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( isHiddenWithinTree ).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\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\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\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 ) {\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 = dataPriv.get( 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 &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\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\n\t\t\t// will dequeue 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 = dataPriv.get( 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.stop ) {\n\t\t\t\thooks.stop.call( this, true );\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\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\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.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\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\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn 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\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( 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 === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\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\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\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 &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\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}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\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 classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\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 classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", 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\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\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 ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\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\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).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\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.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\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\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\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\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// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\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!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!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 optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\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\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = 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( \".\" ) > -1 ) {\n\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\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = 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 (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !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\t\t\tlastElement = cur;\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 = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( 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 && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\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 ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !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\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\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\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\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\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\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\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\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\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\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, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\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\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( \"&\" );\n};\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\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} ).filter( function() {\n\t\t\tvar type = this.type;\n\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 || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\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 (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\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( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\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\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\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 trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\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/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\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\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\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 * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\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\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\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( 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\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.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\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 {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\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\t}\n\n\treturn { state: \"success\", data: response };\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: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\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: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\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\": 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\": JSON.parse,\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 transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\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 &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\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 ( completed ) {\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() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( 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.join( \", \" );\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 completed ? 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\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || 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 ( completed == null ) {\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 ( completed ) {\n\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} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\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}\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 );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\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 ( completed ) {\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\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && 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\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-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 or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\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 ] ] +\n\t\t\t\t\t( 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 &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\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\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\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\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.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\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\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// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( 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// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\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// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\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 || s.type === \"HEAD\" ) {\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\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\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize 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\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\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\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}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = 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.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\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 ( 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 htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\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} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\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\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\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\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\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 crossDomain\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}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"