Current section
Files
Jump to
Current section
Files
priv/static/assets/test-support.map
{"version":3,"sources":["vendor/ember-cli/test-support-prefix.js","vendor/qunit/qunit.js","vendor/qunit-notifications/index.js","vendor/ember-cli-qunit/qunit-configuration.js","vendor/ember-cli-qunit/test-loader.js","addon-test-support/ember-cli-test-loader/test-support/index.js","addon-test-support/ember-qunit.js","addon-test-support/ember-qunit/adapter.js","addon-test-support/ember-qunit/module-for-component.js","addon-test-support/ember-qunit/module-for-model.js","addon-test-support/ember-qunit/module-for.js","addon-test-support/ember-qunit/qunit-module.js","addon-test-support/ember-test-helpers.js","addon-test-support/ember-test-helpers/-legacy-overrides.js","addon-test-support/ember-test-helpers/abstract-test-module.js","addon-test-support/ember-test-helpers/build-registry.js","addon-test-support/ember-test-helpers/has-ember-version.js","addon-test-support/ember-test-helpers/test-context.js","addon-test-support/ember-test-helpers/test-module-for-acceptance.js","addon-test-support/ember-test-helpers/test-module-for-component.js","addon-test-support/ember-test-helpers/test-module-for-integration.js","addon-test-support/ember-test-helpers/test-module-for-model.js","addon-test-support/ember-test-helpers/test-module.js","addon-test-support/ember-test-helpers/test-resolver.js","addon-test-support/ember-test-helpers/wait.js","addon-test-support/qunit.js","vendor/ember-cli/test-support-suffix.js"],"sourcesContent":["\n","/*!\n * QUnit 2.3.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2017-04-10T19:56Z\n */\n(function (global$1) {\n 'use strict';\n\n global$1 = 'default' in global$1 ? global$1['default'] : global$1;\n\n var window = global$1.window;\n var console = global$1.console;\n var setTimeout = global$1.setTimeout;\n var clearTimeout = global$1.clearTimeout;\n\n var document = window && window.document;\n var navigator = window && window.navigator;\n\n var localSessionStorage = function () {\n \tvar x = \"qunit-test-string\";\n \ttry {\n \t\tglobal$1.sessionStorage.setItem(x, x);\n \t\tglobal$1.sessionStorage.removeItem(x);\n \t\treturn global$1.sessionStorage;\n \t} catch (e) {\n \t\treturn undefined;\n \t}\n }();\n\n var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n\n\n\n\n\n\n\n\n\n\n var classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n };\n\n var createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n var toConsumableArray = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n };\n\n var toString = Object.prototype.toString;\n var hasOwn = Object.prototype.hasOwnProperty;\n var now = Date.now || function () {\n \treturn new Date().getTime();\n };\n\n var defined = {\n \tdocument: window && window.document !== undefined,\n \tsetTimeout: setTimeout !== undefined\n };\n\n // Returns a new Array with the elements that are in a but not in b\n function diff(a, b) {\n \tvar i,\n \t j,\n \t result = a.slice();\n\n \tfor (i = 0; i < result.length; i++) {\n \t\tfor (j = 0; j < b.length; j++) {\n \t\t\tif (result[i] === b[j]) {\n \t\t\t\tresult.splice(i, 1);\n \t\t\t\ti--;\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t}\n \treturn result;\n }\n\n /**\n * Determines whether an element exists in a given array or not.\n *\n * @method inArray\n * @param {Any} elem\n * @param {Array} array\n * @return {Boolean}\n */\n function inArray(elem, array) {\n \treturn array.indexOf(elem) !== -1;\n }\n\n /**\n * Makes a clone of an object using only Array or Object as base,\n * and copies over the own enumerable properties.\n *\n * @param {Object} obj\n * @return {Object} New object with only the own properties (recursively).\n */\n function objectValues(obj) {\n \tvar key,\n \t val,\n \t vals = is(\"array\", obj) ? [] : {};\n \tfor (key in obj) {\n \t\tif (hasOwn.call(obj, key)) {\n \t\t\tval = obj[key];\n \t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n \t\t}\n \t}\n \treturn vals;\n }\n\n function extend(a, b, undefOnly) {\n \tfor (var prop in b) {\n \t\tif (hasOwn.call(b, prop)) {\n \t\t\tif (b[prop] === undefined) {\n \t\t\t\tdelete a[prop];\n \t\t\t} else if (!(undefOnly && typeof a[prop] !== \"undefined\")) {\n \t\t\t\ta[prop] = b[prop];\n \t\t\t}\n \t\t}\n \t}\n\n \treturn a;\n }\n\n function objectType(obj) {\n \tif (typeof obj === \"undefined\") {\n \t\treturn \"undefined\";\n \t}\n\n \t// Consider: typeof null === object\n \tif (obj === null) {\n \t\treturn \"null\";\n \t}\n\n \tvar match = toString.call(obj).match(/^\\[object\\s(.*)\\]$/),\n \t type = match && match[1];\n\n \tswitch (type) {\n \t\tcase \"Number\":\n \t\t\tif (isNaN(obj)) {\n \t\t\t\treturn \"nan\";\n \t\t\t}\n \t\t\treturn \"number\";\n \t\tcase \"String\":\n \t\tcase \"Boolean\":\n \t\tcase \"Array\":\n \t\tcase \"Set\":\n \t\tcase \"Map\":\n \t\tcase \"Date\":\n \t\tcase \"RegExp\":\n \t\tcase \"Function\":\n \t\tcase \"Symbol\":\n \t\t\treturn type.toLowerCase();\n \t}\n\n \tif ((typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj)) === \"object\") {\n \t\treturn \"object\";\n \t}\n }\n\n // Safe object type checking\n function is(type, obj) {\n \treturn objectType(obj) === type;\n }\n\n // Based on Java's String.hashCode, a simple but not\n // rigorously collision resistant hashing function\n function generateHash(module, testName) {\n \tvar str = module + \"\\x1C\" + testName;\n \tvar hash = 0;\n\n \tfor (var i = 0; i < str.length; i++) {\n \t\thash = (hash << 5) - hash + str.charCodeAt(i);\n \t\thash |= 0;\n \t}\n\n \t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n \t// strictly necessary but increases user understanding that the id is a SHA-like hash\n \tvar hex = (0x100000000 + hash).toString(16);\n \tif (hex.length < 8) {\n \t\thex = \"0000000\" + hex;\n \t}\n\n \treturn hex.slice(-8);\n }\n\n // Test for equality any JavaScript type.\n // Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>\n var equiv = (function () {\n\n \t// Value pairs queued for comparison. Used for breadth-first processing order, recursion\n \t// detection and avoiding repeated comparison (see below for details).\n \t// Elements are { a: val, b: val }.\n \tvar pairs = [];\n\n \tvar getProto = Object.getPrototypeOf || function (obj) {\n \t\treturn obj.__proto__;\n \t};\n\n \tfunction useStrictEquality(a, b) {\n\n \t\t// This only gets called if a and b are not strict equal, and is used to compare on\n \t\t// the primitive values inside object wrappers. For example:\n \t\t// `var i = 1;`\n \t\t// `var j = new Number(1);`\n \t\t// Neither a nor b can be null, as a !== b and they have the same type.\n \t\tif ((typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) === \"object\") {\n \t\t\ta = a.valueOf();\n \t\t}\n \t\tif ((typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === \"object\") {\n \t\t\tb = b.valueOf();\n \t\t}\n\n \t\treturn a === b;\n \t}\n\n \tfunction compareConstructors(a, b) {\n \t\tvar protoA = getProto(a);\n \t\tvar protoB = getProto(b);\n\n \t\t// Comparing constructors is more strict than using `instanceof`\n \t\tif (a.constructor === b.constructor) {\n \t\t\treturn true;\n \t\t}\n\n \t\t// Ref #851\n \t\t// If the obj prototype descends from a null constructor, treat it\n \t\t// as a null prototype.\n \t\tif (protoA && protoA.constructor === null) {\n \t\t\tprotoA = null;\n \t\t}\n \t\tif (protoB && protoB.constructor === null) {\n \t\t\tprotoB = null;\n \t\t}\n\n \t\t// Allow objects with no prototype to be equivalent to\n \t\t// objects with Object as their constructor.\n \t\tif (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {\n \t\t\treturn true;\n \t\t}\n\n \t\treturn false;\n \t}\n\n \tfunction getRegExpFlags(regexp) {\n \t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];\n \t}\n\n \tfunction isContainer(val) {\n \t\treturn [\"object\", \"array\", \"map\", \"set\"].indexOf(objectType(val)) !== -1;\n \t}\n\n \tfunction breadthFirstCompareChild(a, b) {\n\n \t\t// If a is a container not reference-equal to b, postpone the comparison to the\n \t\t// end of the pairs queue -- unless (a, b) has been seen before, in which case skip\n \t\t// over the pair.\n \t\tif (a === b) {\n \t\t\treturn true;\n \t\t}\n \t\tif (!isContainer(a)) {\n \t\t\treturn typeEquiv(a, b);\n \t\t}\n \t\tif (pairs.every(function (pair) {\n \t\t\treturn pair.a !== a || pair.b !== b;\n \t\t})) {\n\n \t\t\t// Not yet started comparing this pair\n \t\t\tpairs.push({ a: a, b: b });\n \t\t}\n \t\treturn true;\n \t}\n\n \tvar callbacks = {\n \t\t\"string\": useStrictEquality,\n \t\t\"boolean\": useStrictEquality,\n \t\t\"number\": useStrictEquality,\n \t\t\"null\": useStrictEquality,\n \t\t\"undefined\": useStrictEquality,\n \t\t\"symbol\": useStrictEquality,\n \t\t\"date\": useStrictEquality,\n\n \t\t\"nan\": function nan() {\n \t\t\treturn true;\n \t\t},\n\n \t\t\"regexp\": function regexp(a, b) {\n \t\t\treturn a.source === b.source &&\n\n \t\t\t// Include flags in the comparison\n \t\t\tgetRegExpFlags(a) === getRegExpFlags(b);\n \t\t},\n\n \t\t// abort (identical references / instance methods were skipped earlier)\n \t\t\"function\": function _function() {\n \t\t\treturn false;\n \t\t},\n\n \t\t\"array\": function array(a, b) {\n \t\t\tvar i, len;\n\n \t\t\tlen = a.length;\n \t\t\tif (len !== b.length) {\n\n \t\t\t\t// Safe and faster\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\tfor (i = 0; i < len; i++) {\n\n \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n \t\t\t\t\treturn false;\n \t\t\t\t}\n \t\t\t}\n \t\t\treturn true;\n \t\t},\n\n \t\t// Define sets a and b to be equivalent if for each element aVal in a, there\n \t\t// is some element bVal in b such that aVal and bVal are equivalent. Element\n \t\t// repetitions are not counted, so these are equivalent:\n \t\t// a = new Set( [ {}, [], [] ] );\n \t\t// b = new Set( [ {}, {}, [] ] );\n \t\t\"set\": function set$$1(a, b) {\n \t\t\tvar innerEq,\n \t\t\t outerEq = true;\n\n \t\t\tif (a.size !== b.size) {\n\n \t\t\t\t// This optimization has certain quirks because of the lack of\n \t\t\t\t// repetition counting. For instance, adding the same\n \t\t\t\t// (reference-identical) element to two equivalent sets can\n \t\t\t\t// make them non-equivalent.\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\ta.forEach(function (aVal) {\n\n \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n \t\t\t\t// with a break clause would be cleaner here, but it would cause\n \t\t\t\t// a syntax error on older Javascript implementations even if\n \t\t\t\t// Set is unused)\n \t\t\t\tif (!outerEq) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tinnerEq = false;\n\n \t\t\t\tb.forEach(function (bVal) {\n \t\t\t\t\tvar parentPairs;\n\n \t\t\t\t\t// Likewise, short-circuit if the result is already known\n \t\t\t\t\tif (innerEq) {\n \t\t\t\t\t\treturn;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n \t\t\t\t\t// innerEquiv will clobber its contents\n \t\t\t\t\tparentPairs = pairs;\n \t\t\t\t\tif (innerEquiv(bVal, aVal)) {\n \t\t\t\t\t\tinnerEq = true;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Replace the global pairs list\n \t\t\t\t\tpairs = parentPairs;\n \t\t\t\t});\n\n \t\t\t\tif (!innerEq) {\n \t\t\t\t\touterEq = false;\n \t\t\t\t}\n \t\t\t});\n\n \t\t\treturn outerEq;\n \t\t},\n\n \t\t// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)\n \t\t// in a, there is some key-value pair (bKey, bVal) in b such that\n \t\t// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not\n \t\t// counted, so these are equivalent:\n \t\t// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );\n \t\t// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );\n \t\t\"map\": function map(a, b) {\n \t\t\tvar innerEq,\n \t\t\t outerEq = true;\n\n \t\t\tif (a.size !== b.size) {\n\n \t\t\t\t// This optimization has certain quirks because of the lack of\n \t\t\t\t// repetition counting. For instance, adding the same\n \t\t\t\t// (reference-identical) key-value pair to two equivalent maps\n \t\t\t\t// can make them non-equivalent.\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\ta.forEach(function (aVal, aKey) {\n\n \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n \t\t\t\t// with a break clause would be cleaner here, but it would cause\n \t\t\t\t// a syntax error on older Javascript implementations even if\n \t\t\t\t// Map is unused)\n \t\t\t\tif (!outerEq) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tinnerEq = false;\n\n \t\t\t\tb.forEach(function (bVal, bKey) {\n \t\t\t\t\tvar parentPairs;\n\n \t\t\t\t\t// Likewise, short-circuit if the result is already known\n \t\t\t\t\tif (innerEq) {\n \t\t\t\t\t\treturn;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n \t\t\t\t\t// innerEquiv will clobber its contents\n \t\t\t\t\tparentPairs = pairs;\n \t\t\t\t\tif (innerEquiv([bVal, bKey], [aVal, aKey])) {\n \t\t\t\t\t\tinnerEq = true;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Replace the global pairs list\n \t\t\t\t\tpairs = parentPairs;\n \t\t\t\t});\n\n \t\t\t\tif (!innerEq) {\n \t\t\t\t\touterEq = false;\n \t\t\t\t}\n \t\t\t});\n\n \t\t\treturn outerEq;\n \t\t},\n\n \t\t\"object\": function object(a, b) {\n \t\t\tvar i,\n \t\t\t aProperties = [],\n \t\t\t bProperties = [];\n\n \t\t\tif (compareConstructors(a, b) === false) {\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n \t\t\tfor (i in a) {\n\n \t\t\t\t// Collect a's properties\n \t\t\t\taProperties.push(i);\n\n \t\t\t\t// Skip OOP methods that look the same\n \t\t\t\tif (a.constructor !== Object && typeof a.constructor !== \"undefined\" && typeof a[i] === \"function\" && typeof b[i] === \"function\" && a[i].toString() === b[i].toString()) {\n \t\t\t\t\tcontinue;\n \t\t\t\t}\n\n \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n \t\t\t\t\treturn false;\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tfor (i in b) {\n\n \t\t\t\t// Collect b's properties\n \t\t\t\tbProperties.push(i);\n \t\t\t}\n\n \t\t\t// Ensures identical properties name\n \t\t\treturn typeEquiv(aProperties.sort(), bProperties.sort());\n \t\t}\n \t};\n\n \tfunction typeEquiv(a, b) {\n \t\tvar type = objectType(a);\n\n \t\t// Callbacks for containers will append to the pairs queue to achieve breadth-first\n \t\t// search order. The pairs queue is also used to avoid reprocessing any pair of\n \t\t// containers that are reference-equal to a previously visited pair (a special case\n \t\t// this being recursion detection).\n \t\t//\n \t\t// Because of this approach, once typeEquiv returns a false value, it should not be\n \t\t// called again without clearing the pair queue else it may wrongly report a visited\n \t\t// pair as being equivalent.\n \t\treturn objectType(b) === type && callbacks[type](a, b);\n \t}\n\n \tfunction innerEquiv(a, b) {\n \t\tvar i, pair;\n\n \t\t// We're done when there's nothing more to compare\n \t\tif (arguments.length < 2) {\n \t\t\treturn true;\n \t\t}\n\n \t\t// Clear the global pair queue and add the top-level values being compared\n \t\tpairs = [{ a: a, b: b }];\n\n \t\tfor (i = 0; i < pairs.length; i++) {\n \t\t\tpair = pairs[i];\n\n \t\t\t// Perform type-specific comparison on any pairs that are not strictly\n \t\t\t// equal. For container types, that comparison will postpone comparison\n \t\t\t// of any sub-container pair to the end of the pair queue. This gives\n \t\t\t// breadth-first search order. It also avoids the reprocessing of\n \t\t\t// reference-equal siblings, cousins etc, which can have a significant speed\n \t\t\t// impact when comparing a container of small objects each of which has a\n \t\t\t// reference to the same (singleton) large object.\n \t\t\tif (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {\n \t\t\t\treturn false;\n \t\t\t}\n \t\t}\n\n \t\t// ...across all consecutive argument pairs\n \t\treturn arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));\n \t}\n\n \treturn innerEquiv;\n })();\n\n /**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\n var config = {\n\n \t// The queue of tests to run\n \tqueue: [],\n\n \t// Block until document ready\n \tblocking: true,\n\n \t// By default, run previously failed tests first\n \t// very useful in combination with \"Hide passed tests\" checked\n \treorder: true,\n\n \t// By default, modify document.title when suite is done\n \taltertitle: true,\n\n \t// HTML Reporter: collapse every test except the first failing test\n \t// If false, all failing tests will be expanded\n \tcollapse: true,\n\n \t// By default, scroll to top of the page when suite is done\n \tscrolltop: true,\n\n \t// Depth up-to which object will be dumped\n \tmaxDepth: 5,\n\n \t// When enabled, all tests must call expect()\n \trequireExpects: false,\n\n \t// Placeholder for user-configurable form-exposed URL parameters\n \turlConfig: [],\n\n \t// Set of all modules.\n \tmodules: [],\n\n \t// The first unnamed module\n \tcurrentModule: {\n \t\tname: \"\",\n \t\ttests: [],\n \t\tchildModules: [],\n \t\ttestsRun: 0\n \t},\n\n \tcallbacks: {},\n\n \t// The storage module to use for reordering tests\n \tstorage: localSessionStorage\n };\n\n // take a predefined QUnit.config and extend the defaults\n var globalConfig = window && window.QUnit && window.QUnit.config;\n\n // only extend the global config if there is no QUnit overload\n if (window && window.QUnit && !window.QUnit.version) {\n \textend(config, globalConfig);\n }\n\n // Push a loose unnamed module to the modules collection\n config.modules.push(config.currentModule);\n\n // Based on jsDump by Ariel Flesler\n // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\n var dump = (function () {\n \tfunction quote(str) {\n \t\treturn \"\\\"\" + str.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + \"\\\"\";\n \t}\n \tfunction literal(o) {\n \t\treturn o + \"\";\n \t}\n \tfunction join(pre, arr, post) {\n \t\tvar s = dump.separator(),\n \t\t base = dump.indent(),\n \t\t inner = dump.indent(1);\n \t\tif (arr.join) {\n \t\t\tarr = arr.join(\",\" + s + inner);\n \t\t}\n \t\tif (!arr) {\n \t\t\treturn pre + post;\n \t\t}\n \t\treturn [pre, inner + arr, base + post].join(s);\n \t}\n \tfunction array(arr, stack) {\n \t\tvar i = arr.length,\n \t\t ret = new Array(i);\n\n \t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n \t\t\treturn \"[object Array]\";\n \t\t}\n\n \t\tthis.up();\n \t\twhile (i--) {\n \t\t\tret[i] = this.parse(arr[i], undefined, stack);\n \t\t}\n \t\tthis.down();\n \t\treturn join(\"[\", ret, \"]\");\n \t}\n\n \tfunction isArray(obj) {\n \t\treturn (\n\n \t\t\t//Native Arrays\n \t\t\ttoString.call(obj) === \"[object Array]\" ||\n\n \t\t\t// NodeList objects\n \t\t\ttypeof obj.length === \"number\" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)\n \t\t);\n \t}\n\n \tvar reName = /^function (\\w+)/,\n \t dump = {\n\n \t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n \t\tparse: function parse(obj, objType, stack) {\n \t\t\tstack = stack || [];\n \t\t\tvar res,\n \t\t\t parser,\n \t\t\t parserType,\n \t\t\t objIndex = stack.indexOf(obj);\n\n \t\t\tif (objIndex !== -1) {\n \t\t\t\treturn \"recursion(\" + (objIndex - stack.length) + \")\";\n \t\t\t}\n\n \t\t\tobjType = objType || this.typeOf(obj);\n \t\t\tparser = this.parsers[objType];\n \t\t\tparserType = typeof parser === \"undefined\" ? \"undefined\" : _typeof(parser);\n\n \t\t\tif (parserType === \"function\") {\n \t\t\t\tstack.push(obj);\n \t\t\t\tres = parser.call(this, obj, stack);\n \t\t\t\tstack.pop();\n \t\t\t\treturn res;\n \t\t\t}\n \t\t\treturn parserType === \"string\" ? parser : this.parsers.error;\n \t\t},\n \t\ttypeOf: function typeOf(obj) {\n \t\t\tvar type;\n\n \t\t\tif (obj === null) {\n \t\t\t\ttype = \"null\";\n \t\t\t} else if (typeof obj === \"undefined\") {\n \t\t\t\ttype = \"undefined\";\n \t\t\t} else if (is(\"regexp\", obj)) {\n \t\t\t\ttype = \"regexp\";\n \t\t\t} else if (is(\"date\", obj)) {\n \t\t\t\ttype = \"date\";\n \t\t\t} else if (is(\"function\", obj)) {\n \t\t\t\ttype = \"function\";\n \t\t\t} else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {\n \t\t\t\ttype = \"window\";\n \t\t\t} else if (obj.nodeType === 9) {\n \t\t\t\ttype = \"document\";\n \t\t\t} else if (obj.nodeType) {\n \t\t\t\ttype = \"node\";\n \t\t\t} else if (isArray(obj)) {\n \t\t\t\ttype = \"array\";\n \t\t\t} else if (obj.constructor === Error.prototype.constructor) {\n \t\t\t\ttype = \"error\";\n \t\t\t} else {\n \t\t\t\ttype = typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n \t\t\t}\n \t\t\treturn type;\n \t\t},\n\n \t\tseparator: function separator() {\n \t\t\tif (this.multiline) {\n \t\t\t\treturn this.HTML ? \"<br />\" : \"\\n\";\n \t\t\t} else {\n \t\t\t\treturn this.HTML ? \" \" : \" \";\n \t\t\t}\n \t\t},\n\n \t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n \t\tindent: function indent(extra) {\n \t\t\tif (!this.multiline) {\n \t\t\t\treturn \"\";\n \t\t\t}\n \t\t\tvar chr = this.indentChar;\n \t\t\tif (this.HTML) {\n \t\t\t\tchr = chr.replace(/\\t/g, \" \").replace(/ /g, \" \");\n \t\t\t}\n \t\t\treturn new Array(this.depth + (extra || 0)).join(chr);\n \t\t},\n \t\tup: function up(a) {\n \t\t\tthis.depth += a || 1;\n \t\t},\n \t\tdown: function down(a) {\n \t\t\tthis.depth -= a || 1;\n \t\t},\n \t\tsetParser: function setParser(name, parser) {\n \t\t\tthis.parsers[name] = parser;\n \t\t},\n\n \t\t// The next 3 are exposed so you can use them\n \t\tquote: quote,\n \t\tliteral: literal,\n \t\tjoin: join,\n \t\tdepth: 1,\n \t\tmaxDepth: config.maxDepth,\n\n \t\t// This is the list of parsers, to modify them, use dump.setParser\n \t\tparsers: {\n \t\t\twindow: \"[Window]\",\n \t\t\tdocument: \"[Document]\",\n \t\t\terror: function error(_error) {\n \t\t\t\treturn \"Error(\\\"\" + _error.message + \"\\\")\";\n \t\t\t},\n \t\t\tunknown: \"[Unknown]\",\n \t\t\t\"null\": \"null\",\n \t\t\t\"undefined\": \"undefined\",\n \t\t\t\"function\": function _function(fn) {\n \t\t\t\tvar ret = \"function\",\n\n\n \t\t\t\t// Functions never have name in IE\n \t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n \t\t\t\tif (name) {\n \t\t\t\t\tret += \" \" + name;\n \t\t\t\t}\n \t\t\t\tret += \"(\";\n\n \t\t\t\tret = [ret, dump.parse(fn, \"functionArgs\"), \"){\"].join(\"\");\n \t\t\t\treturn join(ret, dump.parse(fn, \"functionCode\"), \"}\");\n \t\t\t},\n \t\t\tarray: array,\n \t\t\tnodelist: array,\n \t\t\t\"arguments\": array,\n \t\t\tobject: function object(map, stack) {\n \t\t\t\tvar keys,\n \t\t\t\t key,\n \t\t\t\t val,\n \t\t\t\t i,\n \t\t\t\t nonEnumerableProperties,\n \t\t\t\t ret = [];\n\n \t\t\t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n \t\t\t\t\treturn \"[object Object]\";\n \t\t\t\t}\n\n \t\t\t\tdump.up();\n \t\t\t\tkeys = [];\n \t\t\t\tfor (key in map) {\n \t\t\t\t\tkeys.push(key);\n \t\t\t\t}\n\n \t\t\t\t// Some properties are not always enumerable on Error objects.\n \t\t\t\tnonEnumerableProperties = [\"message\", \"name\"];\n \t\t\t\tfor (i in nonEnumerableProperties) {\n \t\t\t\t\tkey = nonEnumerableProperties[i];\n \t\t\t\t\tif (key in map && !inArray(key, keys)) {\n \t\t\t\t\t\tkeys.push(key);\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tkeys.sort();\n \t\t\t\tfor (i = 0; i < keys.length; i++) {\n \t\t\t\t\tkey = keys[i];\n \t\t\t\t\tval = map[key];\n \t\t\t\t\tret.push(dump.parse(key, \"key\") + \": \" + dump.parse(val, undefined, stack));\n \t\t\t\t}\n \t\t\t\tdump.down();\n \t\t\t\treturn join(\"{\", ret, \"}\");\n \t\t\t},\n \t\t\tnode: function node(_node) {\n \t\t\t\tvar len,\n \t\t\t\t i,\n \t\t\t\t val,\n \t\t\t\t open = dump.HTML ? \"<\" : \"<\",\n \t\t\t\t close = dump.HTML ? \">\" : \">\",\n \t\t\t\t tag = _node.nodeName.toLowerCase(),\n \t\t\t\t ret = open + tag,\n \t\t\t\t attrs = _node.attributes;\n\n \t\t\t\tif (attrs) {\n \t\t\t\t\tfor (i = 0, len = attrs.length; i < len; i++) {\n \t\t\t\t\t\tval = attrs[i].nodeValue;\n\n \t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n \t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n \t\t\t\t\t\t// \"inherit\".\n \t\t\t\t\t\tif (val && val !== \"inherit\") {\n \t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + dump.parse(val, \"attribute\");\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tret += close;\n\n \t\t\t\t// Show content of TextNode or CDATASection\n \t\t\t\tif (_node.nodeType === 3 || _node.nodeType === 4) {\n \t\t\t\t\tret += _node.nodeValue;\n \t\t\t\t}\n\n \t\t\t\treturn ret + open + \"/\" + tag + close;\n \t\t\t},\n\n \t\t\t// Function calls it internally, it's the arguments part of the function\n \t\t\tfunctionArgs: function functionArgs(fn) {\n \t\t\t\tvar args,\n \t\t\t\t l = fn.length;\n\n \t\t\t\tif (!l) {\n \t\t\t\t\treturn \"\";\n \t\t\t\t}\n\n \t\t\t\targs = new Array(l);\n \t\t\t\twhile (l--) {\n\n \t\t\t\t\t// 97 is 'a'\n \t\t\t\t\targs[l] = String.fromCharCode(97 + l);\n \t\t\t\t}\n \t\t\t\treturn \" \" + args.join(\", \") + \" \";\n \t\t\t},\n\n \t\t\t// Object calls it internally, the key part of an item in a map\n \t\t\tkey: quote,\n\n \t\t\t// Function calls it internally, it's the content of the function\n \t\t\tfunctionCode: \"[code]\",\n\n \t\t\t// Node calls it internally, it's a html attribute value\n \t\t\tattribute: quote,\n \t\t\tstring: quote,\n \t\t\tdate: quote,\n \t\t\tregexp: literal,\n \t\t\tnumber: literal,\n \t\t\t\"boolean\": literal,\n \t\t\tsymbol: function symbol(sym) {\n \t\t\t\treturn sym.toString();\n \t\t\t}\n \t\t},\n\n \t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n \t\tHTML: false,\n\n \t\t// Indentation unit\n \t\tindentChar: \" \",\n\n \t\t// If true, items in a collection, are separated by a \\n, else just a space.\n \t\tmultiline: true\n \t};\n\n \treturn dump;\n })();\n\n var LISTENERS = Object.create(null);\n var SUPPORTED_EVENTS = [\"runStart\", \"suiteStart\", \"testStart\", \"assertion\", \"testEnd\", \"suiteEnd\", \"runEnd\"];\n\n /**\n * Emits an event with the specified data to all currently registered listeners.\n * Callbacks will fire in the order in which they are registered (FIFO). This\n * function is not exposed publicly; it is used by QUnit internals to emit\n * logging events.\n *\n * @private\n * @method emit\n * @param {String} eventName\n * @param {Object} data\n * @return {Void}\n */\n function emit(eventName, data) {\n \tif (objectType(eventName) !== \"string\") {\n \t\tthrow new TypeError(\"eventName must be a string when emitting an event\");\n \t}\n\n \t// Clone the callbacks in case one of them registers a new callback\n \tvar originalCallbacks = LISTENERS[eventName];\n \tvar callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];\n\n \tfor (var i = 0; i < callbacks.length; i++) {\n \t\tcallbacks[i](data);\n \t}\n }\n\n /**\n * Registers a callback as a listener to the specified event.\n *\n * @public\n * @method on\n * @param {String} eventName\n * @param {Function} callback\n * @return {Void}\n */\n function on(eventName, callback) {\n \tif (objectType(eventName) !== \"string\") {\n \t\tthrow new TypeError(\"eventName must be a string when registering a listener\");\n \t} else if (!inArray(eventName, SUPPORTED_EVENTS)) {\n \t\tvar events = SUPPORTED_EVENTS.join(\", \");\n \t\tthrow new Error(\"\\\"\" + eventName + \"\\\" is not a valid event; must be one of: \" + events + \".\");\n \t} else if (objectType(callback) !== \"function\") {\n \t\tthrow new TypeError(\"callback must be a function when registering a listener\");\n \t}\n\n \tif (!LISTENERS[eventName]) {\n \t\tLISTENERS[eventName] = [];\n \t}\n\n \t// Don't register the same callback more than once\n \tif (!inArray(callback, LISTENERS[eventName])) {\n \t\tLISTENERS[eventName].push(callback);\n \t}\n }\n\n // Register logging callbacks\n function registerLoggingCallbacks(obj) {\n \tvar i,\n \t l,\n \t key,\n \t callbackNames = [\"begin\", \"done\", \"log\", \"testStart\", \"testDone\", \"moduleStart\", \"moduleDone\"];\n\n \tfunction registerLoggingCallback(key) {\n \t\tvar loggingCallback = function loggingCallback(callback) {\n \t\t\tif (objectType(callback) !== \"function\") {\n \t\t\t\tthrow new Error(\"QUnit logging methods require a callback function as their first parameters.\");\n \t\t\t}\n\n \t\t\tconfig.callbacks[key].push(callback);\n \t\t};\n\n \t\treturn loggingCallback;\n \t}\n\n \tfor (i = 0, l = callbackNames.length; i < l; i++) {\n \t\tkey = callbackNames[i];\n\n \t\t// Initialize key collection of logging callback\n \t\tif (objectType(config.callbacks[key]) === \"undefined\") {\n \t\t\tconfig.callbacks[key] = [];\n \t\t}\n\n \t\tobj[key] = registerLoggingCallback(key);\n \t}\n }\n\n function runLoggingCallbacks(key, args) {\n \tvar i, l, callbacks;\n\n \tcallbacks = config.callbacks[key];\n \tfor (i = 0, l = callbacks.length; i < l; i++) {\n \t\tcallbacks[i](args);\n \t}\n }\n\n // Doesn't support IE9, it will return undefined on these browsers\n // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n var fileName = (sourceFromStacktrace(0) || \"\").replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\");\n\n function extractStacktrace(e, offset) {\n \toffset = offset === undefined ? 4 : offset;\n\n \tvar stack, include, i;\n\n \tif (e && e.stack) {\n \t\tstack = e.stack.split(\"\\n\");\n \t\tif (/^error$/i.test(stack[0])) {\n \t\t\tstack.shift();\n \t\t}\n \t\tif (fileName) {\n \t\t\tinclude = [];\n \t\t\tfor (i = offset; i < stack.length; i++) {\n \t\t\t\tif (stack[i].indexOf(fileName) !== -1) {\n \t\t\t\t\tbreak;\n \t\t\t\t}\n \t\t\t\tinclude.push(stack[i]);\n \t\t\t}\n \t\t\tif (include.length) {\n \t\t\t\treturn include.join(\"\\n\");\n \t\t\t}\n \t\t}\n \t\treturn stack[offset];\n \t}\n }\n\n function sourceFromStacktrace(offset) {\n \tvar error = new Error();\n\n \t// Support: Safari <=7 only, IE <=10 - 11 only\n \t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n \tif (!error.stack) {\n \t\ttry {\n \t\t\tthrow error;\n \t\t} catch (err) {\n \t\t\terror = err;\n \t\t}\n \t}\n\n \treturn extractStacktrace(error, offset);\n }\n\n var priorityCount = 0;\n var unitSampler = void 0;\n\n /**\n * Advances the ProcessingQueue to the next item if it is ready.\n * @param {Boolean} last\n */\n function advance() {\n \tvar start = now();\n \tconfig.depth = (config.depth || 0) + 1;\n\n \twhile (config.queue.length && !config.blocking) {\n \t\tvar elapsedTime = now() - start;\n\n \t\tif (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {\n \t\t\tif (priorityCount > 0) {\n \t\t\t\tpriorityCount--;\n \t\t\t}\n\n \t\t\tconfig.queue.shift()();\n \t\t} else {\n \t\t\tsetTimeout(advance, 13);\n \t\t\tbreak;\n \t\t}\n \t}\n\n \tconfig.depth--;\n\n \tif (!config.blocking && !config.queue.length && config.depth === 0) {\n \t\tdone();\n \t}\n }\n\n function addToQueueImmediate(callback) {\n \tif (objectType(callback) === \"array\") {\n \t\twhile (callback.length) {\n \t\t\taddToQueueImmediate(callback.pop());\n \t\t}\n\n \t\treturn;\n \t}\n\n \tconfig.queue.unshift(callback);\n \tpriorityCount++;\n }\n\n /**\n * Adds a function to the ProcessingQueue for execution.\n * @param {Function|Array} callback\n * @param {Boolean} priority\n * @param {String} seed\n */\n function addToQueue(callback, prioritize, seed) {\n \tif (prioritize) {\n \t\tconfig.queue.splice(priorityCount++, 0, callback);\n \t} else if (seed) {\n \t\tif (!unitSampler) {\n \t\t\tunitSampler = unitSamplerGenerator(seed);\n \t\t}\n\n \t\t// Insert into a random position after all prioritized items\n \t\tvar index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));\n \t\tconfig.queue.splice(priorityCount + index, 0, callback);\n \t} else {\n \t\tconfig.queue.push(callback);\n \t}\n }\n\n /**\n * Creates a seeded \"sample\" generator which is used for randomizing tests.\n */\n function unitSamplerGenerator(seed) {\n\n \t// 32-bit xorshift, requires only a nonzero seed\n \t// http://excamera.com/sphinx/article-xorshift.html\n \tvar sample = parseInt(generateHash(seed), 16) || -1;\n \treturn function () {\n \t\tsample ^= sample << 13;\n \t\tsample ^= sample >>> 17;\n \t\tsample ^= sample << 5;\n\n \t\t// ECMAScript has no unsigned number type\n \t\tif (sample < 0) {\n \t\t\tsample += 0x100000000;\n \t\t}\n\n \t\treturn sample / 0x100000000;\n \t};\n }\n\n /**\n * This function is called when the ProcessingQueue is done processing all\n * items. It handles emitting the final run events.\n */\n function done() {\n \tvar storage = config.storage;\n\n \tProcessingQueue.finished = true;\n\n \tvar runtime = now() - config.started;\n \tvar passed = config.stats.all - config.stats.bad;\n\n \temit(\"runEnd\", globalSuite.end(true));\n \trunLoggingCallbacks(\"done\", {\n \t\tpassed: passed,\n \t\tfailed: config.stats.bad,\n \t\ttotal: config.stats.all,\n \t\truntime: runtime\n \t});\n\n \t// Clear own storage items if all tests passed\n \tif (storage && config.stats.bad === 0) {\n \t\tfor (var i = storage.length - 1; i >= 0; i--) {\n \t\t\tvar key = storage.key(i);\n\n \t\t\tif (key.indexOf(\"qunit-test-\") === 0) {\n \t\t\t\tstorage.removeItem(key);\n \t\t\t}\n \t\t}\n \t}\n }\n\n var ProcessingQueue = {\n \tfinished: false,\n \tadd: addToQueue,\n \taddImmediate: addToQueueImmediate,\n \tadvance: advance\n };\n\n var TestReport = function () {\n \tfunction TestReport(name, suite, options) {\n \t\tclassCallCheck(this, TestReport);\n\n \t\tthis.name = name;\n \t\tthis.suiteName = suite.name;\n \t\tthis.fullName = suite.fullName.concat(name);\n \t\tthis.runtime = 0;\n \t\tthis.assertions = [];\n\n \t\tthis.skipped = !!options.skip;\n \t\tthis.todo = !!options.todo;\n\n \t\tthis.valid = options.valid;\n\n \t\tthis._startTime = 0;\n \t\tthis._endTime = 0;\n\n \t\tsuite.pushTest(this);\n \t}\n\n \tcreateClass(TestReport, [{\n \t\tkey: \"start\",\n \t\tvalue: function start(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._startTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tsuiteName: this.suiteName,\n \t\t\t\tfullName: this.fullName.slice()\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"end\",\n \t\tvalue: function end(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._endTime = Date.now();\n \t\t\t}\n\n \t\t\treturn extend(this.start(), {\n \t\t\t\truntime: this.getRuntime(),\n \t\t\t\tstatus: this.getStatus(),\n \t\t\t\terrors: this.getFailedAssertions(),\n \t\t\t\tassertions: this.getAssertions()\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"pushAssertion\",\n \t\tvalue: function pushAssertion(assertion) {\n \t\t\tthis.assertions.push(assertion);\n \t\t}\n \t}, {\n \t\tkey: \"getRuntime\",\n \t\tvalue: function getRuntime() {\n \t\t\treturn this._endTime - this._startTime;\n \t\t}\n \t}, {\n \t\tkey: \"getStatus\",\n \t\tvalue: function getStatus() {\n \t\t\tif (this.skipped) {\n \t\t\t\treturn \"skipped\";\n \t\t\t}\n\n \t\t\tvar testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;\n\n \t\t\tif (!testPassed) {\n \t\t\t\treturn \"failed\";\n \t\t\t} else if (this.todo) {\n \t\t\t\treturn \"todo\";\n \t\t\t} else {\n \t\t\t\treturn \"passed\";\n \t\t\t}\n \t\t}\n \t}, {\n \t\tkey: \"getFailedAssertions\",\n \t\tvalue: function getFailedAssertions() {\n \t\t\treturn this.assertions.filter(function (assertion) {\n \t\t\t\treturn !assertion.passed;\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"getAssertions\",\n \t\tvalue: function getAssertions() {\n \t\t\treturn this.assertions.slice();\n \t\t}\n\n \t\t// Remove actual and expected values from assertions. This is to prevent\n \t\t// leaking memory throughout a test suite.\n\n \t}, {\n \t\tkey: \"slimAssertions\",\n \t\tvalue: function slimAssertions() {\n \t\t\tthis.assertions = this.assertions.map(function (assertion) {\n \t\t\t\tdelete assertion.actual;\n \t\t\t\tdelete assertion.expected;\n \t\t\t\treturn assertion;\n \t\t\t});\n \t\t}\n \t}]);\n \treturn TestReport;\n }();\n\n var focused = false;\n\n function Test(settings) {\n \tvar i, l;\n\n \t++Test.count;\n\n \tthis.expected = null;\n \textend(this, settings);\n \tthis.assertions = [];\n \tthis.semaphore = 0;\n \tthis.module = config.currentModule;\n \tthis.stack = sourceFromStacktrace(3);\n \tthis.steps = [];\n\n \tthis.testReport = new TestReport(settings.testName, this.module.suiteReport, {\n \t\ttodo: settings.todo,\n \t\tskip: settings.skip,\n \t\tvalid: this.valid()\n \t});\n\n \t// Register unique strings\n \tfor (i = 0, l = this.module.tests; i < l.length; i++) {\n \t\tif (this.module.tests[i].name === this.testName) {\n \t\t\tthis.testName += \" \";\n \t\t}\n \t}\n\n \tthis.testId = generateHash(this.module.name, this.testName);\n\n \tthis.module.tests.push({\n \t\tname: this.testName,\n \t\ttestId: this.testId\n \t});\n\n \tif (settings.skip) {\n\n \t\t// Skipped tests will fully ignore any sent callback\n \t\tthis.callback = function () {};\n \t\tthis.async = false;\n \t\tthis.expected = 0;\n \t} else {\n \t\tthis.assert = new Assert(this);\n \t}\n }\n\n Test.count = 0;\n\n function getNotStartedModules(startModule) {\n \tvar module = startModule,\n \t modules = [];\n\n \twhile (module && module.testsRun === 0) {\n \t\tmodules.push(module);\n \t\tmodule = module.parentModule;\n \t}\n\n \treturn modules;\n }\n\n Test.prototype = {\n \tbefore: function before() {\n \t\tvar i,\n \t\t startModule,\n \t\t module = this.module,\n \t\t notStartedModules = getNotStartedModules(module);\n\n \t\tfor (i = notStartedModules.length - 1; i >= 0; i--) {\n \t\t\tstartModule = notStartedModules[i];\n \t\t\tstartModule.stats = { all: 0, bad: 0, started: now() };\n \t\t\temit(\"suiteStart\", startModule.suiteReport.start(true));\n \t\t\trunLoggingCallbacks(\"moduleStart\", {\n \t\t\t\tname: startModule.name,\n \t\t\t\ttests: startModule.tests\n \t\t\t});\n \t\t}\n\n \t\tconfig.current = this;\n\n \t\tthis.testEnvironment = extend({}, module.testEnvironment);\n\n \t\tthis.started = now();\n \t\temit(\"testStart\", this.testReport.start(true));\n \t\trunLoggingCallbacks(\"testStart\", {\n \t\t\tname: this.testName,\n \t\t\tmodule: module.name,\n \t\t\ttestId: this.testId,\n \t\t\tpreviousFailure: this.previousFailure\n \t\t});\n\n \t\tif (!config.pollution) {\n \t\t\tsaveGlobal();\n \t\t}\n \t},\n\n \trun: function run() {\n \t\tvar promise;\n\n \t\tconfig.current = this;\n\n \t\tthis.callbackStarted = now();\n\n \t\tif (config.notrycatch) {\n \t\t\trunTest(this);\n \t\t\treturn;\n \t\t}\n\n \t\ttry {\n \t\t\trunTest(this);\n \t\t} catch (e) {\n \t\t\tthis.pushFailure(\"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + (e.message || e), extractStacktrace(e, 0));\n\n \t\t\t// Else next test will carry the responsibility\n \t\t\tsaveGlobal();\n\n \t\t\t// Restart the tests if they're blocking\n \t\t\tif (config.blocking) {\n \t\t\t\tinternalRecover(this);\n \t\t\t}\n \t\t}\n\n \t\tfunction runTest(test) {\n \t\t\tpromise = test.callback.call(test.testEnvironment, test.assert);\n \t\t\ttest.resolvePromise(promise);\n \t\t}\n \t},\n\n \tafter: function after() {\n \t\tcheckPollution();\n \t},\n\n \tqueueHook: function queueHook(hook, hookName, hookOwner) {\n \t\tvar promise,\n \t\t test = this;\n \t\treturn function runHook() {\n \t\t\tif (hookName === \"before\") {\n \t\t\t\tif (hookOwner.testsRun !== 0) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\ttest.preserveEnvironment = true;\n \t\t\t}\n\n \t\t\tif (hookName === \"after\" && hookOwner.testsRun !== numberOfTests(hookOwner) - 1 && config.queue.length > 2) {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tconfig.current = test;\n \t\t\tif (config.notrycatch) {\n \t\t\t\tcallHook();\n \t\t\t\treturn;\n \t\t\t}\n \t\t\ttry {\n \t\t\t\tcallHook();\n \t\t\t} catch (error) {\n \t\t\t\ttest.pushFailure(hookName + \" failed on \" + test.testName + \": \" + (error.message || error), extractStacktrace(error, 0));\n \t\t\t}\n\n \t\t\tfunction callHook() {\n \t\t\t\tpromise = hook.call(test.testEnvironment, test.assert);\n \t\t\t\ttest.resolvePromise(promise, hookName);\n \t\t\t}\n \t\t};\n \t},\n\n \t// Currently only used for module level hooks, can be used to add global level ones\n \thooks: function hooks(handler) {\n \t\tvar hooks = [];\n\n \t\tfunction processHooks(test, module) {\n \t\t\tif (module.parentModule) {\n \t\t\t\tprocessHooks(test, module.parentModule);\n \t\t\t}\n \t\t\tif (module.hooks && objectType(module.hooks[handler]) === \"function\") {\n \t\t\t\thooks.push(test.queueHook(module.hooks[handler], handler, module));\n \t\t\t}\n \t\t}\n\n \t\t// Hooks are ignored on skipped tests\n \t\tif (!this.skip) {\n \t\t\tprocessHooks(this, this.module);\n \t\t}\n \t\treturn hooks;\n \t},\n\n \tfinish: function finish() {\n \t\tconfig.current = this;\n \t\tif (config.requireExpects && this.expected === null) {\n \t\t\tthis.pushFailure(\"Expected number of assertions to be defined, but expect() was \" + \"not called.\", this.stack);\n \t\t} else if (this.expected !== null && this.expected !== this.assertions.length) {\n \t\t\tthis.pushFailure(\"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack);\n \t\t} else if (this.expected === null && !this.assertions.length) {\n \t\t\tthis.pushFailure(\"Expected at least one assertion, but none were run - call \" + \"expect(0) to accept zero assertions.\", this.stack);\n \t\t}\n\n \t\tvar i,\n \t\t module = this.module,\n \t\t moduleName = module.name,\n \t\t testName = this.testName,\n \t\t skipped = !!this.skip,\n \t\t todo = !!this.todo,\n \t\t bad = 0,\n \t\t storage = config.storage;\n\n \t\tthis.runtime = now() - this.started;\n\n \t\tconfig.stats.all += this.assertions.length;\n \t\tmodule.stats.all += this.assertions.length;\n\n \t\tfor (i = 0; i < this.assertions.length; i++) {\n \t\t\tif (!this.assertions[i].result) {\n \t\t\t\tbad++;\n \t\t\t\tconfig.stats.bad++;\n \t\t\t\tmodule.stats.bad++;\n \t\t\t}\n \t\t}\n\n \t\tnotifyTestsRan(module);\n\n \t\t// Store result when possible\n \t\tif (storage) {\n \t\t\tif (bad) {\n \t\t\t\tstorage.setItem(\"qunit-test-\" + moduleName + \"-\" + testName, bad);\n \t\t\t} else {\n \t\t\t\tstorage.removeItem(\"qunit-test-\" + moduleName + \"-\" + testName);\n \t\t\t}\n \t\t}\n\n \t\t// After emitting the js-reporters event we cleanup the assertion data to\n \t\t// avoid leaking it. It is not used by the legacy testDone callbacks.\n \t\temit(\"testEnd\", this.testReport.end(true));\n \t\tthis.testReport.slimAssertions();\n\n \t\trunLoggingCallbacks(\"testDone\", {\n \t\t\tname: testName,\n \t\t\tmodule: moduleName,\n \t\t\tskipped: skipped,\n \t\t\ttodo: todo,\n \t\t\tfailed: bad,\n \t\t\tpassed: this.assertions.length - bad,\n \t\t\ttotal: this.assertions.length,\n \t\t\truntime: skipped ? 0 : this.runtime,\n\n \t\t\t// HTML Reporter use\n \t\t\tassertions: this.assertions,\n \t\t\ttestId: this.testId,\n\n \t\t\t// Source of Test\n \t\t\tsource: this.stack\n \t\t});\n\n \t\tif (module.testsRun === numberOfTests(module)) {\n \t\t\tlogSuiteEnd(module);\n\n \t\t\t// Check if the parent modules, iteratively, are done. If that the case,\n \t\t\t// we emit the `suiteEnd` event and trigger `moduleDone` callback.\n \t\t\tvar parent = module.parentModule;\n \t\t\twhile (parent && parent.testsRun === numberOfTests(parent)) {\n \t\t\t\tlogSuiteEnd(parent);\n \t\t\t\tparent = parent.parentModule;\n \t\t\t}\n \t\t}\n\n \t\tconfig.current = undefined;\n\n \t\tfunction logSuiteEnd(module) {\n \t\t\temit(\"suiteEnd\", module.suiteReport.end(true));\n \t\t\trunLoggingCallbacks(\"moduleDone\", {\n \t\t\t\tname: module.name,\n \t\t\t\ttests: module.tests,\n \t\t\t\tfailed: module.stats.bad,\n \t\t\t\tpassed: module.stats.all - module.stats.bad,\n \t\t\t\ttotal: module.stats.all,\n \t\t\t\truntime: now() - module.stats.started\n \t\t\t});\n \t\t}\n \t},\n\n \tpreserveTestEnvironment: function preserveTestEnvironment() {\n \t\tif (this.preserveEnvironment) {\n \t\t\tthis.module.testEnvironment = this.testEnvironment;\n \t\t\tthis.testEnvironment = extend({}, this.module.testEnvironment);\n \t\t}\n \t},\n\n \tqueue: function queue() {\n \t\tvar test = this;\n\n \t\tif (!this.valid()) {\n \t\t\treturn;\n \t\t}\n\n \t\tfunction runTest() {\n\n \t\t\t// Each of these can by async\n \t\t\tProcessingQueue.addImmediate([function () {\n \t\t\t\ttest.before();\n \t\t\t}, test.hooks(\"before\"), function () {\n \t\t\t\ttest.preserveTestEnvironment();\n \t\t\t}, test.hooks(\"beforeEach\"), function () {\n \t\t\t\ttest.run();\n \t\t\t}, test.hooks(\"afterEach\").reverse(), test.hooks(\"after\").reverse(), function () {\n \t\t\t\ttest.after();\n \t\t\t}, function () {\n \t\t\t\ttest.finish();\n \t\t\t}]);\n \t\t}\n\n \t\tvar previousFailCount = config.storage && +config.storage.getItem(\"qunit-test-\" + this.module.name + \"-\" + this.testName);\n\n \t\t// Prioritize previously failed tests, detected from storage\n \t\tvar prioritize = config.reorder && !!previousFailCount;\n\n \t\tthis.previousFailure = !!previousFailCount;\n\n \t\tProcessingQueue.add(runTest, prioritize, config.seed);\n\n \t\t// If the queue has already finished, we manually process the new test\n \t\tif (ProcessingQueue.finished) {\n \t\t\tProcessingQueue.advance();\n \t\t}\n \t},\n\n\n \tpushResult: function pushResult(resultInfo) {\n \t\tif (this !== config.current) {\n \t\t\tthrow new Error(\"Assertion occured after test had finished.\");\n \t\t}\n\n \t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n \t\tvar source,\n \t\t details = {\n \t\t\tmodule: this.module.name,\n \t\t\tname: this.testName,\n \t\t\tresult: resultInfo.result,\n \t\t\tmessage: resultInfo.message,\n \t\t\tactual: resultInfo.actual,\n \t\t\texpected: resultInfo.expected,\n \t\t\ttestId: this.testId,\n \t\t\tnegative: resultInfo.negative || false,\n \t\t\truntime: now() - this.started,\n \t\t\ttodo: !!this.todo\n \t\t};\n\n \t\tif (!resultInfo.result) {\n \t\t\tsource = resultInfo.source || sourceFromStacktrace();\n\n \t\t\tif (source) {\n \t\t\t\tdetails.source = source;\n \t\t\t}\n \t\t}\n\n \t\tthis.logAssertion(details);\n\n \t\tthis.assertions.push({\n \t\t\tresult: !!resultInfo.result,\n \t\t\tmessage: resultInfo.message\n \t\t});\n \t},\n\n \tpushFailure: function pushFailure(message, source, actual) {\n \t\tif (!(this instanceof Test)) {\n \t\t\tthrow new Error(\"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2));\n \t\t}\n\n \t\tthis.pushResult({\n \t\t\tresult: false,\n \t\t\tmessage: message || \"error\",\n \t\t\tactual: actual || null,\n \t\t\texpected: null,\n \t\t\tsource: source\n \t\t});\n \t},\n\n \t/**\n * Log assertion details using both the old QUnit.log interface and\n * QUnit.on( \"assertion\" ) interface.\n *\n * @private\n */\n \tlogAssertion: function logAssertion(details) {\n \t\trunLoggingCallbacks(\"log\", details);\n\n \t\tvar assertion = {\n \t\t\tpassed: details.result,\n \t\t\tactual: details.actual,\n \t\t\texpected: details.expected,\n \t\t\tmessage: details.message,\n \t\t\tstack: details.source,\n \t\t\ttodo: details.todo\n \t\t};\n \t\tthis.testReport.pushAssertion(assertion);\n \t\temit(\"assertion\", assertion);\n \t},\n\n\n \tresolvePromise: function resolvePromise(promise, phase) {\n \t\tvar then,\n \t\t resume,\n \t\t message,\n \t\t test = this;\n \t\tif (promise != null) {\n \t\t\tthen = promise.then;\n \t\t\tif (objectType(then) === \"function\") {\n \t\t\t\tresume = internalStop(test);\n \t\t\t\tthen.call(promise, function () {\n \t\t\t\t\tresume();\n \t\t\t\t}, function (error) {\n \t\t\t\t\tmessage = \"Promise rejected \" + (!phase ? \"during\" : phase.replace(/Each$/, \"\")) + \" \\\"\" + test.testName + \"\\\": \" + (error && error.message || error);\n \t\t\t\t\ttest.pushFailure(message, extractStacktrace(error, 0));\n\n \t\t\t\t\t// Else next test will carry the responsibility\n \t\t\t\t\tsaveGlobal();\n\n \t\t\t\t\t// Unblock\n \t\t\t\t\tresume();\n \t\t\t\t});\n \t\t\t}\n \t\t}\n \t},\n\n \tvalid: function valid() {\n \t\tvar filter = config.filter,\n \t\t regexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec(filter),\n \t\t module = config.module && config.module.toLowerCase(),\n \t\t fullName = this.module.name + \": \" + this.testName;\n\n \t\tfunction moduleChainNameMatch(testModule) {\n \t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n \t\t\tif (testModuleName === module) {\n \t\t\t\treturn true;\n \t\t\t} else if (testModule.parentModule) {\n \t\t\t\treturn moduleChainNameMatch(testModule.parentModule);\n \t\t\t} else {\n \t\t\t\treturn false;\n \t\t\t}\n \t\t}\n\n \t\tfunction moduleChainIdMatch(testModule) {\n \t\t\treturn inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);\n \t\t}\n\n \t\t// Internally-generated tests are always valid\n \t\tif (this.callback && this.callback.validTest) {\n \t\t\treturn true;\n \t\t}\n\n \t\tif (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {\n\n \t\t\treturn false;\n \t\t}\n\n \t\tif (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {\n\n \t\t\treturn false;\n \t\t}\n\n \t\tif (module && !moduleChainNameMatch(this.module)) {\n \t\t\treturn false;\n \t\t}\n\n \t\tif (!filter) {\n \t\t\treturn true;\n \t\t}\n\n \t\treturn regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);\n \t},\n\n \tregexFilter: function regexFilter(exclude, pattern, flags, fullName) {\n \t\tvar regex = new RegExp(pattern, flags);\n \t\tvar match = regex.test(fullName);\n\n \t\treturn match !== exclude;\n \t},\n\n \tstringFilter: function stringFilter(filter, fullName) {\n \t\tfilter = filter.toLowerCase();\n \t\tfullName = fullName.toLowerCase();\n\n \t\tvar include = filter.charAt(0) !== \"!\";\n \t\tif (!include) {\n \t\t\tfilter = filter.slice(1);\n \t\t}\n\n \t\t// If the filter matches, we need to honour include\n \t\tif (fullName.indexOf(filter) !== -1) {\n \t\t\treturn include;\n \t\t}\n\n \t\t// Otherwise, do the opposite\n \t\treturn !include;\n \t}\n };\n\n function pushFailure() {\n \tif (!config.current) {\n \t\tthrow new Error(\"pushFailure() assertion outside test context, in \" + sourceFromStacktrace(2));\n \t}\n\n \t// Gets current test obj\n \tvar currentTest = config.current;\n\n \treturn currentTest.pushFailure.apply(currentTest, arguments);\n }\n\n function saveGlobal() {\n \tconfig.pollution = [];\n\n \tif (config.noglobals) {\n \t\tfor (var key in global$1) {\n \t\t\tif (hasOwn.call(global$1, key)) {\n\n \t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n \t\t\t\tif (/^qunit-test-output/.test(key)) {\n \t\t\t\t\tcontinue;\n \t\t\t\t}\n \t\t\t\tconfig.pollution.push(key);\n \t\t\t}\n \t\t}\n \t}\n }\n\n function checkPollution() {\n \tvar newGlobals,\n \t deletedGlobals,\n \t old = config.pollution;\n\n \tsaveGlobal();\n\n \tnewGlobals = diff(config.pollution, old);\n \tif (newGlobals.length > 0) {\n \t\tpushFailure(\"Introduced global variable(s): \" + newGlobals.join(\", \"));\n \t}\n\n \tdeletedGlobals = diff(old, config.pollution);\n \tif (deletedGlobals.length > 0) {\n \t\tpushFailure(\"Deleted global variable(s): \" + deletedGlobals.join(\", \"));\n \t}\n }\n\n // Will be exposed as QUnit.test\n function test(testName, callback) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback\n \t});\n\n \tnewTest.queue();\n }\n\n function todo(testName, callback) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback,\n \t\ttodo: true\n \t});\n\n \tnewTest.queue();\n }\n\n // Will be exposed as QUnit.skip\n function skip(testName) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tvar test = new Test({\n \t\ttestName: testName,\n \t\tskip: true\n \t});\n\n \ttest.queue();\n }\n\n // Will be exposed as QUnit.only\n function only(testName, callback) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tconfig.queue.length = 0;\n \tfocused = true;\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback\n \t});\n\n \tnewTest.queue();\n }\n\n // Put a hold on processing and return a function that will release it.\n function internalStop(test) {\n \tvar released = false;\n\n \ttest.semaphore += 1;\n \tconfig.blocking = true;\n\n \t// Set a recovery timeout, if so configured.\n \tif (config.testTimeout && defined.setTimeout) {\n \t\tclearTimeout(config.timeout);\n \t\tconfig.timeout = setTimeout(function () {\n \t\t\tpushFailure(\"Test timed out\", sourceFromStacktrace(2));\n \t\t\tinternalRecover(test);\n \t\t}, config.testTimeout);\n \t}\n\n \treturn function resume() {\n \t\tif (released) {\n \t\t\treturn;\n \t\t}\n\n \t\treleased = true;\n \t\ttest.semaphore -= 1;\n \t\tinternalStart(test);\n \t};\n }\n\n // Forcefully release all processing holds.\n function internalRecover(test) {\n \ttest.semaphore = 0;\n \tinternalStart(test);\n }\n\n // Release a processing hold, scheduling a resumption attempt if no holds remain.\n function internalStart(test) {\n\n \t// If semaphore is non-numeric, throw error\n \tif (isNaN(test.semaphore)) {\n \t\ttest.semaphore = 0;\n\n \t\tpushFailure(\"Invalid value on test.semaphore\", sourceFromStacktrace(2));\n \t\treturn;\n \t}\n\n \t// Don't start until equal number of stop-calls\n \tif (test.semaphore > 0) {\n \t\treturn;\n \t}\n\n \t// Throw an Error if start is called more often than stop\n \tif (test.semaphore < 0) {\n \t\ttest.semaphore = 0;\n\n \t\tpushFailure(\"Tried to restart test while already started (test's semaphore was 0 already)\", sourceFromStacktrace(2));\n \t\treturn;\n \t}\n\n \t// Add a slight delay to allow more assertions etc.\n \tif (defined.setTimeout) {\n \t\tif (config.timeout) {\n \t\t\tclearTimeout(config.timeout);\n \t\t}\n \t\tconfig.timeout = setTimeout(function () {\n \t\t\tif (test.semaphore > 0) {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tif (config.timeout) {\n \t\t\t\tclearTimeout(config.timeout);\n \t\t\t}\n\n \t\t\tbegin();\n \t\t}, 13);\n \t} else {\n \t\tbegin();\n \t}\n }\n\n function numberOfTests(module) {\n \tvar count = module.tests.length;\n \tvar modules = [].concat(toConsumableArray(module.childModules));\n\n \t// Do a breadth-first traversal of the child modules\n \twhile (modules.length) {\n \t\tvar nextModule = modules.shift();\n \t\tcount += nextModule.tests.length;\n \t\tmodules.push.apply(modules, toConsumableArray(nextModule.childModules));\n \t}\n\n \treturn count;\n }\n\n function notifyTestsRan(module) {\n \tmodule.testsRun++;\n \twhile (module = module.parentModule) {\n \t\tmodule.testsRun++;\n \t}\n }\n\n /**\n * Returns a function that proxies to the given method name on the globals\n * console object. The proxy will also detect if the console doesn't exist and\n * will appropriately no-op. This allows support for IE9, which doesn't have a\n * console if the developer tools are not open.\n */\n function consoleProxy(method) {\n \treturn function () {\n \t\tif (console) {\n \t\t\tconsole[method].apply(console, arguments);\n \t\t}\n \t};\n }\n\n var Logger = {\n \twarn: consoleProxy(\"warn\")\n };\n\n var Assert = function () {\n \tfunction Assert(testContext) {\n \t\tclassCallCheck(this, Assert);\n\n \t\tthis.test = testContext;\n \t}\n\n \t// Assert helpers\n\n \t// Documents a \"step\", which is a string value, in a test as a passing assertion\n\n\n \tcreateClass(Assert, [{\n \t\tkey: \"step\",\n \t\tvalue: function step(message) {\n \t\t\tvar result = !!message;\n\n \t\t\tthis.test.steps.push(message);\n\n \t\t\treturn this.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tmessage: message || \"You must provide a message to assert.step\"\n \t\t\t});\n \t\t}\n\n \t\t// Verifies the steps in a test match a given array of string values\n\n \t}, {\n \t\tkey: \"verifySteps\",\n \t\tvalue: function verifySteps(steps, message) {\n \t\t\tthis.deepEqual(this.test.steps, steps, message);\n \t\t}\n\n \t\t// Specify the number of expected assertions to guarantee that failed test\n \t\t// (no assertions are run at all) don't slip through.\n\n \t}, {\n \t\tkey: \"expect\",\n \t\tvalue: function expect(asserts) {\n \t\t\tif (arguments.length === 1) {\n \t\t\t\tthis.test.expected = asserts;\n \t\t\t} else {\n \t\t\t\treturn this.test.expected;\n \t\t\t}\n \t\t}\n\n \t\t// Put a hold on processing and return a function that will release it a maximum of once.\n\n \t}, {\n \t\tkey: \"async\",\n \t\tvalue: function async(count) {\n \t\t\tvar test$$1 = this.test;\n\n \t\t\tvar popped = false,\n \t\t\t acceptCallCount = count;\n\n \t\t\tif (typeof acceptCallCount === \"undefined\") {\n \t\t\t\tacceptCallCount = 1;\n \t\t\t}\n\n \t\t\tvar resume = internalStop(test$$1);\n\n \t\t\treturn function done() {\n \t\t\t\tif (config.current !== test$$1) {\n \t\t\t\t\tthrow Error(\"assert.async callback called after test finished.\");\n \t\t\t\t}\n\n \t\t\t\tif (popped) {\n \t\t\t\t\ttest$$1.pushFailure(\"Too many calls to the `assert.async` callback\", sourceFromStacktrace(2));\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tacceptCallCount -= 1;\n \t\t\t\tif (acceptCallCount > 0) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tpopped = true;\n \t\t\t\tresume();\n \t\t\t};\n \t\t}\n\n \t\t// Exports test.push() to the user API\n \t\t// Alias of pushResult.\n\n \t}, {\n \t\tkey: \"push\",\n \t\tvalue: function push(result, actual, expected, message, negative) {\n \t\t\tLogger.warn(\"assert.push is deprecated and will be removed in QUnit 3.0.\" + \" Please use assert.pushResult instead (http://api.qunitjs.com/pushResult/).\");\n\n \t\t\tvar currentAssert = this instanceof Assert ? this : config.current.assert;\n \t\t\treturn currentAssert.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: negative\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"pushResult\",\n \t\tvalue: function pushResult(resultInfo) {\n\n \t\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n \t\t\tvar assert = this;\n \t\t\tvar currentTest = assert instanceof Assert && assert.test || config.current;\n\n \t\t\t// Backwards compatibility fix.\n \t\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n \t\t\t// Although, it's use is not recommended as it can leak assertions\n \t\t\t// to other tests from async tests, because we only get a reference to the current test,\n \t\t\t// not exactly the test where assertion were intended to be called.\n \t\t\tif (!currentTest) {\n \t\t\t\tthrow new Error(\"assertion outside test context, in \" + sourceFromStacktrace(2));\n \t\t\t}\n\n \t\t\tif (!(assert instanceof Assert)) {\n \t\t\t\tassert = currentTest.assert;\n \t\t\t}\n\n \t\t\treturn assert.test.pushResult(resultInfo);\n \t\t}\n \t}, {\n \t\tkey: \"ok\",\n \t\tvalue: function ok(result, message) {\n \t\t\tif (!message) {\n \t\t\t\tmessage = result ? \"okay\" : \"failed, expected argument to be truthy, was: \" + dump.parse(result);\n \t\t\t}\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !!result,\n \t\t\t\tactual: result,\n \t\t\t\texpected: true,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notOk\",\n \t\tvalue: function notOk(result, message) {\n \t\t\tif (!message) {\n \t\t\t\tmessage = !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" + dump.parse(result);\n \t\t\t}\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !result,\n \t\t\t\tactual: result,\n \t\t\t\texpected: false,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"equal\",\n \t\tvalue: function equal(actual, expected, message) {\n\n \t\t\t// eslint-disable-next-line eqeqeq\n \t\t\tvar result = expected == actual;\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notEqual\",\n \t\tvalue: function notEqual(actual, expected, message) {\n\n \t\t\t// eslint-disable-next-line eqeqeq\n \t\t\tvar result = expected != actual;\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"propEqual\",\n \t\tvalue: function propEqual(actual, expected, message) {\n \t\t\tactual = objectValues(actual);\n \t\t\texpected = objectValues(expected);\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notPropEqual\",\n \t\tvalue: function notPropEqual(actual, expected, message) {\n \t\t\tactual = objectValues(actual);\n \t\t\texpected = objectValues(expected);\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"deepEqual\",\n \t\tvalue: function deepEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notDeepEqual\",\n \t\tvalue: function notDeepEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"strictEqual\",\n \t\tvalue: function strictEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: expected === actual,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notStrictEqual\",\n \t\tvalue: function notStrictEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: expected !== actual,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"throws\",\n \t\tvalue: function throws(block, expected, message) {\n \t\t\tvar actual = void 0,\n \t\t\t result = false;\n\n \t\t\tvar currentTest = this instanceof Assert && this.test || config.current;\n\n \t\t\t// 'expected' is optional unless doing string comparison\n \t\t\tif (objectType(expected) === \"string\") {\n \t\t\t\tif (message == null) {\n \t\t\t\t\tmessage = expected;\n \t\t\t\t\texpected = null;\n \t\t\t\t} else {\n \t\t\t\t\tthrow new Error(\"throws/raises does not accept a string value for the expected argument.\\n\" + \"Use a non-string object value (e.g. regExp) instead if it's necessary.\");\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcurrentTest.ignoreGlobalErrors = true;\n \t\t\ttry {\n \t\t\t\tblock.call(currentTest.testEnvironment);\n \t\t\t} catch (e) {\n \t\t\t\tactual = e;\n \t\t\t}\n \t\t\tcurrentTest.ignoreGlobalErrors = false;\n\n \t\t\tif (actual) {\n \t\t\t\tvar expectedType = objectType(expected);\n\n \t\t\t\t// We don't want to validate thrown error\n \t\t\t\tif (!expected) {\n \t\t\t\t\tresult = true;\n \t\t\t\t\texpected = null;\n\n \t\t\t\t\t// Expected is a regexp\n \t\t\t\t} else if (expectedType === \"regexp\") {\n \t\t\t\t\tresult = expected.test(errorString(actual));\n\n \t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n \t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n \t\t\t\t\tresult = true;\n\n \t\t\t\t\t// Expected is an Error object\n \t\t\t\t} else if (expectedType === \"object\") {\n \t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n \t\t\t\t\t// Expected is a validation function which returns true if validation passed\n \t\t\t\t} else if (expectedType === \"function\" && expected.call({}, actual) === true) {\n \t\t\t\t\texpected = null;\n \t\t\t\t\tresult = true;\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcurrentTest.assert.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}]);\n \treturn Assert;\n }();\n\n // Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n // Known to us are: Closure Compiler, Narwhal\n // eslint-disable-next-line dot-notation\n\n\n Assert.prototype.raises = Assert.prototype[\"throws\"];\n\n /**\n * Converts an error into a simple string for comparisons.\n *\n * @param {Error} error\n * @return {String}\n */\n function errorString(error) {\n \tvar resultErrorString = error.toString();\n\n \tif (resultErrorString.substring(0, 7) === \"[object\") {\n \t\tvar name = error.name ? error.name.toString() : \"Error\";\n \t\tvar message = error.message ? error.message.toString() : \"\";\n\n \t\tif (name && message) {\n \t\t\treturn name + \": \" + message;\n \t\t} else if (name) {\n \t\t\treturn name;\n \t\t} else if (message) {\n \t\t\treturn message;\n \t\t} else {\n \t\t\treturn \"Error\";\n \t\t}\n \t} else {\n \t\treturn resultErrorString;\n \t}\n }\n\n /* global module, exports, define */\n function exportQUnit(QUnit) {\n\n \tif (defined.document) {\n\n \t\t// QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.\n \t\tif (window.QUnit && window.QUnit.version) {\n \t\t\tthrow new Error(\"QUnit has already been defined.\");\n \t\t}\n\n \t\twindow.QUnit = QUnit;\n \t}\n\n \t// For nodejs\n \tif (typeof module !== \"undefined\" && module && module.exports) {\n \t\tmodule.exports = QUnit;\n\n \t\t// For consistency with CommonJS environments' exports\n \t\tmodule.exports.QUnit = QUnit;\n \t}\n\n \t// For CommonJS with exports, but without module.exports, like Rhino\n \tif (typeof exports !== \"undefined\" && exports) {\n \t\texports.QUnit = QUnit;\n \t}\n\n \tif (typeof define === \"function\" && define.amd) {\n \t\tdefine(function () {\n \t\t\treturn QUnit;\n \t\t});\n \t\tQUnit.config.autostart = false;\n \t}\n }\n\n var SuiteReport = function () {\n \tfunction SuiteReport(name, parentSuite) {\n \t\tclassCallCheck(this, SuiteReport);\n\n \t\tthis.name = name;\n \t\tthis.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];\n\n \t\tthis.tests = [];\n \t\tthis.childSuites = [];\n\n \t\tif (parentSuite) {\n \t\t\tparentSuite.pushChildSuite(this);\n \t\t}\n \t}\n\n \tcreateClass(SuiteReport, [{\n \t\tkey: \"start\",\n \t\tvalue: function start(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._startTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tfullName: this.fullName.slice(),\n \t\t\t\ttests: this.tests.map(function (test) {\n \t\t\t\t\treturn test.start();\n \t\t\t\t}),\n \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n \t\t\t\t\treturn suite.start();\n \t\t\t\t}),\n \t\t\t\ttestCounts: {\n \t\t\t\t\ttotal: this.getTestCounts().total\n \t\t\t\t}\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"end\",\n \t\tvalue: function end(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._endTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tfullName: this.fullName.slice(),\n \t\t\t\ttests: this.tests.map(function (test) {\n \t\t\t\t\treturn test.end();\n \t\t\t\t}),\n \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n \t\t\t\t\treturn suite.end();\n \t\t\t\t}),\n \t\t\t\ttestCounts: this.getTestCounts(),\n \t\t\t\truntime: this.getRuntime(),\n \t\t\t\tstatus: this.getStatus()\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"pushChildSuite\",\n \t\tvalue: function pushChildSuite(suite) {\n \t\t\tthis.childSuites.push(suite);\n \t\t}\n \t}, {\n \t\tkey: \"pushTest\",\n \t\tvalue: function pushTest(test) {\n \t\t\tthis.tests.push(test);\n \t\t}\n \t}, {\n \t\tkey: \"getRuntime\",\n \t\tvalue: function getRuntime() {\n \t\t\treturn this._endTime - this._startTime;\n \t\t}\n \t}, {\n \t\tkey: \"getTestCounts\",\n \t\tvalue: function getTestCounts() {\n \t\t\tvar counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };\n\n \t\t\tcounts = this.tests.reduce(function (counts, test) {\n \t\t\t\tif (test.valid) {\n \t\t\t\t\tcounts[test.getStatus()]++;\n \t\t\t\t\tcounts.total++;\n \t\t\t\t}\n\n \t\t\t\treturn counts;\n \t\t\t}, counts);\n\n \t\t\treturn this.childSuites.reduce(function (counts, suite) {\n \t\t\t\treturn suite.getTestCounts(counts);\n \t\t\t}, counts);\n \t\t}\n \t}, {\n \t\tkey: \"getStatus\",\n \t\tvalue: function getStatus() {\n \t\t\tvar _getTestCounts = this.getTestCounts(),\n \t\t\t total = _getTestCounts.total,\n \t\t\t failed = _getTestCounts.failed,\n \t\t\t skipped = _getTestCounts.skipped,\n \t\t\t todo = _getTestCounts.todo;\n\n \t\t\tif (failed) {\n \t\t\t\treturn \"failed\";\n \t\t\t} else {\n \t\t\t\tif (skipped === total) {\n \t\t\t\t\treturn \"skipped\";\n \t\t\t\t} else if (todo === total) {\n \t\t\t\t\treturn \"todo\";\n \t\t\t\t} else {\n \t\t\t\t\treturn \"passed\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t}]);\n \treturn SuiteReport;\n }();\n\n // Handle an unhandled exception. By convention, returns true if further\n // error handling should be suppressed and false otherwise.\n // In this case, we will only suppress further error handling if the\n // \"ignoreGlobalErrors\" configuration option is enabled.\n function onError(error) {\n \tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n \t\targs[_key - 1] = arguments[_key];\n \t}\n\n \tif (config.current) {\n \t\tif (config.current.ignoreGlobalErrors) {\n \t\t\treturn true;\n \t\t}\n \t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n \t} else {\n \t\ttest(\"global failure\", extend(function () {\n \t\t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n \t\t}, { validTest: true }));\n \t}\n\n \treturn false;\n }\n\n var QUnit = {};\n var globalSuite = new SuiteReport();\n\n // The initial \"currentModule\" represents the global (or top-level) module that\n // is not explicitly defined by the user, therefore we add the \"globalSuite\" to\n // it since each module has a suiteReport associated with it.\n config.currentModule.suiteReport = globalSuite;\n\n var moduleStack = [];\n var globalStartCalled = false;\n var runStarted = false;\n\n // Figure out if we're running the tests from a server or not\n QUnit.isLocal = !(defined.document && window.location.protocol !== \"file:\");\n\n // Expose the current QUnit version\n QUnit.version = \"2.3.1\";\n\n function createModule(name, testEnvironment) {\n \tvar parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;\n \tvar moduleName = parentModule !== null ? [parentModule.name, name].join(\" > \") : name;\n \tvar parentSuite = parentModule ? parentModule.suiteReport : globalSuite;\n\n \tvar module = {\n \t\tname: moduleName,\n \t\tparentModule: parentModule,\n \t\ttests: [],\n \t\tmoduleId: generateHash(moduleName),\n \t\ttestsRun: 0,\n \t\tchildModules: [],\n \t\tsuiteReport: new SuiteReport(name, parentSuite)\n \t};\n\n \tvar env = {};\n \tif (parentModule) {\n \t\tparentModule.childModules.push(module);\n \t\textend(env, parentModule.testEnvironment);\n \t}\n \textend(env, testEnvironment);\n \tmodule.testEnvironment = env;\n\n \tconfig.modules.push(module);\n \treturn module;\n }\n\n extend(QUnit, {\n \ton: on,\n\n \t// Call on start of module test to prepend name to all tests\n \tmodule: function module(name, testEnvironment, executeNow) {\n \t\tif (arguments.length === 2) {\n \t\t\tif (objectType(testEnvironment) === \"function\") {\n \t\t\t\texecuteNow = testEnvironment;\n \t\t\t\ttestEnvironment = undefined;\n \t\t\t}\n \t\t}\n\n \t\tvar module = createModule(name, testEnvironment);\n\n \t\t// Move any hooks to a 'hooks' object\n \t\tif (module.testEnvironment) {\n \t\t\tmodule.hooks = {\n \t\t\t\tbefore: module.testEnvironment.before,\n \t\t\t\tbeforeEach: module.testEnvironment.beforeEach,\n \t\t\t\tafterEach: module.testEnvironment.afterEach,\n \t\t\t\tafter: module.testEnvironment.after\n \t\t\t};\n\n \t\t\tdelete module.testEnvironment.before;\n \t\t\tdelete module.testEnvironment.beforeEach;\n \t\t\tdelete module.testEnvironment.afterEach;\n \t\t\tdelete module.testEnvironment.after;\n \t\t}\n\n \t\tvar moduleFns = {\n \t\t\tbefore: setHook(module, \"before\"),\n \t\t\tbeforeEach: setHook(module, \"beforeEach\"),\n \t\t\tafterEach: setHook(module, \"afterEach\"),\n \t\t\tafter: setHook(module, \"after\")\n \t\t};\n\n \t\tvar currentModule = config.currentModule;\n \t\tif (objectType(executeNow) === \"function\") {\n \t\t\tmoduleStack.push(module);\n \t\t\tconfig.currentModule = module;\n \t\t\texecuteNow.call(module.testEnvironment, moduleFns);\n \t\t\tmoduleStack.pop();\n \t\t\tmodule = module.parentModule || currentModule;\n \t\t}\n\n \t\tconfig.currentModule = module;\n \t},\n\n \ttest: test,\n\n \ttodo: todo,\n\n \tskip: skip,\n\n \tonly: only,\n\n \tstart: function start(count) {\n \t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n \t\tif (!config.current) {\n \t\t\tglobalStartCalled = true;\n\n \t\t\tif (runStarted) {\n \t\t\t\tthrow new Error(\"Called start() while test already started running\");\n \t\t\t} else if (globalStartAlreadyCalled || count > 1) {\n \t\t\t\tthrow new Error(\"Called start() outside of a test context too many times\");\n \t\t\t} else if (config.autostart) {\n \t\t\t\tthrow new Error(\"Called start() outside of a test context when \" + \"QUnit.config.autostart was true\");\n \t\t\t} else if (!config.pageLoaded) {\n\n \t\t\t\t// The page isn't completely loaded yet, so we set autostart and then\n \t\t\t\t// load if we're in Node or wait for the browser's load event.\n \t\t\t\tconfig.autostart = true;\n\n \t\t\t\t// Starts from Node even if .load was not previously called. We still return\n \t\t\t\t// early otherwise we'll wind up \"beginning\" twice.\n \t\t\t\tif (!defined.document) {\n \t\t\t\t\tQUnit.load();\n \t\t\t\t}\n\n \t\t\t\treturn;\n \t\t\t}\n \t\t} else {\n \t\t\tthrow new Error(\"QUnit.start cannot be called inside a test context.\");\n \t\t}\n\n \t\tscheduleBegin();\n \t},\n\n \tconfig: config,\n\n \tis: is,\n\n \tobjectType: objectType,\n\n \textend: extend,\n\n \tload: function load() {\n \t\tconfig.pageLoaded = true;\n\n \t\t// Initialize the configuration options\n \t\textend(config, {\n \t\t\tstats: { all: 0, bad: 0 },\n \t\t\tstarted: 0,\n \t\t\tupdateRate: 1000,\n \t\t\tautostart: true,\n \t\t\tfilter: \"\"\n \t\t}, true);\n\n \t\tif (!runStarted) {\n \t\t\tconfig.blocking = false;\n\n \t\t\tif (config.autostart) {\n \t\t\t\tscheduleBegin();\n \t\t\t}\n \t\t}\n \t},\n\n \tstack: function stack(offset) {\n \t\toffset = (offset || 0) + 2;\n \t\treturn sourceFromStacktrace(offset);\n \t},\n\n \tonError: onError\n });\n\n QUnit.pushFailure = pushFailure;\n QUnit.assert = Assert.prototype;\n QUnit.equiv = equiv;\n QUnit.dump = dump;\n\n registerLoggingCallbacks(QUnit);\n\n function scheduleBegin() {\n\n \trunStarted = true;\n\n \t// Add a slight delay to allow definition of more modules and tests.\n \tif (defined.setTimeout) {\n \t\tsetTimeout(function () {\n \t\t\tbegin();\n \t\t}, 13);\n \t} else {\n \t\tbegin();\n \t}\n }\n\n function begin() {\n \tvar i,\n \t l,\n \t modulesLog = [];\n\n \t// If the test run hasn't officially begun yet\n \tif (!config.started) {\n\n \t\t// Record the time of the test run's beginning\n \t\tconfig.started = now();\n\n \t\t// Delete the loose unnamed module if unused.\n \t\tif (config.modules[0].name === \"\" && config.modules[0].tests.length === 0) {\n \t\t\tconfig.modules.shift();\n \t\t}\n\n \t\t// Avoid unnecessary information by not logging modules' test environments\n \t\tfor (i = 0, l = config.modules.length; i < l; i++) {\n \t\t\tmodulesLog.push({\n \t\t\t\tname: config.modules[i].name,\n \t\t\t\ttests: config.modules[i].tests\n \t\t\t});\n \t\t}\n\n \t\t// The test run is officially beginning now\n \t\temit(\"runStart\", globalSuite.start(true));\n \t\trunLoggingCallbacks(\"begin\", {\n \t\t\ttotalTests: Test.count,\n \t\t\tmodules: modulesLog\n \t\t});\n \t}\n\n \tconfig.blocking = false;\n \tProcessingQueue.advance();\n }\n\n function setHook(module, hookName) {\n \tif (!module.hooks) {\n \t\tmodule.hooks = {};\n \t}\n\n \treturn function (callback) {\n \t\tmodule.hooks[hookName] = callback;\n \t};\n }\n\n exportQUnit(QUnit);\n\n (function () {\n\n \tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n \t\treturn;\n \t}\n\n \tvar config = QUnit.config,\n \t hasOwn = Object.prototype.hasOwnProperty;\n\n \t// Stores fixture HTML for resetting later\n \tfunction storeFixture() {\n\n \t\t// Avoid overwriting user-defined values\n \t\tif (hasOwn.call(config, \"fixture\")) {\n \t\t\treturn;\n \t\t}\n\n \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n \t\tif (fixture) {\n \t\t\tconfig.fixture = fixture.innerHTML;\n \t\t}\n \t}\n\n \tQUnit.begin(storeFixture);\n\n \t// Resets the fixture DOM element if available.\n \tfunction resetFixture() {\n \t\tif (config.fixture == null) {\n \t\t\treturn;\n \t\t}\n\n \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n \t\tif (fixture) {\n \t\t\tfixture.innerHTML = config.fixture;\n \t\t}\n \t}\n\n \tQUnit.testStart(resetFixture);\n })();\n\n (function () {\n\n \t// Only interact with URLs via window.location\n \tvar location = typeof window !== \"undefined\" && window.location;\n \tif (!location) {\n \t\treturn;\n \t}\n\n \tvar urlParams = getUrlParams();\n\n \tQUnit.urlParams = urlParams;\n\n \t// Match module/test by inclusion in an array\n \tQUnit.config.moduleId = [].concat(urlParams.moduleId || []);\n \tQUnit.config.testId = [].concat(urlParams.testId || []);\n\n \t// Exact case-insensitive match of the module name\n \tQUnit.config.module = urlParams.module;\n\n \t// Regular expression or case-insenstive substring match against \"moduleName: testName\"\n \tQUnit.config.filter = urlParams.filter;\n\n \t// Test order randomization\n \tif (urlParams.seed === true) {\n\n \t\t// Generate a random seed if the option is specified without a value\n \t\tQUnit.config.seed = Math.random().toString(36).slice(2);\n \t} else if (urlParams.seed) {\n \t\tQUnit.config.seed = urlParams.seed;\n \t}\n\n \t// Add URL-parameter-mapped config values with UI form rendering data\n \tQUnit.config.urlConfig.push({\n \t\tid: \"hidepassed\",\n \t\tlabel: \"Hide passed tests\",\n \t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n \t}, {\n \t\tid: \"noglobals\",\n \t\tlabel: \"Check for Globals\",\n \t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" + \"global object (`window` in Browsers). Stored as query-strings.\"\n \t}, {\n \t\tid: \"notrycatch\",\n \t\tlabel: \"No try-catch\",\n \t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" + \"exceptions in IE reasonable. Stored as query-strings.\"\n \t});\n\n \tQUnit.begin(function () {\n \t\tvar i,\n \t\t option,\n \t\t urlConfig = QUnit.config.urlConfig;\n\n \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n \t\t\toption = QUnit.config.urlConfig[i];\n \t\t\tif (typeof option !== \"string\") {\n \t\t\t\toption = option.id;\n \t\t\t}\n\n \t\t\tif (QUnit.config[option] === undefined) {\n \t\t\t\tQUnit.config[option] = urlParams[option];\n \t\t\t}\n \t\t}\n \t});\n\n \tfunction getUrlParams() {\n \t\tvar i, param, name, value;\n \t\tvar urlParams = Object.create(null);\n \t\tvar params = location.search.slice(1).split(\"&\");\n \t\tvar length = params.length;\n\n \t\tfor (i = 0; i < length; i++) {\n \t\t\tif (params[i]) {\n \t\t\t\tparam = params[i].split(\"=\");\n \t\t\t\tname = decodeQueryParam(param[0]);\n\n \t\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n \t\t\t\tvalue = param.length === 1 || decodeQueryParam(param.slice(1).join(\"=\"));\n \t\t\t\tif (name in urlParams) {\n \t\t\t\t\turlParams[name] = [].concat(urlParams[name], value);\n \t\t\t\t} else {\n \t\t\t\t\turlParams[name] = value;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\treturn urlParams;\n \t}\n\n \tfunction decodeQueryParam(param) {\n \t\treturn decodeURIComponent(param.replace(/\\+/g, \"%20\"));\n \t}\n })();\n\n var stats = {\n \tpassedTests: 0,\n \tfailedTests: 0,\n \tskippedTests: 0,\n \ttodoTests: 0\n };\n\n // Escape text for attribute or text content.\n function escapeText(s) {\n \tif (!s) {\n \t\treturn \"\";\n \t}\n \ts = s + \"\";\n\n \t// Both single quotes and double quotes (for attributes)\n \treturn s.replace(/['\"<>&]/g, function (s) {\n \t\tswitch (s) {\n \t\t\tcase \"'\":\n \t\t\t\treturn \"'\";\n \t\t\tcase \"\\\"\":\n \t\t\t\treturn \""\";\n \t\t\tcase \"<\":\n \t\t\t\treturn \"<\";\n \t\t\tcase \">\":\n \t\t\t\treturn \">\";\n \t\t\tcase \"&\":\n \t\t\t\treturn \"&\";\n \t\t}\n \t});\n }\n\n (function () {\n\n \t// Don't load the HTML Reporter on non-browser environments\n \tif (typeof window === \"undefined\" || !window.document) {\n \t\treturn;\n \t}\n\n \tvar config = QUnit.config,\n \t document$$1 = window.document,\n \t collapseNext = false,\n \t hasOwn = Object.prototype.hasOwnProperty,\n \t unfilteredUrl = setUrl({ filter: undefined, module: undefined,\n \t\tmoduleId: undefined, testId: undefined }),\n \t modulesList = [];\n\n \tfunction addEvent(elem, type, fn) {\n \t\telem.addEventListener(type, fn, false);\n \t}\n\n \tfunction removeEvent(elem, type, fn) {\n \t\telem.removeEventListener(type, fn, false);\n \t}\n\n \tfunction addEvents(elems, type, fn) {\n \t\tvar i = elems.length;\n \t\twhile (i--) {\n \t\t\taddEvent(elems[i], type, fn);\n \t\t}\n \t}\n\n \tfunction hasClass(elem, name) {\n \t\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") >= 0;\n \t}\n\n \tfunction addClass(elem, name) {\n \t\tif (!hasClass(elem, name)) {\n \t\t\telem.className += (elem.className ? \" \" : \"\") + name;\n \t\t}\n \t}\n\n \tfunction toggleClass(elem, name, force) {\n \t\tif (force || typeof force === \"undefined\" && !hasClass(elem, name)) {\n \t\t\taddClass(elem, name);\n \t\t} else {\n \t\t\tremoveClass(elem, name);\n \t\t}\n \t}\n\n \tfunction removeClass(elem, name) {\n \t\tvar set = \" \" + elem.className + \" \";\n\n \t\t// Class name may appear multiple times\n \t\twhile (set.indexOf(\" \" + name + \" \") >= 0) {\n \t\t\tset = set.replace(\" \" + name + \" \", \" \");\n \t\t}\n\n \t\t// Trim for prettiness\n \t\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace(/^\\s+|\\s+$/g, \"\");\n \t}\n\n \tfunction id(name) {\n \t\treturn document$$1.getElementById && document$$1.getElementById(name);\n \t}\n\n \tfunction abortTests() {\n \t\tvar abortButton = id(\"qunit-abort-tests-button\");\n \t\tif (abortButton) {\n \t\t\tabortButton.disabled = true;\n \t\t\tabortButton.innerHTML = \"Aborting...\";\n \t\t}\n \t\tQUnit.config.queue.length = 0;\n \t\treturn false;\n \t}\n\n \tfunction interceptNavigation(ev) {\n \t\tapplyUrlParams();\n\n \t\tif (ev && ev.preventDefault) {\n \t\t\tev.preventDefault();\n \t\t}\n\n \t\treturn false;\n \t}\n\n \tfunction getUrlConfigHtml() {\n \t\tvar i,\n \t\t j,\n \t\t val,\n \t\t escaped,\n \t\t escapedTooltip,\n \t\t selection = false,\n \t\t urlConfig = config.urlConfig,\n \t\t urlConfigHtml = \"\";\n\n \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n \t\t\tval = config.urlConfig[i];\n \t\t\tif (typeof val === \"string\") {\n \t\t\t\tval = {\n \t\t\t\t\tid: val,\n \t\t\t\t\tlabel: val\n \t\t\t\t};\n \t\t\t}\n\n \t\t\tescaped = escapeText(val.id);\n \t\t\tescapedTooltip = escapeText(val.tooltip);\n\n \t\t\tif (!val.value || typeof val.value === \"string\") {\n \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'><input id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' type='checkbox'\" + (val.value ? \" value='\" + escapeText(val.value) + \"'\" : \"\") + (config[val.id] ? \" checked='checked'\" : \"\") + \" title='\" + escapedTooltip + \"' />\" + escapeText(val.label) + \"</label>\";\n \t\t\t} else {\n \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'>\" + val.label + \": </label><select id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n \t\t\t\tif (QUnit.is(\"array\", val.value)) {\n \t\t\t\t\tfor (j = 0; j < val.value.length; j++) {\n \t\t\t\t\t\tescaped = escapeText(val.value[j]);\n \t\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" + (config[val.id] === val.value[j] ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escaped + \"</option>\";\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tfor (j in val.value) {\n \t\t\t\t\t\tif (hasOwn.call(val.value, j)) {\n \t\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText(j) + \"'\" + (config[val.id] === j ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escapeText(val.value[j]) + \"</option>\";\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tif (config[val.id] && !selection) {\n \t\t\t\t\tescaped = escapeText(config[val.id]);\n \t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n \t\t\t\t}\n \t\t\t\turlConfigHtml += \"</select>\";\n \t\t\t}\n \t\t}\n\n \t\treturn urlConfigHtml;\n \t}\n\n \t// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n \t// Updates the URL with the new state of `config.urlConfig` values.\n \tfunction toolbarChanged() {\n \t\tvar updatedUrl,\n \t\t value,\n \t\t tests,\n \t\t field = this,\n \t\t params = {};\n\n \t\t// Detect if field is a select menu or a checkbox\n \t\tif (\"selectedIndex\" in field) {\n \t\t\tvalue = field.options[field.selectedIndex].value || undefined;\n \t\t} else {\n \t\t\tvalue = field.checked ? field.defaultValue || true : undefined;\n \t\t}\n\n \t\tparams[field.name] = value;\n \t\tupdatedUrl = setUrl(params);\n\n \t\t// Check if we can apply the change without a page refresh\n \t\tif (\"hidepassed\" === field.name && \"replaceState\" in window.history) {\n \t\t\tQUnit.urlParams[field.name] = value;\n \t\t\tconfig[field.name] = value || false;\n \t\t\ttests = id(\"qunit-tests\");\n \t\t\tif (tests) {\n \t\t\t\ttoggleClass(tests, \"hidepass\", value || false);\n \t\t\t}\n \t\t\twindow.history.replaceState(null, \"\", updatedUrl);\n \t\t} else {\n \t\t\twindow.location = updatedUrl;\n \t\t}\n \t}\n\n \tfunction setUrl(params) {\n \t\tvar key,\n \t\t arrValue,\n \t\t i,\n \t\t querystring = \"?\",\n \t\t location = window.location;\n\n \t\tparams = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);\n\n \t\tfor (key in params) {\n\n \t\t\t// Skip inherited or undefined properties\n \t\t\tif (hasOwn.call(params, key) && params[key] !== undefined) {\n\n \t\t\t\t// Output a parameter for each value of this key (but usually just one)\n \t\t\t\tarrValue = [].concat(params[key]);\n \t\t\t\tfor (i = 0; i < arrValue.length; i++) {\n \t\t\t\t\tquerystring += encodeURIComponent(key);\n \t\t\t\t\tif (arrValue[i] !== true) {\n \t\t\t\t\t\tquerystring += \"=\" + encodeURIComponent(arrValue[i]);\n \t\t\t\t\t}\n \t\t\t\t\tquerystring += \"&\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\treturn location.protocol + \"//\" + location.host + location.pathname + querystring.slice(0, -1);\n \t}\n\n \tfunction applyUrlParams() {\n \t\tvar i,\n \t\t selectedModules = [],\n \t\t modulesList = id(\"qunit-modulefilter-dropdown-list\").getElementsByTagName(\"input\"),\n \t\t filter = id(\"qunit-filter-input\").value;\n\n \t\tfor (i = 0; i < modulesList.length; i++) {\n \t\t\tif (modulesList[i].checked) {\n \t\t\t\tselectedModules.push(modulesList[i].value);\n \t\t\t}\n \t\t}\n\n \t\twindow.location = setUrl({\n \t\t\tfilter: filter === \"\" ? undefined : filter,\n \t\t\tmoduleId: selectedModules.length === 0 ? undefined : selectedModules,\n\n \t\t\t// Remove module and testId filter\n \t\t\tmodule: undefined,\n \t\t\ttestId: undefined\n \t\t});\n \t}\n\n \tfunction toolbarUrlConfigContainer() {\n \t\tvar urlConfigContainer = document$$1.createElement(\"span\");\n\n \t\turlConfigContainer.innerHTML = getUrlConfigHtml();\n \t\taddClass(urlConfigContainer, \"qunit-url-config\");\n\n \t\taddEvents(urlConfigContainer.getElementsByTagName(\"input\"), \"change\", toolbarChanged);\n \t\taddEvents(urlConfigContainer.getElementsByTagName(\"select\"), \"change\", toolbarChanged);\n\n \t\treturn urlConfigContainer;\n \t}\n\n \tfunction abortTestsButton() {\n \t\tvar button = document$$1.createElement(\"button\");\n \t\tbutton.id = \"qunit-abort-tests-button\";\n \t\tbutton.innerHTML = \"Abort\";\n \t\taddEvent(button, \"click\", abortTests);\n \t\treturn button;\n \t}\n\n \tfunction toolbarLooseFilter() {\n \t\tvar filter = document$$1.createElement(\"form\"),\n \t\t label = document$$1.createElement(\"label\"),\n \t\t input = document$$1.createElement(\"input\"),\n \t\t button = document$$1.createElement(\"button\");\n\n \t\taddClass(filter, \"qunit-filter\");\n\n \t\tlabel.innerHTML = \"Filter: \";\n\n \t\tinput.type = \"text\";\n \t\tinput.value = config.filter || \"\";\n \t\tinput.name = \"filter\";\n \t\tinput.id = \"qunit-filter-input\";\n\n \t\tbutton.innerHTML = \"Go\";\n\n \t\tlabel.appendChild(input);\n\n \t\tfilter.appendChild(label);\n \t\tfilter.appendChild(document$$1.createTextNode(\" \"));\n \t\tfilter.appendChild(button);\n \t\taddEvent(filter, \"submit\", interceptNavigation);\n\n \t\treturn filter;\n \t}\n\n \tfunction moduleListHtml() {\n \t\tvar i,\n \t\t checked,\n \t\t html = \"\";\n\n \t\tfor (i = 0; i < config.modules.length; i++) {\n \t\t\tif (config.modules[i].name !== \"\") {\n \t\t\t\tchecked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;\n \t\t\t\thtml += \"<li><label class='clickable\" + (checked ? \" checked\" : \"\") + \"'><input type='checkbox' \" + \"value='\" + config.modules[i].moduleId + \"'\" + (checked ? \" checked='checked'\" : \"\") + \" />\" + escapeText(config.modules[i].name) + \"</label></li>\";\n \t\t\t}\n \t\t}\n\n \t\treturn html;\n \t}\n\n \tfunction toolbarModuleFilter() {\n \t\tvar allCheckbox,\n \t\t commit,\n \t\t reset,\n \t\t moduleFilter = document$$1.createElement(\"form\"),\n \t\t label = document$$1.createElement(\"label\"),\n \t\t moduleSearch = document$$1.createElement(\"input\"),\n \t\t dropDown = document$$1.createElement(\"div\"),\n \t\t actions = document$$1.createElement(\"span\"),\n \t\t dropDownList = document$$1.createElement(\"ul\"),\n \t\t dirty = false;\n\n \t\tmoduleSearch.id = \"qunit-modulefilter-search\";\n \t\taddEvent(moduleSearch, \"input\", searchInput);\n \t\taddEvent(moduleSearch, \"input\", searchFocus);\n \t\taddEvent(moduleSearch, \"focus\", searchFocus);\n \t\taddEvent(moduleSearch, \"click\", searchFocus);\n\n \t\tlabel.id = \"qunit-modulefilter-search-container\";\n \t\tlabel.innerHTML = \"Module: \";\n \t\tlabel.appendChild(moduleSearch);\n\n \t\tactions.id = \"qunit-modulefilter-actions\";\n \t\tactions.innerHTML = \"<button style='display:none'>Apply</button>\" + \"<button type='reset' style='display:none'>Reset</button>\" + \"<label class='clickable\" + (config.moduleId.length ? \"\" : \" checked\") + \"'><input type='checkbox'\" + (config.moduleId.length ? \"\" : \" checked='checked'\") + \">All modules</label>\";\n \t\tallCheckbox = actions.lastChild.firstChild;\n \t\tcommit = actions.firstChild;\n \t\treset = commit.nextSibling;\n \t\taddEvent(commit, \"click\", applyUrlParams);\n\n \t\tdropDownList.id = \"qunit-modulefilter-dropdown-list\";\n \t\tdropDownList.innerHTML = moduleListHtml();\n\n \t\tdropDown.id = \"qunit-modulefilter-dropdown\";\n \t\tdropDown.style.display = \"none\";\n \t\tdropDown.appendChild(actions);\n \t\tdropDown.appendChild(dropDownList);\n \t\taddEvent(dropDown, \"change\", selectionChange);\n \t\tselectionChange();\n\n \t\tmoduleFilter.id = \"qunit-modulefilter\";\n \t\tmoduleFilter.appendChild(label);\n \t\tmoduleFilter.appendChild(dropDown);\n \t\taddEvent(moduleFilter, \"submit\", interceptNavigation);\n \t\taddEvent(moduleFilter, \"reset\", function () {\n\n \t\t\t// Let the reset happen, then update styles\n \t\t\twindow.setTimeout(selectionChange);\n \t\t});\n\n \t\t// Enables show/hide for the dropdown\n \t\tfunction searchFocus() {\n \t\t\tif (dropDown.style.display !== \"none\") {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tdropDown.style.display = \"block\";\n \t\t\taddEvent(document$$1, \"click\", hideHandler);\n \t\t\taddEvent(document$$1, \"keydown\", hideHandler);\n\n \t\t\t// Hide on Escape keydown or outside-container click\n \t\t\tfunction hideHandler(e) {\n \t\t\t\tvar inContainer = moduleFilter.contains(e.target);\n\n \t\t\t\tif (e.keyCode === 27 || !inContainer) {\n \t\t\t\t\tif (e.keyCode === 27 && inContainer) {\n \t\t\t\t\t\tmoduleSearch.focus();\n \t\t\t\t\t}\n \t\t\t\t\tdropDown.style.display = \"none\";\n \t\t\t\t\tremoveEvent(document$$1, \"click\", hideHandler);\n \t\t\t\t\tremoveEvent(document$$1, \"keydown\", hideHandler);\n \t\t\t\t\tmoduleSearch.value = \"\";\n \t\t\t\t\tsearchInput();\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Processes module search box input\n \t\tfunction searchInput() {\n \t\t\tvar i,\n \t\t\t item,\n \t\t\t searchText = moduleSearch.value.toLowerCase(),\n \t\t\t listItems = dropDownList.children;\n\n \t\t\tfor (i = 0; i < listItems.length; i++) {\n \t\t\t\titem = listItems[i];\n \t\t\t\tif (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {\n \t\t\t\t\titem.style.display = \"\";\n \t\t\t\t} else {\n \t\t\t\t\titem.style.display = \"none\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Processes selection changes\n \t\tfunction selectionChange(evt) {\n \t\t\tvar i,\n \t\t\t item,\n \t\t\t checkbox = evt && evt.target || allCheckbox,\n \t\t\t modulesList = dropDownList.getElementsByTagName(\"input\"),\n \t\t\t selectedNames = [];\n\n \t\t\ttoggleClass(checkbox.parentNode, \"checked\", checkbox.checked);\n\n \t\t\tdirty = false;\n \t\t\tif (checkbox.checked && checkbox !== allCheckbox) {\n \t\t\t\tallCheckbox.checked = false;\n \t\t\t\tremoveClass(allCheckbox.parentNode, \"checked\");\n \t\t\t}\n \t\t\tfor (i = 0; i < modulesList.length; i++) {\n \t\t\t\titem = modulesList[i];\n \t\t\t\tif (!evt) {\n \t\t\t\t\ttoggleClass(item.parentNode, \"checked\", item.checked);\n \t\t\t\t} else if (checkbox === allCheckbox && checkbox.checked) {\n \t\t\t\t\titem.checked = false;\n \t\t\t\t\tremoveClass(item.parentNode, \"checked\");\n \t\t\t\t}\n \t\t\t\tdirty = dirty || item.checked !== item.defaultChecked;\n \t\t\t\tif (item.checked) {\n \t\t\t\t\tselectedNames.push(item.parentNode.textContent);\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcommit.style.display = reset.style.display = dirty ? \"\" : \"none\";\n \t\t\tmoduleSearch.placeholder = selectedNames.join(\", \") || allCheckbox.parentNode.textContent;\n \t\t\tmoduleSearch.title = \"Type to filter list. Current selection:\\n\" + (selectedNames.join(\"\\n\") || allCheckbox.parentNode.textContent);\n \t\t}\n\n \t\treturn moduleFilter;\n \t}\n\n \tfunction appendToolbar() {\n \t\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\n \t\tif (toolbar) {\n \t\t\ttoolbar.appendChild(toolbarUrlConfigContainer());\n \t\t\ttoolbar.appendChild(toolbarModuleFilter());\n \t\t\ttoolbar.appendChild(toolbarLooseFilter());\n \t\t\ttoolbar.appendChild(document$$1.createElement(\"div\")).className = \"clearfix\";\n \t\t}\n \t}\n\n \tfunction appendHeader() {\n \t\tvar header = id(\"qunit-header\");\n\n \t\tif (header) {\n \t\t\theader.innerHTML = \"<a href='\" + escapeText(unfilteredUrl) + \"'>\" + header.innerHTML + \"</a> \";\n \t\t}\n \t}\n\n \tfunction appendBanner() {\n \t\tvar banner = id(\"qunit-banner\");\n\n \t\tif (banner) {\n \t\t\tbanner.className = \"\";\n \t\t}\n \t}\n\n \tfunction appendTestResults() {\n \t\tvar tests = id(\"qunit-tests\"),\n \t\t result = id(\"qunit-testresult\"),\n \t\t controls;\n\n \t\tif (result) {\n \t\t\tresult.parentNode.removeChild(result);\n \t\t}\n\n \t\tif (tests) {\n \t\t\ttests.innerHTML = \"\";\n \t\t\tresult = document$$1.createElement(\"p\");\n \t\t\tresult.id = \"qunit-testresult\";\n \t\t\tresult.className = \"result\";\n \t\t\ttests.parentNode.insertBefore(result, tests);\n \t\t\tresult.innerHTML = \"<div id=\\\"qunit-testresult-display\\\">Running...<br /> </div>\" + \"<div id=\\\"qunit-testresult-controls\\\"></div>\" + \"<div class=\\\"clearfix\\\"></div>\";\n \t\t\tcontrols = id(\"qunit-testresult-controls\");\n \t\t}\n\n \t\tif (controls) {\n \t\t\tcontrols.appendChild(abortTestsButton());\n \t\t}\n \t}\n\n \tfunction appendFilteredTest() {\n \t\tvar testId = QUnit.config.testId;\n \t\tif (!testId || testId.length <= 0) {\n \t\t\treturn \"\";\n \t\t}\n \t\treturn \"<div id='qunit-filteredTest'>Rerunning selected tests: \" + escapeText(testId.join(\", \")) + \" <a id='qunit-clearFilter' href='\" + escapeText(unfilteredUrl) + \"'>Run all tests</a></div>\";\n \t}\n\n \tfunction appendUserAgent() {\n \t\tvar userAgent = id(\"qunit-userAgent\");\n\n \t\tif (userAgent) {\n \t\t\tuserAgent.innerHTML = \"\";\n \t\t\tuserAgent.appendChild(document$$1.createTextNode(\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent));\n \t\t}\n \t}\n\n \tfunction appendInterface() {\n \t\tvar qunit = id(\"qunit\");\n\n \t\tif (qunit) {\n \t\t\tqunit.innerHTML = \"<h1 id='qunit-header'>\" + escapeText(document$$1.title) + \"</h1>\" + \"<h2 id='qunit-banner'></h2>\" + \"<div id='qunit-testrunner-toolbar'></div>\" + appendFilteredTest() + \"<h2 id='qunit-userAgent'></h2>\" + \"<ol id='qunit-tests'></ol>\";\n \t\t}\n\n \t\tappendHeader();\n \t\tappendBanner();\n \t\tappendTestResults();\n \t\tappendUserAgent();\n \t\tappendToolbar();\n \t}\n\n \tfunction appendTestsList(modules) {\n \t\tvar i, l, x, z, test, moduleObj;\n\n \t\tfor (i = 0, l = modules.length; i < l; i++) {\n \t\t\tmoduleObj = modules[i];\n\n \t\t\tfor (x = 0, z = moduleObj.tests.length; x < z; x++) {\n \t\t\t\ttest = moduleObj.tests[x];\n\n \t\t\t\tappendTest(test.name, test.testId, moduleObj.name);\n \t\t\t}\n \t\t}\n \t}\n\n \tfunction appendTest(name, testId, moduleName) {\n \t\tvar title,\n \t\t rerunTrigger,\n \t\t testBlock,\n \t\t assertList,\n \t\t tests = id(\"qunit-tests\");\n\n \t\tif (!tests) {\n \t\t\treturn;\n \t\t}\n\n \t\ttitle = document$$1.createElement(\"strong\");\n \t\ttitle.innerHTML = getNameHtml(name, moduleName);\n\n \t\trerunTrigger = document$$1.createElement(\"a\");\n \t\trerunTrigger.innerHTML = \"Rerun\";\n \t\trerunTrigger.href = setUrl({ testId: testId });\n\n \t\ttestBlock = document$$1.createElement(\"li\");\n \t\ttestBlock.appendChild(title);\n \t\ttestBlock.appendChild(rerunTrigger);\n \t\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n \t\tassertList = document$$1.createElement(\"ol\");\n \t\tassertList.className = \"qunit-assert-list\";\n\n \t\ttestBlock.appendChild(assertList);\n\n \t\ttests.appendChild(testBlock);\n \t}\n\n \t// HTML Reporter initialization and load\n \tQUnit.begin(function (details) {\n \t\tvar i, moduleObj, tests;\n\n \t\t// Sort modules by name for the picker\n \t\tfor (i = 0; i < details.modules.length; i++) {\n \t\t\tmoduleObj = details.modules[i];\n \t\t\tif (moduleObj.name) {\n \t\t\t\tmodulesList.push(moduleObj.name);\n \t\t\t}\n \t\t}\n \t\tmodulesList.sort(function (a, b) {\n \t\t\treturn a.localeCompare(b);\n \t\t});\n\n \t\t// Initialize QUnit elements\n \t\tappendInterface();\n \t\tappendTestsList(details.modules);\n \t\ttests = id(\"qunit-tests\");\n \t\tif (tests && config.hidepassed) {\n \t\t\taddClass(tests, \"hidepass\");\n \t\t}\n \t});\n\n \tQUnit.done(function (details) {\n \t\tvar banner = id(\"qunit-banner\"),\n \t\t tests = id(\"qunit-tests\"),\n \t\t abortButton = id(\"qunit-abort-tests-button\"),\n \t\t totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,\n \t\t html = [totalTests, \" tests completed in \", details.runtime, \" milliseconds, with \", stats.failedTests, \" failed, \", stats.skippedTests, \" skipped, and \", stats.todoTests, \" todo.<br />\", \"<span class='passed'>\", details.passed, \"</span> assertions of <span class='total'>\", details.total, \"</span> passed, <span class='failed'>\", details.failed, \"</span> failed.\"].join(\"\"),\n \t\t test,\n \t\t assertLi,\n \t\t assertList;\n\n \t\t// Update remaing tests to aborted\n \t\tif (abortButton && abortButton.disabled) {\n \t\t\thtml = \"Tests aborted after \" + details.runtime + \" milliseconds.\";\n\n \t\t\tfor (var i = 0; i < tests.children.length; i++) {\n \t\t\t\ttest = tests.children[i];\n \t\t\t\tif (test.className === \"\" || test.className === \"running\") {\n \t\t\t\t\ttest.className = \"aborted\";\n \t\t\t\t\tassertList = test.getElementsByTagName(\"ol\")[0];\n \t\t\t\t\tassertLi = document$$1.createElement(\"li\");\n \t\t\t\t\tassertLi.className = \"fail\";\n \t\t\t\t\tassertLi.innerHTML = \"Test aborted.\";\n \t\t\t\t\tassertList.appendChild(assertLi);\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\tif (banner && (!abortButton || abortButton.disabled === false)) {\n \t\t\tbanner.className = stats.failedTests ? \"qunit-fail\" : \"qunit-pass\";\n \t\t}\n\n \t\tif (abortButton) {\n \t\t\tabortButton.parentNode.removeChild(abortButton);\n \t\t}\n\n \t\tif (tests) {\n \t\t\tid(\"qunit-testresult-display\").innerHTML = html;\n \t\t}\n\n \t\tif (config.altertitle && document$$1.title) {\n\n \t\t\t// Show ✖ for good, ✔ for bad suite result in title\n \t\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n \t\t\tdocument$$1.title = [stats.failedTests ? \"\\u2716\" : \"\\u2714\", document$$1.title.replace(/^[\\u2714\\u2716] /i, \"\")].join(\" \");\n \t\t}\n\n \t\t// Scroll back to top to show results\n \t\tif (config.scrolltop && window.scrollTo) {\n \t\t\twindow.scrollTo(0, 0);\n \t\t}\n \t});\n\n \tfunction getNameHtml(name, module) {\n \t\tvar nameHtml = \"\";\n\n \t\tif (module) {\n \t\t\tnameHtml = \"<span class='module-name'>\" + escapeText(module) + \"</span>: \";\n \t\t}\n\n \t\tnameHtml += \"<span class='test-name'>\" + escapeText(name) + \"</span>\";\n\n \t\treturn nameHtml;\n \t}\n\n \tQUnit.testStart(function (details) {\n \t\tvar running, testBlock, bad;\n\n \t\ttestBlock = id(\"qunit-test-output-\" + details.testId);\n \t\tif (testBlock) {\n \t\t\ttestBlock.className = \"running\";\n \t\t} else {\n\n \t\t\t// Report later registered tests\n \t\t\tappendTest(details.name, details.testId, details.module);\n \t\t}\n\n \t\trunning = id(\"qunit-testresult-display\");\n \t\tif (running) {\n \t\t\tbad = QUnit.config.reorder && details.previousFailure;\n\n \t\t\trunning.innerHTML = (bad ? \"Rerunning previously failed test: <br />\" : \"Running: <br />\") + getNameHtml(details.name, details.module);\n \t\t}\n \t});\n\n \tfunction stripHtml(string) {\n\n \t\t// Strip tags, html entity and whitespaces\n \t\treturn string.replace(/<\\/?[^>]+(>|$)/g, \"\").replace(/\\"/g, \"\").replace(/\\s+/g, \"\");\n \t}\n\n \tQUnit.log(function (details) {\n \t\tvar assertList,\n \t\t assertLi,\n \t\t message,\n \t\t expected,\n \t\t actual,\n \t\t diff,\n \t\t showDiff = false,\n \t\t testItem = id(\"qunit-test-output-\" + details.testId);\n\n \t\tif (!testItem) {\n \t\t\treturn;\n \t\t}\n\n \t\tmessage = escapeText(details.message) || (details.result ? \"okay\" : \"failed\");\n \t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n \t\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n \t\t// The pushFailure doesn't provide details.expected\n \t\t// when it calls, it's implicit to also not show expected and diff stuff\n \t\t// Also, we need to check details.expected existence, as it can exist and be undefined\n \t\tif (!details.result && hasOwn.call(details, \"expected\")) {\n \t\t\tif (details.negative) {\n \t\t\t\texpected = \"NOT \" + QUnit.dump.parse(details.expected);\n \t\t\t} else {\n \t\t\t\texpected = QUnit.dump.parse(details.expected);\n \t\t\t}\n\n \t\t\tactual = QUnit.dump.parse(details.actual);\n \t\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + escapeText(expected) + \"</pre></td></tr>\";\n\n \t\t\tif (actual !== expected) {\n\n \t\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText(actual) + \"</pre></td></tr>\";\n\n \t\t\t\t// Don't show diff if actual or expected are booleans\n \t\t\t\tif (!/^(true|false)$/.test(actual) && !/^(true|false)$/.test(expected)) {\n \t\t\t\t\tdiff = QUnit.diff(expected, actual);\n \t\t\t\t\tshowDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;\n \t\t\t\t}\n\n \t\t\t\t// Don't show diff if expected and actual are totally different\n \t\t\t\tif (showDiff) {\n \t\t\t\t\tmessage += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + diff + \"</pre></td></tr>\";\n \t\t\t\t}\n \t\t\t} else if (expected.indexOf(\"[object Array]\") !== -1 || expected.indexOf(\"[object Object]\") !== -1) {\n \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the depth of object is more than current max depth (\" + QUnit.config.maxDepth + \").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to \" + \" run with a higher max depth or <a href='\" + escapeText(setUrl({ maxDepth: -1 })) + \"'>\" + \"Rerun</a> without max depth.</p></td></tr>\";\n \t\t\t} else {\n \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the expected and actual results have an equivalent\" + \" serialization</td></tr>\";\n \t\t\t}\n\n \t\t\tif (details.source) {\n \t\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\";\n \t\t\t}\n\n \t\t\tmessage += \"</table>\";\n\n \t\t\t// This occurs when pushFailure is set and we have an extracted stack trace\n \t\t} else if (!details.result && details.source) {\n \t\t\tmessage += \"<table>\" + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\" + \"</table>\";\n \t\t}\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tassertLi = document$$1.createElement(\"li\");\n \t\tassertLi.className = details.result ? \"pass\" : \"fail\";\n \t\tassertLi.innerHTML = message;\n \t\tassertList.appendChild(assertLi);\n \t});\n\n \tQUnit.testDone(function (details) {\n \t\tvar testTitle,\n \t\t time,\n \t\t testItem,\n \t\t assertList,\n \t\t good,\n \t\t bad,\n \t\t testCounts,\n \t\t skipped,\n \t\t sourceName,\n \t\t tests = id(\"qunit-tests\");\n\n \t\tif (!tests) {\n \t\t\treturn;\n \t\t}\n\n \t\ttestItem = id(\"qunit-test-output-\" + details.testId);\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tgood = details.passed;\n \t\tbad = details.failed;\n\n \t\t// This test passed if it has no unexpected failed assertions\n \t\tvar testPassed = details.failed > 0 ? details.todo : !details.todo;\n\n \t\tif (testPassed) {\n\n \t\t\t// Collapse the passing tests\n \t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t} else if (config.collapse) {\n \t\t\tif (!collapseNext) {\n\n \t\t\t\t// Skip collapsing the first failing test\n \t\t\t\tcollapseNext = true;\n \t\t\t} else {\n\n \t\t\t\t// Collapse remaining tests\n \t\t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t\t}\n \t\t}\n\n \t\t// The testItem.firstChild is the test name\n \t\ttestTitle = testItem.firstChild;\n\n \t\ttestCounts = bad ? \"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" : \"\";\n\n \t\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts + details.assertions.length + \")</b>\";\n\n \t\tif (details.skipped) {\n \t\t\tstats.skippedTests++;\n\n \t\t\ttestItem.className = \"skipped\";\n \t\t\tskipped = document$$1.createElement(\"em\");\n \t\t\tskipped.className = \"qunit-skipped-label\";\n \t\t\tskipped.innerHTML = \"skipped\";\n \t\t\ttestItem.insertBefore(skipped, testTitle);\n \t\t} else {\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(assertList, \"qunit-collapsed\");\n \t\t\t});\n\n \t\t\ttestItem.className = testPassed ? \"pass\" : \"fail\";\n\n \t\t\tif (details.todo) {\n \t\t\t\tvar todoLabel = document$$1.createElement(\"em\");\n \t\t\t\ttodoLabel.className = \"qunit-todo-label\";\n \t\t\t\ttodoLabel.innerHTML = \"todo\";\n \t\t\t\ttestItem.className += \" todo\";\n \t\t\t\ttestItem.insertBefore(todoLabel, testTitle);\n \t\t\t}\n\n \t\t\ttime = document$$1.createElement(\"span\");\n \t\t\ttime.className = \"runtime\";\n \t\t\ttime.innerHTML = details.runtime + \" ms\";\n \t\t\ttestItem.insertBefore(time, assertList);\n\n \t\t\tif (!testPassed) {\n \t\t\t\tstats.failedTests++;\n \t\t\t} else if (details.todo) {\n \t\t\t\tstats.todoTests++;\n \t\t\t} else {\n \t\t\t\tstats.passedTests++;\n \t\t\t}\n \t\t}\n\n \t\t// Show the source of the test when showing assertions\n \t\tif (details.source) {\n \t\t\tsourceName = document$$1.createElement(\"p\");\n \t\t\tsourceName.innerHTML = \"<strong>Source: </strong>\" + details.source;\n \t\t\taddClass(sourceName, \"qunit-source\");\n \t\t\tif (testPassed) {\n \t\t\t\taddClass(sourceName, \"qunit-collapsed\");\n \t\t\t}\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(sourceName, \"qunit-collapsed\");\n \t\t\t});\n \t\t\ttestItem.appendChild(sourceName);\n \t\t}\n \t});\n\n \t// Avoid readyState issue with phantomjs\n \t// Ref: #818\n \tvar notPhantom = function (p) {\n \t\treturn !(p && p.version && p.version.major > 0);\n \t}(window.phantom);\n\n \tif (notPhantom && document$$1.readyState === \"complete\") {\n \t\tQUnit.load();\n \t} else {\n \t\taddEvent(window, \"load\", QUnit.load);\n \t}\n\n \t// Wrap window.onerror. We will call the original window.onerror to see if\n \t// the existing handler fully handles the error; if not, we will call the\n \t// QUnit.onError function.\n \tvar originalWindowOnError = window.onerror;\n\n \t// Cover uncaught exceptions\n \t// Returning true will suppress the default browser handler,\n \t// returning false will let it run.\n \twindow.onerror = function (message, fileName, lineNumber) {\n \t\tvar ret = false;\n \t\tif (originalWindowOnError) {\n \t\t\tfor (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n \t\t\t\targs[_key - 3] = arguments[_key];\n \t\t\t}\n\n \t\t\tret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));\n \t\t}\n\n \t\t// Treat return value as window.onerror itself does,\n \t\t// Only do our handling if not suppressed.\n \t\tif (ret !== true) {\n \t\t\tvar error = {\n \t\t\t\tmessage: message,\n \t\t\t\tfileName: fileName,\n \t\t\t\tlineNumber: lineNumber\n \t\t\t};\n\n \t\t\tret = QUnit.onError(error);\n \t\t}\n\n \t\treturn ret;\n \t};\n })();\n\n /*\n * This file is a modified version of google-diff-match-patch's JavaScript implementation\n * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n * modifications are licensed as more fully set forth in LICENSE.txt.\n *\n * The original source of google-diff-match-patch is attributable and licensed as follows:\n *\n * Copyright 2006 Google Inc.\n * https://code.google.com/p/google-diff-match-patch/\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 * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * More Info:\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n */\n QUnit.diff = function () {\n \tfunction DiffMatchPatch() {}\n\n \t// DIFF FUNCTIONS\n\n \t/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\n \tvar DIFF_DELETE = -1,\n \t DIFF_INSERT = 1,\n \t DIFF_EQUAL = 0;\n\n \t/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n \t\tvar deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;\n\n \t\t// The diff must be complete in up to 1 second.\n \t\tdeadline = new Date().getTime() + 1000;\n\n \t\t// Check for null inputs.\n \t\tif (text1 === null || text2 === null) {\n \t\t\tthrow new Error(\"Null input. (DiffMain)\");\n \t\t}\n\n \t\t// Check for equality (speedup).\n \t\tif (text1 === text2) {\n \t\t\tif (text1) {\n \t\t\t\treturn [[DIFF_EQUAL, text1]];\n \t\t\t}\n \t\t\treturn [];\n \t\t}\n\n \t\tif (typeof optChecklines === \"undefined\") {\n \t\t\toptChecklines = true;\n \t\t}\n\n \t\tchecklines = optChecklines;\n\n \t\t// Trim off common prefix (speedup).\n \t\tcommonlength = this.diffCommonPrefix(text1, text2);\n \t\tcommonprefix = text1.substring(0, commonlength);\n \t\ttext1 = text1.substring(commonlength);\n \t\ttext2 = text2.substring(commonlength);\n\n \t\t// Trim off common suffix (speedup).\n \t\tcommonlength = this.diffCommonSuffix(text1, text2);\n \t\tcommonsuffix = text1.substring(text1.length - commonlength);\n \t\ttext1 = text1.substring(0, text1.length - commonlength);\n \t\ttext2 = text2.substring(0, text2.length - commonlength);\n\n \t\t// Compute the diff on the middle block.\n \t\tdiffs = this.diffCompute(text1, text2, checklines, deadline);\n\n \t\t// Restore the prefix and suffix.\n \t\tif (commonprefix) {\n \t\t\tdiffs.unshift([DIFF_EQUAL, commonprefix]);\n \t\t}\n \t\tif (commonsuffix) {\n \t\t\tdiffs.push([DIFF_EQUAL, commonsuffix]);\n \t\t}\n \t\tthis.diffCleanupMerge(diffs);\n \t\treturn diffs;\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Is there an insertion operation before the last equality.\n \t\tpreIns = false;\n\n \t\t// Is there a deletion operation before the last equality.\n \t\tpreDel = false;\n\n \t\t// Is there an insertion operation after the last equality.\n \t\tpostIns = false;\n\n \t\t// Is there a deletion operation after the last equality.\n \t\tpostDel = false;\n \t\twhile (pointer < diffs.length) {\n\n \t\t\t// Equality found.\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\tif (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n\n \t\t\t\t\t// Candidate found.\n \t\t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\t\tpreIns = postIns;\n \t\t\t\t\tpreDel = postDel;\n \t\t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t\t} else {\n\n \t\t\t\t\t// Not a candidate, and can never become one.\n \t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t}\n \t\t\t\tpostIns = postDel = false;\n\n \t\t\t\t// An insertion or deletion.\n \t\t\t} else {\n\n \t\t\t\tif (diffs[pointer][0] === DIFF_DELETE) {\n \t\t\t\t\tpostDel = true;\n \t\t\t\t} else {\n \t\t\t\t\tpostIns = true;\n \t\t\t\t}\n\n \t\t\t\t/*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n \t\t\t\tif (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n \t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tif (preIns && preDel) {\n\n \t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n \t\t\t\t\t\tpostIns = postDel = true;\n \t\t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\t} else {\n \t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n \t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n \t\t\t\t\t\tpostIns = postDel = false;\n \t\t\t\t\t}\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \t/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n * @param {integer} string to be beautified.\n * @return {string} HTML representation.\n */\n \tDiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n \t\tvar op,\n \t\t data,\n \t\t x,\n \t\t html = [];\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\top = diffs[x][0]; // Operation (insert, delete, equal)\n \t\t\tdata = diffs[x][1]; // Text of change.\n \t\t\tswitch (op) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\thtml[x] = \"<ins>\" + escapeText(data) + \"</ins>\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\thtml[x] = \"<del>\" + escapeText(data) + \"</del>\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n \t\t\t\t\thtml[x] = \"<span>\" + escapeText(data) + \"</span>\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\treturn html.join(\"\");\n \t};\n\n \t/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\n \tDiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerstart = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerstart = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\n \tDiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerend;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerend = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerend = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n \t\tvar diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n\n \t\tif (!text1) {\n\n \t\t\t// Just add some text (speedup).\n \t\t\treturn [[DIFF_INSERT, text2]];\n \t\t}\n\n \t\tif (!text2) {\n\n \t\t\t// Just delete some text (speedup).\n \t\t\treturn [[DIFF_DELETE, text1]];\n \t\t}\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\ti = longtext.indexOf(shorttext);\n \t\tif (i !== -1) {\n\n \t\t\t// Shorter text is inside the longer text (speedup).\n \t\t\tdiffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n \t\t\t// Swap insertions for deletions if diff is reversed.\n \t\t\tif (text1.length > text2.length) {\n \t\t\t\tdiffs[0][0] = diffs[2][0] = DIFF_DELETE;\n \t\t\t}\n \t\t\treturn diffs;\n \t\t}\n\n \t\tif (shorttext.length === 1) {\n\n \t\t\t// Single character string.\n \t\t\t// After the previous speedup, the character can't be an equality.\n \t\t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t\t}\n\n \t\t// Check to see if the problem can be split in two.\n \t\thm = this.diffHalfMatch(text1, text2);\n \t\tif (hm) {\n\n \t\t\t// A half-match was found, sort out the return data.\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t\tmidCommon = hm[4];\n\n \t\t\t// Send both pairs off for separate processing.\n \t\t\tdiffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n \t\t\tdiffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n \t\t\t// Merge the results.\n \t\t\treturn diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n \t\t}\n\n \t\tif (checklines && text1.length > 100 && text2.length > 100) {\n \t\t\treturn this.diffLineMode(text1, text2, deadline);\n \t\t}\n\n \t\treturn this.diffBisect(text1, text2, deadline);\n \t};\n\n \t/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\n \tDiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n \t\tvar longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\tif (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n \t\t\treturn null; // Pointless.\n \t\t}\n \t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n \t\t/**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n \t\tfunction diffHalfMatchI(longtext, shorttext, i) {\n \t\t\tvar seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n \t\t\t// Start with a 1/4 length substring at position i as a seed.\n \t\t\tseed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n \t\t\tj = -1;\n \t\t\tbestCommon = \"\";\n \t\t\twhile ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n \t\t\t\tprefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n \t\t\t\tsuffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n \t\t\t\tif (bestCommon.length < suffixLength + prefixLength) {\n \t\t\t\t\tbestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n \t\t\t\t\tbestLongtextA = longtext.substring(0, i - suffixLength);\n \t\t\t\t\tbestLongtextB = longtext.substring(i + prefixLength);\n \t\t\t\t\tbestShorttextA = shorttext.substring(0, j - suffixLength);\n \t\t\t\t\tbestShorttextB = shorttext.substring(j + prefixLength);\n \t\t\t\t}\n \t\t\t}\n \t\t\tif (bestCommon.length * 2 >= longtext.length) {\n \t\t\t\treturn [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n \t\t\t} else {\n \t\t\t\treturn null;\n \t\t\t}\n \t\t}\n\n \t\t// First check if the second quarter is the seed for a half-match.\n \t\thm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n \t\t// Check again based on the third quarter.\n \t\thm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n \t\tif (!hm1 && !hm2) {\n \t\t\treturn null;\n \t\t} else if (!hm2) {\n \t\t\thm = hm1;\n \t\t} else if (!hm1) {\n \t\t\thm = hm2;\n \t\t} else {\n\n \t\t\t// Both matched. Select the longest.\n \t\t\thm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n \t\t}\n\n \t\t// A half-match was found, sort out the return data.\n \t\tif (text1.length > text2.length) {\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t} else {\n \t\t\ttext2A = hm[0];\n \t\t\ttext2B = hm[1];\n \t\t\ttext1A = hm[2];\n \t\t\ttext1B = hm[3];\n \t\t}\n \t\tmidCommon = hm[4];\n \t\treturn [text1A, text1B, text2A, text2B, midCommon];\n \t};\n\n \t/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n \t\tvar a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n \t\t// Scan the text on a line-by-line basis first.\n \t\ta = this.diffLinesToChars(text1, text2);\n \t\ttext1 = a.chars1;\n \t\ttext2 = a.chars2;\n \t\tlinearray = a.lineArray;\n\n \t\tdiffs = this.DiffMain(text1, text2, false, deadline);\n\n \t\t// Convert the diff back to original text.\n \t\tthis.diffCharsToLines(diffs, linearray);\n\n \t\t// Eliminate freak matches (e.g. blank lines)\n \t\tthis.diffCleanupSemantic(diffs);\n\n \t\t// Rediff any replacement blocks, this time character-by-character.\n \t\t// Add a dummy entry at the end.\n \t\tdiffs.push([DIFF_EQUAL, \"\"]);\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete >= 1 && countInsert >= 1) {\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n \t\t\t\t\t\ta = this.DiffMain(textDelete, textInsert, false, deadline);\n \t\t\t\t\t\tfor (j = a.length - 1; j >= 0; j--) {\n \t\t\t\t\t\t\tdiffs.splice(pointer, 0, a[j]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer + a.length;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n \t\treturn diffs;\n \t};\n\n \t/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n \t\tvar text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n \t\tmaxD = Math.ceil((text1Length + text2Length) / 2);\n \t\tvOffset = maxD;\n \t\tvLength = 2 * maxD;\n \t\tv1 = new Array(vLength);\n \t\tv2 = new Array(vLength);\n\n \t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n \t\t// integers and undefined.\n \t\tfor (x = 0; x < vLength; x++) {\n \t\t\tv1[x] = -1;\n \t\t\tv2[x] = -1;\n \t\t}\n \t\tv1[vOffset + 1] = 0;\n \t\tv2[vOffset + 1] = 0;\n \t\tdelta = text1Length - text2Length;\n\n \t\t// If the total number of characters is odd, then the front path will collide\n \t\t// with the reverse path.\n \t\tfront = delta % 2 !== 0;\n\n \t\t// Offsets for start and end of k loop.\n \t\t// Prevents mapping of space beyond the grid.\n \t\tk1start = 0;\n \t\tk1end = 0;\n \t\tk2start = 0;\n \t\tk2end = 0;\n \t\tfor (d = 0; d < maxD; d++) {\n\n \t\t\t// Bail out if deadline is reached.\n \t\t\tif (new Date().getTime() > deadline) {\n \t\t\t\tbreak;\n \t\t\t}\n\n \t\t\t// Walk the front path one step.\n \t\t\tfor (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n \t\t\t\tk1Offset = vOffset + k1;\n \t\t\t\tif (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n \t\t\t\t\tx1 = v1[k1Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx1 = v1[k1Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty1 = x1 - k1;\n \t\t\t\twhile (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n \t\t\t\t\tx1++;\n \t\t\t\t\ty1++;\n \t\t\t\t}\n \t\t\t\tv1[k1Offset] = x1;\n \t\t\t\tif (x1 > text1Length) {\n\n \t\t\t\t\t// Ran off the right of the graph.\n \t\t\t\t\tk1end += 2;\n \t\t\t\t} else if (y1 > text2Length) {\n\n \t\t\t\t\t// Ran off the bottom of the graph.\n \t\t\t\t\tk1start += 2;\n \t\t\t\t} else if (front) {\n \t\t\t\t\tk2Offset = vOffset + delta - k1;\n \t\t\t\t\tif (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - v2[k2Offset];\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n\n \t\t\t// Walk the reverse path one step.\n \t\t\tfor (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n \t\t\t\tk2Offset = vOffset + k2;\n \t\t\t\tif (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n \t\t\t\t\tx2 = v2[k2Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx2 = v2[k2Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty2 = x2 - k2;\n \t\t\t\twhile (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n \t\t\t\t\tx2++;\n \t\t\t\t\ty2++;\n \t\t\t\t}\n \t\t\t\tv2[k2Offset] = x2;\n \t\t\t\tif (x2 > text1Length) {\n\n \t\t\t\t\t// Ran off the left of the graph.\n \t\t\t\t\tk2end += 2;\n \t\t\t\t} else if (y2 > text2Length) {\n\n \t\t\t\t\t// Ran off the top of the graph.\n \t\t\t\t\tk2start += 2;\n \t\t\t\t} else if (!front) {\n \t\t\t\t\tk1Offset = vOffset + delta - k2;\n \t\t\t\t\tif (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n \t\t\t\t\t\tx1 = v1[k1Offset];\n \t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - x2;\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\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// Diff took too long and hit the deadline or\n \t\t// number of diffs equals number of characters, no commonality at all.\n \t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t};\n\n \t/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n \t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n \t\ttext1a = text1.substring(0, x);\n \t\ttext2a = text2.substring(0, y);\n \t\ttext1b = text1.substring(x);\n \t\ttext2b = text2.substring(y);\n\n \t\t// Compute both diffs serially.\n \t\tdiffs = this.DiffMain(text1a, text2a, false, deadline);\n \t\tdiffsb = this.DiffMain(text1b, text2b, false, deadline);\n\n \t\treturn diffs.concat(diffsb);\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Number of characters that changed prior to the equality.\n \t\tlengthInsertions1 = 0;\n \t\tlengthDeletions1 = 0;\n\n \t\t// Number of characters that changed after the equality.\n \t\tlengthInsertions2 = 0;\n \t\tlengthDeletions2 = 0;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\t// Equality found.\n \t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\tlengthInsertions1 = lengthInsertions2;\n \t\t\t\tlengthDeletions1 = lengthDeletions2;\n \t\t\t\tlengthInsertions2 = 0;\n \t\t\t\tlengthDeletions2 = 0;\n \t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t} else {\n \t\t\t\t// An insertion or deletion.\n \t\t\t\tif (diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\t\tlengthInsertions2 += diffs[pointer][1].length;\n \t\t\t\t} else {\n \t\t\t\t\tlengthDeletions2 += diffs[pointer][1].length;\n \t\t\t\t}\n\n \t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n \t\t\t\t// sides of it.\n \t\t\t\tif (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n \t\t\t\t\t// Throw away the equality we just deleted.\n \t\t\t\t\tequalitiesLength--;\n\n \t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n \t\t\t\t\tequalitiesLength--;\n \t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n \t\t\t\t\t// Reset the counters.\n \t\t\t\t\tlengthInsertions1 = 0;\n \t\t\t\t\tlengthDeletions1 = 0;\n \t\t\t\t\tlengthInsertions2 = 0;\n \t\t\t\t\tlengthDeletions2 = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// Normalize the diff.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n\n \t\t// Find any overlaps between deletions and insertions.\n \t\t// e.g: <del>abcxxx</del><ins>xxxdef</ins>\n \t\t// -> <del>abc</del>xxx<ins>def</ins>\n \t\t// e.g: <del>xxxabc</del><ins>defxxx</ins>\n \t\t// -> <ins>def</ins>xxx<del>abc</del>\n \t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n \t\tpointer = 1;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\tdeletion = diffs[pointer - 1][1];\n \t\t\t\tinsertion = diffs[pointer][1];\n \t\t\t\toverlapLength1 = this.diffCommonOverlap(deletion, insertion);\n \t\t\t\toverlapLength2 = this.diffCommonOverlap(insertion, deletion);\n \t\t\t\tif (overlapLength1 >= overlapLength2) {\n \t\t\t\t\tif (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Overlap found. Insert an equality and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n \t\t\t\t\t\tdiffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n \t\t\t\t\t\tdiffs[pointer + 1][1] = insertion.substring(overlapLength1);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tif (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Reverse overlap found.\n \t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n\n \t\t\t\t\t\tdiffs[pointer - 1][0] = DIFF_INSERT;\n \t\t\t\t\t\tdiffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n \t\t\t\t\t\tdiffs[pointer + 1][0] = DIFF_DELETE;\n \t\t\t\t\t\tdiffs[pointer + 1][1] = deletion.substring(overlapLength2);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tpointer++;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t};\n\n \t/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n \t\tvar text1Length, text2Length, textLength, best, length, pattern, found;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n\n \t\t// Eliminate the null case.\n \t\tif (text1Length === 0 || text2Length === 0) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Truncate the longer string.\n \t\tif (text1Length > text2Length) {\n \t\t\ttext1 = text1.substring(text1Length - text2Length);\n \t\t} else if (text1Length < text2Length) {\n \t\t\ttext2 = text2.substring(0, text1Length);\n \t\t}\n \t\ttextLength = Math.min(text1Length, text2Length);\n\n \t\t// Quick check for the worst case.\n \t\tif (text1 === text2) {\n \t\t\treturn textLength;\n \t\t}\n\n \t\t// Start by looking for a single character match\n \t\t// and increase length until no match is found.\n \t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n \t\tbest = 0;\n \t\tlength = 1;\n \t\twhile (true) {\n \t\t\tpattern = text1.substring(textLength - length);\n \t\t\tfound = text2.indexOf(pattern);\n \t\t\tif (found === -1) {\n \t\t\t\treturn best;\n \t\t\t}\n \t\t\tlength += found;\n \t\t\tif (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n \t\t\t\tbest = length;\n \t\t\t\tlength++;\n \t\t\t}\n \t\t}\n \t};\n\n \t/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n \t\tvar lineArray, lineHash, chars1, chars2;\n \t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n \t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n \t\t// '\\x00' is a valid character, but various debuggers don't like it.\n \t\t// So we'll insert a junk entry to avoid generating a null character.\n \t\tlineArray[0] = \"\";\n\n \t\t/**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n \t\tfunction diffLinesToCharsMunge(text) {\n \t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n \t\t\tchars = \"\";\n\n \t\t\t// Walk the text, pulling out a substring for each line.\n \t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n \t\t\t// Modifying text would create many large strings to garbage collect.\n \t\t\tlineStart = 0;\n \t\t\tlineEnd = -1;\n\n \t\t\t// Keeping our own length variable is faster than looking it up.\n \t\t\tlineArrayLength = lineArray.length;\n \t\t\twhile (lineEnd < text.length - 1) {\n \t\t\t\tlineEnd = text.indexOf(\"\\n\", lineStart);\n \t\t\t\tif (lineEnd === -1) {\n \t\t\t\t\tlineEnd = text.length - 1;\n \t\t\t\t}\n \t\t\t\tline = text.substring(lineStart, lineEnd + 1);\n \t\t\t\tlineStart = lineEnd + 1;\n\n \t\t\t\tif (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {\n \t\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n \t\t\t\t} else {\n \t\t\t\t\tchars += String.fromCharCode(lineArrayLength);\n \t\t\t\t\tlineHash[line] = lineArrayLength;\n \t\t\t\t\tlineArray[lineArrayLength++] = line;\n \t\t\t\t}\n \t\t\t}\n \t\t\treturn chars;\n \t\t}\n\n \t\tchars1 = diffLinesToCharsMunge(text1);\n \t\tchars2 = diffLinesToCharsMunge(text2);\n \t\treturn {\n \t\t\tchars1: chars1,\n \t\t\tchars2: chars2,\n \t\t\tlineArray: lineArray\n \t\t};\n \t};\n\n \t/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n \t\tvar x, chars, text, y;\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\tchars = diffs[x][1];\n \t\t\ttext = [];\n \t\t\tfor (y = 0; y < chars.length; y++) {\n \t\t\t\ttext[y] = lineArray[chars.charCodeAt(y)];\n \t\t\t}\n \t\t\tdiffs[x][1] = text.join(\"\");\n \t\t}\n \t};\n\n \t/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n \t\tvar pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;\n \t\tdiffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete + countInsert > 1) {\n \t\t\t\t\t\tif (countDelete !== 0 && countInsert !== 0) {\n\n \t\t\t\t\t\t\t// Factor out any common prefixes.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonPrefix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tif (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n \t\t\t\t\t\t\t\t\tdiffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n \t\t\t\t\t\t\t\t} else {\n \t\t\t\t\t\t\t\t\tdiffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n \t\t\t\t\t\t\t\t\tpointer++;\n \t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(commonlength);\n \t\t\t\t\t\t\t}\n\n \t\t\t\t\t\t\t// Factor out any common suffixies.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonSuffix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tdiffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(0, textInsert.length - commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(0, textDelete.length - commonlength);\n \t\t\t\t\t\t\t}\n \t\t\t\t\t\t}\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tif (countDelete === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t} else if (countInsert === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n \t\t\t\t\t\t} else {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n \t\t\t\t\t} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n\n \t\t\t\t\t\t// Merge this equality with the previous one.\n \t\t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer][1];\n \t\t\t\t\t\tdiffs.splice(pointer, 1);\n \t\t\t\t\t} else {\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif (diffs[diffs.length - 1][1] === \"\") {\n \t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n \t\t}\n\n \t\t// Second pass: look for single edits surrounded on both sides by equalities\n \t\t// which can be shifted sideways to eliminate an equality.\n \t\t// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n \t\tchanges = false;\n \t\tpointer = 1;\n\n \t\t// Intentionally ignore the first and last element (don't need checking).\n \t\twhile (pointer < diffs.length - 1) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n\n \t\t\t\tdiffPointer = diffs[pointer][1];\n \t\t\t\tposition = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n \t\t\t\t// This is a single edit surrounded by equalities.\n \t\t\t\tif (position === diffs[pointer - 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the previous equality.\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n \t\t\t\t\tdiffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer - 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the next equality.\n \t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer + 1][1];\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer + 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// If shifts were made, the diff needs reordering and another shift sweep.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \treturn function (o, n) {\n \t\tvar diff, output, text;\n \t\tdiff = new DiffMatchPatch();\n \t\toutput = diff.DiffMain(o, n);\n \t\tdiff.diffCleanupEfficiency(output);\n \t\ttext = diff.diffPrettyHtml(output);\n\n \t\treturn text;\n \t};\n }();\n\n}((function() { return this; }())));\n","QUnit.notifications = function( options ) {\n \"use strict\";\n\n options = options || {};\n options.icons = options.icons || {};\n options.timeout = options.timeout || 4000;\n options.titles = options.titles || { passed: \"Passed!\", failed: \"Failed!\" };\n options.bodies = options.bodies || {\n passed: \"{{passed}} of {{total}} passed\",\n failed: \"{{passed}} passed. {{failed}} failed.\"\n };\n\n var renderBody = function( body, details ) {\n [ \"passed\", \"failed\", \"total\", \"runtime\" ].forEach( function( type ) {\n body = body.replace( \"{{\" + type + \"}}\", details[ type ] );\n } );\n\n return body;\n };\n\n function generateQueryString( params ) {\n var key,\n querystring = \"?\";\n\n params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );\n\n for ( key in params ) {\n if ( params.hasOwnProperty( key ) ) {\n if ( params[ key ] === undefined ) {\n continue;\n }\n querystring += encodeURIComponent( key );\n if ( params[ key ] !== true ) {\n querystring += \"=\" + encodeURIComponent( params[ key ] );\n }\n querystring += \"&\";\n }\n }\n return location.protocol + \"//\" + location.host +\n location.pathname + querystring.slice( 0, -1 );\n }\n\n if ( window.Notification ) {\n QUnit.done( function( details ) {\n var title,\n _options = {},\n notification;\n\n if ( window.Notification && QUnit.urlParams.notifications ) {\n if ( details.failed === 0 ) {\n title = options.titles.passed;\n _options.body = renderBody( options.bodies.passed, details );\n\n if ( options.icons.passed ) {\n _options.icon = options.icons.passed;\n }\n } else {\n title = options.titles.failed;\n _options.body = renderBody( options.bodies.failed, details );\n\n if ( options.icons.failed ) {\n _options.icon = options.icons.failed;\n }\n }\n\n notification = new window.Notification( title, _options );\n\n setTimeout( function() {\n notification.close();\n }, options.timeout );\n }\n } );\n\n QUnit.begin( function() {\n var toolbar = document.getElementById( \"qunit-testrunner-toolbar\" );\n if ( !toolbar ) { return; }\n\n var notification = document.createElement( \"input\" ),\n label = document.createElement( \"label\" ),\n disableCheckbox = function() {\n notification.checked = false;\n notification.disabled = true;\n label.style.opacity = 0.5;\n label.title = notification.title = \"Note: Notifications have been \" +\n \"disabled in this browser.\";\n };\n\n notification.type = \"checkbox\";\n notification.id = \"qunit-notifications\";\n\n label.innerHTML = \"Notifications\";\n label.for = \"qunit-notifications\";\n label.title = \"Show notifications.\";\n if ( window.Notification.permission === \"denied\" ) {\n disableCheckbox();\n } else if ( QUnit.urlParams.notifications ) {\n notification.checked = true;\n }\n\n notification.addEventListener( \"click\", function( event ) {\n if ( event.target.checked ) {\n if ( window.Notification.permission === \"granted\" ) {\n window.location = generateQueryString( { notifications: true } );\n } else if ( window.Notification.permission === \"denied\" ) {\n disableCheckbox();\n } else {\n window.Notification.requestPermission( function( permission ) {\n if ( permission === \"denied\" ) {\n disableCheckbox();\n } else {\n window.location = generateQueryString( { notifications: true } );\n }\n } );\n }\n } else {\n window.location = generateQueryString( { notifications: undefined } );\n }\n }, false );\n\n toolbar.appendChild( notification );\n toolbar.appendChild( label );\n } );\n }\n};\n","/* globals jQuery, QUnit */\n\n(function() {\n QUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container'});\n QUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting'});\n QUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container'});\n QUnit.config.urlConfig.push({ id: 'devmode', label: 'Development mode' });\n\n QUnit.config.testTimeout = QUnit.urlParams.devmode ? null : 60000; //Default Test Timeout 60 Seconds\n\n if (QUnit.notifications) {\n QUnit.notifications({\n icons: {\n passed: '/assets/passed.png',\n failed: '/assets/failed.png'\n }\n });\n }\n\n function ready(fn) {\n if (typeof jQuery === 'function') {\n jQuery(document).ready(fn);\n return;\n }\n\n if (document.readyState != 'loading'){\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n }\n\n ready(function() {\n var testContainer = document.getElementById('ember-testing-container');\n if (!testContainer) { return; }\n\n var params = QUnit.urlParams;\n\n var containerVisibility = params.nocontainer ? 'hidden' : 'visible';\n var containerPosition = (params.dockcontainer || params.devmode) ? 'absolute' : 'relative';\n\n if (params.devmode) {\n testContainer.className = ' full-screen';\n }\n\n testContainer.style.visibility = containerVisibility;\n testContainer.style.position = containerPosition;\n });\n})();\n","/* globals jQuery, QUnit, require, requirejs */\n\n(function() {\n function ready(fn) {\n if (typeof jQuery === 'function') {\n jQuery(document).ready(fn);\n return;\n }\n\n if (document.readyState != 'loading'){\n fn();\n } else {\n document.addEventListener('DOMContentLoaded', fn);\n }\n }\n \n var autostart = QUnit.config.autostart !== false;\n QUnit.config.autostart = false;\n\n ready(function() {\n var QUnitAdapter = require('ember-qunit').QUnitAdapter;\n Ember.Test.adapter = QUnitAdapter.create();\n\n var testLoaderModulePath = 'ember-cli-test-loader/test-support/index';\n\n if (!requirejs.entries[testLoaderModulePath]) {\n testLoaderModulePath = 'ember-cli/test-loader';\n }\n\n var TestLoaderModule = require(testLoaderModulePath);\n var TestLoader = TestLoaderModule['default'];\n var addModuleExcludeMatcher = TestLoaderModule['addModuleExcludeMatcher'];\n var addModuleIncludeMatcher = TestLoaderModule['addModuleIncludeMatcher'];\n\n function excludeModule(moduleName) {\n return QUnit.urlParams.nolint &&\n moduleName.match(/\\.(jshint|lint-test)$/);\n }\n\n function includeModule(moduleName) {\n return moduleName.match(/\\.jshint$/);\n }\n\n if (addModuleExcludeMatcher && addModuleIncludeMatcher) {\n addModuleExcludeMatcher(excludeModule);\n addModuleIncludeMatcher(includeModule);\n } else {\n TestLoader.prototype.shouldLoadModule = function shouldLoadModule(moduleName) {\n return (moduleName.match(/[-_]test$/) || includeModule(moduleName)) && !excludeModule(moduleName);\n };\n }\n\n var moduleLoadFailures = [];\n\n TestLoader.prototype.moduleLoadFailure = function(moduleName, error) {\n moduleLoadFailures.push(error);\n\n QUnit.module('TestLoader Failures');\n QUnit.test(moduleName + ': could not be loaded', function() {\n throw error;\n });\n };\n\n QUnit.done(function() {\n if (moduleLoadFailures.length) {\n throw new Error('\\n' + moduleLoadFailures.join('\\n'));\n }\n });\n\n setTimeout(function() {\n TestLoader.load();\n\n if (autostart) {\n QUnit.start();\n }\n }, 250);\n });\n\n})();\n","define('ember-cli-test-loader/test-support/index', ['exports'], function (exports) {\n /* globals requirejs, require */\n \"use strict\";\n\n exports.addModuleIncludeMatcher = addModuleIncludeMatcher;\n exports.addModuleExcludeMatcher = addModuleExcludeMatcher;\n exports['default'] = TestLoader;\n var moduleIncludeMatchers = [];\n var moduleExcludeMatchers = [];\n\n function addModuleIncludeMatcher(fn) {\n moduleIncludeMatchers.push(fn);\n }\n\n ;\n\n function addModuleExcludeMatcher(fn) {\n moduleExcludeMatchers.push(fn);\n }\n\n ;\n\n function checkMatchers(matchers, moduleName) {\n var matcher;\n\n for (var i = 0, l = matchers.length; i < l; i++) {\n matcher = matchers[i];\n\n if (matcher(moduleName)) {\n return true;\n }\n }\n\n return false;\n }\n\n function TestLoader() {\n this._didLogMissingUnsee = false;\n }\n\n ;\n\n TestLoader.prototype = {\n shouldLoadModule: function shouldLoadModule(moduleName) {\n return moduleName.match(/[-_]test$/);\n },\n\n listModules: function listModules() {\n return Object.keys(requirejs.entries);\n },\n\n listTestModules: function listTestModules() {\n var moduleNames = this.listModules();\n var testModules = [];\n var moduleName;\n\n for (var i = 0; i < moduleNames.length; i++) {\n moduleName = moduleNames[i];\n\n if (checkMatchers(moduleExcludeMatchers, moduleName)) {\n continue;\n }\n\n if (checkMatchers(moduleIncludeMatchers, moduleName) || this.shouldLoadModule(moduleName)) {\n testModules.push(moduleName);\n }\n }\n\n return testModules;\n },\n\n loadModules: function loadModules() {\n var testModules = this.listTestModules();\n var testModule;\n\n for (var i = 0; i < testModules.length; i++) {\n testModule = testModules[i];\n this.require(testModule);\n this.unsee(testModule);\n }\n }\n };\n\n TestLoader.prototype.require = function (moduleName) {\n try {\n require(moduleName);\n } catch (e) {\n this.moduleLoadFailure(moduleName, e);\n }\n };\n\n TestLoader.prototype.unsee = function (moduleName) {\n if (typeof require.unsee === 'function') {\n require.unsee(moduleName);\n } else if (!this._didLogMissingUnsee) {\n this._didLogMissingUnsee = true;\n if (typeof console !== 'undefined') {\n console.warn('unable to require.unsee, please upgrade loader.js to >= v3.3.0');\n }\n }\n };\n\n TestLoader.prototype.moduleLoadFailure = function (moduleName, error) {\n console.error('Error loading: ' + moduleName, error.stack);\n };\n\n TestLoader.load = function () {\n new TestLoader().loadModules();\n };\n});","define('ember-qunit', ['exports', 'ember-qunit/module-for', 'ember-qunit/module-for-component', 'ember-qunit/module-for-model', 'ember-qunit/adapter', 'ember-test-helpers', 'qunit'], function (exports, _emberQunitModuleFor, _emberQunitModuleForComponent, _emberQunitModuleForModel, _emberQunitAdapter, _emberTestHelpers, _qunit) {\n Object.defineProperty(exports, 'module', {\n enumerable: true,\n get: function get() {\n return _qunit.module;\n }\n });\n Object.defineProperty(exports, 'test', {\n enumerable: true,\n get: function get() {\n return _qunit.test;\n }\n });\n Object.defineProperty(exports, 'skip', {\n enumerable: true,\n get: function get() {\n return _qunit.skip;\n }\n });\n Object.defineProperty(exports, 'only', {\n enumerable: true,\n get: function get() {\n return _qunit.only;\n }\n });\n Object.defineProperty(exports, 'todo', {\n enumerable: true,\n get: function get() {\n return _qunit.todo;\n }\n });\n exports.moduleFor = _emberQunitModuleFor['default'];\n exports.moduleForComponent = _emberQunitModuleForComponent['default'];\n exports.moduleForModel = _emberQunitModuleForModel['default'];\n exports.setResolver = _emberTestHelpers.setResolver;\n exports.QUnitAdapter = _emberQunitAdapter['default'];\n});","define('ember-qunit/adapter', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {\n exports['default'] = _ember['default'].Test.Adapter.extend({\n init: function init() {\n this.doneCallbacks = [];\n },\n\n asyncStart: function asyncStart() {\n this.doneCallbacks.push(_qunit['default'].config.current ? _qunit['default'].config.current.assert.async() : null);\n },\n\n asyncEnd: function asyncEnd() {\n var done = this.doneCallbacks.pop();\n // This can be null if asyncStart() was called outside of a test\n if (done) {\n done();\n }\n },\n\n exception: function exception(error) {\n _qunit['default'].config.current.assert.ok(false, _ember['default'].inspect(error));\n }\n });\n});","define('ember-qunit/module-for-component', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n exports['default'] = moduleForComponent;\n\n function moduleForComponent(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);\n }\n});","define('ember-qunit/module-for-model', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n exports['default'] = moduleForModel;\n\n function moduleForModel(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModuleForModel, name, description, callbacks);\n }\n});","define('ember-qunit/module-for', ['exports', 'ember-qunit/qunit-module', 'ember-test-helpers'], function (exports, _emberQunitQunitModule, _emberTestHelpers) {\n exports['default'] = moduleFor;\n\n function moduleFor(name, description, callbacks) {\n (0, _emberQunitQunitModule.createModule)(_emberTestHelpers.TestModule, name, description, callbacks);\n }\n});","define('ember-qunit/qunit-module', ['exports', 'ember', 'qunit'], function (exports, _ember, _qunit) {\n exports.createModule = createModule;\n\n function noop() {}\n\n function callbackFor(name, callbacks) {\n if (typeof callbacks !== 'object') {\n return noop;\n }\n if (!callbacks) {\n return noop;\n }\n\n var callback = noop;\n\n if (callbacks[name]) {\n callback = callbacks[name];\n delete callbacks[name];\n }\n\n return callback;\n }\n\n function createModule(Constructor, name, description, callbacks) {\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = name;\n }\n\n var _before = callbackFor('before', callbacks);\n var _beforeEach = callbackFor('beforeEach', callbacks);\n var _afterEach = callbackFor('afterEach', callbacks);\n var _after = callbackFor('after', callbacks);\n\n var module;\n var moduleName = typeof description === 'string' ? description : name;\n\n (0, _qunit.module)(moduleName, {\n before: function before() {\n // storing this in closure scope to avoid exposing these\n // private internals to the test context\n module = new Constructor(name, description, callbacks);\n return _before.apply(this, arguments);\n },\n\n beforeEach: function beforeEach() {\n var _module2,\n _this = this,\n _arguments = arguments;\n\n // provide the test context to the underlying module\n module.setContext(this);\n\n return (_module2 = module).setup.apply(_module2, arguments).then(function () {\n return _beforeEach.apply(_this, _arguments);\n });\n },\n\n afterEach: function afterEach() {\n var _arguments2 = arguments;\n\n var result = _afterEach.apply(this, arguments);\n return _ember['default'].RSVP.resolve(result).then(function () {\n var _module3;\n\n return (_module3 = module).teardown.apply(_module3, _arguments2);\n });\n },\n\n after: function after() {\n var result = _after.apply(this, arguments);\n module = null;\n return result;\n }\n });\n }\n});","define('ember-test-helpers', ['exports', 'ember', 'ember-test-helpers/test-module', 'ember-test-helpers/test-module-for-acceptance', 'ember-test-helpers/test-module-for-integration', 'ember-test-helpers/test-module-for-component', 'ember-test-helpers/test-module-for-model', 'ember-test-helpers/test-context', 'ember-test-helpers/test-resolver'], function (exports, _ember, _emberTestHelpersTestModule, _emberTestHelpersTestModuleForAcceptance, _emberTestHelpersTestModuleForIntegration, _emberTestHelpersTestModuleForComponent, _emberTestHelpersTestModuleForModel, _emberTestHelpersTestContext, _emberTestHelpersTestResolver) {\n\n _ember['default'].testing = true;\n\n exports.TestModule = _emberTestHelpersTestModule['default'];\n exports.TestModuleForAcceptance = _emberTestHelpersTestModuleForAcceptance['default'];\n exports.TestModuleForIntegration = _emberTestHelpersTestModuleForIntegration['default'];\n exports.TestModuleForComponent = _emberTestHelpersTestModuleForComponent['default'];\n exports.TestModuleForModel = _emberTestHelpersTestModuleForModel['default'];\n exports.getContext = _emberTestHelpersTestContext.getContext;\n exports.setContext = _emberTestHelpersTestContext.setContext;\n exports.unsetContext = _emberTestHelpersTestContext.unsetContext;\n exports.setResolver = _emberTestHelpersTestResolver.setResolver;\n});","define('ember-test-helpers/-legacy-overrides', ['exports', 'ember', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersHasEmberVersion) {\n exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;\n\n function preGlimmerSetupIntegrationForComponent() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = {};\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n context.actions = module.actionHooks;\n\n (this.registry || this.container).register('component:-test-holder', _ember['default'].Component.extend());\n\n context.render = function (template) {\n // in case `this.render` is called twice, make sure to teardown the first invocation\n module.teardownComponent();\n\n if (!template) {\n throw new Error(\"in a component integration test you must pass a template to `render()`\");\n }\n if (_ember['default'].isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = _ember['default'].Handlebars.compile(template);\n }\n module.component = module.container.lookupFactory('component:-test-holder').create({\n layout: template\n });\n\n module.component.set('context', context);\n module.component.set('controller', context);\n\n _ember['default'].run(function () {\n module.component.appendTo('#ember-testing');\n });\n\n context._element = module.component.element;\n };\n\n context.$ = function () {\n return module.component.$.apply(module.component, arguments);\n };\n\n context.set = function (key, value) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].set(context, key, value);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].setProperties(context, hash);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return _ember['default'].get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return _ember['default'].getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error(\"integration testing template received unexpected action \" + actionName);\n }\n hook.apply(module, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n module.teardownComponent();\n };\n }\n});","define('ember-test-helpers/abstract-test-module', ['exports', 'ember-test-helpers/wait', 'ember-test-helpers/test-context', 'ember'], function (exports, _emberTestHelpersWait, _emberTestHelpersTestContext, _ember) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n // calling this `merge` here because we cannot\n // actually assume it is like `Object.assign`\n // with > 2 args\n var merge = _ember['default'].assign || _ember['default'].merge;\n\n var _default = (function () {\n function _default(name, options) {\n _classCallCheck(this, _default);\n\n this.context = undefined;\n this.name = name;\n this.callbacks = options || {};\n\n this.initSetupSteps();\n this.initTeardownSteps();\n }\n\n _createClass(_default, [{\n key: 'setup',\n value: function setup(assert) {\n var _this = this;\n\n return this.invokeSteps(this.setupSteps, this, assert).then(function () {\n _this.contextualizeCallbacks();\n return _this.invokeSteps(_this.contextualizedSetupSteps, _this.context, assert);\n });\n }\n }, {\n key: 'teardown',\n value: function teardown(assert) {\n var _this2 = this;\n\n return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(function () {\n return _this2.invokeSteps(_this2.teardownSteps, _this2, assert);\n }).then(function () {\n _this2.cache = null;\n _this2.cachedCalls = null;\n });\n }\n }, {\n key: 'initSetupSteps',\n value: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n }\n }, {\n key: 'invokeSteps',\n value: function invokeSteps(steps, context, assert) {\n steps = steps.slice();\n\n function nextStep() {\n var step = steps.shift();\n if (step) {\n // guard against exceptions, for example missing components referenced from needs.\n return new _ember['default'].RSVP.Promise(function (resolve) {\n resolve(step.call(context, assert));\n }).then(nextStep);\n } else {\n return _ember['default'].RSVP.resolve();\n }\n }\n return nextStep();\n }\n }, {\n key: 'contextualizeCallbacks',\n value: function contextualizeCallbacks() {}\n }, {\n key: 'initTeardownSteps',\n value: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n }\n }, {\n key: 'setupTestElements',\n value: function setupTestElements() {\n var testEl = document.querySelector('#ember-testing');\n if (!testEl) {\n var element = document.createElement('div');\n element.setAttribute('id', 'ember-testing');\n\n document.body.appendChild(element);\n this.fixtureResetValue = '';\n } else {\n this.fixtureResetValue = testEl.innerHTML;\n }\n }\n }, {\n key: 'setupContext',\n value: function setupContext(options) {\n var context = this.getContext();\n\n merge(context, {\n dispatcher: null,\n inject: {}\n });\n merge(context, options);\n\n this.setToString();\n (0, _emberTestHelpersTestContext.setContext)(context);\n this.context = context;\n }\n }, {\n key: 'setContext',\n value: function setContext(context) {\n this.context = context;\n }\n }, {\n key: 'getContext',\n value: function getContext() {\n if (this.context) {\n return this.context;\n }\n\n return this.context = (0, _emberTestHelpersTestContext.getContext)() || {};\n }\n }, {\n key: 'setToString',\n value: function setToString() {\n var _this3 = this;\n\n this.context.toString = function () {\n if (_this3.subjectName) {\n return 'test context for: ' + _this3.subjectName;\n }\n\n if (_this3.name) {\n return 'test context for: ' + _this3.name;\n }\n };\n }\n }, {\n key: 'setupAJAXListeners',\n value: function setupAJAXListeners() {\n (0, _emberTestHelpersWait._setupAJAXHooks)();\n }\n }, {\n key: 'teardownAJAXListeners',\n value: function teardownAJAXListeners() {\n (0, _emberTestHelpersWait._teardownAJAXHooks)();\n }\n }, {\n key: 'teardownTestElements',\n value: function teardownTestElements() {\n document.getElementById('ember-testing').innerHTML = this.fixtureResetValue;\n\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (_ember['default'].View && _ember['default'].View.views) {\n _ember['default'].View.views = {};\n }\n }\n }, {\n key: 'teardownContext',\n value: function teardownContext() {\n var context = this.context;\n this.context = undefined;\n (0, _emberTestHelpersTestContext.unsetContext)();\n\n if (context && context.dispatcher && !context.dispatcher.isDestroyed) {\n _ember['default'].run(function () {\n context.dispatcher.destroy();\n });\n }\n }\n }]);\n\n return _default;\n })();\n\n exports['default'] = _default;\n});","define('ember-test-helpers/build-registry', ['exports', 'require', 'ember'], function (exports, _require, _ember) {\n\n function exposeRegistryMethodsWithoutDeprecations(container) {\n var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];\n\n function exposeRegistryMethod(container, method) {\n if (method in container) {\n container[method] = function () {\n return container._registry[method].apply(container._registry, arguments);\n };\n }\n }\n\n for (var i = 0, l = methods.length; i < l; i++) {\n exposeRegistryMethod(container, methods[i]);\n }\n }\n\n var Owner = (function () {\n if (_ember['default']._RegistryProxyMixin && _ember['default']._ContainerProxyMixin) {\n return _ember['default'].Object.extend(_ember['default']._RegistryProxyMixin, _ember['default']._ContainerProxyMixin);\n }\n\n return _ember['default'].Object.extend();\n })();\n\n exports['default'] = function (resolver) {\n var fallbackRegistry, registry, container;\n var namespace = _ember['default'].Object.create({\n Resolver: { create: function create() {\n return resolver;\n } }\n });\n\n function register(name, factory) {\n var thingToRegisterWith = registry || container;\n\n if (!(container.factoryFor ? container.factoryFor(name) : container.lookupFactory(name))) {\n thingToRegisterWith.register(name, factory);\n }\n }\n\n if (_ember['default'].Application.buildRegistry) {\n fallbackRegistry = _ember['default'].Application.buildRegistry(namespace);\n fallbackRegistry.register('component-lookup:main', _ember['default'].ComponentLookup);\n\n registry = new _ember['default'].Registry({\n fallback: fallbackRegistry\n });\n\n if (_ember['default'].ApplicationInstance && _ember['default'].ApplicationInstance.setupRegistry) {\n _ember['default'].ApplicationInstance.setupRegistry(registry);\n }\n\n // these properties are set on the fallback registry by `buildRegistry`\n // and on the primary registry within the ApplicationInstance constructor\n // but we need to manually recreate them since ApplicationInstance's are not\n // exposed externally\n registry.normalizeFullName = fallbackRegistry.normalizeFullName;\n registry.makeToString = fallbackRegistry.makeToString;\n registry.describe = fallbackRegistry.describe;\n\n var owner = Owner.create({\n __registry__: registry,\n __container__: null\n });\n\n container = registry.container({ owner: owner });\n owner.__container__ = container;\n\n exposeRegistryMethodsWithoutDeprecations(container);\n } else {\n container = _ember['default'].Application.buildContainer(namespace);\n container.register('component-lookup:main', _ember['default'].ComponentLookup);\n }\n\n // Ember 1.10.0 did not properly add `view:toplevel` or `view:default`\n // to the registry in Ember.Application.buildRegistry :(\n //\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (_ember['default'].View) {\n register('view:toplevel', _ember['default'].View.extend());\n }\n\n // Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only\n // do this when present\n if (_ember['default']._MetamorphView) {\n register('view:default', _ember['default']._MetamorphView);\n }\n\n var globalContext = typeof global === 'object' && global || self;\n if (requirejs.entries['ember-data/setup-container']) {\n // ember-data is a proper ember-cli addon since 2.3; if no 'import\n // 'ember-data'' is present somewhere in the tests, there is also no `DS`\n // available on the globalContext and hence ember-data wouldn't be setup\n // correctly for the tests; that's why we import and call setupContainer\n // here; also see https://github.com/emberjs/data/issues/4071 for context\n var setupContainer = (0, _require['default'])('ember-data/setup-container')['default'];\n setupContainer(registry || container);\n } else if (globalContext.DS) {\n var DS = globalContext.DS;\n if (DS._setupContainer) {\n DS._setupContainer(registry || container);\n } else {\n register('transform:boolean', DS.BooleanTransform);\n register('transform:date', DS.DateTransform);\n register('transform:number', DS.NumberTransform);\n register('transform:string', DS.StringTransform);\n register('serializer:-default', DS.JSONSerializer);\n register('serializer:-rest', DS.RESTSerializer);\n register('adapter:-rest', DS.RESTAdapter);\n }\n }\n\n return {\n registry: registry,\n container: container\n };\n };\n});\n/* globals global, self, requirejs */","define('ember-test-helpers/has-ember-version', ['exports', 'ember'], function (exports, _ember) {\n exports['default'] = hasEmberVersion;\n\n function hasEmberVersion(major, minor) {\n var numbers = _ember['default'].VERSION.split('-')[0].split('.');\n var actualMajor = parseInt(numbers[0], 10);\n var actualMinor = parseInt(numbers[1], 10);\n return actualMajor > major || actualMajor === major && actualMinor >= minor;\n }\n});","define(\"ember-test-helpers/test-context\", [\"exports\"], function (exports) {\n exports.setContext = setContext;\n exports.getContext = getContext;\n exports.unsetContext = unsetContext;\n var __test_context__;\n\n function setContext(context) {\n __test_context__ = context;\n }\n\n function getContext() {\n return __test_context__;\n }\n\n function unsetContext() {\n __test_context__ = undefined;\n }\n});","define('ember-test-helpers/test-module-for-acceptance', ['exports', 'ember-test-helpers/abstract-test-module', 'ember', 'ember-test-helpers/test-context'], function (exports, _emberTestHelpersAbstractTestModule, _ember, _emberTestHelpersTestContext) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n var _default = (function (_AbstractTestModule) {\n _inherits(_default, _AbstractTestModule);\n\n function _default() {\n _classCallCheck(this, _default);\n\n _get(Object.getPrototypeOf(_default.prototype), 'constructor', this).apply(this, arguments);\n }\n\n _createClass(_default, [{\n key: 'setupContext',\n value: function setupContext() {\n _get(Object.getPrototypeOf(_default.prototype), 'setupContext', this).call(this, { application: this.createApplication() });\n }\n }, {\n key: 'teardownContext',\n value: function teardownContext() {\n _ember['default'].run(function () {\n (0, _emberTestHelpersTestContext.getContext)().application.destroy();\n });\n\n _get(Object.getPrototypeOf(_default.prototype), 'teardownContext', this).call(this);\n }\n }, {\n key: 'createApplication',\n value: function createApplication() {\n var _callbacks = this.callbacks;\n var Application = _callbacks.Application;\n var config = _callbacks.config;\n\n var application = undefined;\n\n _ember['default'].run(function () {\n application = Application.create(config);\n application.setupForTesting();\n application.injectTestHelpers();\n });\n\n return application;\n }\n }]);\n\n return _default;\n })(_emberTestHelpersAbstractTestModule['default']);\n\n exports['default'] = _default;\n});","define('ember-test-helpers/test-module-for-component', ['exports', 'ember-test-helpers/test-module', 'ember', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides'], function (exports, _emberTestHelpersTestModule, _ember, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n exports.setupComponentIntegrationTest = _setupComponentIntegrationTest;\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n var ACTION_KEY = undefined;\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n ACTION_KEY = 'actions';\n } else {\n ACTION_KEY = '_actions';\n }\n\n var isPreGlimmer = !(0, _emberTestHelpersHasEmberVersion['default'])(1, 13);\n\n var getOwner = _ember['default'].getOwner;\n\n var _default = (function (_TestModule) {\n _inherits(_default, _TestModule);\n\n function _default(componentName, description, callbacks) {\n _classCallCheck(this, _default);\n\n // Allow `description` to be omitted\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = null;\n } else if (!callbacks) {\n callbacks = {};\n }\n\n var integrationOption = callbacks.integration;\n var hasNeeds = Array.isArray(callbacks.needs);\n\n _get(Object.getPrototypeOf(_default.prototype), 'constructor', this).call(this, 'component:' + componentName, description, callbacks);\n\n this.componentName = componentName;\n\n if (hasNeeds || callbacks.unit || integrationOption === false) {\n this.isUnitTest = true;\n } else if (integrationOption) {\n this.isUnitTest = false;\n } else {\n _ember['default'].deprecate(\"the component:\" + componentName + \" test module is implicitly running in unit test mode, \" + \"which will change to integration test mode by default in an upcoming version of \" + \"ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit \" + \"test mode.\", false, { id: 'ember-test-helpers.test-module-for-component.test-type', until: '0.6.0' });\n this.isUnitTest = true;\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n callbacks.integration = true;\n }\n\n if (this.isUnitTest || this.isLegacy) {\n this.setupSteps.push(this.setupComponentUnitTest);\n } else {\n this.callbacks.subject = function () {\n throw new Error(\"component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('<my-component foo=true>');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/\");\n };\n this.setupSteps.push(this.setupComponentIntegrationTest);\n this.teardownSteps.unshift(this.teardownComponent);\n }\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.setupSteps.push(this._aliasViewRegistry);\n this.teardownSteps.unshift(this._resetViewRegistry);\n }\n }\n\n _createClass(_default, [{\n key: 'initIntegration',\n value: function initIntegration(options) {\n this.isLegacy = options.integration === 'legacy';\n this.isIntegration = options.integration !== 'legacy';\n }\n }, {\n key: '_aliasViewRegistry',\n value: function _aliasViewRegistry() {\n this._originalGlobalViewRegistry = _ember['default'].View.views;\n var viewRegistry = this.container.lookup('-view-registry:main');\n\n if (viewRegistry) {\n _ember['default'].View.views = viewRegistry;\n }\n }\n }, {\n key: '_resetViewRegistry',\n value: function _resetViewRegistry() {\n _ember['default'].View.views = this._originalGlobalViewRegistry;\n }\n }, {\n key: 'setupComponentUnitTest',\n value: function setupComponentUnitTest() {\n var _this = this;\n var resolver = this.resolver;\n var context = this.context;\n\n var layoutName = 'template:components/' + this.componentName;\n\n var layout = resolver.resolve(layoutName);\n\n var thingToRegisterWith = this.registry || this.container;\n if (layout) {\n thingToRegisterWith.register(layoutName, layout);\n thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);\n }\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n context._element = null;\n\n this.callbacks.render = function () {\n var subject;\n\n _ember['default'].run(function () {\n subject = context.subject();\n subject.appendTo('#ember-testing');\n });\n\n context._element = subject.element;\n\n _this.teardownSteps.unshift(function () {\n _ember['default'].run(function () {\n _ember['default'].tryInvoke(subject, 'destroy');\n });\n });\n };\n\n this.callbacks.append = function () {\n _ember['default'].deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, { id: 'ember-test-helpers.test-module-for-component.append', until: '0.6.0' });\n return context.$();\n };\n\n context.$ = function () {\n this.render();\n var subject = this.subject();\n\n return subject.$.apply(subject, arguments);\n };\n }\n }, {\n key: 'setupComponentIntegrationTest',\n value: function setupComponentIntegrationTest() {\n if (isPreGlimmer) {\n return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);\n } else {\n return _setupComponentIntegrationTest.apply(this, arguments);\n }\n }\n }, {\n key: 'setupContext',\n value: function setupContext() {\n _get(Object.getPrototypeOf(_default.prototype), 'setupContext', this).call(this);\n\n // only setup the injection if we are running against a version\n // of Ember that has `-view-registry:main` (Ember >= 1.12)\n if (this.container.factoryFor ? this.container.factoryFor('-view-registry:main') : this.container.lookupFactory('-view-registry:main')) {\n (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n this.context.factory = function () {};\n }\n }\n }, {\n key: 'teardownComponent',\n value: function teardownComponent() {\n var component = this.component;\n if (component) {\n _ember['default'].run(component, 'destroy');\n this.component = null;\n }\n }\n }]);\n\n return _default;\n })(_emberTestHelpersTestModule['default']);\n\n exports['default'] = _default;\n\n function _setupComponentIntegrationTest() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = context[ACTION_KEY] = {};\n context.dispatcher = this.container.lookup('event_dispatcher:main') || _ember['default'].EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n var hasRendered = false;\n var OutletView = module.container.factoryFor ? module.container.factoryFor('view:-outlet') : module.container.lookupFactory('view:-outlet');\n var OutletTemplate = module.container.lookup('template:-outlet');\n var toplevelView = module.component = OutletView.create();\n var hasOutletTemplate = !!OutletTemplate;\n var outletState = {\n render: {\n owner: getOwner ? getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: OutletTemplate\n },\n\n outlets: {}\n };\n\n var element = document.getElementById('ember-testing');\n var templateId = 0;\n\n if (hasOutletTemplate) {\n _ember['default'].run(function () {\n toplevelView.setOutletState(outletState);\n });\n }\n\n context.render = function (template) {\n if (!template) {\n throw new Error(\"in a component integration test you must pass a template to `render()`\");\n }\n if (_ember['default'].isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = _ember['default'].Handlebars.compile(template);\n }\n\n var templateFullName = 'template:-undertest-' + ++templateId;\n this.registry.register(templateFullName, template);\n var stateToRender = {\n owner: getOwner ? getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: module.context,\n ViewClass: undefined,\n template: module.container.lookup(templateFullName),\n outlets: {}\n };\n\n if (hasOutletTemplate) {\n stateToRender.name = 'index';\n outletState.outlets.main = { render: stateToRender, outlets: {} };\n } else {\n stateToRender.name = 'application';\n outletState = { render: stateToRender, outlets: {} };\n }\n\n _ember['default'].run(function () {\n toplevelView.setOutletState(outletState);\n });\n\n if (!hasRendered) {\n _ember['default'].run(module.component, 'appendTo', '#ember-testing');\n hasRendered = true;\n }\n\n // ensure the element is based on the wrapping toplevel view\n // Ember still wraps the main application template with a\n // normal tagged view\n context._element = element = document.querySelector('#ember-testing > .ember-view');\n };\n\n context.$ = function (selector) {\n // emulates Ember internal behavor of `this.$` in a component\n // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18\n return selector ? _ember['default'].$(selector, element) : _ember['default'].$(element);\n };\n\n context.set = function (key, value) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].set(context, key, value);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = _ember['default'].run(function () {\n return _ember['default'].setProperties(context, hash);\n });\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return _ember['default'].get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return _ember['default'].getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error(\"integration testing template received unexpected action \" + actionName);\n }\n hook.apply(module.context, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n _ember['default'].run(function () {\n toplevelView.setOutletState({\n render: {\n owner: module.container,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: undefined\n },\n outlets: {}\n });\n });\n };\n }\n});","define('ember-test-helpers/test-module-for-integration', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/-legacy-overrides', 'ember-test-helpers/test-module-for-component'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion, _emberTestHelpersLegacyOverrides, _emberTestHelpersTestModuleForComponent) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n var isPreGlimmer = !(0, _emberTestHelpersHasEmberVersion['default'])(1, 13);\n\n var _default = (function (_AbstractTestModule) {\n _inherits(_default, _AbstractTestModule);\n\n function _default() {\n _classCallCheck(this, _default);\n\n _get(Object.getPrototypeOf(_default.prototype), 'constructor', this).apply(this, arguments);\n this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();\n }\n\n _createClass(_default, [{\n key: 'initSetupSteps',\n value: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContainer);\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n this.setupSteps.push(this.setupComponentIntegrationTest);\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.setupSteps.push(this._aliasViewRegistry);\n }\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n }\n }, {\n key: 'initTeardownSteps',\n value: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownContainer);\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownAJAXListeners);\n this.teardownSteps.push(this.teardownComponent);\n\n if (_ember['default'].View && _ember['default'].View.views) {\n this.teardownSteps.push(this._resetViewRegistry);\n }\n\n this.teardownSteps.push(this.teardownTestElements);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n }\n }, {\n key: 'setupContainer',\n value: function setupContainer() {\n var resolver = this.resolver;\n var items = (0, _emberTestHelpersBuildRegistry['default'])(resolver);\n\n this.container = items.container;\n this.registry = items.registry;\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n var thingToRegisterWith = this.registry || this.container;\n var router = resolver.resolve('router:main');\n router = router || _ember['default'].Router.extend();\n thingToRegisterWith.register('router:main', router);\n }\n }\n }, {\n key: 'setupContext',\n value: function setupContext() {\n var subjectName = this.subjectName;\n var container = this.container;\n\n var factory = function factory() {\n return container.factoryFor ? container.factoryFor(subjectName) : container.lookupFactory(subjectName);\n };\n\n _get(Object.getPrototypeOf(_default.prototype), 'setupContext', this).call(this, {\n container: this.container,\n registry: this.registry,\n factory: factory,\n register: function register() {\n var target = this.registry || this.container;\n return target.register.apply(target, arguments);\n }\n });\n\n var context = this.context;\n\n if (_ember['default'].setOwner) {\n _ember['default'].setOwner(context, this.container.owner);\n }\n\n if (_ember['default'].inject) {\n var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);\n keys.forEach(function (typeName) {\n context.inject[typeName] = function (name, opts) {\n var alias = opts && opts.as || name;\n _ember['default'].run(function () {\n _ember['default'].set(context, alias, context.container.lookup(typeName + ':' + name));\n });\n };\n });\n }\n\n // only setup the injection if we are running against a version\n // of Ember that has `-view-registry:main` (Ember >= 1.12)\n if (this.container.factoryFor ? this.container.factoryFor('-view-registry:main') : this.container.lookupFactory('-view-registry:main')) {\n (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');\n }\n }\n }, {\n key: 'setupComponentIntegrationTest',\n value: function setupComponentIntegrationTest() {\n if (isPreGlimmer) {\n return _emberTestHelpersLegacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);\n } else {\n return _emberTestHelpersTestModuleForComponent.setupComponentIntegrationTest.apply(this, arguments);\n }\n }\n }, {\n key: 'teardownComponent',\n value: function teardownComponent() {\n var component = this.component;\n if (component) {\n _ember['default'].run(function () {\n component.destroy();\n });\n }\n }\n }, {\n key: 'teardownContainer',\n value: function teardownContainer() {\n var container = this.container;\n _ember['default'].run(function () {\n container.destroy();\n });\n }\n\n // allow arbitrary named factories, like rspec let\n }, {\n key: 'contextualizeCallbacks',\n value: function contextualizeCallbacks() {\n var callbacks = this.callbacks;\n var context = this.context;\n\n this.cache = this.cache || {};\n this.cachedCalls = this.cachedCalls || {};\n\n var keys = (Object.keys || _ember['default'].keys)(callbacks);\n var keysLength = keys.length;\n\n if (keysLength) {\n for (var i = 0; i < keysLength; i++) {\n this._contextualizeCallback(context, keys[i], context);\n }\n }\n }\n }, {\n key: '_contextualizeCallback',\n value: function _contextualizeCallback(context, key, callbackContext) {\n var _this = this;\n var callbacks = this.callbacks;\n var factory = context.factory;\n\n context[key] = function (options) {\n if (_this.cachedCalls[key]) {\n return _this.cache[key];\n }\n\n var result = callbacks[key].call(callbackContext, options, factory());\n\n _this.cache[key] = result;\n _this.cachedCalls[key] = true;\n\n return result;\n };\n }\n }, {\n key: '_aliasViewRegistry',\n value: function _aliasViewRegistry() {\n this._originalGlobalViewRegistry = _ember['default'].View.views;\n var viewRegistry = this.container.lookup('-view-registry:main');\n\n if (viewRegistry) {\n _ember['default'].View.views = viewRegistry;\n }\n }\n }, {\n key: '_resetViewRegistry',\n value: function _resetViewRegistry() {\n _ember['default'].View.views = this._originalGlobalViewRegistry;\n }\n }]);\n\n return _default;\n })(_emberTestHelpersAbstractTestModule['default']);\n\n exports['default'] = _default;\n});","define('ember-test-helpers/test-module-for-model', ['exports', 'require', 'ember-test-helpers/test-module', 'ember'], function (exports, _require, _emberTestHelpersTestModule, _ember) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n var _default = (function (_TestModule) {\n _inherits(_default, _TestModule);\n\n function _default(modelName, description, callbacks) {\n _classCallCheck(this, _default);\n\n _get(Object.getPrototypeOf(_default.prototype), 'constructor', this).call(this, 'model:' + modelName, description, callbacks);\n\n this.modelName = modelName;\n\n this.setupSteps.push(this.setupModel);\n }\n\n _createClass(_default, [{\n key: 'setupModel',\n value: function setupModel() {\n var container = this.container;\n var defaultSubject = this.defaultSubject;\n var callbacks = this.callbacks;\n var modelName = this.modelName;\n\n var adapterFactory = container.factoryFor ? container.factoryFor('adapter:application') : container.lookupFactory('adapter:application');\n if (!adapterFactory) {\n if (requirejs.entries['ember-data/adapters/json-api']) {\n adapterFactory = (0, _require['default'])('ember-data/adapters/json-api')['default'];\n }\n\n // when ember-data/adapters/json-api is provided via ember-cli shims\n // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the\n // above require statement returns a bizzaro object with only a `default`\n // property (circular reference actually)\n if (!adapterFactory || !adapterFactory.create) {\n adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;\n }\n\n var thingToRegisterWith = this.registry || this.container;\n thingToRegisterWith.register('adapter:application', adapterFactory);\n }\n\n callbacks.store = function () {\n var container = this.container;\n return container.lookup('service:store') || container.lookup('store:main');\n };\n\n if (callbacks.subject === defaultSubject) {\n callbacks.subject = function (options) {\n var container = this.container;\n\n return _ember['default'].run(function () {\n var store = container.lookup('service:store') || container.lookup('store:main');\n return store.createRecord(modelName, options);\n });\n };\n }\n }\n }]);\n\n return _default;\n })(_emberTestHelpersTestModule['default']);\n\n exports['default'] = _default;\n});\n/* global DS, requirejs */ // added here to prevent an import from erroring when ED is not present","define('ember-test-helpers/test-module', ['exports', 'ember', 'ember-test-helpers/abstract-test-module', 'ember-test-helpers/test-resolver', 'ember-test-helpers/build-registry', 'ember-test-helpers/has-ember-version'], function (exports, _ember, _emberTestHelpersAbstractTestModule, _emberTestHelpersTestResolver, _emberTestHelpersBuildRegistry, _emberTestHelpersHasEmberVersion) {\n var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\n var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\n function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n var _default = (function (_AbstractTestModule) {\n _inherits(_default, _AbstractTestModule);\n\n function _default(subjectName, description, callbacks) {\n _classCallCheck(this, _default);\n\n // Allow `description` to be omitted, in which case it should\n // default to `subjectName`\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = subjectName;\n }\n\n _get(Object.getPrototypeOf(_default.prototype), 'constructor', this).call(this, description || subjectName, callbacks);\n\n this.subjectName = subjectName;\n this.description = description || subjectName;\n this.resolver = this.callbacks.resolver || (0, _emberTestHelpersTestResolver.getResolver)();\n\n if (this.callbacks.integration && this.callbacks.needs) {\n throw new Error(\"cannot declare 'integration: true' and 'needs' in the same module\");\n }\n\n if (this.callbacks.integration) {\n this.initIntegration(callbacks);\n delete callbacks.integration;\n }\n\n this.initSubject();\n this.initNeeds();\n }\n\n _createClass(_default, [{\n key: 'initIntegration',\n value: function initIntegration(options) {\n if (options.integration === 'legacy') {\n throw new Error('`integration: \\'legacy\\'` is only valid for component tests.');\n }\n this.isIntegration = true;\n }\n }, {\n key: 'initSubject',\n value: function initSubject() {\n this.callbacks.subject = this.callbacks.subject || this.defaultSubject;\n }\n }, {\n key: 'initNeeds',\n value: function initNeeds() {\n this.needs = [this.subjectName];\n if (this.callbacks.needs) {\n this.needs = this.needs.concat(this.callbacks.needs);\n delete this.callbacks.needs;\n }\n }\n }, {\n key: 'initSetupSteps',\n value: function initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContainer);\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n }\n }, {\n key: 'initTeardownSteps',\n value: function initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownSubject);\n this.teardownSteps.push(this.teardownContainer);\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n }\n }, {\n key: 'setupContainer',\n value: function setupContainer() {\n if (this.isIntegration || this.isLegacy) {\n this._setupIntegratedContainer();\n } else {\n this._setupIsolatedContainer();\n }\n }\n }, {\n key: 'setupContext',\n value: function setupContext() {\n var subjectName = this.subjectName;\n var container = this.container;\n\n var factory = function factory() {\n return container.factoryFor ? container.factoryFor(subjectName) : container.lookupFactory(subjectName);\n };\n\n _get(Object.getPrototypeOf(_default.prototype), 'setupContext', this).call(this, {\n container: this.container,\n registry: this.registry,\n factory: factory,\n register: function register() {\n var target = this.registry || this.container;\n return target.register.apply(target, arguments);\n }\n });\n\n if (_ember['default'].setOwner) {\n _ember['default'].setOwner(this.context, this.container.owner);\n }\n\n this.setupInject();\n }\n }, {\n key: 'setupInject',\n value: function setupInject() {\n var module = this;\n var context = this.context;\n\n if (_ember['default'].inject) {\n var keys = (Object.keys || _ember['default'].keys)(_ember['default'].inject);\n\n keys.forEach(function (typeName) {\n context.inject[typeName] = function (name, opts) {\n var alias = opts && opts.as || name;\n _ember['default'].run(function () {\n _ember['default'].set(context, alias, module.container.lookup(typeName + ':' + name));\n });\n };\n });\n }\n }\n }, {\n key: 'teardownSubject',\n value: function teardownSubject() {\n var subject = this.cache.subject;\n\n if (subject) {\n _ember['default'].run(function () {\n _ember['default'].tryInvoke(subject, 'destroy');\n });\n }\n }\n }, {\n key: 'teardownContainer',\n value: function teardownContainer() {\n var container = this.container;\n _ember['default'].run(function () {\n container.destroy();\n });\n }\n }, {\n key: 'defaultSubject',\n value: function defaultSubject(options, factory) {\n return factory.create(options);\n }\n\n // allow arbitrary named factories, like rspec let\n }, {\n key: 'contextualizeCallbacks',\n value: function contextualizeCallbacks() {\n var callbacks = this.callbacks;\n var context = this.context;\n\n this.cache = this.cache || {};\n this.cachedCalls = this.cachedCalls || {};\n\n var keys = (Object.keys || _ember['default'].keys)(callbacks);\n var keysLength = keys.length;\n\n if (keysLength) {\n var deprecatedContext = this._buildDeprecatedContext(this, context);\n for (var i = 0; i < keysLength; i++) {\n this._contextualizeCallback(context, keys[i], deprecatedContext);\n }\n }\n }\n }, {\n key: '_contextualizeCallback',\n value: function _contextualizeCallback(context, key, callbackContext) {\n var _this = this;\n var callbacks = this.callbacks;\n var factory = context.factory;\n\n context[key] = function (options) {\n if (_this.cachedCalls[key]) {\n return _this.cache[key];\n }\n\n var result = callbacks[key].call(callbackContext, options, factory());\n\n _this.cache[key] = result;\n _this.cachedCalls[key] = true;\n\n return result;\n };\n }\n\n /*\n Builds a version of the passed in context that contains deprecation warnings\n for accessing properties that exist on the module.\n */\n }, {\n key: '_buildDeprecatedContext',\n value: function _buildDeprecatedContext(module, context) {\n var deprecatedContext = Object.create(context);\n\n var keysForDeprecation = Object.keys(module);\n\n for (var i = 0, l = keysForDeprecation.length; i < l; i++) {\n this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);\n }\n\n return deprecatedContext;\n }\n\n /*\n Defines a key on an object to act as a proxy for deprecating the original.\n */\n }, {\n key: '_proxyDeprecation',\n value: function _proxyDeprecation(obj, proxy, key) {\n if (typeof proxy[key] === 'undefined') {\n Object.defineProperty(proxy, key, {\n get: function get() {\n _ember['default'].deprecate('Accessing the test module property \"' + key + '\" from a callback is deprecated.', false, { id: 'ember-test-helpers.test-module.callback-context', until: '0.6.0' });\n return obj[key];\n }\n });\n }\n }\n }, {\n key: '_setupContainer',\n value: function _setupContainer(isolated) {\n var resolver = this.resolver;\n\n var items = (0, _emberTestHelpersBuildRegistry['default'])(!isolated ? resolver : Object.create(resolver, {\n resolve: {\n value: function value() {}\n }\n }));\n\n this.container = items.container;\n this.registry = items.registry;\n\n if ((0, _emberTestHelpersHasEmberVersion['default'])(1, 13)) {\n var thingToRegisterWith = this.registry || this.container;\n var router = resolver.resolve('router:main');\n router = router || _ember['default'].Router.extend();\n thingToRegisterWith.register('router:main', router);\n }\n }\n }, {\n key: '_setupIsolatedContainer',\n value: function _setupIsolatedContainer() {\n var resolver = this.resolver;\n this._setupContainer(true);\n\n var thingToRegisterWith = this.registry || this.container;\n\n for (var i = this.needs.length; i > 0; i--) {\n var fullName = this.needs[i - 1];\n var normalizedFullName = resolver.normalize(fullName);\n thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName));\n }\n\n if (!this.registry) {\n this.container.resolver = function () {};\n }\n }\n }, {\n key: '_setupIntegratedContainer',\n value: function _setupIntegratedContainer() {\n this._setupContainer();\n }\n }]);\n\n return _default;\n })(_emberTestHelpersAbstractTestModule['default']);\n\n exports['default'] = _default;\n});","define('ember-test-helpers/test-resolver', ['exports'], function (exports) {\n exports.setResolver = setResolver;\n exports.getResolver = getResolver;\n var __resolver__;\n\n function setResolver(resolver) {\n __resolver__ = resolver;\n }\n\n function getResolver() {\n if (__resolver__ == null) {\n throw new Error('you must set a resolver with `testResolver.set(resolver)`');\n }\n\n return __resolver__;\n }\n});","define('ember-test-helpers/wait', ['exports', 'ember'], function (exports, _ember) {\n var _slicedToArray = (function () { function sliceIterator(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']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\n exports._teardownAJAXHooks = _teardownAJAXHooks;\n exports._setupAJAXHooks = _setupAJAXHooks;\n exports['default'] = wait;\n\n var jQuery = _ember['default'].$;\n\n var requests;\n function incrementAjaxPendingRequests(_, xhr) {\n requests.push(xhr);\n }\n\n function decrementAjaxPendingRequests(_, xhr) {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n }\n }\n }\n\n function _teardownAJAXHooks() {\n if (!jQuery) {\n return;\n }\n\n jQuery(document).off('ajaxSend', incrementAjaxPendingRequests);\n jQuery(document).off('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n function _setupAJAXHooks() {\n requests = [];\n\n if (!jQuery) {\n return;\n }\n\n jQuery(document).on('ajaxSend', incrementAjaxPendingRequests);\n jQuery(document).on('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n var _internalCheckWaiters;\n if (_ember['default'].__loader.registry['ember-testing/test/waiters']) {\n _internalCheckWaiters = _ember['default'].__loader.require('ember-testing/test/waiters').checkWaiters;\n }\n\n function checkWaiters() {\n if (_internalCheckWaiters) {\n return _internalCheckWaiters();\n } else if (_ember['default'].Test.waiters) {\n if (_ember['default'].Test.waiters.any(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2);\n\n var context = _ref2[0];\n var callback = _ref2[1];\n return !callback.call(context);\n })) {\n return true;\n }\n }\n\n return false;\n }\n\n function wait(_options) {\n var options = _options || {};\n var waitForTimers = options.hasOwnProperty('waitForTimers') ? options.waitForTimers : true;\n var waitForAJAX = options.hasOwnProperty('waitForAJAX') ? options.waitForAJAX : true;\n var waitForWaiters = options.hasOwnProperty('waitForWaiters') ? options.waitForWaiters : true;\n\n return new _ember['default'].RSVP.Promise(function (resolve) {\n var watcher = self.setInterval(function () {\n if (waitForTimers && (_ember['default'].run.hasScheduledTimers() || _ember['default'].run.currentRunLoop)) {\n return;\n }\n\n if (waitForAJAX && requests && requests.length > 0) {\n return;\n }\n\n if (waitForWaiters && checkWaiters()) {\n return;\n }\n\n // Stop polling\n self.clearInterval(watcher);\n\n // Synchronously resolve the promise\n _ember['default'].run(null, resolve);\n }, 10);\n });\n }\n});\n/* globals self */","define(\"qunit\", [\"exports\"], function (exports) {\n /* globals QUnit */\n\n var _module = QUnit.module;\n exports.module = _module;\n var test = QUnit.test;\n exports.test = test;\n var skip = QUnit.skip;\n exports.skip = skip;\n var only = QUnit.only;\n exports.only = only;\n var todo = QUnit.todo;\n\n exports.todo = todo;\n exports[\"default\"] = QUnit;\n});","runningTests = true;\n\nif (window.Testem) {\n window.Testem.hookIntoTestFramework();\n}\n\n\n"],"names":[],"mappings":"AAAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9xJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"test-support.js"}