{"version":3,"sources":["jsdelivr-header.js","/npm/jquery-mockjax@2.7.0/src/jquery.mockjax.js"],"names":[],"mappings":"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","file":"/npm/jquery-mockjax@2.7.0/src/jquery.mockjax.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/jquery-mockjax@2.7.0/src/jquery.mockjax.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function(root, factory) {\n\t'use strict';\n\n\t// AMDJS module definition\n\tif ( typeof define === 'function' && define.amd && define.amd.jQuery ) {\n\t\tdefine(['jquery'], function($) {\n\t\t\treturn factory($, root);\n\t\t});\n\n\t// CommonJS module definition\n\t} else if ( typeof exports === 'object') {\n\n\t\t// NOTE: To use Mockjax as a Node module you MUST provide the factory with\n\t\t// a valid version of jQuery and a window object (the global scope):\n\t\t// var mockjax = require('jquery.mockjax')(jQuery, window);\n\n\t\tmodule.exports = factory;\n\n\t// Global jQuery in web browsers\n\t} else {\n\t\treturn factory(root.jQuery || root.$, root);\n\t}\n}(this, function($, window) {\n\t'use strict';\n\n\tvar _ajax = $.ajax,\n\t\tmockHandlers = [],\n\t\tmockedAjaxCalls = [],\n\t\tunmockedAjaxCalls = [],\n\t\tCALLBACK_REGEX = /=\\?(&|$)/,\n\t\tjsc = (new Date()).getTime(),\n\t\tDEFAULT_RESPONSE_TIME = 500;\n\n\t// Parse the given XML string.\n\tfunction parseXML(xml) {\n\t\tif ( window.DOMParser === undefined && window.ActiveXObject ) {\n\t\t\twindow.DOMParser = function() { };\n\t\t\tDOMParser.prototype.parseFromString = function( xmlString ) {\n\t\t\t\tvar doc = new ActiveXObject('Microsoft.XMLDOM');\n\t\t\t\tdoc.async = 'false';\n\t\t\t\tdoc.loadXML( xmlString );\n\t\t\t\treturn doc;\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tvar xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );\n\t\t\tif ( $.isXMLDoc( xmlDoc ) ) {\n\t\t\t\tvar err = $('parsererror', xmlDoc);\n\t\t\t\tif ( err.length === 1 ) {\n\t\t\t\t\tthrow new Error('Error: ' + $(xmlDoc).text() );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Error('Unable to parse XML');\n\t\t\t}\n\t\t\treturn xmlDoc;\n\t\t} catch( e ) {\n\t\t\tvar msg = ( e.name === undefined ? e : e.name + ': ' + e.message );\n\t\t\t$(document).trigger('xmlParseError', [ msg ]);\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\t// Check if the data field on the mock handler and the request match. This\n\t// can be used to restrict a mock handler to being used only when a certain\n\t// set of data is passed to it.\n\tfunction isMockDataEqual( mock, live ) {\n\t\tlogger.debug( mock, ['Checking mock data against request data', mock, live] );\n\t\tvar identical = true;\n\n\t\tif (typeof mock === 'function') {\n\t\t\treturn !!mock(live);\n\t\t}\n\n\t\t// Test for situations where the data is a querystring (not an object)\n\t\tif (typeof live === 'string') {\n\t\t\t// Querystring may be a regex\n\t\t\tif (typeof mock.test === 'function') {\n\t\t\t\treturn mock.test(live);\n\t\t\t} else if (typeof mock === 'object') {\n\t\t\t\tlive = getQueryParams(live);\n\t\t\t} else {\n\t\t\t\treturn mock === live;\n\t\t\t}\n\t\t}\n\n\t\t$.each(mock, function(k) {\n\t\t\tif ( live[k] === undefined ) {\n\t\t\t\tidentical = false;\n\t\t\t\treturn identical;\n\t\t\t} else {\n\t\t\t\tif ( typeof live[k] === 'object' && live[k] !== null ) {\n\t\t\t\t\tif ( identical && Array.isArray( live[k] ) ) {\n\t\t\t\t\t\tidentical = Array.isArray( mock[k] ) && live[k].length === mock[k].length;\n\t\t\t\t\t}\n\t\t\t\t\tidentical = identical && isMockDataEqual(mock[k], live[k]);\n\t\t\t\t} else {\n\t\t\t\t\tif ( mock[k] && typeof mock[k].test === 'function') {\n\t\t\t\t\t\tidentical = identical && mock[k].test(live[k]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tidentical = identical && ( mock[k] === live[k] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn identical;\n\t}\n\n\tfunction getQueryParams(queryString) {\n\t\tvar i, l, param, tmp,\n\t\t\tparamsObj = {},\n\t\t\tparams = String(queryString).split(/&/);\n\n\t\tfor (i=0, l=params.length; i<l; ++i) {\n\t\t\tparam = params[i];\n\t\t\ttry {\n\t\t\t\tparam = decodeURIComponent(param.replace(/\\+/g, ' '));\n\t\t\t\tparam = param.split(/=/);\n\t\t\t} catch(e) {\n\t\t\t\t// Can't parse this one, so let it go?\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (paramsObj[param[0]]) {\n\t\t\t\t// this is an array query param (more than one entry in query)\n\t\t\t\tif (!paramsObj[param[0]].splice) {\n\t\t\t\t\t// if not already an array, make it one\n\t\t\t\t\ttmp = paramsObj[param[0]];\n\t\t\t\t\tparamsObj[param[0]] = [];\n\t\t\t\t\tparamsObj[param[0]].push(tmp);\n\t\t\t\t}\n\t\t\t\tparamsObj[param[0]].push(param[1]);\n\t\t\t} else {\n\t\t\t\tparamsObj[param[0]] = param[1];\n\t\t\t}\n\t\t}\n\n\t\tlogger.debug( null, ['Getting query params from string', queryString, paramsObj] );\n\n\t\treturn paramsObj;\n\t}\n\n\t// See if a mock handler property matches the default settings\n\tfunction isDefaultSetting(handler, property) {\n\t\treturn handler[property] === $.mockjaxSettings[property];\n\t}\n\n\t// Check the given handler should mock the given request\n\tfunction getMockForRequest( handler, requestSettings ) {\n\t\t// If the mock was registered with a function, let the function decide if we\n\t\t// want to mock this request\n\t\tif (typeof handler === 'function') {\n\t\t\treturn handler( requestSettings );\n\t\t}\n\n\t\t// Apply namespace prefix to the mock handler's url.\n\t\tvar namespace = handler.namespace || (typeof(handler.namespace) === 'undefined' && $.mockjaxSettings.namespace);\n\n\t\t// Inspect the URL of the request and check if the mock handler's url\n\t\t// matches the url for this ajax request\n\t\tif (typeof handler.url.test === 'function') {\n\t\t\t// namespace exists prepend handler.url with namespace\n\t\t\tif (!!namespace) {\n\t\t\t\tnamespace = namespace.replace(/(\\/+)$/, '');\n\t\t\t\tvar pattern = handler.url.source.replace(/^(\\^+)/, '').replace(/^/, '^(' + namespace + ')?\\/?');\n\t\t\t\thandler.url = new RegExp(pattern);\n\t\t\t}\n\t\t\t// The user provided a regex for the url, test it\n\t\t\tif ( !handler.url.test( requestSettings.url ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\n\t\t\tvar effectiveUrl = handler.url;\n\n\t\t\tif (!!namespace) {\n\t\t\t\tvar namespacedUrl = [\n\t\t\t\t\tnamespace.replace(/(\\/+)$/, ''),\n\t\t\t\t\thandler.url.replace(/^(\\/+)/, '')\n\t\t\t\t].join('/');\n\t\t\t\teffectiveUrl = namespacedUrl;\n\t\t\t}\n\n\t\t\t// Look for a simple wildcard '*' or a direct URL match\n\t\t\tvar star = effectiveUrl.indexOf('*');\n\t\t\tif (effectiveUrl !== requestSettings.url && star === -1 ||\n\t\t\t\t\t!new RegExp(effectiveUrl.replace(/[-[\\]{}()+?.,\\\\^$|#\\s]/g, '\\\\$&').replace(/\\*/g, '.+')).test(requestSettings.url)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\t// Inspect the request headers submitted\n\t\tif ( handler.requestHeaders ) {\n\t\t\t//No expectation for headers, do not mock this request\n\t\t\tif (requestSettings.headers === undefined) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\tvar headersMismatch = false;\n\t\t\t\t$.each(handler.requestHeaders, function(key, value) {\n\t\t\t\t\tvar v = requestSettings.headers[key];\n\t\t\t\t\tif(v !== value) {\n\t\t\t\t\t\theadersMismatch = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t//Headers do not match, do not mock this request\n\t\t\t\tif (headersMismatch) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Inspect the data submitted in the request (either POST body or GET query string)\n\t\tif ( handler.data ) {\n\t\t\tif ( !requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {\n\t\t\t\t// They're not identical, do not mock this request\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t// Inspect the request type\n\t\tif ( handler && handler.type &&\n\t\t\t\thandler.type.toLowerCase() !== requestSettings.type.toLowerCase() ) {\n\t\t\t// The request type doesn't match (GET vs. POST)\n\t\t\treturn null;\n\t\t}\n\n\t\treturn handler;\n\t}\n\n\tfunction isPosNum(value) {\n\t\treturn typeof value === 'number' && value >= 0;\n\t}\n\n\tfunction parseResponseTimeOpt(responseTime) {\n\t\tif (Array.isArray(responseTime) && responseTime.length === 2) {\n\t\t\tvar min = responseTime[0];\n\t\t\tvar max = responseTime[1];\n\t\t\tif(isPosNum(min) && isPosNum(max)) {\n\t\t\t\treturn Math.floor(Math.random() * (max - min)) + min;\n\t\t\t}\n\t\t} else if(isPosNum(responseTime)) {\n\t\t\treturn responseTime;\n\t\t}\n\t\treturn DEFAULT_RESPONSE_TIME;\n\t}\n\n\t// Process the xhr objects send operation\n\tfunction _xhrSend(mockHandler, requestSettings, origSettings) {\n\t\tlogger.debug( mockHandler, ['Sending fake XHR request', mockHandler, requestSettings, origSettings] );\n\n\t\t// This is a substitute for < 1.4 which lacks $.proxy\n\t\tvar process = (function(that) {\n\t\t\treturn function() {\n\t\t\t\treturn (function() {\n\t\t\t\t\t// The request has returned\n\t\t\t\t\tthis.status = mockHandler.status;\n\t\t\t\t\tthis.statusText = mockHandler.statusText;\n\t\t\t\t\tthis.readyState\t= 1;\n\n\t\t\t\t\tvar finishRequest = function () {\n\t\t\t\t\t\tthis.readyState\t= 4;\n\n\t\t\t\t\t\tvar onReady;\n\t\t\t\t\t\t// Copy over our mock to our xhr object before passing control back to\n\t\t\t\t\t\t// jQuery's onreadystatechange callback\n\t\t\t\t\t\tif ( requestSettings.dataType === 'json' && ( typeof mockHandler.responseText === 'object' ) ) {\n\t\t\t\t\t\t\tthis.responseText = JSON.stringify(mockHandler.responseText);\n\t\t\t\t\t\t} else if ( requestSettings.dataType === 'xml' ) {\n\t\t\t\t\t\t\tif ( typeof mockHandler.responseXML === 'string' ) {\n\t\t\t\t\t\t\t\tthis.responseXML = parseXML(mockHandler.responseXML);\n\t\t\t\t\t\t\t\t//in jQuery 1.9.1+, responseXML is processed differently and relies on responseText\n\t\t\t\t\t\t\t\tthis.responseText = mockHandler.responseXML;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.responseXML = mockHandler.responseXML;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (typeof mockHandler.responseText === 'object' && mockHandler.responseText !== null) {\n\t\t\t\t\t\t\t// since jQuery 1.9 responseText type has to match contentType\n\t\t\t\t\t\t\tmockHandler.contentType = 'application/json';\n\t\t\t\t\t\t\tthis.responseText = JSON.stringify(mockHandler.responseText);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.responseText = mockHandler.responseText;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (Array.isArray(mockHandler.status)) {\n\t\t\t\t\t\t\tvar idxStatus = Math.floor(Math.random() * mockHandler.status.length);\n\t\t\t\t\t\t\tthis.status = mockHandler.status[idxStatus];\n\t\t\t\t\t\t} else if (typeof mockHandler.status === 'number' || typeof mockHandler.status === 'string') {\n\t\t\t\t\t\t\tthis.status = mockHandler.status;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( typeof mockHandler.statusText === 'string') {\n\t\t\t\t\t\t\tthis.statusText = mockHandler.statusText;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// jQuery 2.0 renamed onreadystatechange to onload\n\t\t\t\t\t\tonReady = this.onload || this.onreadystatechange;\n\n\t\t\t\t\t\t// jQuery < 1.4 doesn't have onreadystate change for xhr\n\t\t\t\t\t\tif (typeof onReady === 'function') {\n\t\t\t\t\t\t\tif( mockHandler.isTimeout) {\n\t\t\t\t\t\t\t\tthis.status = -1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonReady.call( this, mockHandler.isTimeout ? 'timeout' : undefined );\n\t\t\t\t\t\t} else if ( mockHandler.isTimeout ) {\n\t\t\t\t\t\t\t// Fix for 1.3.2 timeout to keep success from firing.\n\t\t\t\t\t\t\tthis.status = -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// We have an executable function, call it to give\n\t\t\t\t\t// the mock handler a chance to update it's data\n\t\t\t\t\tif (typeof mockHandler.response === 'function') {\n\t\t\t\t\t\t// Wait for it to finish\n\t\t\t\t\t\tif ( mockHandler.response.length === 2 ) {\n\t\t\t\t\t\t\tmockHandler.response(origSettings, function () {\n\t\t\t\t\t\t\t\tfinishRequest.call(that);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmockHandler.response(origSettings);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfinishRequest.call(that);\n\t\t\t\t}).apply(that);\n\t\t\t};\n\t\t})(this);\n\n\t\tif ( mockHandler.proxy ) {\n\t\t\tlogger.info( mockHandler, ['Retrieving proxy file: ' + mockHandler.proxy, mockHandler] );\n\t\t\t// We're proxying this request and loading in an external file instead\n\t\t\t_ajax({\n\t\t\t\tglobal: false,\n\t\t\t\turl: mockHandler.proxy,\n\t\t\t\ttype: mockHandler.proxyType,\n\t\t\t\tdata: mockHandler.data,\n\t\t\t\tasync: requestSettings.async,\n\t\t\t\tdataType: requestSettings.dataType === 'script' ? 'text/plain' : requestSettings.dataType,\n\t\t\t\tcomplete: function(xhr) {\n\t\t\t\t\t// Fix for bug #105\n\t\t\t\t\t// jQuery will convert the text to XML for us, and if we use the actual responseXML here\n\t\t\t\t\t// then some other things don't happen, resulting in no data given to the 'success' cb\n\t\t\t\t\tmockHandler.responseXML = mockHandler.responseText = xhr.responseText;\n\n\t\t\t\t\t// Don't override the handler status/statusText if it's specified by the config\n\t\t\t\t\tif (isDefaultSetting(mockHandler, 'status')) {\n\t\t\t\t\t\tmockHandler.status = xhr.status;\n\t\t\t\t\t}\n\t\t\t\t\tif (isDefaultSetting(mockHandler, 'statusText')) {\n\t\t\t\t\t\tmockHandler.statusText = xhr.statusText;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( requestSettings.async === false ) {\n\t\t\t\t\t\t// TODO: Blocking delay\n\t\t\t\t\t\tprocess();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// type === 'POST' || 'GET' || 'DELETE'\n\t\t\tif ( requestSettings.async === false ) {\n\t\t\t\t// TODO: Blocking delay\n\t\t\t\tprocess();\n\t\t\t} else {\n\t\t\t\tthis.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime));\n\t\t\t}\n\t\t}\n\n\t}\n\n\t// Construct a mocked XHR Object\n\tfunction xhr(mockHandler, requestSettings, origSettings, origHandler) {\n\t\tlogger.debug( mockHandler, ['Creating new mock XHR object', mockHandler, requestSettings, origSettings, origHandler] );\n\n\t\t// Extend with our default mockjax settings\n\t\tmockHandler = $.extend(true, {}, $.mockjaxSettings, mockHandler);\n\n\t\tif (typeof mockHandler.headers === 'undefined') {\n\t\t\tmockHandler.headers = {};\n\t\t}\n\t\tif (typeof requestSettings.headers === 'undefined') {\n\t\t\trequestSettings.headers = {};\n\t\t}\n\t\tif ( mockHandler.contentType ) {\n\t\t\tmockHandler.headers['content-type'] = mockHandler.contentType;\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: mockHandler.status,\n\t\t\tstatusText: mockHandler.statusText,\n\t\t\treadyState: 1,\n\t\t\topen: function() { },\n\t\t\tsend: function() {\n\t\t\t\torigHandler.fired = true;\n\t\t\t\t_xhrSend.call(this, mockHandler, requestSettings, origSettings);\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tclearTimeout(this.responseTimer);\n\t\t\t},\n\t\t\tsetRequestHeader: function(header, value) {\n\t\t\t\trequestSettings.headers[header] = value;\n\t\t\t},\n\t\t\tgetResponseHeader: function(header) {\n\t\t\t\t// 'Last-modified', 'Etag', 'content-type' are all checked by jQuery\n\t\t\t\tif ( mockHandler.headers && mockHandler.headers[header] ) {\n\t\t\t\t\t// Return arbitrary headers\n\t\t\t\t\treturn mockHandler.headers[header];\n\t\t\t\t} else if ( header.toLowerCase() === 'last-modified' ) {\n\t\t\t\t\treturn mockHandler.lastModified || (new Date()).toString();\n\t\t\t\t} else if ( header.toLowerCase() === 'etag' ) {\n\t\t\t\t\treturn mockHandler.etag || '';\n\t\t\t\t} else if ( header.toLowerCase() === 'content-type' ) {\n\t\t\t\t\treturn mockHandler.contentType || 'text/plain';\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\tvar headers = '';\n\t\t\t\t// since jQuery 1.9 responseText type has to match contentType\n\t\t\t\tif (mockHandler.contentType) {\n\t\t\t\t\tmockHandler.headers['content-type'] = mockHandler.contentType;\n\t\t\t\t}\n\t\t\t\t$.each(mockHandler.headers, function(k, v) {\n\t\t\t\t\theaders += k + ': ' + v + '\\n';\n\t\t\t\t});\n\t\t\t\treturn headers;\n\t\t\t}\n\t\t};\n\t}\n\n\t// Process a JSONP mock request.\n\tfunction processJsonpMock( requestSettings, mockHandler, origSettings ) {\n\t\t// Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here\n\t\t// because there isn't an easy hook for the cross domain script tag of jsonp\n\n\t\tprocessJsonpUrl( requestSettings );\n\n\t\trequestSettings.dataType = 'json';\n\t\tif(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) {\n\t\t\tcreateJsonpCallback(requestSettings, mockHandler, origSettings);\n\n\t\t\t// We need to make sure\n\t\t\t// that a JSONP style response is executed properly\n\n\t\t\tvar rurl = /^(\\w+:)?\\/\\/([^\\/?#]+)/,\n\t\t\t\tparts = rurl.exec( requestSettings.url ),\n\t\t\t\tremote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);\n\n\t\t\trequestSettings.dataType = 'script';\n\t\t\tif(requestSettings.type.toUpperCase() === 'GET' && remote ) {\n\t\t\t\tvar newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings );\n\n\t\t\t\t// Check if we are supposed to return a Deferred back to the mock call, or just\n\t\t\t\t// signal success\n\t\t\t\tif(newMockReturn) {\n\t\t\t\t\treturn newMockReturn;\n\t\t\t\t} else {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Append the required callback parameter to the end of the request URL, for a JSONP request\n\tfunction processJsonpUrl( requestSettings ) {\n\t\tif ( requestSettings.type.toUpperCase() === 'GET' ) {\n\t\t\tif ( !CALLBACK_REGEX.test( requestSettings.url ) ) {\n\t\t\t\trequestSettings.url += (/\\?/.test( requestSettings.url ) ? '&' : '?') +\n\t\t\t\t\t(requestSettings.jsonp || 'callback') + '=?';\n\t\t\t}\n\t\t} else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) {\n\t\t\trequestSettings.data = (requestSettings.data ? requestSettings.data + '&' : '') + (requestSettings.jsonp || 'callback') + '=?';\n\t\t}\n\t}\n\n\t// Process a JSONP request by evaluating the mocked response text\n\tfunction processJsonpRequest( requestSettings, mockHandler, origSettings ) {\n\t\tlogger.debug( mockHandler, ['Performing JSONP request', mockHandler, requestSettings, origSettings] );\n\n\t\t// Synthesize the mock request for adding a script tag\n\t\tvar callbackContext = origSettings && origSettings.context || requestSettings,\n\t\t\t// If we are running under jQuery 1.5+, return a deferred object\n\t\t\tnewMock = ($.Deferred) ? (new $.Deferred()) : null;\n\n\t\t// If the response handler on the moock is a function, call it\n\t\tif ( mockHandler.response && typeof mockHandler.response === 'function' ) {\n\n\t\t\tmockHandler.response(origSettings);\n\n\n\t\t} else if ( typeof mockHandler.responseText === 'object' ) {\n\t\t\t// Evaluate the responseText javascript in a global context\n\t\t\t$.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')');\n\n\t\t} else if (mockHandler.proxy) {\n\t\t\tlogger.info( mockHandler, ['Performing JSONP proxy request: ' + mockHandler.proxy, mockHandler] );\n\n\t\t\t// This handles the unique case where we have a remote URL, but want to proxy the JSONP\n\t\t\t// response to another file (not the same URL as the mock matching)\n\t\t\t_ajax({\n\t\t\t\tglobal: false,\n\t\t\t\turl: mockHandler.proxy,\n\t\t\t\ttype: mockHandler.proxyType,\n\t\t\t\tdata: mockHandler.data,\n\t\t\t\tdataType: requestSettings.dataType === 'script' ? 'text/plain' : requestSettings.dataType,\n\t\t\t\tcomplete: function(xhr) {\n\t\t\t\t\t$.globalEval( '(' + xhr.responseText + ')');\n\t\t\t\t\tcompleteJsonpCall( requestSettings, mockHandler, callbackContext, newMock );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn newMock;\n\n\t\t} else {\n\t\t\t$.globalEval( '(' +\n\t\t\t\t((typeof mockHandler.responseText === 'string') ?\n\t\t\t\t\t('\"' + mockHandler.responseText + '\"') : mockHandler.responseText) +\n\t\t\t')');\n\t\t}\n\n\t\tcompleteJsonpCall( requestSettings, mockHandler, callbackContext, newMock );\n\n\t\treturn newMock;\n\t}\n\n\tfunction completeJsonpCall( requestSettings, mockHandler, callbackContext, newMock ) {\n\t\tvar json;\n\n\t\t// Successful response\n\t\tsetTimeout(function() {\n\t\t\tjsonpSuccess( requestSettings, callbackContext, mockHandler );\n\t\t\tjsonpComplete( requestSettings, callbackContext );\n\n\t\t\tif ( newMock ) {\n\t\t\t\ttry {\n\t\t\t\t\tjson = JSON.parse( mockHandler.responseText );\n\t\t\t\t} catch (err) { /* just checking... */ }\n\n\t\t\t\tnewMock.resolveWith( callbackContext, [json || mockHandler.responseText] );\n\t\t\t\tlogger.log( mockHandler, ['JSONP mock call complete', mockHandler, newMock] );\n\t\t\t}\n\t\t}, parseResponseTimeOpt( mockHandler.responseTime ));\n\t}\n\n\n\t// Create the required JSONP callback function for the request\n\tfunction createJsonpCallback( requestSettings, mockHandler, origSettings ) {\n\t\tvar callbackContext = origSettings && origSettings.context || requestSettings;\n\t\tvar jsonp = (typeof requestSettings.jsonpCallback === 'string' && requestSettings.jsonpCallback) || ('jsonp' + jsc++);\n\n\t\t// Replace the =? sequence both in the query string and the data\n\t\tif ( requestSettings.data ) {\n\t\t\trequestSettings.data = (requestSettings.data + '').replace(CALLBACK_REGEX, '=' + jsonp + '$1');\n\t\t}\n\n\t\trequestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, '=' + jsonp + '$1');\n\n\n\t\t// Handle JSONP-style loading\n\t\twindow[ jsonp ] = window[ jsonp ] || function() {\n\t\t\tjsonpSuccess( requestSettings, callbackContext, mockHandler );\n\t\t\tjsonpComplete( requestSettings, callbackContext );\n\t\t\t// Garbage collect\n\t\t\twindow[ jsonp ] = undefined;\n\n\t\t\ttry {\n\t\t\t\tdelete window[ jsonp ];\n\t\t\t} catch(e) {}\n\t\t};\n\t\trequestSettings.jsonpCallback = jsonp;\n\t}\n\n\t// The JSONP request was successful\n\tfunction jsonpSuccess(requestSettings, callbackContext, mockHandler) {\n\t\t// If a local callback was specified, fire it and pass it the data\n\t\tif ( requestSettings.success ) {\n\t\t\trequestSettings.success.call( callbackContext, mockHandler.responseText || '', 'success', {} );\n\t\t}\n\n\t\t// Fire the global callback\n\t\tif ( requestSettings.global ) {\n\t\t\t(requestSettings.context ? $(requestSettings.context) : $.event).trigger('ajaxSuccess', [{}, requestSettings]);\n\t\t}\n\t}\n\n\t// The JSONP request was completed\n\tfunction jsonpComplete(requestSettings, callbackContext) {\n\t\tif ( requestSettings.complete ) {\n\t\t\trequestSettings.complete.call( callbackContext, {\n\t\t\t\tstatusText: 'success',\n\t\t\t\tstatus: 200\n\t\t\t} , 'success' );\n\t\t}\n\n\t\t// The request was completed\n\t\tif ( requestSettings.global ) {\n\t\t\t(requestSettings.context ? $(requestSettings.context) : $.event).trigger('ajaxComplete', [{}, requestSettings]);\n\t\t}\n\n\t\t// Handle the global AJAX counter\n\t\tif ( requestSettings.global && ! --$.active ) {\n\t\t\t$.event.trigger( 'ajaxStop' );\n\t\t}\n\t}\n\n\n\t// The core $.ajax replacement.\n\tfunction handleAjax( url, origSettings ) {\n\t\tvar mockRequest, requestSettings, mockHandler, overrideCallback;\n\n\t\tlogger.debug( null, ['Ajax call intercepted', url, origSettings] );\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === 'object' ) {\n\t\t\torigSettings = url;\n\t\t\turl = undefined;\n\t\t} else {\n\t\t\t// work around to support 1.5 signature\n\t\t\torigSettings = origSettings || {};\n\t\t\torigSettings.url = url || origSettings.url;\n\t\t}\n\n\t\t// Extend the original settings for the request\n\t\trequestSettings = $.ajaxSetup({}, origSettings);\n\t\trequestSettings.type = requestSettings.method = requestSettings.method || requestSettings.type;\n\n\t\t// Generic function to override callback methods for use with\n\t\t// callback options (onAfterSuccess, onAfterError, onAfterComplete)\n\t\toverrideCallback = function(action, mockHandler) {\n\t\t\tvar origHandler = origSettings[action.toLowerCase()];\n\t\t\treturn function() {\n\t\t\t\tif (typeof origHandler === 'function') {\n\t\t\t\t\torigHandler.apply(this, [].slice.call(arguments));\n\t\t\t\t}\n\t\t\t\tmockHandler['onAfter' + action]();\n\t\t\t};\n\t\t};\n\n\t\t// Iterate over our mock handlers (in order depending on the matchInRegistrationOrder setting)\n\t\t// until we find one that is willing to intercept the request\n\t\tfor(var k = 0; k < mockHandlers.length; k++) {\n\t\t\tvar handlerIndex = $.mockjaxSettings.matchInRegistrationOrder ? k : mockHandlers.length - 1 - k;\n\t\t\tvar origHandler = mockHandlers[handlerIndex];\n\t\t\tif ( !origHandler ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmockHandler = getMockForRequest( origHandler, requestSettings );\n\t\t\tif(!mockHandler) {\n\t\t\t\tlogger.debug( origHandler, ['Mock does not match request', url, requestSettings] );\n\t\t\t\t// No valid mock found for this request\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ($.mockjaxSettings.retainAjaxCalls) {\n\t\t\t\tmockedAjaxCalls.push(requestSettings);\n\t\t\t}\n\n\t\t\t// If logging is enabled, log the mock to the console\n\t\t\tlogger.info( mockHandler, [\n\t\t\t\t'MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url,\n\t\t\t\t$.ajaxSetup({}, requestSettings)\n\t\t\t] );\n\n\t\t\tif ((mockHandler.status === 301 || mockHandler.status === 302) &&\n\t\t\t\t(requestSettings.type.toUpperCase() === 'GET' || requestSettings.type.toUpperCase() === 'HEAD') &&\n\t\t\t\tmockHandler.headers.Location) {\n\t\t\t\tlogger.debug('Doing mock redirect to', mockHandler.headers.Location, requestSettings.type);\n\n\t\t\t\tvar redirectSettings = {};\n\t\t\t\tvar origKeys = Object.keys(origSettings);\n\t\t\t\t// We can't alter origSettings, so we need a shallow copy of it...\n\t\t\t\tfor (var oi=0; oi<origKeys.length; oi++) {\n\t\t\t\t\tredirectSettings[origKeys[oi]] = origSettings[origKeys[oi]];\n\t\t\t\t}\n\t\t\t\tredirectSettings.url = mockHandler.headers.Location;\n\t\t\t\tredirectSettings.headers = {\n\t\t\t\t\tReferer: origSettings.url\n\t\t\t\t};\n\n\t\t\t\treturn handleAjax(redirectSettings);\n\t\t\t}\n\n\t\t\tif ( requestSettings.dataType && requestSettings.dataType.toUpperCase() === 'JSONP' ) {\n\t\t\t\tif ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) {\n\t\t\t\t\t// This mock will handle the JSONP request\n\t\t\t\t\treturn mockRequest;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We are mocking, so there will be no cross domain request, however, jQuery\n\t\t\t// aggressively pursues this if the domains don't match, so we need to\n\t\t\t// explicitly disallow it. (See #136)\n\t\t\torigSettings.crossDomain = false;\n\n\t\t\t// Removed to fix #54 - keep the mocking data object intact\n\t\t\t//mockHandler.data = requestSettings.data;\n\n\t\t\tmockHandler.cache = requestSettings.cache;\n\t\t\tmockHandler.timeout = requestSettings.timeout;\n\t\t\tmockHandler.global = requestSettings.global;\n\n\t\t\t// In the case of a timeout, we just need to ensure\n\t\t\t// an actual jQuery timeout (That is, our reponse won't)\n\t\t\t// return faster than the timeout setting.\n\t\t\tif ( mockHandler.isTimeout ) {\n\t\t\t\tif ( mockHandler.responseTime > 1 ) {\n\t\t\t\t\torigSettings.timeout = mockHandler.responseTime - 1;\n\t\t\t\t} else {\n\t\t\t\t\tmockHandler.responseTime = 2;\n\t\t\t\t\torigSettings.timeout = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set up onAfter[X] callback functions\n\t\t\tif (typeof mockHandler.onAfterSuccess === 'function') {\n\t\t\t\torigSettings.success = overrideCallback('Success', mockHandler);\n\t\t\t}\n\t\t\tif (typeof mockHandler.onAfterError === 'function') {\n\t\t\t\torigSettings.error = overrideCallback('Error', mockHandler);\n\t\t\t}\n\t\t\tif (typeof mockHandler.onAfterComplete === 'function') {\n\t\t\t\torigSettings.complete = overrideCallback('Complete', mockHandler);\n\t\t\t}\n\n\t\t\tcopyUrlParameters(mockHandler, origSettings);\n\n\t\t\t/* jshint loopfunc:true */\n\t\t\t(function(mockHandler, requestSettings, origSettings, origHandler) {\n\n\t\t\t\tmockRequest = _ajax.call($, $.extend(true, {}, origSettings, {\n\t\t\t\t\t// Mock the XHR object\n\t\t\t\t\txhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ); }\n\t\t\t\t}));\n\t\t\t})(mockHandler, requestSettings, origSettings, origHandler);\n\t\t\t/* jshint loopfunc:false */\n\n\t\t\treturn mockRequest;\n\t\t}\n\n\t\t// We don't have a mock request\n\t\tlogger.log( null, ['No mock matched to request', url, origSettings] );\n\t\tif ($.mockjaxSettings.retainAjaxCalls) {\n\t\t\tunmockedAjaxCalls.push(origSettings);\n\t\t}\n\t\tif($.mockjaxSettings.throwUnmocked === true) {\n\t\t\tthrow new Error('AJAX not mocked: ' + origSettings.url);\n\t\t}\n\t\telse { // trigger a normal request\n\t\t\tlogger.log('Real ajax call to', origSettings.url);\n\t\t\treturn _ajax.apply($, [origSettings]);\n\t\t}\n\t}\n\n\t/**\n\t* Copies URL parameter values if they were captured by a regular expression\n\t* @param {Object} mockHandler\n\t* @param {Object} origSettings\n\t*/\n\tfunction copyUrlParameters(mockHandler, origSettings) {\n\t\t//parameters aren't captured if the URL isn't a RegExp\n\t\tif (!(mockHandler.url instanceof RegExp)) {\n\t\t\treturn;\n\t\t}\n\t\t//if no URL params were defined on the handler, don't attempt a capture\n\t\tif (!mockHandler.hasOwnProperty('urlParams')) {\n\t\t\treturn;\n\t\t}\n\t\tvar captures = mockHandler.url.exec(origSettings.url);\n\t\t//the whole RegExp match is always the first value in the capture results\n\t\tif (captures.length === 1) {\n\t\t\treturn;\n\t\t}\n\t\tcaptures.shift();\n\t\t//use handler params as keys and capture resuts as values\n\t\tvar i = 0,\n\t\tcapturesLength = captures.length,\n\t\tparamsLength = mockHandler.urlParams.length,\n\t\t//in case the number of params specified is less than actual captures\n\t\tmaxIterations = Math.min(capturesLength, paramsLength),\n\t\tparamValues = {};\n\t\tfor (i; i < maxIterations; i++) {\n\t\t\tvar key = mockHandler.urlParams[i];\n\t\t\tparamValues[key] = captures[i];\n\t\t}\n\t\torigSettings.urlParams = paramValues;\n\t}\n\n\t/**\n\t * Clears handlers that mock given url\n\t * @param url\n\t * @returns {Array}\n\t */\n\tfunction clearByUrl(url) {\n\t\tvar i, len,\n\t\t\thandler,\n\t\t\tresults = [],\n\t\t\tmatch=url instanceof RegExp ?\n\t\t\t\tfunction(testUrl) { return url.test(testUrl); } :\n\t\t\t\tfunction(testUrl) { return url === testUrl; };\n\t\tfor (i=0, len=mockHandlers.length; i<len; i++) {\n\t\t\thandler = mockHandlers[i];\n\t\t\tif (!match(handler.url)) {\n\t\t\t\tresults.push(handler);\n\t\t\t} else {\n\t\t\t\tlogger.log( handler, [\n\t\t\t\t\t'Clearing mock: ' + (handler && handler.url),\n\t\t\t\t\thandler\n\t\t\t\t] );\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t}\n\n\n\t// Public\n\n\t$.extend({\n\t\tajax: handleAjax\n\t});\n\n\tvar logger = {\n\t\t_log: function logger( mockHandler, args, level ) {\n\t\t\tvar loggerLevel = $.mockjaxSettings.logging;\n\t\t\tif (mockHandler && typeof mockHandler.logging !== 'undefined') {\n\t\t\t\tloggerLevel = mockHandler.logging;\n\t\t\t}\n\t\t\tlevel = ( level === 0 ) ? level : ( level || logLevels.LOG );\n\t\t\targs = (args.splice) ? args : [ args ];\n\n\t\t\t// Is logging turned off for this mock or mockjax as a whole?\n\t\t\t// Or is this log message above the desired log level?\n\t\t\tif ( loggerLevel === false || loggerLevel < level ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( $.mockjaxSettings.log ) {\n\t\t\t\treturn $.mockjaxSettings.log( mockHandler, args[1] || args[0] );\n\t\t\t} else if ( $.mockjaxSettings.logger && $.mockjaxSettings.logger[$.mockjaxSettings.logLevelMethods[level]] ) {\n\t\t\t\treturn $.mockjaxSettings.logger[$.mockjaxSettings.logLevelMethods[level]].apply( $.mockjaxSettings.logger, args );\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Convenience method for logging a DEBUG level message\n\t\t * @param  {Object} m  The mock handler in question\n\t\t * @param  {Array|String|Object} a  The items to log\n\t\t * @return {?}  Will return whatever the $.mockjaxSettings.logger method for this level would return (generally 'undefined')\n\t\t */\n\t\tdebug: function(m,a) { return logger._log(m,a,logLevels.DEBUG); },\n\t\t/**\n\t\t * @see logger.debug\n\t\t */\n\t\tlog: function(m,a) { return logger._log(m,a,logLevels.LOG); },\n\t\t/**\n\t\t * @see logger.debug\n\t\t */\n\t\tinfo: function(m,a) { return logger._log(m,a,logLevels.INFO); },\n\t\t/**\n\t\t * @see logger.debug\n\t\t */\n\t\twarn: function(m,a) { return logger._log(m,a,logLevels.WARN); },\n\t\t/**\n\t\t * @see logger.debug\n\t\t */\n\t\terror: function(m,a) { return logger._log(m,a,logLevels.ERROR); }\n\t};\n\n\tvar logLevels = {\n\t\tDEBUG: 4,\n\t\tLOG: 3,\n\t\tINFO: 2,\n\t\tWARN: 1,\n\t\tERROR: 0\n\t};\n\n\t/**\n\t * Default settings for mockjax. Some of these are used for defaults of\n\t * individual mock handlers, and some are for the library as a whole.\n\t * For individual mock handler settings, please see the README on the repo:\n\t * https://github.com/jakerella/jquery-mockjax#api-methods.\n\t * For Global settings see:\n\t * https://github.com/jakerella/jquery-mockjax#globally-defining-mockjax-settings\n\t *\n\t * @type {Object}\n\t */\n\t$.mockjaxSettings = {\n\t\tlog:\t\t\t\tnull, // this is only here for historical purposes... use $.mockjaxSettings.logger\n\t\tlogger:\t\t\t\twindow.console,\n\t\tlogging:\t\t\t2,\n\t\tlogLevelMethods:\t['error', 'warn', 'info', 'log', 'debug'],\n\t\tmatchInRegistrationOrder: true,\n\t\tnamespace:\t\t\tnull,\n\t\tstatus:\t\t\t\t200,\n\t\tstatusText:\t\t\t'OK',\n\t\tresponseTime:\t\tDEFAULT_RESPONSE_TIME,\n\t\tisTimeout:\t\t\tfalse,\n\t\tthrowUnmocked:\t\tfalse,\n\t\tretainAjaxCalls:\ttrue,\n\t\tcontentType:\t\t'text/plain',\n\t\tresponse:\t\t\t'',\n\t\tresponseText:\t\t'',\n\t\tresponseXML:\t\t'',\n\t\tproxy:\t\t\t\t'',\n\t\tproxyType:\t\t\t'GET',\n\n\t\tlastModified:\t\tnull,\n\t\tetag:\t\t\t\t'',\n\t\theaders:\t\t\t{\n\t\t\t\t\t\t\t\tetag: 'IJF@H#@923uf8023hFO@I#H#',\n\t\t\t\t\t\t\t\t'content-type' : 'text/plain'\n\t\t\t\t\t\t\t}\n\t};\n\n\t/**\n\t * Create a new mock Ajax handler. When a mock handler is matched during a\n\t * $.ajax() call this library will intercept that request and fake a response\n\t * using the data and methods in the mock. You can see all settings in the\n\t * README of the main repository:\n\t * https://github.com/jakerella/jquery-mockjax#api-methods\n\t *\n\t * @param  {Object} settings The mock handelr settings: https://github.com/jakerella/jquery-mockjax#api-methods\n\t * @return {Number}\t\t  The id (index) of the mock handler suitable for clearing (see $.mockjax.clear())\n\t */\n\t$.mockjax = function(settings) {\n\t\t// Multiple mocks.\n\t\tif (Array.isArray(settings)) {\n\t\t\treturn $.map(settings, function(s) {\n\t\t\t\treturn $.mockjax(s);\n\t\t\t});\n\t\t}\n\n\t\tvar i = mockHandlers.length;\n\t\tmockHandlers[i] = settings;\n\t\tlogger.log( settings, ['Created new mock handler', settings] );\n\t\treturn i;\n\t};\n\n\t$.mockjax._logger = logger;\n\n\t/**\n\t * Remove an Ajax mock from those held in memory. This will prevent any\n\t * future Ajax request mocking for matched requests.\n\t * NOTE: Clearing a mock will not prevent the resolution of in progress requests\n\t *\n\t * @param  {Number|String|RegExp} i  OPTIONAL The mock to clear. If not provided, all mocks are cleared,\n\t *                                   if a number it is the index in the in-memory cache. If a string or\n\t *                                   RegExp, find a mock that matches that URL and clear it.\n\t * @return {void}\n\t */\n\t$.mockjax.clear = function(i) {\n\t\tif ( typeof i === 'string' || i instanceof RegExp) {\n\t\t\tmockHandlers = clearByUrl(i);\n\t\t} else if ( i || i === 0 ) {\n\t\t\tlogger.log( mockHandlers[i], [\n\t\t\t\t'Clearing mock: ' + (mockHandlers[i] && mockHandlers[i].url),\n\t\t\t\tmockHandlers[i]\n\t\t\t] );\n\t\t\tmockHandlers[i] = null;\n\t\t} else {\n\t\t\tlogger.log( null, 'Clearing all mocks' );\n\t\t\tmockHandlers = [];\n\t\t}\n\t\tmockedAjaxCalls = [];\n\t\tunmockedAjaxCalls = [];\n\t};\n\n\t/**\n\t * By default all Ajax requests performed after loading Mockjax are recorded\n\t * so that we can see which requests were mocked and which were not. This\n\t * method allows the developer to clear those retained requests.\n\t *\n\t * @return {void}\n\t */\n\t$.mockjax.clearRetainedAjaxCalls = function() {\n\t\tmockedAjaxCalls = [];\n\t\tunmockedAjaxCalls = [];\n\t\tlogger.debug( null, 'Cleared retained ajax calls' );\n\t};\n\n\t/**\n\t * Retrive the mock handler with the given id (index).\n\t *\n\t * @param  {Number} i  The id (index) to retrieve\n\t * @return {Object}\tThe mock handler settings\n\t */\n\t$.mockjax.handler = function(i) {\n\t\tif ( arguments.length === 1 ) {\n\t\t\treturn mockHandlers[i];\n\t\t}\n\t};\n\n\t/**\n\t * Retrieve the current array of mock handlers.\n\t * NOTE: Altering these handlers, or the array itself is probably not a good\n\t * idea! This could easily lead to malfunction of the library. If you need\n\t * to alter a handler, clear(index) it (using the array index) and then\n\t * create a new handler with $.mockjax({ ... })\n\t *\n\t * **WARNING**: Additionally, note that the handlers array WILL NOT CHANGE\n\t * when a mock is cleared. This is because we have to maintain the handler\n\t * indeces for clearing of other mock handlers. (This is not ideal, and\n\t * will probably change in the future.) Cleared mocks are set to null!\n\t *\n \t * @return {Array} The current collection of handlers\n\t */\n\t$.mockjax.handlers = function() {\n\t\treturn mockHandlers;\n\t};\n\n\t/**\n\t * Retrieve all Ajax calls that have been mocked by this library during the\n\t * current session (in other words, only since you last loaded this file).\n\t *\n\t * @return {Array}  The mocked Ajax calls (request settings)\n\t */\n\t$.mockjax.mockedAjaxCalls = function() {\n\t\treturn mockedAjaxCalls;\n\t};\n\n\t/**\n\t * Return all mock handlers that have NOT been matched against Ajax requests\n\t *\n\t * @return {Array}  The mock handlers\n\t */\n\t$.mockjax.unfiredHandlers = function() {\n\t\tvar results = [];\n\t\tfor (var i=0, len=mockHandlers.length; i<len; i++) {\n\t\t\tvar handler = mockHandlers[i];\n\t\t\tif (handler !== null && !handler.fired) {\n\t\t\t\tresults.push(handler);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/**\n\t * Retrieve all Ajax calls that have NOT been mocked by this library during\n\t * the current session (in other words, only since you last loaded this file).\n\t *\n\t * @return {Array}  The mocked Ajax calls (request settings)\n\t */\n\t$.mockjax.unmockedAjaxCalls = function() {\n\t\treturn unmockedAjaxCalls;\n\t};\n\n\treturn $.mockjax;\n\n}));\n"]}