tag');\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: ''\n });\n }\n\n assertContent(content) {\n this.assert.strictEqual(this.nodesCount, 1, 'It should render exactly one
tag');\n this.assertElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n 'data-foo': content\n },\n content: ''\n });\n }\n\n });\n\n class TrustedContentTest extends DynamicContentTest {\n assertIsEmpty() {\n this.assert.strictEqual(this.firstChild, null);\n }\n\n assertContent(content) {\n this.assertHTML(content);\n }\n\n assertStableRerender() {\n this.takeSnapshot();\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n super.assertInvariants();\n }\n\n assertInvariants() {// If it's not stable, we will wipe out all the content and replace them,\n // so there are no invariants\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Dynamic content tests (trusted)', class extends TrustedContentTest {\n renderPath(path, context = {}) {\n this.render(`{{{${path}}}}`, context);\n }\n\n ['@test updating trusted curlies']() {\n this.render('{{{this.htmlContent}}}{{{this.nested.htmlContent}}}', {\n htmlContent: '
Max ',\n nested: {\n htmlContent: '
James '\n }\n });\n this.assertContent('
Max James ');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'htmlContent', '
M a x '));\n this.assertContent('
M a x James ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'nested.htmlContent', 'Jammie'));\n this.assertContent('
M a x Jammie');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'htmlContent', '
Max ');\n (0, _metal.set)(this.context, 'nested', {\n htmlContent: '
James '\n });\n });\n this.assertContent('
Max James ');\n }\n\n ['@test empty content in trusted curlies [GH#14978]']() {\n this.render('before {{{this.value}}} after', {\n value: 'hello'\n });\n this.assertContent('before hello after');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', undefined));\n this.assertContent('before after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('before hello after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', null));\n this.assertContent('before after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('before hello after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', ''));\n this.assertContent('before after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('before hello after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', (0, _helpers.htmlSafe)('')));\n this.assertContent('before after');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 'hello'));\n this.assertContent('before hello after');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Dynamic content tests (integration)', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it can render a dynamic template']() {\n var template = `\n \n
\n
Why you should use {{this.framework}}? \n
\n It's great \n It's awesome \n It's {{this.framework}} \n \n
\n \n `;\n var ember = `\n \n
\n
Why you should use Ember.js? \n
\n It's great \n It's awesome \n It's Ember.js \n \n
\n \n `;\n var react = `\n \n
\n
Why you should use React? \n
\n It's great \n It's awesome \n It's React \n \n
\n \n `;\n this.render(template, {\n framework: 'Ember.js'\n });\n this.assertHTML(ember);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertHTML(ember);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'framework', 'React'));\n this.assertHTML(react);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'framework', 'Ember.js'));\n this.assertHTML(ember);\n }\n\n ['@test it should evaluate to nothing if part of the path is `undefined`']() {\n this.render('{{this.foo.bar.baz.bizz}}', {\n foo: {}\n });\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: {\n bizz: 'Hey!'\n }\n }\n }));\n this.assertText('Hey!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {}));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: {\n bizz: 'Hello!'\n }\n }\n }));\n this.assertText('Hello!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {}));\n this.assertText('');\n }\n\n ['@test it should evaluate to nothing if part of the path is a primative']() {\n this.render('{{this.foo.bar.baz.bizz}}', {\n foo: {\n bar: true\n }\n });\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: false\n }));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: 'Haha'\n }));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: null\n }));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: undefined\n }));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: 1\n }));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: {\n bizz: 'Hello!'\n }\n }\n }));\n this.assertText('Hello!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: true\n }));\n this.assertText('');\n }\n\n ['@test can set dynamic href']() {\n this.render('
Example ', {\n model: {\n url: 'http://example.com'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: {\n href: 'http://example.com'\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: {\n href: 'http://example.com'\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.url', 'http://linkedin.com'));\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: {\n href: 'http://linkedin.com'\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n url: 'http://example.com'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'a',\n content: 'Example',\n attrs: {\n href: 'http://example.com'\n }\n });\n }\n\n ['@test quoteless class attributes update correctly']() {\n this.render('
hello
', {\n fooBar: true\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'fooBar', false));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'fooBar', true));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n }\n\n ['@test quoted class attributes update correctly'](assert) {\n this.render('
hello
', {\n fooBar: true\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'fooBar', false));\n assert.equal(this.firstChild.className, '');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'fooBar', true));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo-bar')\n }\n });\n }\n\n ['@test unquoted class attribute can contain multiple classes']() {\n this.render('
hello
', {\n model: {\n classes: 'foo bar baz'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n classes: 'foo bar baz'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n }\n\n ['@test unquoted class attribute']() {\n this.render('
hello
', {\n model: {\n foo: 'foo'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: 'foo'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n }\n\n ['@test quoted class attribute']() {\n this.render('
hello
', {\n model: {\n foo: 'foo'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: 'foo'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo')\n }\n });\n }\n\n ['@test quoted class attribute can contain multiple classes']() {\n this.render('
hello
', {\n model: {\n classes: 'foo bar baz'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.classes', 'fizz bizz'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n classes: 'foo bar baz'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar baz')\n }\n });\n }\n\n ['@test class attribute concats bound values']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar',\n bizz: 'bizz'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.foo', 'fizz'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz bar bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.bar', null));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('fizz bizz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar',\n bizz: 'bizz'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar bizz')\n }\n });\n }\n\n ['@test class attribute accepts nested helpers, and updates']() {\n this.render(`
hello
`, {\n model: {\n size: 'large',\n hasSize: true,\n hasShape: false,\n shape: 'round'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('large')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('large')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.hasShape', true));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('large round')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.hasSize', false));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('round')\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n size: 'large',\n hasSize: true,\n hasShape: false,\n shape: 'round'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('large')\n }\n });\n }\n\n ['@test Multiple dynamic classes']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar',\n fizz: 'fizz',\n baz: 'baz'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar fizz baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar fizz baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model.foo', null);\n (0, _metal.set)(this.context, 'model.fizz', null);\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('bar baz')\n }\n });\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar',\n fizz: 'fizz',\n baz: 'baz'\n });\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: (0, _internalTestHelpers.classes)('foo bar fizz baz')\n }\n });\n }\n\n ['@test classes are ordered: See issue #9912']() {\n this.render('
hello
', {\n model: {\n foo: 'foo',\n bar: 'bar'\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: 'foo static bar'\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: 'foo static bar'\n }\n });\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model.bar', null);\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: 'foo static '\n }\n });\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model', {\n foo: 'foo',\n bar: 'bar'\n });\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: 'hello',\n attrs: {\n class: 'foo static bar'\n }\n });\n }\n\n });\n var warnings, originalWarn;\n\n class StyleTest extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n warnings = [];\n originalWarn = (0, _debug.getDebugFunction)('warn');\n (0, _debug.setDebugFunction)('warn', function (message, test) {\n if (!test) {\n warnings.push(message);\n }\n });\n }\n\n teardown() {\n super.teardown(...arguments);\n (0, _debug.setDebugFunction)('warn', originalWarn);\n }\n\n assertStyleWarning(style) {\n this.assert.deepEqual(warnings, [(0, _views.constructStyleDeprecationMessage)(style)]);\n }\n\n assertNoWarning() {\n this.assert.deepEqual(warnings, []);\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Inline style tests', class extends StyleTest {\n ['@test can set dynamic style']() {\n this.render('
', {\n model: {\n style: (0, _helpers.htmlSafe)('width: 60px;')\n }\n });\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {\n style: 'width: 60px;'\n }\n });\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {\n style: 'width: 60px;'\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.style', 'height: 60px;'));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {\n style: 'height: 60px;'\n }\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.style', null));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {}\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n style: 'width: 60px;'\n }));\n this.assertElement(this.firstChild, {\n tagName: 'div',\n content: '',\n attrs: {\n style: 'width: 60px;'\n }\n });\n }\n\n });\n\n if (true\n /* DEBUG */\n ) {\n (0, _internalTestHelpers.moduleFor)('Inline style tests - warnings', class extends StyleTest {\n ['@test specifying
generates a warning']() {\n var userValue = 'width: 42px';\n this.render('
', {\n userValue\n });\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `attributeBindings: [\"style\"]` generates a warning']() {\n var FooBarComponent = _helpers.Component.extend({\n attributeBindings: ['style']\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: 'hello'\n });\n var userValue = 'width: 42px';\n this.render('{{foo-bar style=this.userValue}}', {\n userValue\n });\n this.assertStyleWarning(userValue);\n }\n\n ['@test specifying `
` works properly without a warning']() {\n this.render('
', {\n userValue: 'width: 42px'\n });\n this.assertNoWarning();\n }\n\n ['@test specifying `
` works properly with a SafeString']() {\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n this.assertNoWarning();\n }\n\n ['@test null value do not generate htmlsafe warning']() {\n this.render('
', {\n userValue: null\n });\n this.assertNoWarning();\n }\n\n ['@test undefined value do not generate htmlsafe warning']() {\n this.render('
');\n this.assertNoWarning();\n }\n\n ['@test no warnings are triggered when a safe string is quoted']() {\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n this.assertNoWarning();\n }\n\n ['@test binding warning is triggered when an unsafe string is quoted']() {\n var userValue = 'width: 42px';\n this.render('
', {\n userValue\n });\n this.assertStyleWarning(userValue);\n }\n\n ['@test binding warning is triggered when a safe string for a complete property is concatenated in place']() {\n var userValue = 'width: 42px';\n this.render('
', {\n userValue: new _helpers.SafeString('width: 42px')\n });\n this.assertStyleWarning(`color: green; ${userValue}`);\n }\n\n ['@test binding warning is triggered when a safe string for a value is concatenated in place']() {\n var userValue = '42px';\n this.render('
', {\n userValue: new _helpers.SafeString(userValue)\n });\n this.assertStyleWarning(`color: green; width: ${userValue}`);\n }\n\n ['@test binding warning is triggered when a safe string for a property name is concatenated in place']() {\n var userValue = 'width';\n this.render('
', {\n userProperty: new _helpers.SafeString(userValue)\n });\n this.assertStyleWarning(`color: green; ${userValue}: 42px`);\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/custom-component-manager-test\", [\"internal-test-helpers\", \"@glimmer/manager\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer\"], function (_internalTestHelpers, _manager, _runtime, _metal, _glimmer) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n var BasicComponentManager = _runtime.Object.extend({\n capabilities: (0, _manager.componentCapabilities)('3.4'),\n\n createComponent(factory, args) {\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n (0, _metal.set)(component, 'args', args);\n },\n\n getContext(component) {\n return component;\n }\n\n });\n /* eslint-disable */\n\n\n function createBasicManager(owner) {\n return BasicComponentManager.create({\n owner\n });\n }\n\n function createInstrumentedManager(owner) {\n return InstrumentedComponentManager.create({\n owner\n });\n }\n /* eslint-enable */\n\n\n var InstrumentedComponentManager;\n\n class ComponentManagerTest extends _internalTestHelpers.RenderingTestCase {\n constructor(assert) {\n super(...arguments);\n InstrumentedComponentManager = _runtime.Object.extend({\n capabilities: (0, _manager.componentCapabilities)('3.4', {\n destructor: true,\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent(component) {\n assert.step('didCreateComponent');\n component.didRender();\n },\n\n didUpdateComponent(component) {\n assert.step('didUpdateComponent');\n component.didUpdate();\n }\n\n });\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Component Manager - Curly Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} world
`,\n ComponentClass\n });\n this.render('{{foo-bar}}');\n this.assertHTML(`
hello world
`);\n }\n\n ['@test it can render a basic component with custom component manager with a factory']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(() => BasicComponentManager.create(), _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} world
`,\n ComponentClass\n });\n this.render('{{foo-bar}}');\n this.assertHTML(`
hello world
`);\n }\n\n ['@test it can have no template context']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: (0, _manager.componentCapabilities)('3.4'),\n\n createComponent() {\n return null;\n },\n\n updateComponent() {},\n\n getContext() {\n return null;\n }\n\n });\n }, {});\n this.registerComponent('foo-bar', {\n template: `
{{@greeting}} world
`,\n ComponentClass\n });\n this.render('{{foo-bar greeting=\"hello\"}}');\n this.assertHTML(`
hello world
`);\n }\n\n ['@test it can discover component manager through inheritance - ES Classes']() {\n class Base {}\n\n (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: (0, _manager.componentCapabilities)('3.4'),\n\n createComponent(Factory, args) {\n return new Factory(args);\n },\n\n updateComponent() {},\n\n getContext(component) {\n return component;\n }\n\n });\n }, Base);\n\n class Child extends Base {}\n\n class Grandchild extends Child {\n constructor() {\n super();\n this.name = 'grandchild';\n }\n\n }\n\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n this.render('{{foo-bar}}');\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can discover component manager through inheritance - Ember Object']() {\n var Parent = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend());\n var Child = Parent.extend();\n var Grandchild = Child.extend({\n init() {\n this._super(...arguments);\n\n this.name = 'grandchild';\n }\n\n });\n this.registerComponent('foo-bar', {\n template: `{{this.name}}`,\n ComponentClass: Grandchild\n });\n this.render('{{foo-bar}}');\n this.assertHTML(`grandchild`);\n }\n\n ['@test it can customize the template context']() {\n var customContext = {\n greeting: 'goodbye'\n };\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: (0, _manager.componentCapabilities)('3.4'),\n\n createComponent(factory) {\n return factory.create();\n },\n\n getContext() {\n return customContext;\n },\n\n updateComponent() {}\n\n });\n }, _runtime.Object.extend({\n greeting: 'hello',\n count: 1234\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} world {{this.count}}
`,\n ComponentClass\n });\n this.render('{{foo-bar}}');\n this.assertHTML(`
goodbye world
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(customContext, 'greeting', 'sayonara'));\n this.assertHTML(`
sayonara world
`);\n }\n\n ['@test it can set arguments on the component instance']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar firstName=\"Yehuda\" lastName=\"Katz\"}}');\n this.assertHTML(`
Yehuda Katz
`);\n }\n\n ['@test arguments are updated if they change']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar firstName=this.firstName lastName=this.lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n this.assertHTML(`
Yehuda Katz
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n this.assertHTML(`
Chad Hietala
`);\n }\n\n ['@test it can set positional params on the component instance']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.positional.[]', function () {\n return this.args.positional[0] + ' ' + this.args.positional[1];\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar \"Yehuda\" \"Katz\"}}');\n this.assertHTML(`
Yehuda Katz
`);\n }\n\n ['@test positional params are updated if they change (computed, arr tag)']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.positional.[]', function () {\n return this.args.positional[0] + ' ' + this.args.positional[1];\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar this.firstName this.lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n this.assertHTML(`
Yehuda Katz
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n this.assertHTML(`
Chad Hietala
`);\n }\n\n ['@test positional params are updated if they change (computed, individual tags)']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.positional.0', 'args.positional.1', function () {\n return this.args.positional[0] + ' ' + this.args.positional[1];\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar this.firstName this.lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n this.assertHTML(`
Yehuda Katz
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n this.assertHTML(`
Chad Hietala
`);\n }\n\n ['@test positional params are updated if they change (native)']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, class extends _runtime.Object {\n get salutation() {\n return this.args.positional[0] + ' ' + this.args.positional[1];\n }\n\n });\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('{{foo-bar this.firstName this.lastName}}', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n this.assertHTML(`
Yehuda Katz
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n this.assertHTML(`
Chad Hietala
`);\n }\n\n ['@test it can opt-in to running destructor'](assert) {\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: (0, _manager.componentCapabilities)('3.4', {\n destructor: true\n }),\n\n createComponent(factory) {\n assert.step('createComponent');\n return factory.create();\n },\n\n getContext(component) {\n return component;\n },\n\n updateComponent() {},\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n }\n\n });\n }, _runtime.Object.extend({\n greeting: 'hello',\n\n destroy() {\n assert.step('component.destroy()');\n\n this._super(...arguments);\n }\n\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} world
`,\n ComponentClass\n });\n this.render('{{#if this.show}}{{foo-bar}}{{/if}}', {\n show: true\n });\n this.assertHTML(`
hello world
`);\n (0, _internalTestHelpers.runTask)(() => this.context.set('show', false));\n this.assertText('');\n assert.verifySteps(['createComponent', 'destroyComponent', 'component.destroy()']);\n }\n\n ['@test it can opt-in to running async lifecycle hooks'](assert) {\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: (0, _manager.componentCapabilities)('3.4', {\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent() {\n assert.step('didCreateComponent');\n },\n\n didUpdateComponent() {\n assert.step('didUpdateComponent');\n }\n\n });\n }, _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} {{@name}}
`,\n ComponentClass\n });\n this.render('{{foo-bar name=this.name}}', {\n name: 'world'\n });\n this.assertHTML(`
hello world
`);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n (0, _internalTestHelpers.runTask)(() => this.context.set('name', 'max'));\n this.assertHTML(`
hello max
`);\n assert.verifySteps(['updateComponent', 'didUpdateComponent']);\n }\n\n '@test capabilities helper function must be used to generate capabilities'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: {\n asyncLifecycleCallbacks: true,\n destructor: true,\n update: false\n },\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent() {\n assert.step('didCreateComponent');\n },\n\n didUpdateComponent() {\n assert.step('didUpdateComponent');\n }\n\n });\n }, _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} {{@name}}
`,\n ComponentClass\n });\n assert.throws(() => {\n this.render('{{foo-bar name=this.name}}', {\n name: 'world'\n });\n }, /Custom component managers must have a `capabilities` property that is the result of calling the `capabilities\\('3.4' \\| '3.13'\\)` \\(imported via `import \\{ capabilities \\} from '@ember\\/component';`\\). /);\n assert.verifySteps([]);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Component Manager - Angle Invocation', class extends ComponentManagerTest {\n ['@test it can render a basic component with custom component manager']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} world
`,\n ComponentClass\n });\n this.render('
');\n this.assertHTML(`
hello world
`);\n }\n\n ['@test it can set arguments on the component instance']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('
');\n this.assertHTML(`
Yehuda Katz
`);\n }\n\n ['@test it can pass attributes']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend());\n this.registerComponent('foo-bar', {\n template: `
Hello world!
`,\n ComponentClass\n });\n this.render('
');\n this.assertHTML(`
Hello world!
`);\n }\n\n ['@test arguments are updated if they change']() {\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, _runtime.Object.extend({\n salutation: (0, _metal.computed)('args.named.firstName', 'args.named.lastName', function () {\n return this.args.named.firstName + ' ' + this.args.named.lastName;\n })\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.salutation}}
`,\n ComponentClass\n });\n this.render('
', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n this.assertHTML(`
Yehuda Katz
`);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.setProperties)(this.context, {\n firstName: 'Chad',\n lastName: 'Hietala'\n }));\n this.assertHTML(`
Chad Hietala
`);\n }\n\n ['@test updating attributes triggers updateComponent and didUpdateComponent'](assert) {\n var TestManager = _runtime.Object.extend({\n capabilities: (0, _manager.componentCapabilities)('3.4', {\n destructor: true,\n asyncLifecycleCallbacks: true\n }),\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent(component) {\n assert.step('didCreateComponent');\n component.didRender();\n },\n\n didUpdateComponent(component) {\n assert.step('didUpdateComponent');\n component.didUpdate();\n }\n\n });\n\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return TestManager.create();\n }, _runtime.Object.extend({\n didRender() {},\n\n didUpdate() {}\n\n }));\n this.registerComponent('foo-bar', {\n template: `
Hello world!
`,\n ComponentClass\n });\n this.render('
', {\n value: 'foo'\n });\n this.assertHTML(`
Hello world!
`);\n assert.verifySteps(['createComponent', 'getContext', 'didCreateComponent']);\n (0, _internalTestHelpers.runTask)(() => this.context.set('value', 'bar'));\n assert.verifySteps(['updateComponent', 'didUpdateComponent']);\n }\n\n ['@test updateComponent fires consistently with or without args'](assert) {\n var updated = [];\n\n class TestManager {\n constructor() {\n this.capabilities = (0, _manager.componentCapabilities)('3.13', {\n updateHook: true\n });\n }\n\n static create() {\n return new TestManager();\n }\n\n createComponent(_factory, args) {\n assert.step('createComponent');\n return {\n id: args.named.id || 'no-id'\n };\n }\n\n updateComponent(component) {\n assert.step('updateComponent');\n updated.push(component);\n }\n\n getContext(component) {\n assert.step('getContext');\n return component;\n }\n\n }\n\n var ComponentClass = (0, _glimmer.setComponentManager)(() => new TestManager(), {});\n this.registerComponent('foo-bar', {\n template: '{{yield}}',\n ComponentClass\n });\n this.render((0, _internalTestHelpers.strip)`\n [
{{this.value}} ]\n [
{{this.value}} ]\n [
{{this.value}} ]\n `, {\n id: 'dynamic-id',\n value: 'Hello World'\n });\n this.assertHTML(`[Hello World][Hello World][Hello World]`);\n assert.deepEqual(updated, []);\n assert.verifySteps(['createComponent', 'getContext', 'createComponent', 'getContext', 'createComponent', 'getContext']);\n (0, _internalTestHelpers.runTask)(() => this.context.set('value', 'bar'));\n assert.deepEqual(updated, [{\n id: 'no-id'\n }, {\n id: 'static-id'\n }, {\n id: 'dynamic-id'\n }]);\n assert.verifySteps(['updateComponent', 'updateComponent', 'updateComponent']);\n }\n\n ['@test updating arguments does not trigger updateComponent or didUpdateComponent if `updateHook` is false'](assert) {\n class TestManager {\n constructor() {\n this.capabilities = (0, _manager.componentCapabilities)('3.13', {\n /* implied: updateHook: false */\n });\n }\n\n createComponent() {\n assert.step('createComponent');\n return {};\n }\n\n getContext(component) {\n assert.step('getContext');\n return component;\n }\n\n updateComponent() {\n throw new Error('updateComponent called unexpectedly');\n }\n\n didUpdateComponent() {\n throw new Error('didUpdateComponent called unexpectedly');\n }\n\n }\n\n var ComponentClass = (0, _glimmer.setComponentManager)(() => new TestManager(), {});\n this.registerComponent('foo-bar', {\n template: `
Hello world!
`,\n ComponentClass\n });\n this.render('
', {\n value: 'foo'\n });\n this.assertHTML(`
Hello world!
`);\n assert.verifySteps(['createComponent', 'getContext']);\n (0, _internalTestHelpers.runTask)(() => this.context.set('value', 'bar'));\n assert.verifySteps([]);\n }\n\n '@test capabilities helper function must be used to generate capabilities'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n var ComponentClass = (0, _glimmer.setComponentManager)(() => {\n return _runtime.Object.create({\n capabilities: {\n asyncLifecycleCallbacks: true,\n destructor: true,\n update: false\n },\n\n createComponent(factory, args) {\n assert.step('createComponent');\n return factory.create({\n args\n });\n },\n\n updateComponent(component, args) {\n assert.step('updateComponent');\n (0, _metal.set)(component, 'args', args);\n },\n\n destroyComponent(component) {\n assert.step('destroyComponent');\n component.destroy();\n },\n\n getContext(component) {\n assert.step('getContext');\n return component;\n },\n\n didCreateComponent() {\n assert.step('didCreateComponent');\n },\n\n didUpdateComponent() {\n assert.step('didUpdateComponent');\n }\n\n });\n }, _runtime.Object.extend({\n greeting: 'hello'\n }));\n this.registerComponent('foo-bar', {\n template: `
{{this.greeting}} {{@name}}
`,\n ComponentClass\n });\n assert.throws(() => {\n this.render('
', {\n name: 'world'\n });\n }, /Custom component managers must have a `capabilities` property that is the result of calling the `capabilities\\('3.4' \\| '3.13'\\)` \\(imported via `import \\{ capabilities \\} from '@ember\\/component';`\\). /);\n assert.verifySteps([]);\n }\n\n '@test tracked property mutation in constructor issues a deprecation'() {\n var _class, _descriptor;\n\n var ComponentClass = (0, _glimmer.setComponentManager)(createBasicManager, (_class = class _class extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"itemCount\", _descriptor, this);\n }\n\n init() {\n super.init(...arguments); // first read the tracked property\n\n var {\n itemCount\n } = this; // then attempt to update the tracked property\n\n this.itemCount = itemCount + 1;\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"itemCount\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 0;\n }\n }), _class));\n this.registerComponent('foo-bar', {\n template: `{{this.itemCount}}`,\n ComponentClass\n });\n expectDeprecation(() => {\n this.render('
');\n }, /You attempted to update `itemCount` on `<.*>`, but it had already been used previously in the same computation/);\n this.assertHTML(`1`);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/custom-modifier-manager-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@glimmer/manager\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/debug-stack\"], function (_internalTestHelpers, _glimmer, _manager, _runtime, _metal, _debugStack) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n class ModifierManagerTest extends _internalTestHelpers.RenderingTestCase {\n '@test throws a useful error when missing capabilities'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.registerModifier('foo-bar', (0, _manager.setModifierManager)(() => {\n return {\n createModifier() {},\n\n installModifier() {},\n\n updateModifier() {},\n\n destroyModifier() {}\n\n };\n }, {}));\n assert.throws(() => {\n this.render('
hello world ');\n }, /Custom modifier managers must have a `capabilities` property /);\n }\n\n '@test can register a custom element modifier and render it'(assert) {\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement() {\n assert.ok(true, 'Called didInsertElement');\n }\n\n }));\n this.render('
hello world ');\n this.assertHTML(`
hello world `);\n }\n\n '@test custom lifecycle hooks'(assert) {\n assert.expect(9);\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didUpdate([truthy]) {\n assert.ok(true, 'Called didUpdate');\n assert.equal(truthy, 'true', 'gets updated args');\n },\n\n didInsertElement([truthy]) {\n assert.ok(true, 'Called didInsertElement');\n assert.equal(truthy, true, 'gets initial args');\n },\n\n willDestroyElement() {\n assert.ok(true, 'Called willDestroyElement');\n }\n\n }));\n this.render('{{#if this.truthy}}
hello world {{/if}}', {\n truthy: true\n });\n this.assertHTML(`
hello world `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'truthy', 'true'));\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'truthy', false));\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'truthy', true));\n }\n\n '@test associates manager even through an inheritance structure'(assert) {\n assert.expect(5);\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n ModifierClass = ModifierClass.extend({\n didInsertElement([truthy]) {\n this._super(...arguments);\n\n assert.ok(true, 'Called didInsertElement');\n assert.equal(truthy, true, 'gets initial args');\n }\n\n });\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement([truthy]) {\n this._super(...arguments);\n\n assert.ok(true, 'Called didInsertElement');\n assert.equal(truthy, true, 'gets initial args');\n }\n\n }));\n this.render('
hello world ', {\n truthy: true\n });\n this.assertHTML(`
hello world `);\n }\n\n '@test can give consistent access to underlying DOM element'(assert) {\n assert.expect(4);\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n savedElement: undefined,\n\n didInsertElement(positional) {\n // consume first positional argument (ensures updates run)\n positional[0];\n assert.equal(this.element.tagName, 'H1');\n this.set('savedElement', this.element);\n },\n\n didUpdate() {\n assert.equal(this.element, this.savedElement);\n },\n\n willDestroyElement() {\n assert.equal(this.element, this.savedElement);\n }\n\n }));\n this.render('
hello world ', {\n truthy: true\n });\n this.assertHTML(`
hello world `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'truthy', 'true'));\n }\n\n '@test lifecycle hooks are autotracked by default'(assert) {\n var TrackedClass = _runtime.Object.extend({\n count: (0, _metal.tracked)({\n value: 0\n })\n });\n\n var trackedOne = TrackedClass.create();\n var trackedTwo = TrackedClass.create();\n var insertCount = 0;\n var updateCount = 0;\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement() {\n // track the count of the first item\n trackedOne.count;\n insertCount++;\n },\n\n didUpdate() {\n // track the count of the second item\n trackedTwo.count;\n updateCount++;\n }\n\n }));\n this.render('
hello world ');\n this.assertHTML(`
hello world `);\n assert.equal(insertCount, 1);\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => trackedTwo.count++);\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => trackedOne.count++);\n assert.equal(updateCount, 1);\n (0, _internalTestHelpers.runTask)(() => trackedOne.count++);\n assert.equal(updateCount, 1);\n (0, _internalTestHelpers.runTask)(() => trackedTwo.count++);\n assert.equal(updateCount, 2);\n }\n\n '@test provides a helpful deprecation when mutating a tracked value that was consumed already within constructor'(assert) {\n var _class, _descriptor;\n\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, (_class = class _class {\n static create() {\n return new this();\n }\n\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor, this); // first read the tracked property\n\n\n this.foo; // then attempt to update the tracked property\n\n this.foo = 456;\n }\n\n didInsertElement() {}\n\n didUpdate() {}\n\n willDestroyElement() {}\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 123;\n }\n }), _class));\n this.registerModifier('foo-bar', class extends ModifierClass {\n didInsertElement() {\n assert.ok(true, 'modifiers didInsertElement was called');\n }\n\n });\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('foo');\n expectDeprecation(() => {\n this.render('
hello world ');\n }, expectedMessage);\n }\n\n '@test provides a helpful assertion when mutating a value that was consumed already'() {\n var _class3, _descriptor2;\n\n var Person = (_class3 = class Person {\n constructor() {\n _initializerDefineProperty(this, \"name\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"name\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'bob';\n }\n }), _class3);\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, class {\n static create() {\n return new this();\n }\n\n didInsertElement() {}\n\n didUpdate() {}\n\n willDestroyElement() {}\n\n });\n this.registerModifier('foo-bar', class MyModifier extends ModifierClass {\n didInsertElement([person]) {\n person.name;\n person.name = 'sam';\n }\n\n });\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('name', 'Person', {\n renderTree: ['\\\\(instance of a `foo-bar` modifier\\\\)'],\n includeTopLevel: false\n });\n expectAssertion(() => {\n this.render('
hello world ', {\n person: new Person()\n });\n }, expectedMessage);\n }\n\n '@test capabilities helper function must be used to generate capabilities'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n class OverrideCustomModifierManager extends this.CustomModifierManager {\n constructor(...args) {\n super(...args);\n this.capabilities = {\n disableAutoTracking: false,\n useArgsProxy: true,\n passFactoryToCreate: false\n };\n }\n\n }\n\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new OverrideCustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {\n assert.step('didInsertElement');\n },\n\n didUpdate() {\n assert.step('didUpdate');\n },\n\n willDestroyElement() {\n assert.step('willDestroyElement');\n }\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend());\n assert.throws(() => {\n this.render('
hello world ');\n }, /Custom modifier managers must have a `capabilities` property that is the result of calling the `capabilities\\('3.13' \\| '3.22'\\)` \\(imported via `import \\{ capabilities \\} from '@ember\\/modifier';`\\). /);\n assert.verifySteps([]);\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Basic Custom Modifier Manager: 3.13', class extends ModifierManagerTest {\n constructor(..._args) {\n super(..._args);\n this.CustomModifierManager = class CustomModifierManager {\n constructor(owner) {\n this.capabilities = (0, _manager.modifierCapabilities)('3.13');\n this.owner = owner;\n }\n\n createModifier(factory, args) {\n // factory is the owner.factoryFor result\n return factory.create(args);\n }\n\n installModifier(instance, element, args) {\n instance.element = element;\n var {\n positional,\n named\n } = args;\n instance.didInsertElement(positional, named);\n }\n\n updateModifier(instance, args) {\n var {\n positional,\n named\n } = args;\n instance.didUpdate(positional, named);\n }\n\n destroyModifier(instance) {\n instance.willDestroyElement();\n }\n\n };\n }\n\n '@test modifers consume all arguments'(assert) {\n var insertCount = 0;\n var updateCount = 0;\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement(_positional, named) {\n insertCount++; // consume qux\n\n named.qux;\n },\n\n didUpdate(_positiona, named) {\n updateCount++; // consume qux\n\n named.qux;\n }\n\n }));\n this.render('
hello world ', {\n bar: 'bar',\n qux: 'quz'\n });\n this.assertHTML(`
hello world `);\n assert.equal(insertCount, 1);\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'bar', 'other bar'));\n assert.equal(updateCount, 1);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'qux', 'quuuuxxxxxx'));\n assert.equal(updateCount, 2);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Basic Custom Modifier Manager: 3.22', class extends ModifierManagerTest {\n constructor(..._args2) {\n super(..._args2);\n this.CustomModifierManager = class CustomModifierManager {\n constructor(owner) {\n this.capabilities = (0, _manager.modifierCapabilities)('3.22');\n this.owner = owner;\n }\n\n createModifier(Modifier, args) {\n return Modifier.create(args);\n }\n\n installModifier(instance, element, args) {\n instance.element = element;\n var {\n positional,\n named\n } = args;\n instance.didInsertElement(positional, named);\n }\n\n updateModifier(instance, args) {\n var {\n positional,\n named\n } = args;\n instance.didUpdate(positional, named);\n }\n\n destroyModifier(instance) {\n instance.willDestroyElement();\n }\n\n };\n }\n\n '@test modifers only track positional arguments they consume'(assert) {\n var insertCount = 0;\n var updateCount = 0;\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement(positional) {\n insertCount++; // consume the second positional\n\n positional[1];\n },\n\n didUpdate(positional) {\n updateCount++; // consume the second positional\n\n positional[1];\n }\n\n }));\n this.render('
hello world ', {\n positionOne: 'first!!!',\n positionTwo: 'second :(',\n bar: 'bar',\n qux: 'quz'\n });\n this.assertHTML(`
hello world `);\n assert.equal(insertCount, 1);\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'positionOne', 'no first?'));\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'positionTwo', 'YASSSSSSS!!!'));\n assert.equal(updateCount, 1);\n }\n\n '@test modifers only track named arguments they consume'(assert) {\n var insertCount = 0;\n var updateCount = 0;\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new this.CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {},\n\n didUpdate() {},\n\n willDestroyElement() {}\n\n }));\n this.registerModifier('foo-bar', ModifierClass.extend({\n didInsertElement(_positional, named) {\n insertCount++; // consume qux\n\n named.qux;\n },\n\n didUpdate(_positiona, named) {\n updateCount++; // consume qux\n\n named.qux;\n }\n\n }));\n this.render('
hello world ', {\n bar: 'bar',\n qux: 'quz'\n });\n this.assertHTML(`
hello world `);\n assert.equal(insertCount, 1);\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'bar', 'other bar'));\n assert.equal(updateCount, 0);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'qux', 'quuuuxxxxxx'));\n assert.equal(updateCount, 1);\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can resolve a modifier'() {\n this.registerModifier('replace', (0, _internalTestHelpers.defineSimpleModifier)((element, [text]) => element.innerHTML = text ?? 'Hello, world!')); // BUG: this should work according to the RFC\n // this.render(\n // '[
Nope
][
Nope
]'\n // );\n\n this.render('[
Nope
][
Nope
]');\n this.assertText('[Hello, world!][wow]');\n this.assertStableRerender();\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Cannot dynamically resolve a modifier'(assert) {\n this.registerModifier('replace', (0, _internalTestHelpers.defineSimpleModifier)(element => element.innerHTML = 'Hello, world!'));\n\n if (true\n /* DEBUG */\n ) {\n expectAssertion(() => this.render( // BUG: this should work according to the RFC\n // '
Nope
',\n '
Nope
', {\n name: 'replace'\n }), /Passing a dynamic string to the `\\(modifier\\)` keyword is disallowed\\./);\n } else {\n assert.expect(0);\n }\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can be curried'() {\n var val = (0, _internalTestHelpers.defineSimpleModifier)((element, [text]) => element.innerHTML = text);\n this.registerComponent('foo', {\n template: '
'\n });\n this.registerComponent('bar', {\n template: '
',\n ComponentClass: _glimmer.Component.extend({\n val\n })\n });\n this.render('
');\n this.assertText('Hello, world!');\n this.assertStableRerender();\n }\n\n '@feature(!EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Cannot be curried when flag is not enabled'() {\n expectAssertion(() => {\n this.registerComponent('bar', {\n template: '
'\n });\n }, /Cannot use the \\(modifier\\) keyword yet, as it has not been implemented/);\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can use a dynamic modifier with a nested dynamic helper'() {\n var foo = (0, _internalTestHelpers.defineSimpleHelper)(() => 'Hello, world!');\n var bar = (0, _internalTestHelpers.defineSimpleModifier)((element, [value]) => element.innerHTML = value);\n this.registerComponent('baz', {\n template: '
',\n ComponentClass: _glimmer.Component.extend({\n tagName: '',\n foo,\n bar\n })\n });\n this.render('
');\n this.assertHTML('
Hello, world!
');\n this.assertStableRerender();\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Rendering test: non-interactive custom modifiers', class extends _internalTestHelpers.RenderingTestCase {\n getBootOptions() {\n return {\n isInteractive: false\n };\n }\n\n [`@test doesn't trigger lifecycle hooks when non-interactive: modifierCapabilities('3.13')`](assert) {\n class CustomModifierManager {\n constructor(owner) {\n this.capabilities = (0, _manager.modifierCapabilities)('3.13');\n this.owner = owner;\n }\n\n createModifier(factory, args) {\n return factory.create(args);\n }\n\n installModifier(instance, element, args) {\n instance.element = element;\n var {\n positional,\n named\n } = args;\n instance.didInsertElement(positional, named);\n }\n\n updateModifier(instance, args) {\n var {\n positional,\n named\n } = args;\n instance.didUpdate(positional, named);\n }\n\n destroyModifier(instance) {\n instance.willDestroyElement();\n }\n\n }\n\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {\n assert.ok(false);\n },\n\n didUpdate() {\n assert.ok(false);\n },\n\n willDestroyElement() {\n assert.ok(false);\n }\n\n }));\n this.registerModifier('foo-bar', ModifierClass);\n this.render('
hello world ');\n (0, _internalTestHelpers.runTask)(() => this.context.set('baz', 'Hello'));\n this.assertHTML('
hello world ');\n }\n\n [`@test doesn't trigger lifecycle hooks when non-interactive: modifierCapabilities('3.22')`](assert) {\n class CustomModifierManager {\n constructor(owner) {\n this.capabilities = (0, _manager.modifierCapabilities)('3.22');\n this.owner = owner;\n }\n\n createModifier(Modifier, args) {\n return Modifier.create(args);\n }\n\n installModifier(instance, element, args) {\n instance.element = element;\n var {\n positional,\n named\n } = args;\n instance.didInsertElement(positional, named);\n }\n\n updateModifier(instance, args) {\n var {\n positional,\n named\n } = args;\n instance.didUpdate(positional, named);\n }\n\n destroyModifier(instance) {\n instance.willDestroyElement();\n }\n\n }\n\n var ModifierClass = (0, _manager.setModifierManager)(owner => {\n return new CustomModifierManager(owner);\n }, _runtime.Object.extend({\n didInsertElement() {\n assert.ok(false);\n },\n\n didUpdate() {\n assert.ok(false);\n },\n\n willDestroyElement() {\n assert.ok(false);\n }\n\n }));\n this.registerModifier('foo-bar', ModifierClass);\n this.render('
hello world ');\n (0, _internalTestHelpers.runTask)(() => this.context.set('baz', 'Hello'));\n this.assertHTML('
hello world ');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/event-dispatcher-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/helpers\", \"@ember/runloop\", \"@ember/instrumentation\", \"@ember/canary-features\"], function (_internalTestHelpers, _helpers, _runloop, _instrumentation, _canaryFeatures) {\n \"use strict\";\n\n var canDataTransfer = Boolean(document.createEvent('HTMLEvents').dataTransfer);\n\n function fireNativeWithDataTransfer(node, type, dataTransfer) {\n var event = document.createEvent('HTMLEvents');\n event.initEvent(type, true, true);\n event.dataTransfer = dataTransfer;\n node.dispatchEvent(event);\n }\n\n function triggerEvent(node, event) {\n switch (event) {\n case 'focusin':\n return node.focus();\n\n case 'focusout':\n return node.blur();\n\n default:\n return node.trigger(event);\n }\n }\n\n var SUPPORTED_EMBER_EVENTS = {\n touchstart: 'touchStart',\n touchmove: 'touchMove',\n touchend: 'touchEnd',\n touchcancel: 'touchCancel',\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n mousedown: 'mouseDown',\n mouseup: 'mouseUp',\n contextmenu: 'contextMenu',\n click: 'click',\n dblclick: 'doubleClick',\n focusin: 'focusIn',\n focusout: 'focusOut',\n submit: 'submit',\n input: 'input',\n change: 'change',\n dragstart: 'dragStart',\n drag: 'drag',\n dragenter: 'dragEnter',\n dragleave: 'dragLeave',\n dragover: 'dragOver',\n drop: 'drop',\n dragend: 'dragEnd'\n };\n (0, _internalTestHelpers.moduleFor)('EventDispatcher', class extends _internalTestHelpers.RenderingTestCase {\n ['@test event handler methods are called when event is triggered'](assert) {\n var receivedEvent;\n var browserEvent;\n this.registerComponent('x-button', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'button'\n }, Object.keys(SUPPORTED_EMBER_EVENTS).map(browerEvent => ({\n [SUPPORTED_EMBER_EVENTS[browerEvent]](event) {\n receivedEvent = event;\n }\n\n })).reduce((result, singleEventHandler) => ({ ...result,\n ...singleEventHandler\n }), {}))\n });\n this.render(`{{x-button}}`);\n var elementNode = this.$('button');\n var element = elementNode[0];\n\n for (browserEvent in SUPPORTED_EMBER_EVENTS) {\n receivedEvent = null;\n (0, _internalTestHelpers.runTask)(() => triggerEvent(elementNode, browserEvent));\n assert.ok(receivedEvent, `${browserEvent} event was triggered`);\n assert.strictEqual(receivedEvent.target, element);\n }\n }\n\n ['@test event listeners are called when event is triggered'](assert) {\n var receivedEvent;\n var browserEvent;\n this.registerComponent('x-button', {\n ComponentClass: _helpers.Component.extend({\n tagName: 'button',\n\n init() {\n this._super();\n\n Object.keys(SUPPORTED_EMBER_EVENTS).forEach(browserEvent => {\n this.on(SUPPORTED_EMBER_EVENTS[browserEvent], event => receivedEvent = event);\n });\n }\n\n })\n });\n this.render(`{{x-button}}`);\n var elementNode = this.$('button');\n var element = elementNode[0];\n\n for (browserEvent in SUPPORTED_EMBER_EVENTS) {\n receivedEvent = null;\n (0, _internalTestHelpers.runTask)(() => triggerEvent(elementNode, browserEvent));\n assert.ok(receivedEvent, `${browserEvent} event was triggered`);\n assert.strictEqual(receivedEvent.target, element);\n }\n }\n\n ['@test events bubble view hierarchy for form elements'](assert) {\n var receivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n\n }),\n template: `
`\n });\n this.render(`{{x-foo}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('change'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test case insensitive events'](assert) {\n var receivedEvent;\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n\n }),\n template: `
my button `\n });\n this.render(`{{x-bar}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('click'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test case sensitive events'](assert) {\n var receivedEvent;\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n clicked(event) {\n receivedEvent = event;\n }\n\n }),\n template: `
my button `\n });\n this.render(`{{x-bar}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('click'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test events bubble to parent view'](assert) {\n var receivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change(event) {\n receivedEvent = event;\n }\n\n }),\n template: `{{yield}}`\n });\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {}\n\n }),\n template: `
`\n });\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('change'));\n assert.ok(receivedEvent, 'change event was triggered');\n assert.strictEqual(receivedEvent.target, this.$('#is-done')[0]);\n }\n\n ['@test events bubbling up can be prevented by returning false'](assert) {\n var hasReceivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n hasReceivedEvent = true;\n }\n\n }),\n template: `{{yield}}`\n });\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change() {\n return false;\n }\n\n }),\n template: `
`\n });\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('change'));\n assert.notOk(hasReceivedEvent, 'change event has not been received');\n }\n\n ['@test events bubbling up can be prevented by calling stopPropagation()'](assert) {\n var hasReceivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n hasReceivedEvent = true;\n }\n\n }),\n template: `{{yield}}`\n });\n this.registerComponent('x-bar', {\n ComponentClass: _helpers.Component.extend({\n change(e) {\n e.stopPropagation();\n }\n\n }),\n template: `
`\n });\n this.render(`{{#x-foo}}{{x-bar}}{{/x-foo}}`);\n (0, _internalTestHelpers.runTask)(() => this.$('#is-done').trigger('change'));\n assert.notOk(hasReceivedEvent, 'change event has not been received');\n }\n\n ['@test event handlers are wrapped in a run loop'](assert) {\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n change() {\n assert.ok((0, _runloop._getCurrentRunLoop)(), 'a run loop should have started');\n }\n\n }),\n template: `
`\n });\n this.render(`{{x-foo}}`);\n this.$('#is-done').trigger('click');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('EventDispatcher#setup', class extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n this.dispatcher = this.owner.lookup('event_dispatcher:main');\n }\n\n getBootOptions() {\n return {\n skipEventDispatcher: true\n };\n }\n\n ['@test additional events can be specified'](assert) {\n this.dispatcher.setup({\n myevent: 'myEvent'\n });\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n myEvent() {\n assert.ok(true, 'custom event was triggered');\n }\n\n }),\n template: `
Hello!
`\n });\n this.render(`{{x-foo}}`);\n this.$('div').trigger('myevent');\n }\n\n ['@test a rootElement can be specified'](assert) {\n this.element.innerHTML = '
'; // this.$().append('
');\n\n this.dispatcher.setup({\n myevent: 'myEvent'\n }, '#app');\n assert.ok(this.$('#app').hasClass('ember-application'), 'custom rootElement was used');\n assert.equal(this.dispatcher.rootElement, '#app', 'the dispatchers rootElement was updated');\n }\n\n ['@test default events can be disabled via `customEvents`'](assert) {\n this.dispatcher.setup({\n click: null\n });\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click() {\n assert.ok(false, 'click method was called');\n },\n\n null() {\n assert.ok(false, 'null method was called');\n },\n\n doubleClick() {\n assert.ok(true, 'a non-disabled event is still handled properly');\n }\n\n }),\n template: `
Hello!
`\n });\n this.render(`{{x-foo}}`);\n this.$('div').trigger('click');\n this.$('div').trigger('dblclick');\n }\n\n ['@test throws if specified rootElement does not exist'](assert) {\n assert.throws(() => {\n this.dispatcher.setup({\n myevent: 'myEvent'\n }, '#app');\n });\n }\n\n });\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _internalTestHelpers.moduleFor)('EventDispatcher - Instrumentation', class extends _internalTestHelpers.RenderingTestCase {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test instruments triggered events'](assert) {\n var clicked = 0;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n click() {\n clicked++;\n }\n\n }),\n template: `
hello
`\n });\n this.render(`{{x-foo}}`);\n this.$('div').trigger('click');\n assert.equal(clicked, 1, 'precond - the click handler was invoked');\n var clickInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.click', {\n before() {\n clickInstrumented++;\n assert.equal(clicked, 1, 'invoked before event is handled');\n },\n\n after() {\n clickInstrumented++;\n assert.equal(clicked, 2, 'invoked after event is handled');\n }\n\n });\n var keypressInstrumented = 0;\n (0, _instrumentation.subscribe)('interaction.keypress', {\n before() {\n keypressInstrumented++;\n },\n\n after() {\n keypressInstrumented++;\n }\n\n });\n this.$('div').trigger('click');\n this.$('div').trigger('change');\n assert.equal(clicked, 2, 'precond - The click handler was invoked');\n assert.equal(clickInstrumented, 2, 'The click was instrumented');\n assert.strictEqual(keypressInstrumented, 0, 'The keypress was not instrumented');\n }\n\n });\n }\n\n if (canDataTransfer) {\n (0, _internalTestHelpers.moduleFor)('EventDispatcher - Event Properties', class extends _internalTestHelpers.RenderingTestCase {\n ['@test dataTransfer property is added to drop event'](assert) {\n var receivedEvent;\n this.registerComponent('x-foo', {\n ComponentClass: _helpers.Component.extend({\n drop(event) {\n receivedEvent = event;\n }\n\n })\n });\n this.render(`{{x-foo}}`);\n fireNativeWithDataTransfer(this.$('div')[0], 'drop', 'success');\n assert.equal(receivedEvent.dataTransfer, 'success');\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/array-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{array}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test returns an array']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#let (array \"Sergio\") as |people|}}\n {{#each people as |personName|}}\n {{personName}}\n {{/each}}\n {{/let}}`);\n this.assertText('Sergio');\n this.assertStableRerender();\n }\n\n ['@test can have more than one value']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#let (array \"Sergio\" \"Robert\") as |people|}}\n {{#each people as |personName|}}\n {{personName}},\n {{/each}}\n {{/let}}`);\n this.assertText('Sergio,Robert,');\n this.assertStableRerender();\n }\n\n ['@test binds values when variables are used']() {\n this.render((0, _internalTestHelpers.strip)`{{#let (array this.personOne) as |people|}}\n {{#each people as |personName|}}\n {{personName}}\n {{/each}}\n {{/let}}`, {\n personOne: 'Tom'\n });\n this.assertText('Tom');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personOne', 'Yehuda'));\n this.assertText('Yehuda');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personOne', 'Tom'));\n this.assertText('Tom');\n }\n\n ['@test binds multiple values when variables are used']() {\n this.render((0, _internalTestHelpers.strip)`{{#let (array this.personOne this.personTwo) as |people|}}\n {{#each people as |personName|}}\n {{personName}},\n {{/each}}\n {{/let}}`, {\n personOne: 'Tom',\n personTwo: 'Yehuda'\n });\n this.assertText('Tom,Yehuda,');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personOne', 'Sergio'));\n this.assertText('Sergio,Yehuda,');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Tom'));\n this.assertText('Sergio,Tom,');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'personOne', 'Tom');\n (0, _metal.set)(this.context, 'personTwo', 'Yehuda');\n });\n this.assertText('Tom,Yehuda,');\n }\n\n ['@test array helpers can be nested']() {\n this.render((0, _internalTestHelpers.strip)`{{#let (array (array this.personOne this.personTwo)) as |listOfPeople|}}\n {{#each listOfPeople as |people|}}\n List:\n {{#each people as |personName|}}\n {{personName}},\n {{/each}}\n {{/each}}\n {{/let}}`, {\n personOne: 'Tom',\n personTwo: 'Yehuda'\n });\n this.assertText('List:Tom,Yehuda,');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personOne', 'Chad'));\n this.assertText('List:Chad,Yehuda,');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Balint'));\n this.assertText('List:Chad,Balint,');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'personOne', 'Tom');\n (0, _metal.set)(this.context, 'personTwo', 'Yehuda');\n });\n this.assertText('List:Tom,Yehuda,');\n }\n\n ['@test should yield hash of an array of internal properties']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n this.model = {\n personOne: 'Chad'\n };\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash people=(array this.model.personOne))}}`\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#foo-bar as |values|}}\n {{#each values.people as |personName|}}\n {{personName}}\n {{/each}}\n {{/foo-bar}}`);\n this.assertText('Chad');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model.personOne', 'Godfrey'));\n this.assertText('Godfrey');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model', {\n personOne: 'Chad'\n }));\n this.assertText('Chad');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model.personOne', 'Godfrey'));\n this.assertText('Godfrey');\n }\n\n ['@test should yield hash of an array of internal and external properties']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n this.model = {\n personOne: 'Chad'\n };\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash people=(array this.model.personOne this.personTwo))}}`\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#foo-bar personTwo=this.model.personTwo as |values|}}\n {{#each values.people as |personName|}}\n {{personName}},\n {{/each}}\n {{/foo-bar}}`, {\n model: {\n personTwo: 'Tom'\n }\n });\n this.assertText('Chad,Tom,');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'model.personOne', 'Godfrey');\n (0, _metal.set)(this.context, 'model.personTwo', 'Yehuda');\n });\n this.assertText('Godfrey,Yehuda,');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'model', {\n personOne: 'Chad'\n });\n (0, _metal.set)(this.context, 'model', {\n personTwo: 'Tom'\n });\n });\n this.assertText('Chad,Tom,');\n }\n\n ['@test should render when passing as argument to a component invocation']() {\n var FooBarComponent = _helpers.Component.extend({});\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: (0, _internalTestHelpers.strip)`\n {{#each this.people as |personName|}}\n {{personName}},\n {{/each}}`\n });\n this.render((0, _internalTestHelpers.strip)`{{foo-bar people=(array \"Tom\" this.personTwo)}}`, {\n personTwo: 'Chad'\n });\n this.assertText('Tom,Chad,');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Godfrey'));\n this.assertText('Tom,Godfrey,');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Chad'));\n this.assertText('Tom,Chad,');\n }\n\n ['@test should return an entirely new array when any argument change']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: (0, _internalTestHelpers.strip)`\n {{#each this.people as |personName|}}\n {{personName}},\n {{/each}}`\n });\n this.render((0, _internalTestHelpers.strip)`{{foo-bar people=(array \"Tom\" this.personTwo)}}`, {\n personTwo: 'Chad'\n });\n var firstArray = fooBarInstance.people;\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Godfrey'));\n this.assert.ok(firstArray !== fooBarInstance.people, 'should have created an entirely new array');\n }\n\n ['@test capture array values in JS to assert deep equal']() {\n var captured;\n this.registerHelper('capture', function ([array]) {\n captured = array;\n return 'captured';\n });\n this.render(`{{capture (array 'Tom' this.personTwo)}}`, {\n personTwo: 'Godfrey'\n });\n this.assert.deepEqual(captured, ['Tom', 'Godfrey']);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Robert'));\n this.assert.deepEqual(captured, ['Tom', 'Robert']);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'personTwo', 'Godfrey'));\n this.assert.deepEqual(captured, ['Tom', 'Godfrey']);\n }\n\n ['@test GH18693 properties in hash can be accessed from the array']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#each (array (hash some=\"thing\")) as |item|}}\n {{item.some}}\n {{/each}}`);\n this.assertText('thing');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/closure-action-test\", [\"internal-test-helpers\", \"@ember/instrumentation\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/canary-features\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _instrumentation, _runloop, _metal, _canaryFeatures, _helpers) {\n \"use strict\";\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _internalTestHelpers.moduleFor)('Helpers test: closure {{action}} improved instrumentation', class extends _internalTestHelpers.RenderingTestCase {\n subscribe(eventName, options) {\n this.subscriber = (0, _instrumentation.subscribe)(eventName, options);\n }\n\n teardown() {\n if (this.subscriber) {\n (0, _instrumentation.unsubscribe)(this.subscriber);\n }\n\n super.teardown();\n }\n\n ['@test interaction event subscriber should be passed parameters']() {\n var actionParam = 'So krispy';\n var beforeParameters = [];\n var afterParameters = [];\n\n var InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n this.attrs.submit(actionParam);\n }\n\n }\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerSubmit() {}\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '
What it do '\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.args);\n },\n\n after(name, timestamp, payload) {\n afterParameters.push(payload.args);\n }\n\n });\n this.render(`{{outer-component}}`);\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#instrument-button').trigger('click');\n });\n this.assert.deepEqual(beforeParameters, [[], [actionParam]], 'instrumentation subscriber before function was passed closure action parameters');\n this.assert.deepEqual(afterParameters, [[actionParam], []], 'instrumentation subscriber after function was passed closure action parameters');\n }\n\n ['@test interaction event subscriber should be passed target']() {\n var beforeParameters = [];\n var afterParameters = [];\n\n var InnerComponent = _helpers.Component.extend({\n myProperty: 'inner-thing',\n actions: {\n fireAction() {\n this.attrs.submit();\n }\n\n }\n });\n\n var OuterComponent = _helpers.Component.extend({\n myProperty: 'outer-thing',\n\n outerSubmit() {}\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '
What it do '\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.subscribe('interaction.ember-action', {\n before(name, timestamp, payload) {\n beforeParameters.push(payload.target.get('myProperty'));\n },\n\n after(name, timestamp, payload) {\n afterParameters.push(payload.target.get('myProperty'));\n }\n\n });\n this.render(`{{outer-component}}`);\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#instrument-button').trigger('click');\n });\n this.assert.deepEqual(beforeParameters, ['inner-thing', 'outer-thing'], 'instrumentation subscriber before function was passed target');\n this.assert.deepEqual(afterParameters, ['outer-thing', 'inner-thing'], 'instrumentation subscriber after function was passed target');\n }\n\n ['@test instrumented action should return value']() {\n var returnedValue = 'Chris P is so krispy';\n var actualReturnedValue;\n\n var InnerComponent = _helpers.Component.extend({\n actions: {\n fireAction() {\n actualReturnedValue = this.attrs.submit();\n }\n\n }\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return returnedValue;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '
What it do '\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.subscribe('interaction.ember-action', {\n before() {},\n\n after() {}\n\n });\n this.render(`{{outer-component}}`);\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#instrument-button').trigger('click');\n });\n this.assert.equal(actualReturnedValue, returnedValue, 'action can return to caller');\n }\n\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: closure {{action}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test action should be called']() {\n var outerActionCalled = false;\n var component;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n outerActionCalled = true;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n component.fireAction();\n });\n this.assert.ok(outerActionCalled, 'the action was called');\n }\n\n ['@test an error is triggered when bound action function is undefined']() {\n this.registerComponent('inner-component', {\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n template: '{{inner-component submit=(action this.somethingThatIsUndefined)}}'\n });\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /Action passed is null or undefined in \\(action[^)]*\\) from .*\\./);\n }\n\n ['@test an error is triggered when bound action being passed in is a non-function']() {\n this.registerComponent('inner-component', {\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: _helpers.Component.extend({\n nonFunctionThing: {}\n }),\n template: '{{inner-component submit=(action this.nonFunctionThing)}}'\n });\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action could not be made for `.*` in .*\\. Please confirm that you are using either a quoted action name \\(i\\.e\\. `\\(action '.*'\\)`\\) or a function available in .*\\./);\n }\n\n ['@test [#12718] a nice error is shown when a bound action function is undefined and it is passed as @foo']() {\n this.registerComponent('inner-component', {\n template: '
Click me '\n });\n this.registerComponent('outer-component', {\n template: '{{inner-component}}'\n });\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /Action passed is null or undefined in \\(action[^)]*\\) from .*\\./);\n }\n\n ['@test action value is returned']() {\n var expectedValue = 'terrible tom';\n var returnedValue;\n var innerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n returnedValue = this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerSubmit() {\n return expectedValue;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(returnedValue, expectedValue, 'action can return to caller');\n }\n\n ['@test action should be called on the correct scope']() {\n var innerComponent;\n var outerComponent;\n var actualComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outerComponent = this;\n },\n\n isOuterComponent: true,\n\n outerSubmit() {\n actualComponent = this;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action this.outerSubmit)}}'\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualComponent, outerComponent, 'action has the correct context');\n this.assert.ok(actualComponent.isOuterComponent, 'action has the correct context');\n }\n\n ['@test arguments to action are passed, curry']() {\n var first = 'mitch';\n var second = 'martin';\n var third = 'matt';\n var fourth = 'wacky wycats';\n var innerComponent;\n var actualArgs;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit(fourth);\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n third,\n\n outerSubmit() {\n // eslint-disable-line no-unused-vars\n actualArgs = [...arguments];\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (action this.outerSubmit \"${first}\") \"${second}\" this.third)}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.deepEqual(actualArgs, [first, second, third, fourth], 'action has the correct args');\n }\n\n ['@test `this` can be passed as an argument']() {\n var value = {};\n var component;\n var innerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n outerAction(incomingValue) {\n value = incomingValue;\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: '{{inner-component submit=(action \"outerAction\" this)}}'\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.strictEqual(value, component, 'the component is passed at `this`');\n }\n\n ['@test arguments to action are bound']() {\n var value = 'lazy leah';\n var innerComponent;\n var outerComponent;\n var actualArg;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outerComponent = this;\n },\n\n value: '',\n\n outerSubmit(incomingValue) {\n actualArg = incomingValue;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action this.outerSubmit this.value)}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.strictEqual(actualArg, '', 'action has the correct first arg');\n (0, _internalTestHelpers.runTask)(() => {\n outerComponent.set('value', value);\n });\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.strictEqual(actualArg, value, 'action has the correct first arg');\n }\n\n ['@test array arguments are passed correctly to action']() {\n var first = 'foo';\n var second = [3, 5];\n var third = [4, 9];\n var actualFirst;\n var actualSecond;\n var actualThird;\n var innerComponent;\n var outerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit(second, third);\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outerComponent = this;\n },\n\n outerSubmit(incomingFirst, incomingSecond, incomingThird) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n actualThird = incomingThird;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action this.outerSubmit this.first)}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n outerComponent.set('first', first);\n outerComponent.set('second', second);\n });\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualFirst, first, 'action has the correct first arg');\n this.assert.equal(actualSecond, second, 'action has the correct second arg');\n this.assert.equal(actualThird, third, 'action has the correct third arg');\n }\n\n ['@test mut values can be wrapped in actions, are settable']() {\n var newValue = 'trollin trek';\n var innerComponent;\n var outerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit(newValue);\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outerComponent = this;\n },\n\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut this.outerMut))}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(outerComponent.get('outerMut'), newValue, 'mut value is set');\n }\n\n ['@test mut values can be wrapped in actions, are settable with a curry']() {\n var newValue = 'trollin trek';\n var innerComponent;\n var outerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outerComponent = this;\n },\n\n outerMut: 'patient peter'\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action (mut this.outerMut) '${newValue}')}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(outerComponent.get('outerMut'), newValue, 'mut value is set');\n }\n\n ['@test action can create closures over actions']() {\n var first = 'raging robert';\n var second = 'mild machty';\n var returnValue = 'butch brian';\n var actualFirst;\n var actualSecond;\n var actualReturnedValue;\n var innerComponent;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n actualReturnedValue = this.attrs.submit(second);\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' '${first}')}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualReturnedValue, returnValue, 'return value is present');\n this.assert.equal(actualFirst, first, 'first argument is correct');\n this.assert.equal(actualSecond, second, 'second argument is correct');\n }\n\n ['@test provides a helpful error if an action is not present']() {\n var InnerComponent = _helpers.Component.extend({});\n\n var OuterComponent = _helpers.Component.extend({\n actions: {\n something() {// this is present to ensure `actions` hash is present\n // a different error is triggered if `actions` is missing\n // completely\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action named 'doesNotExist' was not found in /);\n }\n\n ['@test provides a helpful error if actions hash is not present']() {\n var InnerComponent = _helpers.Component.extend({});\n\n var OuterComponent = _helpers.Component.extend({});\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'doesNotExist')}}`\n });\n expectAssertion(() => {\n this.render('{{outer-component}}');\n }, /An action named 'doesNotExist' was not found in /);\n }\n\n ['@test action can create closures over actions with target']() {\n var innerComponent;\n var actionCalled = false;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n otherComponent: (0, _metal.computed)(function () {\n return {\n actions: {\n outerAction() {\n actionCalled = true;\n }\n\n }\n };\n })\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' target=this.otherComponent)}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.ok(actionCalled, 'action called on otherComponent');\n }\n\n ['@test value can be used with action over actions']() {\n var newValue = 'yelping yehuda';\n var innerComponent;\n var actualValue;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerContent: {\n readProp: newValue\n },\n actions: {\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'outerAction' value=\"readProp\")}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualValue, newValue, 'value is read');\n }\n\n ['@test action will read the value of a first property']() {\n var newValue = 'irate igor';\n var innerComponent;\n var actualValue;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit({\n readProp: newValue\n });\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action this.outerAction value=\"readProp\")}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualValue, newValue, 'property is read');\n }\n\n ['@test action will read the value of a curried first argument property']() {\n var newValue = 'kissing kris';\n var innerComponent;\n var actualValue;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n objectArgument: {\n readProp: newValue\n },\n\n outerAction(incomingValue) {\n actualValue = incomingValue;\n }\n\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action this.outerAction this.objectArgument value=\"readProp\")}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.equal(actualValue, newValue, 'property is read');\n }\n\n ['@test action closure does not get auto-mut wrapped'](assert) {\n var first = 'raging robert';\n var second = 'mild machty';\n var returnValue = 'butch brian';\n var innerComponent;\n var actualFirst;\n var actualSecond;\n var actualReturnedValue;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.get('submit')(second);\n this.get('attrs-submit')(second);\n var attrsSubmitReturnValue = this.attrs['attrs-submit'](second);\n var submitReturnValue = this.attrs.submit(second);\n assert.equal(attrsSubmitReturnValue, submitReturnValue, 'both attrs.foo and foo should behave the same');\n return submitReturnValue;\n }\n\n });\n\n var MiddleComponent = _helpers.Component.extend({});\n\n var OuterComponent = _helpers.Component.extend({\n actions: {\n outerAction(incomingFirst, incomingSecond) {\n actualFirst = incomingFirst;\n actualSecond = incomingSecond;\n return returnValue;\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: `{{inner-component attrs-submit=@submit submit=this.submit}}`\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{middle-component submit=(action 'outerAction' '${first}')}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n actualReturnedValue = innerComponent.fireAction();\n });\n this.assert.equal(actualFirst, first, 'first argument is correct');\n this.assert.equal(actualSecond, second, 'second argument is correct');\n this.assert.equal(actualReturnedValue, returnValue, 'return value is present');\n }\n\n ['@test action should be called within a run loop']() {\n var innerComponent;\n var capturedRunLoop;\n\n var InnerComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n innerComponent = this;\n },\n\n fireAction() {\n this.attrs.submit();\n }\n\n });\n\n var OuterComponent = _helpers.Component.extend({\n actions: {\n submit() {\n capturedRunLoop = (0, _runloop._getCurrentRunLoop)();\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: 'inner'\n });\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: `{{inner-component submit=(action 'submit')}}`\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n innerComponent.fireAction();\n });\n this.assert.ok(capturedRunLoop, 'action is called within a run loop');\n }\n\n ['@test closure action with `(mut undefinedThing)` works properly [GH#13959]']() {\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n label: undefined,\n\n init() {\n this._super(...arguments);\n\n component = this;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
{{if this.label this.label \"Click me\"}} '\n });\n this.render('{{example-component}}');\n this.assertText('Click me');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assertText('Clicked!');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('label', 'Dun clicked');\n });\n this.assertText('Dun clicked');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assertText('Clicked!');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('label', undefined);\n });\n this.assertText('Click me');\n }\n\n ['@test closure actions does not cause component hooks to fire unnecessarily [GH#14305] [GH#14654]'](assert) {\n var clicked = 0;\n var didReceiveAttrsFired = 0;\n\n var ClickMeComponent = _helpers.Component.extend({\n tagName: 'button',\n\n click() {\n this.get('onClick').call(undefined, ++clicked);\n },\n\n didReceiveAttrs() {\n didReceiveAttrsFired++;\n }\n\n });\n\n this.registerComponent('click-me', {\n ComponentClass: ClickMeComponent\n });\n var outer;\n\n var OuterComponent = _helpers.Component.extend({\n clicked: 0,\n actions: {\n 'on-click': function () {\n this.incrementProperty('clicked');\n }\n },\n\n init() {\n this._super();\n\n outer = this;\n this.set('onClick', () => this.incrementProperty('clicked'));\n }\n\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: (0, _internalTestHelpers.strip)`\n
clicked: {{this.clicked}}; foo: {{this.foo}}
\n\n {{click-me id=\"string-action\" onClick=(action \"on-click\")}}\n {{click-me id=\"function-action\" onClick=(action this.onClick)}}\n {{click-me id=\"mut-action\" onClick=(action (mut this.clicked))}}\n `\n });\n this.render('{{outer-component foo=this.foo}}', {\n foo: 1\n });\n this.assertText('clicked: 0; foo: 1');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('clicked: 0; foo: 1');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 2));\n this.assertText('clicked: 0; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => this.$('#string-action').click());\n this.assertText('clicked: 1; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => this.$('#function-action').click());\n this.assertText('clicked: 2; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(outer, 'onClick', function () {\n outer.incrementProperty('clicked');\n }));\n this.assertText('clicked: 2; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => this.$('#function-action').click());\n this.assertText('clicked: 3; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n (0, _internalTestHelpers.runTask)(() => this.$('#mut-action').click());\n this.assertText('clicked: 4; foo: 2');\n assert.equal(didReceiveAttrsFired, 3);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/concat-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{concat}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it concats static arguments']() {\n this.render(`{{concat \"foo\" \" \" \"bar\" \" \" \"baz\"}}`);\n this.assertText('foo bar baz');\n }\n\n ['@test it updates for bound arguments']() {\n this.render(`{{concat this.model.first this.model.second}}`, {\n model: {\n first: 'one',\n second: 'two'\n }\n });\n this.assertText('onetwo');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('onetwo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n this.assertText('threetwo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.second', 'four'));\n this.assertText('threefour');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n first: 'one',\n second: 'two'\n }));\n this.assertText('onetwo');\n }\n\n ['@test it can be used as a sub-expression']() {\n this.render(`{{concat (concat this.model.first this.model.second) (concat this.model.third this.model.fourth)}}`, {\n model: {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n }\n });\n this.assertText('onetwothreefour');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('onetwothreefour');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.first', 'five'));\n this.assertText('fivetwothreefour');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model.second', 'six');\n (0, _metal.set)(this.context, 'model.third', 'seven');\n });\n this.assertText('fivesixsevenfour');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model', {\n first: 'one',\n second: 'two',\n third: 'three',\n fourth: 'four'\n });\n });\n this.assertText('onetwothreefour');\n }\n\n ['@test it can be used as input for other helpers']() {\n this.registerHelper('x-eq', ([actual, expected]) => actual === expected);\n this.render(`{{#if (x-eq (concat this.model.first this.model.second) \"onetwo\")}}Truthy!{{else}}False{{/if}}`, {\n model: {\n first: 'one',\n second: 'two'\n }\n });\n this.assertText('Truthy!');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Truthy!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.first', 'three'));\n this.assertText('False');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n first: 'one',\n second: 'two'\n }));\n this.assertText('Truthy!');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/custom-helper-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/debug-stack\"], function (_internalTestHelpers, _glimmer, _metal, _debugStack) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: custom helpers', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it cannot override built-in syntax']() {\n this.registerHelper('array', () => 'Nope');\n expectAssertion(() => {\n this.render(`{{array this.foo 'LOL'}}`, {\n foo: true\n });\n }, /You attempted to overwrite the built-in helper \"array\" which is not allowed. Please rename the helper./);\n }\n\n ['@test it can resolve custom simple helpers with or without dashes']() {\n this.registerHelper('hello', () => 'hello');\n this.registerHelper('hello-world', () => 'hello world');\n this.render('{{hello}} | {{hello-world}}');\n this.assertText('hello | hello world');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello | hello world');\n }\n\n ['@test it does not resolve helpers with a `.` (period)']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n this.registerHelper('hello.world', () => 'hello world');\n this.render('{{hello.world}}', {\n hello: {\n world: ''\n }\n });\n this.assertText('');\n this.assertStableRerender();\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'hello', {\n world: 'hello world!'\n }));\n this.assertText('hello world!');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'hello', {\n world: ''\n });\n });\n this.assertText('');\n }\n\n ['@test it can resolve custom class-based helpers with or without dashes']() {\n this.registerHelper('hello', {\n compute() {\n return 'hello';\n }\n\n });\n this.registerHelper('hello-world', {\n compute() {\n return 'hello world';\n }\n\n });\n this.render('{{hello}} | {{hello-world}}');\n this.assertText('hello | hello world');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello | hello world');\n }\n\n ['@test throws if `this._super` is not called from `init`']() {\n this.registerHelper('hello-world', {\n init() {}\n\n });\n expectAssertion(() => {\n this.render('{{hello-world}}');\n }, /You must call `super.init\\(...arguments\\);` or `this._super\\(...arguments\\)` when overriding `init` on a framework object. Please update .*/);\n }\n\n ['@test class-based helper can recompute a new value'](assert) {\n var destroyCount = 0;\n var computeCount = 0;\n var helper;\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n\n helper = this;\n },\n\n compute() {\n return ++computeCount;\n },\n\n destroy() {\n destroyCount++;\n\n this._super();\n }\n\n });\n this.render('{{hello-world}}');\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('2');\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n }\n\n ['@test class-based helper lifecycle'](assert) {\n var hooks = [];\n var helper;\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n\n hooks.push('init');\n helper = this;\n },\n\n compute() {\n hooks.push('compute');\n },\n\n willDestroy() {\n hooks.push('willDestroy');\n\n this._super();\n },\n\n destroy() {\n hooks.push('destroy');\n\n this._super();\n }\n\n });\n this.render('{{#if this.show}}{{hello-world}}{{/if}}', {\n show: true\n });\n assert.deepEqual(hooks, ['init', 'compute']);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.deepEqual(hooks, ['init', 'compute']);\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n assert.deepEqual(hooks, ['init', 'compute', 'compute']);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'show', false));\n assert.deepEqual(hooks, ['init', 'compute', 'compute', 'destroy', 'willDestroy']);\n }\n\n ['@test class-based helper with static arguments can recompute a new value'](assert) {\n var destroyCount = 0;\n var computeCount = 0;\n var helper;\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n\n helper = this;\n },\n\n compute() {\n return ++computeCount;\n },\n\n destroy() {\n destroyCount++;\n\n this._super();\n }\n\n });\n this.render('{{hello-world \"whut\"}}');\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('2');\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n } // https://github.com/emberjs/ember.js/issues/14774\n\n\n ['@test class-based helper with static arguments can recompute a new value without a runloop'](assert) {\n var destroyCount = 0;\n var computeCount = 0;\n var helper;\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n\n helper = this;\n },\n\n compute() {\n return ++computeCount;\n },\n\n destroy() {\n destroyCount++;\n\n this._super();\n }\n\n });\n this.render('{{hello-world \"whut\"}}');\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('1');\n helper.recompute();\n this.assertText('2');\n assert.strictEqual(destroyCount, 0, 'destroy is not called on recomputation');\n }\n\n ['@test helper params can be returned']() {\n this.registerHelper('hello-world', values => {\n return values;\n });\n this.render('{{#each (hello-world this.model) as |item|}}({{item}}){{/each}}', {\n model: ['bob']\n });\n this.assertText('(bob)');\n }\n\n ['@test helper hash can be returned']() {\n this.registerHelper('hello-world', (_, hash) => {\n return hash.model;\n });\n this.render(`{{get (hello-world model=this.model) 'name'}}`, {\n model: {\n name: 'bob'\n }\n });\n this.assertText('bob');\n }\n\n ['@test simple helper is called for param changes'](assert) {\n var computeCount = 0;\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return `${value}-value`;\n });\n this.render('{{hello-world this.model.name}}', {\n model: {\n name: 'bob'\n }\n });\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n name: 'bob'\n }));\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 3, 'compute is called exactly 3 times');\n }\n\n ['@test class-based helper compute is called for param changes'](assert) {\n var createCount = 0;\n var computeCount = 0;\n this.registerHelper('hello-world', {\n init() {\n this._super(...arguments);\n\n createCount++;\n },\n\n compute([value]) {\n computeCount++;\n return `${value}-value`;\n }\n\n });\n this.render('{{hello-world this.model.name}}', {\n model: {\n name: 'bob'\n }\n });\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n name: 'bob'\n }));\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 3, 'compute is called exactly 3 times');\n assert.strictEqual(createCount, 1, 'helper is only created once');\n }\n\n ['@test simple helper receives params, hash']() {\n this.registerHelper('hello-world', (_params, _hash) => {\n return `params: ${JSON.stringify(_params)}, hash: ${JSON.stringify(_hash)}`;\n });\n this.render('{{hello-world this.model.name \"rich\" first=this.model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.age', 28));\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n name: 'bob',\n age: 42\n }));\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n }\n\n ['@test class-based helper receives params, hash']() {\n this.registerHelper('hello-world', {\n compute(_params, _hash) {\n return `params: ${JSON.stringify(_params)}, hash: ${JSON.stringify(_hash)}`;\n }\n\n });\n this.render('{{hello-world this.model.name \"rich\" first=this.model.age last=\"sam\"}}', {\n model: {\n name: 'bob',\n age: 42\n }\n });\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.name', 'sal'));\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.age', 28));\n this.assertText('params: [\"sal\",\"rich\"], hash: {\"first\":28,\"last\":\"sam\"}');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n name: 'bob',\n age: 42\n }));\n this.assertText('params: [\"bob\",\"rich\"], hash: {\"first\":42,\"last\":\"sam\"}');\n }\n\n ['@test class-based helper usable in subexpressions']() {\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n\n });\n this.render(`{{join-words \"Who\"\n (join-words \"overcomes\" \"by\")\n this.model.reason\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`, {\n model: {\n reason: 'force'\n }\n });\n this.assertText('Who overcomes by force hath overcome but half his foe');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Who overcomes by force hath overcome but half his foe');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.reason', 'Nickleback'));\n this.assertText('Who overcomes by Nickleback hath overcome but half his foe');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n reason: 'force'\n }));\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test parameterless helper is usable in subexpressions']() {\n this.registerHelper('should-show', () => {\n return true;\n });\n this.render(`{{#if (should-show)}}true{{/if}}`);\n this.assertText('true');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('true');\n }\n\n ['@test parameterless helper is usable in attributes']() {\n this.registerHelper('foo-bar', () => {\n return 'baz';\n });\n this.render(`
`);\n this.assertHTML('
');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertHTML('
');\n }\n\n ['@test simple helper not usable with a block'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.registerHelper('some-helper', () => {});\n assert.throws(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Attempted to resolve `some-helper`, which was expected to be a component, but nothing was found./);\n }\n\n ['@test class-based helper not usable with a block'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.registerHelper('some-helper', {\n compute() {}\n\n });\n assert.throws(() => {\n this.render(`{{#some-helper}}{{/some-helper}}`);\n }, /Attempted to resolve `some-helper`, which was expected to be a component, but nothing was found./);\n }\n\n ['@test simple helper not usable within element'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.registerHelper('some-helper', () => {});\n assert.throws(() => {\n this.render(`
`);\n }, /Attempted to resolve `some-helper`, which was expected to be a modifier, but nothing was found./);\n }\n\n ['@test class-based helper not usable within element'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.registerHelper('some-helper', {\n compute() {}\n\n });\n assert.throws(() => {\n this.render(`
`);\n }, /Attempted to resolve `some-helper`, which was expected to be a modifier, but nothing was found./);\n }\n\n ['@test class-based helper is torn down'](assert) {\n var destroyCalled = 0;\n this.registerHelper('some-helper', {\n destroy() {\n destroyCalled++;\n\n this._super(...arguments);\n },\n\n compute() {\n return 'must define a compute';\n }\n\n });\n this.render(`{{some-helper}}`);\n (0, _internalTestHelpers.runDestroy)(this.component);\n assert.strictEqual(destroyCalled, 1, 'destroy called once');\n }\n\n ['@test class-based helper used in subexpression can recompute']() {\n var helper;\n var phrase = 'overcomes by';\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n\n helper = this;\n },\n\n compute() {\n return phrase;\n }\n\n });\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n\n });\n this.render(`{{join-words \"Who\"\n (dynamic-segment)\n \"force\"\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`);\n this.assertText('Who overcomes by force hath overcome but half his foe');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Who overcomes by force hath overcome but half his foe');\n phrase = 'believes his';\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('Who believes his force hath overcome but half his foe');\n phrase = 'overcomes by';\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test class-based helper used in subexpression can recompute component']() {\n var helper;\n var phrase = 'overcomes by';\n this.registerHelper('dynamic-segment', {\n init() {\n this._super(...arguments);\n\n helper = this;\n },\n\n compute() {\n return phrase;\n }\n\n });\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n\n });\n this.registerComponent('some-component', {\n template: '{{@first}} {{@second}} {{@third}} {{@fourth}} {{@fifth}}'\n });\n this.render(`{{some-component first=\"Who\"\n second=(dynamic-segment)\n third=\"force\"\n fourth=(join-words (join-words \"hath overcome but\" \"half\"))\n fifth=(join-words \"his\" (join-words \"foe\"))}}`);\n this.assertText('Who overcomes by force hath overcome but half his foe');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Who overcomes by force hath overcome but half his foe');\n phrase = 'believes his';\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('Who believes his force hath overcome but half his foe');\n phrase = 'overcomes by';\n (0, _internalTestHelpers.runTask)(() => helper.recompute());\n this.assertText('Who overcomes by force hath overcome but half his foe');\n }\n\n ['@test class-based helper used in subexpression is destroyed'](assert) {\n var destroyCount = 0;\n this.registerHelper('dynamic-segment', {\n phrase: 'overcomes by',\n\n init() {\n this._super(...arguments);\n },\n\n compute() {\n return this.phrase;\n },\n\n destroy() {\n destroyCount++;\n\n this._super(...arguments);\n }\n\n });\n this.registerHelper('join-words', {\n compute(params) {\n return params.join(' ');\n }\n\n });\n this.render(`{{join-words \"Who\"\n (dynamic-segment)\n \"force\"\n (join-words (join-words \"hath overcome but\" \"half\"))\n (join-words \"his\" (join-words \"foe\"))}}`);\n (0, _internalTestHelpers.runDestroy)(this.component);\n assert.equal(destroyCount, 1, 'destroy is called after a view is destroyed');\n }\n\n ['@test simple helper can be invoked manually via `owner.factoryFor(...).create().compute()'](assert) {\n this.registerHelper('some-helper', () => {\n assert.ok(true, 'some-helper helper invoked');\n return 'lolol';\n });\n var instance = this.owner.factoryFor('helper:some-helper').create();\n assert.equal(typeof instance.compute, 'function', 'expected instance.compute to be present');\n assert.equal(instance.compute(), 'lolol', 'can invoke `.compute`');\n }\n\n ['@test class-based helper can be invoked manually via `owner.factoryFor(...).create().compute()'](assert) {\n this.registerHelper('some-helper', {\n compute() {\n assert.ok(true, 'some-helper helper invoked');\n return 'lolol';\n }\n\n });\n var instance = this.owner.factoryFor('helper:some-helper').create();\n assert.equal(typeof instance.compute, 'function', 'expected instance.compute to be present');\n assert.equal(instance.compute(), 'lolol', 'can invoke `.compute`');\n }\n\n ['@test class-based helper in native ES syntax receives owner'](assert) {\n var testContext = this;\n this.add('helper:hello-world', class extends _glimmer.Helper {\n constructor(owner) {\n super(owner);\n assert.equal(owner, testContext.owner, 'owner was passed as a constructor argument');\n }\n\n compute() {\n return 'huzza!';\n }\n\n });\n this.render('{{hello-world}}');\n this.assertText('huzza!');\n }\n\n ['@test class-based helper gives helpful warning when mutating a value that was tracked already']() {\n this.add('helper:hello-world', class extends _glimmer.Helper {\n compute() {\n this.get('value');\n this.set('value', 123);\n }\n\n });\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('value', '<.+?>', {\n renderTree: ['\\\\(result of a `<\\\\(unknown\\\\).*?>` helper\\\\)']\n });\n expectDeprecation(() => {\n // TODO: this must be a bug??\n expectDeprecation((0, _debugStack.backtrackingMessageFor)('undefined', undefined, {\n renderTree: ['\\\\(result of a `<\\\\(unknown\\\\).*?>` helper\\\\)']\n }));\n this.render('{{hello-world}}');\n }, expectedMessage);\n }\n\n ['@test class-based helper gives helpful deprecation when mutating a tracked property that was tracked already']() {\n var _class, _descriptor;\n\n this.add('helper:hello-world', (_class = class HelloWorld extends _glimmer.Helper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"value\", _descriptor, this);\n }\n\n compute() {\n this.value;\n this.value = 123;\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class));\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('value', '
', {\n renderTree: ['\\\\(result of a `` helper\\\\)']\n });\n expectDeprecation(() => {\n this.render('{{hello-world}}');\n }, expectedMessage);\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can resolve a helper'() {\n this.registerHelper('hello-world', ([text]) => text ?? 'Hello, world!');\n this.render('[{{helper \"hello-world\"}}][{{helper (helper \"hello-world\") \"wow\"}}]');\n this.assertText('[Hello, world!][wow]');\n this.assertStableRerender();\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Cannot dynamically resolve a helper'(assert) {\n this.registerHelper('hello-world', () => 'Hello, world!');\n\n if (true\n /* DEBUG */\n ) {\n expectAssertion(() => this.render('{{helper this.name}}', {\n name: 'hello-world'\n }), /Passing a dynamic string to the `\\(helper\\)` keyword is disallowed\\./);\n } else {\n assert.expect(0);\n }\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can use a curried dynamic helper'() {\n var val = (0, _internalTestHelpers.defineSimpleHelper)(value => value);\n this.registerComponent('foo', {\n template: '{{@value}}'\n });\n this.registerComponent('bar', {\n template: ' ',\n ComponentClass: _glimmer.Component.extend({\n val\n })\n });\n this.render(' ');\n this.assertText('Hello, world!');\n this.assertStableRerender();\n }\n\n '@feature(!EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can use a curried dynamic helper'() {\n expectAssertion(() => {\n this.registerComponent('bar', {\n template: ' '\n });\n }, /Cannot use the \\(helper\\) keyword yet, as it has not been implemented/);\n }\n\n '@feature(EMBER_DYNAMIC_HELPERS_AND_MODIFIERS) Can use a dynamic helper with nested helpers'() {\n var foo = (0, _internalTestHelpers.defineSimpleHelper)(() => 'world!');\n var bar = (0, _internalTestHelpers.defineSimpleHelper)(value => 'Hello, ' + value);\n this.registerComponent('baz', {\n template: '{{this.bar (this.foo)}}',\n ComponentClass: _glimmer.Component.extend({\n foo,\n bar\n })\n });\n this.render(' ');\n this.assertText('Hello, world!');\n this.assertStableRerender();\n }\n\n ['@test helpers are not computed eagerly when used with if expressions'](assert) {\n this.registerHelper('is-ok', () => 'hello');\n this.registerHelper('throws-error', () => assert.ok(false, 'helper was computed eagerly'));\n this.render('{{if true (is-ok) (throws-error)}}');\n this.assertText('hello');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello');\n }\n\n });\n\n if (true\n /* DEBUG */\n ) {\n class HelperMutatingArgsTests extends _internalTestHelpers.RenderingTestCase {\n buildCompute() {\n return (params, hash) => {\n this.assert.throws(() => {\n params.push('foo'); // cannot assert error message as it varies by platform\n });\n this.assert.throws(() => {\n hash.foo = 'bar'; // cannot assert error message as it varies by platform\n });\n this.assert.throws(() => {\n hash.someUnusedHashProperty = 'bar'; // cannot assert error message as it varies by platform\n });\n };\n }\n\n ['@test cannot mutate params - no positional specified / named specified']() {\n this.render('{{test-helper foo=this.bar}}', {\n bar: 'derp'\n });\n }\n\n ['@test cannot mutate params - positional specified / no named specified']() {\n this.render('{{test-helper this.bar}}', {\n bar: 'derp'\n });\n }\n\n ['@test cannot mutate params - positional specified / named specified']() {\n this.render('{{test-helper this.bar foo=this.qux}}', {\n bar: 'derp',\n qux: 'baz'\n });\n }\n\n ['@test cannot mutate params - no positional specified / no named specified']() {\n this.render('{{test-helper}}', {\n bar: 'derp',\n qux: 'baz'\n });\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: mutation triggers errors - class based helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n var compute = this.buildCompute();\n this.registerHelper('test-helper', {\n compute\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: mutation triggers errors - simple helper', class extends HelperMutatingArgsTests {\n constructor() {\n super(...arguments);\n var compute = this.buildCompute();\n this.registerHelper('test-helper', compute);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: argument-less helper invocation in named arguments position', class extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n this.registerComponent('bar', {\n template: '[{{is-string @content}}][{{@content}}]'\n });\n this.registerHelper('is-string', ([value]) => typeof value === 'string');\n }\n\n ['@test invoking an argument-less helper without parens in named argument position is deprecated']() {\n this.registerHelper('foo', () => 'Hello, world!');\n expectDeprecation(() => this.render(' ', {\n foo: 'Not it!'\n }), new RegExp(/The `foo` helper was used in the `-top-level` template as /.source + /`@content={{foo}}`\\. This is ambigious between wanting the `@content` /.source + /argument to be the `foo` helper itself, or the result of invoking the /.source + /`foo` helper \\(current behavior\\)\\. This implicit invocation behavior /.source + /has been deprecated\\./.source));\n this.assertText('[true][Hello, world!]');\n this.assertStableRerender();\n }\n\n ['@test invoking an argument-less helper with parens in named argument position is not deprecated']() {\n this.registerHelper('foo', () => 'Hello, world!');\n expectNoDeprecation(() => this.render(' ', {\n foo: 'Not it!'\n }));\n this.assertText('[true][Hello, world!]');\n this.assertStableRerender();\n }\n\n ['@test invoking an argument-less helper with quotes in named argument position is not deprecated']() {\n this.registerHelper('foo', () => 'Hello, world!');\n expectNoDeprecation(() => this.render(' ', {\n foo: 'Not it!'\n }));\n this.assertText('[true][Hello, world!]');\n this.assertStableRerender();\n }\n\n ['@test passing a local helper in named argument position is not deprecated']() {\n var foo = (0, _internalTestHelpers.defineSimpleHelper)(() => 'Hello, world!');\n expectNoDeprecation(() => this.render(`{{#let this.foo as |foo|}} {{/let}}`, {\n foo\n }));\n this.assertText('[false][Hello, world!]');\n this.assertStableRerender();\n } // TODO: this one really should work, and there is a passing test in glimmer-vm,\n // but somehow it doesn't work here. This is almost certainly a VM bug as something\n // is trying to call `block.compile()` but `block` is the reference for `this.foo`.\n // So the execution stack is probably off-by-one or something.\n\n\n ['@test invoking a local helper with parens in named argument position is not deprecated']() {\n var foo = (0, _internalTestHelpers.defineSimpleHelper)(() => 'Hello, world!');\n expectNoDeprecation(() => this.render(`{{#let this.foo as |foo|}} {{/let}}`, {\n foo\n }));\n this.assertText('[true][Hello, world!]');\n this.assertStableRerender();\n } // TODO: this one doesn't work yet, and there is a failing test in glimmer-vm\n\n\n ['@skip invoking a helper with quotes in named argument position is not deprecated']() {\n var foo = (0, _internalTestHelpers.defineSimpleHelper)(() => 'Hello, world!');\n expectNoDeprecation(() => this.render(`{{#let this.foo as |foo|}} {{/let}}`, {\n foo\n }));\n this.assertText('[true][Hello, world!]');\n this.assertStableRerender();\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/element-action-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/instrumentation\", \"@ember/canary-features\", \"@ember/-internals/runtime\", \"@ember/-internals/views\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _instrumentation, _canaryFeatures, _runtime, _views, _helpers) {\n \"use strict\";\n\n function getActionAttributes(element) {\n var attributes = element.attributes;\n var actionAttrs = [];\n\n for (var i = 0; i < attributes.length; i++) {\n var attr = attributes.item(i);\n\n if (attr.name.indexOf('data-ember-action-') === 0) {\n actionAttrs.push(attr.name);\n }\n }\n\n return actionAttrs;\n }\n\n function getActionIds(element) {\n return getActionAttributes(element).map(attribute => attribute.slice('data-ember-action-'.length));\n }\n\n if (_canaryFeatures.EMBER_IMPROVED_INSTRUMENTATION) {\n (0, _internalTestHelpers.moduleFor)('Helpers test: element action instrumentation', class extends _internalTestHelpers.RenderingTestCase {\n teardown() {\n super.teardown();\n (0, _instrumentation.reset)();\n }\n\n ['@test action should fire interaction event with proper params']() {\n var subscriberCallCount = 0;\n var subscriberPayload = null;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {}\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Click me '\n });\n (0, _instrumentation.subscribe)('interaction.ember-action', {\n before() {\n subscriberCallCount++;\n },\n\n after(name, time, payload) {\n subscriberPayload = payload;\n }\n\n });\n this.render('{{example-component}}');\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assert.equal(subscriberCallCount, 0, 'subscriber has not been called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.equal(subscriberCallCount, 1, 'subscriber has been called 1 time');\n this.assert.equal(subscriberPayload.name, 'foo', 'subscriber called with correct name');\n this.assert.equal(subscriberPayload.args[0], 'bar', 'subscriber called with correct args');\n }\n\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: element action', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it can call an action on its enclosing component']() {\n var fooCallCount = 0;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n foo() {\n fooCallCount++;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Click me '\n });\n this.render('{{example-component}}');\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assert.equal(fooCallCount, 0, 'foo has not been called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.equal(fooCallCount, 1, 'foo has been called 1 time');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.equal(fooCallCount, 2, 'foo has been called 2 times');\n }\n\n ['@test it can call an action with parameters']() {\n var fooArgs = [];\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n member: 'a',\n\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n foo(thing) {\n fooArgs.push(thing);\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Click me '\n });\n this.render('{{example-component}}');\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assert.deepEqual(fooArgs, [], 'foo has not been called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.deepEqual(fooArgs, ['a'], 'foo has not been called');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('member', 'b');\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.deepEqual(fooArgs, ['a', 'b'], 'foo has been called with an updated value');\n }\n\n ['@test it should output a marker attribute with a guid']() {\n this.render('me the money ');\n var button = this.$('button');\n var attributes = getActionAttributes(button[0]);\n this.assert.ok(button.attr('data-ember-action').match(''), 'An empty data-ember-action attribute was added');\n this.assert.ok(attributes[0].match(/data-ember-action-\\d+/), 'A data-ember-action-xyz attribute with a guid was added');\n }\n\n ['@test it should allow alternative events to be handled']() {\n var showCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '
'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#show').trigger('mouseup');\n });\n this.assert.ok(showCalled, 'show action was called on mouseUp');\n }\n\n ['@test inside a yield, the target points at the original target']() {\n var targetWatted = false;\n var innerWatted = false;\n\n var TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n\n }\n });\n\n var InnerComponent = _helpers.Component.extend({\n actions: {\n wat() {\n innerWatted = true;\n }\n\n }\n });\n\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: '{{yield}}'\n });\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: (0, _internalTestHelpers.strip)`\n {{#inner-component}}\n Wat me! \n {{/inner-component}}\n `\n });\n this.render('{{target-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.ok(targetWatted, 'the correct target was watted');\n this.assert.notOk(innerWatted, 'the inner target was not watted');\n }\n\n ['@test it should allow a target to be specified']() {\n var targetWatted = false;\n\n var TargetComponent = _helpers.Component.extend({\n actions: {\n wat() {\n targetWatted = true;\n }\n\n }\n });\n\n var OtherComponent = _helpers.Component.extend({});\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n this.registerComponent('other-component', {\n ComponentClass: OtherComponent,\n template: 'Wat? '\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#target-component as |parent|}}\n {{other-component anotherTarget=parent}}\n {{/target-component}}\n `);\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.equal(targetWatted, true, 'the specified target was watted');\n }\n\n ['@test it should lazily evaluate the target']() {\n var firstEdit = 0;\n var secondEdit = 0;\n var component;\n var first = {\n edit() {\n firstEdit++;\n }\n\n };\n var second = {\n edit() {\n secondEdit++;\n }\n\n };\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n theTarget: first\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Edit '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.equal(firstEdit, 1);\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(component, 'theTarget', second);\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.equal(firstEdit, 1);\n this.assert.equal(secondEdit, 1);\n }\n\n ['@test it should register an event handler']() {\n var editHandlerWasCalled = false;\n var shortcutHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me click me too
'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a[data-ember-action]').trigger('click', {\n altKey: true\n });\n });\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('div[data-ember-action]').trigger('click', {\n ctrlKey: true\n });\n });\n this.assert.equal(shortcutHandlerWasCalled, true, 'the \"any\" shortcut\\'s event handler was called');\n }\n\n ['@test it handles whitelisted bound modifier keys']() {\n var editHandlerWasCalled = false;\n var shortcutHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n altKey: 'alt',\n anyKey: 'any',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n\n shortcut() {\n shortcutHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me click me too
'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a[data-ember-action]').trigger('click', {\n altKey: true\n });\n });\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('div[data-ember-action]').trigger('click', {\n ctrlKey: true\n });\n });\n this.assert.equal(shortcutHandlerWasCalled, true, 'the \"any\" shortcut\\'s event handler was called');\n }\n\n ['@test it handles whitelisted bound modifier keys with current value']() {\n var editHandlerWasCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n acceptedKeys: 'alt',\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a[data-ember-action]').trigger('click', {\n altKey: true\n });\n });\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n editHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n component.set('acceptedKeys', '');\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.$('div[data-ember-action]').click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the event handler was not called');\n }\n\n ['@test should be able to use action more than once for the same event within a view']() {\n var editHandlerWasCalled = false;\n var deleteHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n\n delete() {\n deleteHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit delete '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called (due to bubbling)');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#delete').click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called (due to bubbling)');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.wrap(component.element).click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the event should not bubble if `bubbles=false` is passed']() {\n var editHandlerWasCalled = false;\n var deleteHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n\n delete() {\n deleteHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit delete '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#delete').click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.wrap(component.element).click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the event should not bubble if `bubbles=false` is passed bound']() {\n var editHandlerWasCalled = false;\n var deleteHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n isFalse: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n },\n\n delete() {\n deleteHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit delete '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#delete').click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, true, 'the delete action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n editHandlerWasCalled = deleteHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.wrap(component.element).click();\n });\n this.assert.equal(editHandlerWasCalled, false, 'the edit action was not called');\n this.assert.equal(deleteHandlerWasCalled, false, 'the delete action was not called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test the bubbling depends on the bound parameter']() {\n var editHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n shouldBubble: false,\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'edit '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(originalHandlerWasCalled, false, 'the click handler was not called');\n editHandlerWasCalled = originalHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n component.set('shouldBubble', true);\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the edit action was called');\n this.assert.equal(originalHandlerWasCalled, true, 'the click handler was called');\n }\n\n ['@test multiple actions with bubbles=false for same event are called but prevent bubbling']() {\n var clickAction1WasCalled = false;\n var clickAction2WasCalled = false;\n var eventHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n clicked1() {\n clickAction1WasCalled = true;\n },\n\n clicked2() {\n clickAction2WasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: (0, _internalTestHelpers.strip)`\n click me `,\n\n click() {\n eventHandlerWasCalled = true;\n }\n\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').trigger('click');\n });\n this.assert.ok(clickAction1WasCalled, 'the first clicked action was called');\n this.assert.ok(clickAction2WasCalled, 'the second clicked action was called');\n this.assert.notOk(eventHandlerWasCalled, 'event did not bubble up');\n }\n\n ['@test it should work properly in an #each block']() {\n var editHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n items: (0, _runtime.A)([1, 2, 3, 4]),\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each this.items as |item|}}click me {{/each}}'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n }\n\n ['@test it should work properly in a {{#let foo as |bar|}} block']() {\n var editHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n something: {\n ohai: 'there'\n },\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#let this.something as |somethingElse|}}click me {{/let}}'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.equal(editHandlerWasCalled, true, 'the event handler was called');\n }\n\n ['@test it should unregister event handlers when an element action is removed'](assert) {\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {}\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#if this.isActive}}click me {{/if}}'\n });\n this.render('{{example-component isActive=this.isActive}}', {\n isActive: true\n });\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n var actionId;\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n assert.ok(_views.ActionManager.registeredActions[actionId], 'An action is registered');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is still present');\n assert.ok(_views.ActionManager.registeredActions[actionId], 'The action is still registered');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'isActive', false));\n assert.strictEqual(this.$('a[data-ember-action]').length, 0, 'The element is removed');\n assert.ok(!_views.ActionManager.registeredActions[actionId], 'The action is unregistered');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'isActive', true));\n assert.equal(this.$('a[data-ember-action]').length, 1, 'The element is rendered');\n actionId = getActionIds(this.$('a[data-ember-action]')[0])[0];\n assert.ok(_views.ActionManager.registeredActions[actionId], 'A new action is registered');\n }\n\n ['@test it should capture events from child elements and allow them to trigger the action']() {\n var editHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me
'\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.ok(editHandlerWasCalled, 'event on a child target triggered the action of its parent');\n }\n\n ['@test it should allow bubbling of events from action helper to original parent event']() {\n var editHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.ok(editHandlerWasCalled && originalHandlerWasCalled, 'both event handlers were called');\n }\n\n ['@test it should not bubble an event from action helper to original parent event if `bubbles=false` is passed']() {\n var editHandlerWasCalled = false;\n var originalHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n },\n\n click() {\n originalHandlerWasCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.ok(editHandlerWasCalled, 'the child event handler was called');\n this.assert.notOk(originalHandlerWasCalled, 'the parent handler was not called');\n }\n\n ['@test it should allow \"send\" as the action name (#594)']() {\n var sendHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n send() {\n sendHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.ok(sendHandlerWasCalled, 'the event handler was called');\n }\n\n ['@test it should send the view, event, and current context to the action']() {\n var passedTarget;\n var passedContext;\n var targetThis;\n\n var TargetComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n targetThis = this;\n },\n\n actions: {\n edit(context) {\n passedTarget = this === targetThis;\n passedContext = context;\n }\n\n }\n });\n\n var aContext;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n aContext = this;\n }\n\n });\n\n this.registerComponent('target-component', {\n ComponentClass: TargetComponent,\n template: '{{yield this}}'\n });\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: (0, _internalTestHelpers.strip)`\n {{#target-component as |aTarget|}}\n click me \n {{/target-component}}\n `\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('#edit').click();\n });\n this.assert.ok(passedTarget, 'the action is called with the target as this');\n this.assert.strictEqual(passedContext, aContext, 'the parameter is passed along');\n }\n\n ['@test it should only trigger actions for the event they were registered on']() {\n var editHandlerWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n edit() {\n editHandlerWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.ok(editHandlerWasCalled, 'the event handler was called on click');\n editHandlerWasCalled = false;\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').trigger('mouseover');\n });\n this.assert.notOk(editHandlerWasCalled, 'the event handler was not called on mouseover');\n }\n\n ['@test it should allow multiple contexts to be specified']() {\n var passedContexts;\n var models = [_runtime.Object.create(), _runtime.Object.create()];\n\n var ExampleComponent = _helpers.Component.extend({\n modelA: models[0],\n modelB: models[1],\n actions: {\n edit(...args) {\n passedContexts = args;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.deepEqual(passedContexts, models, 'the action was called with the passed contexts');\n }\n\n ['@test it should allow multiple contexts to be specified mixed with string args']() {\n var passedContexts;\n\n var model = _runtime.Object.create();\n\n var ExampleComponent = _helpers.Component.extend({\n model: model,\n actions: {\n edit(...args) {\n passedContexts = args;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'click me '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.deepEqual(passedContexts, ['herp', model], 'the action was called with the passed contexts');\n }\n\n ['@test it should not trigger action with special clicks']() {\n var showCalled = false;\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n show() {\n showCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Howdy '\n });\n this.render('{{example-component}}');\n var assert = this.assert;\n\n var checkClick = (prop, value, expected) => {\n showCalled = false;\n var event = this.wrap(component.element).findAll('button').trigger('click', {\n [prop]: value\n })[0];\n\n if (expected) {\n assert.ok(showCalled, `should call action with ${prop}:${value}`);\n assert.ok(event.defaultPrevented, 'should prevent default');\n } else {\n assert.notOk(showCalled, `should not call action with ${prop}:${value}`);\n assert.notOk(event.defaultPrevented, 'should not prevent default');\n }\n };\n\n checkClick('ctrlKey', true, false);\n checkClick('altKey', true, false);\n checkClick('metaKey', true, false);\n checkClick('shiftKey', true, false);\n checkClick('button', 0, true);\n checkClick('button', 1, false);\n checkClick('button', 2, false);\n checkClick('button', 3, false);\n checkClick('button', 4, false);\n }\n\n ['@test it can trigger actions for keyboard events']() {\n var showCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {\n showCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: ' '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('input').trigger('keyup', {\n char: 'a',\n which: 65\n });\n });\n this.assert.ok(showCalled, 'the action was called with keyup');\n }\n\n ['@test a quoteless parameter should allow dynamic lookup of the actionName']() {\n var lastAction;\n var actionOrder = [];\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n hookMeUp: 'rock',\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Whistle tips go woop woooop '\n });\n this.render('{{example-component}}');\n var test = this;\n\n var testBoundAction = propertyValue => {\n (0, _internalTestHelpers.runTask)(() => {\n component.set('hookMeUp', propertyValue);\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.wrap(component.element).findAll('#bound-param').click();\n });\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n this.assert.deepEqual(actionOrder, ['rock', 'paper', 'scissors'], 'action name was looked up properly');\n }\n\n ['@test a quoteless string parameter should resolve actionName, including path']() {\n var lastAction;\n var actionOrder = [];\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n allactions: (0, _runtime.A)([{\n title: 'Rock',\n name: 'rock'\n }, {\n title: 'Paper',\n name: 'paper'\n }, {\n title: 'Scissors',\n name: 'scissors'\n }]),\n actions: {\n rock() {\n lastAction = 'rock';\n actionOrder.push('rock');\n },\n\n paper() {\n lastAction = 'paper';\n actionOrder.push('paper');\n },\n\n scissors() {\n lastAction = 'scissors';\n actionOrder.push('scissors');\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{#each this.allactions as |allaction|}}{{allaction.title}} {{/each}}'\n });\n this.render('{{example-component}}');\n var test = this;\n\n var testBoundAction = propertyValue => {\n (0, _internalTestHelpers.runTask)(() => {\n this.wrap(component.element).findAll(`#${propertyValue}`).click();\n });\n test.assert.ok(lastAction, propertyValue, `lastAction set to ${propertyValue}`);\n };\n\n testBoundAction('rock');\n testBoundAction('paper');\n testBoundAction('scissors');\n this.assert.deepEqual(actionOrder, ['rock', 'paper', 'scissors'], 'action name was looked up properly');\n }\n\n ['@test a quoteless function parameter should be called, including arguments']() {\n var submitCalled = false;\n var incomingArg;\n var arg = 'rough ray';\n\n var ExampleComponent = _helpers.Component.extend({\n submit(actualArg) {\n incomingArg = actualArg;\n submitCalled = true;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: `Hi `\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').click();\n });\n this.assert.ok(submitCalled, 'submit function called');\n this.assert.equal(incomingArg, arg, 'argument passed');\n }\n\n ['@test a quoteless parameter that does not resolve to a value asserts']() {\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n ohNoeNotValid() {}\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi '\n });\n expectAssertion(() => {\n this.render('{{example-component}}');\n }, 'You specified a quoteless path, `this.ohNoeNotValid`, to the {{action}} helper ' + 'which did not resolve to an action name (a string). ' + 'Perhaps you meant to use a quoted actionName? (e.g. {{action \"ohNoeNotValid\"}}).');\n }\n\n ['@test allows multiple actions on a single element']() {\n var clickActionWasCalled = false;\n var doubleClickActionWasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n clicked() {\n clickActionWasCalled = true;\n },\n\n doubleClicked() {\n doubleClickActionWasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: (0, _internalTestHelpers.strip)`\n click me `\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').trigger('click');\n });\n this.assert.ok(clickActionWasCalled, 'the clicked action was called');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').trigger('dblclick');\n });\n this.assert.ok(doubleClickActionWasCalled, 'the doubleClicked action was called');\n }\n\n ['@test allows multiple actions for same event on a single element']() {\n var clickAction1WasCalled = false;\n var clickAction2WasCalled = false;\n\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n clicked1() {\n clickAction1WasCalled = true;\n },\n\n clicked2() {\n clickAction2WasCalled = true;\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: (0, _internalTestHelpers.strip)`\n click me `\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('a').trigger('click');\n });\n this.assert.ok(clickAction1WasCalled, 'the first clicked action was called');\n this.assert.ok(clickAction2WasCalled, 'the second clicked action was called');\n }\n\n ['@test it should respect preventDefault option if provided']() {\n var ExampleComponent = _helpers.Component.extend({\n actions: {\n show() {}\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi '\n });\n this.render('{{example-component}}');\n var event;\n (0, _internalTestHelpers.runTask)(() => {\n event = this.$('a').click()[0];\n });\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n }\n\n ['@test it should respect preventDefault option if provided bound']() {\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n shouldPreventDefault: false,\n\n init() {\n this._super(...arguments);\n\n component = this;\n },\n\n actions: {\n show() {}\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Hi '\n });\n this.render('{{example-component}}');\n var event;\n (0, _internalTestHelpers.runTask)(() => {\n event = this.$('a').trigger(event)[0];\n });\n this.assert.equal(event.defaultPrevented, false, 'should not preventDefault');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('shouldPreventDefault', true);\n event = this.$('a').trigger('click')[0];\n });\n this.assert.equal(event.defaultPrevented, true, 'should preventDefault');\n }\n\n ['@test it should target the proper component when `action` is in yielded block [GH #12409]']() {\n var outerActionCalled = false;\n var innerClickCalled = false;\n\n var OuterComponent = _helpers.Component.extend({\n actions: {\n hey() {\n outerActionCalled = true;\n }\n\n }\n });\n\n var MiddleComponent = _helpers.Component.extend({});\n\n var InnerComponent = _helpers.Component.extend({\n click() {\n innerClickCalled = true;\n this.action();\n }\n\n });\n\n this.registerComponent('outer-component', {\n ComponentClass: OuterComponent,\n template: (0, _internalTestHelpers.strip)`\n {{#middle-component}}\n {{inner-component action=(action \"hey\")}}\n {{/middle-component}}\n `\n });\n this.registerComponent('middle-component', {\n ComponentClass: MiddleComponent,\n template: '{{yield}}'\n });\n this.registerComponent('inner-component', {\n ComponentClass: InnerComponent,\n template: (0, _internalTestHelpers.strip)`\n Click Me \n {{yield}}\n `\n });\n this.render('{{outer-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.ok(outerActionCalled, 'the action fired on the proper target');\n this.assert.ok(innerClickCalled, 'the click was triggered');\n }\n\n ['@test element action with (mut undefinedThing) works properly']() {\n var component;\n\n var ExampleComponent = _helpers.Component.extend({\n label: undefined,\n\n init() {\n this._super(...arguments);\n\n component = this;\n }\n\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: '{{if this.label this.label \"Click me\"}} '\n });\n this.render('{{example-component}}');\n this.assertText('Click me');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assertText('Clicked!');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('label', 'Dun clicked');\n });\n this.assertText('Dun clicked');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assertText('Clicked!');\n (0, _internalTestHelpers.runTask)(() => {\n component.set('label', undefined);\n });\n this.assertText('Click me');\n }\n\n ['@test it supports non-registered actions [GH#14888]']() {\n this.render(`\n {{#if this.show}}\n \n Show ({{this.show}})\n \n {{/if}}\n `, {\n show: true\n });\n this.assert.equal(this.$('button').text().trim(), 'Show (true)'); // We need to focus in to simulate an actual click.\n\n (0, _internalTestHelpers.runTask)(() => {\n document.getElementById('ddButton').focus();\n document.getElementById('ddButton').click();\n });\n }\n\n [\"@test action handler that shifts element attributes doesn't trigger multiple invocations\"]() {\n var actionCount = 0;\n\n var ExampleComponent = _helpers.Component.extend({\n selected: false,\n actions: {\n toggleSelected() {\n actionCount++;\n this.toggleProperty('selected');\n }\n\n }\n });\n\n this.registerComponent('example-component', {\n ComponentClass: ExampleComponent,\n template: 'Toggle Selected '\n });\n this.render('{{example-component}}');\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.equal(actionCount, 1, 'Click action only fired once.');\n this.assert.ok(this.$('button').hasClass('selected'), \"Element with action handler has properly updated it's conditional class\");\n (0, _internalTestHelpers.runTask)(() => {\n this.$('button').click();\n });\n this.assert.equal(actionCount, 2, 'Second click action only fired once.');\n this.assert.ok(!this.$('button').hasClass('selected'), \"Element with action handler has properly updated it's conditional class\");\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/fn-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_metal, _internalTestHelpers, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{fn}}', class extends _internalTestHelpers.RenderingTestCase {\n beforeEach() {\n this.registerHelper('invoke', function ([fn]) {\n return fn();\n });\n var testContext = this;\n this.registerComponent('stash', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n testContext.stashedFn = this.stashedFn;\n }\n\n })\n });\n }\n\n '@test updates when arguments change'() {\n this.render(`{{invoke (fn this.myFunc this.arg1 this.arg2)}}`, {\n myFunc(arg1, arg2) {\n return `arg1: ${arg1}, arg2: ${arg2}`;\n },\n\n arg1: 'foo',\n arg2: 'bar'\n });\n this.assertText('arg1: foo, arg2: bar');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg1', 'qux'));\n this.assertText('arg1: qux, arg2: bar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg2', 'derp'));\n this.assertText('arg1: qux, arg2: derp');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'arg1', 'foo');\n (0, _metal.set)(this.context, 'arg2', 'bar');\n });\n this.assertText('arg1: foo, arg2: bar');\n }\n\n '@test updates when the function changes'() {\n var func1 = (arg1, arg2) => `arg1: ${arg1}, arg2: ${arg2}`;\n\n var func2 = (arg1, arg2) => `arg2: ${arg2}, arg1: ${arg1}`;\n\n this.render(`{{invoke (fn this.myFunc this.arg1 this.arg2)}}`, {\n myFunc: func1,\n arg1: 'foo',\n arg2: 'bar'\n });\n this.assertText('arg1: foo, arg2: bar');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'myFunc', func2));\n this.assertText('arg2: bar, arg1: foo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'myFunc', func1));\n this.assertText('arg1: foo, arg2: bar');\n }\n\n '@test a stashed fn result update arguments when invoked'(assert) {\n this.render(`{{stash stashedFn=(fn this.myFunc this.arg1 this.arg2)}}`, {\n myFunc(arg1, arg2) {\n return `arg1: ${arg1}, arg2: ${arg2}`;\n },\n\n arg1: 'foo',\n arg2: 'bar'\n });\n assert.equal(this.stashedFn(), 'arg1: foo, arg2: bar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg1', 'qux'));\n assert.equal(this.stashedFn(), 'arg1: qux, arg2: bar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg2', 'derp'));\n assert.equal(this.stashedFn(), 'arg1: qux, arg2: derp');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'arg1', 'foo');\n (0, _metal.set)(this.context, 'arg2', 'bar');\n });\n assert.equal(this.stashedFn(), 'arg1: foo, arg2: bar');\n }\n\n '@test a stashed fn result invokes the correct function when the bound function changes'(assert) {\n var func1 = (arg1, arg2) => `arg1: ${arg1}, arg2: ${arg2}`;\n\n var func2 = (arg1, arg2) => `arg2: ${arg2}, arg1: ${arg1}`;\n\n this.render(`{{stash stashedFn=(fn this.myFunc this.arg1 this.arg2)}}`, {\n myFunc: func1,\n arg1: 'foo',\n arg2: 'bar'\n });\n assert.equal(this.stashedFn(), 'arg1: foo, arg2: bar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'myFunc', func2));\n assert.equal(this.stashedFn(), 'arg2: bar, arg1: foo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'myFunc', func1));\n assert.equal(this.stashedFn(), 'arg1: foo, arg2: bar');\n }\n\n '@test there is no `this` context within the callback'(assert) {\n if (true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n this.render(`{{stash stashedFn=(fn this.myFunc this.arg1)}}`, {\n myFunc() {\n assert.strictEqual(this, null, 'this is bound to null in production builds');\n }\n\n });\n this.stashedFn();\n }\n\n '@test can use `this` if bound prior to passing to fn'(assert) {\n this.render(`{{stash stashedFn=(fn (action this.myFunc) this.arg1)}}`, {\n myFunc(arg1) {\n return `arg1: ${arg1}, arg2: ${this.arg2}`;\n },\n\n arg1: 'foo',\n arg2: 'bar'\n });\n assert.equal(this.stashedFn(), 'arg1: foo, arg2: bar');\n }\n\n '@test partially applies each layer when nested [GH#17959]'() {\n this.render(`{{invoke (fn (fn (fn this.myFunc this.arg1) this.arg2) this.arg3)}}`, {\n myFunc(arg1, arg2, arg3) {\n return `arg1: ${arg1}, arg2: ${arg2}, arg3: ${arg3}`;\n },\n\n arg1: 'foo',\n arg2: 'bar',\n arg3: 'qux'\n });\n this.assertText('arg1: foo, arg2: bar, arg3: qux');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg1', 'qux'));\n this.assertText('arg1: qux, arg2: bar, arg3: qux');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg2', 'derp'));\n this.assertText('arg1: qux, arg2: derp, arg3: qux');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arg3', 'huzzah'));\n this.assertText('arg1: qux, arg2: derp, arg3: huzzah');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'arg1', 'foo');\n (0, _metal.set)(this.context, 'arg2', 'bar');\n (0, _metal.set)(this.context, 'arg3', 'qux');\n });\n this.assertText('arg1: foo, arg2: bar, arg3: qux');\n }\n\n '@test can be used on the result of `mut`'() {\n this.render(`{{this.arg1}}{{stash stashedFn=(fn (mut this.arg1) this.arg2)}}`, {\n arg1: 'foo',\n arg2: 'bar'\n });\n this.assertText('foo');\n (0, _internalTestHelpers.runTask)(() => this.stashedFn());\n this.assertText('bar');\n }\n\n '@test can be used on the result of `mut` with a falsy value'() {\n this.render(`{{this.arg1}}{{stash stashedFn=(fn (mut this.arg1) this.arg2)}}`, {\n arg1: 'foo',\n arg2: false\n });\n this.assertText('foo');\n (0, _internalTestHelpers.runTask)(() => this.stashedFn());\n this.assertText('false');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/get-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\", \"@ember/-internals/glimmer/tests/utils/glimmerish-component\"], function (_internalTestHelpers, _metal, _helpers, _glimmerishComponent) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{get}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test should be able to get an object value with a static key']() {\n this.render(`[{{get this.colors 'apple'}}] [{{if true (get this.colors 'apple')}}]`, {\n colors: {\n apple: 'red'\n }\n });\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors.apple', 'green'));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'red'\n }));\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with nested static key']() {\n this.render(`[{{get this.colors \"apple.gala\"}}] [{{if true (get this.colors \"apple.gala\")}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow'\n }\n }\n });\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n this.assertText('[yellow and red striped] [yellow and red striped]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: {\n gala: 'red and yellow'\n }\n }));\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with a number']() {\n this.render(`[{{get this.items 1}}][{{get this.items 2}}][{{get this.items 3}}]`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n this.assertText('[First][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[First][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n this.assertText('[Qux][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'items', {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }));\n this.assertText('[First][Second][Third]');\n }\n\n ['@test should be able to get an array value with a number']() {\n this.render(`[{{get this.numbers 0}}][{{get this.numbers 1}}][{{get this.numbers 2}}]`, {\n numbers: [1, 2, 3]\n });\n this.assertText('[1][2][3]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[1][2][3]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n this.assertText('[3][2][1]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'numbers', [1, 2, 3]));\n this.assertText('[1][2][3]');\n }\n\n ['@test should be able to get an object value with a path evaluating to a number']() {\n this.render(`{{#each this.indexes as |index|}}[{{get this.items index}}]{{/each}}`, {\n indexes: [1, 2, 3],\n items: {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }\n });\n this.assertText('[First][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[First][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'items.1', 'Qux'));\n this.assertText('[Qux][Second][Third]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'items', {\n 1: 'First',\n 2: 'Second',\n 3: 'Third'\n }));\n this.assertText('[First][Second][Third]');\n }\n\n ['@test should be able to get an array value with a path evaluating to a number']() {\n this.render(`{{#each this.numbers as |num index|}}[{{get this.numbers index}}]{{/each}}`, {\n numbers: [1, 2, 3]\n });\n this.assertText('[1][2][3]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[1][2][3]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'numbers', [3, 2, 1]));\n this.assertText('[3][2][1]');\n }\n\n ['@test should be able to get an object value with a bound/dynamic key']() {\n this.render(`[{{get this.colors this.key}}] [{{if true (get this.colors this.key)}}]`, {\n colors: {\n apple: 'red',\n banana: 'yellow'\n },\n key: 'apple'\n });\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'banana'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n this.assertText('[purple] [purple]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple'));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'red'\n }));\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with nested dynamic key']() {\n this.render(`[{{get this.colors this.key}}] [{{if true (get this.colors this.key)}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n },\n banana: 'yellow'\n },\n key: 'apple.gala'\n });\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple.mcintosh'));\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'banana'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with subexpression returning nested key']() {\n this.render(`[{{get this.colors (concat 'apple' '.' 'gala')}}] [{{if true (get this.colors (concat 'apple' '.' 'gala'))}}]`, {\n colors: {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\n },\n key: 'apple.gala'\n });\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red and yellow] [red and yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow and red striped'));\n this.assertText('[yellow and red striped] [yellow and red striped]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors.apple.gala', 'yellow-redish'));\n this.assertText('[yellow-redish] [yellow-redish]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: {\n gala: 'red and yellow',\n mcintosh: 'red'\n }\n }));\n this.assertText('[red and yellow] [red and yellow]');\n }\n\n ['@test should be able to get an object value with a get helper as the key']() {\n this.render(`[{{get this.colors (get this.possibleKeys this.key)}}] [{{if true (get this.colors (get this.possibleKeys this.key))}}]`, {\n colors: {\n apple: 'red',\n banana: 'yellow'\n },\n key: 'key1',\n possibleKeys: {\n key1: 'apple',\n key2: 'banana'\n }\n });\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'key2'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'colors.apple', 'green');\n (0, _metal.set)(this.context, 'colors.banana', 'purple');\n });\n this.assertText('[purple] [purple]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'key1'));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'red',\n banana: 'yellow'\n }));\n this.assertText('[red] [red]');\n }\n\n ['@test should be able to get an object value with a get helper value as a bound/dynamic key']() {\n this.render(`[{{get (get this.possibleValues this.objectKey) this.key}}] [{{if true (get (get this.possibleValues this.objectKey) this.key)}}]`, {\n possibleValues: {\n colors1: {\n apple: 'red',\n banana: 'yellow'\n },\n colors2: {\n apple: 'green',\n banana: 'purple'\n }\n },\n objectKey: 'colors1',\n key: 'apple'\n });\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'banana'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n this.assertText('[purple] [purple]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple'));\n }\n\n ['@test should be able to get an object value with a get helper as the value and a get helper as the key']() {\n this.render(`[{{get (get this.possibleValues this.objectKey) (get this.possibleKeys this.key)}}] [{{if true (get (get this.possibleValues this.objectKey) (get this.possibleKeys this.key))}}]`, {\n possibleValues: {\n colors1: {\n apple: 'red',\n banana: 'yellow'\n },\n colors2: {\n apple: 'green',\n banana: 'purple'\n }\n },\n objectKey: 'colors1',\n possibleKeys: {\n key1: 'apple',\n key2: 'banana'\n },\n key: 'key1'\n });\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors1'));\n this.assertText('[red] [red]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'key2'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'objectKey', 'colors2'));\n this.assertText('[purple] [purple]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'objectKey', 'colors1');\n (0, _metal.set)(this.context, 'key', 'key1');\n });\n this.assertText('[red] [red]');\n }\n\n ['@test the result of a get helper can be yielded']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n this.mcintosh = 'red';\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (get this.colors this.mcintosh)}}`\n });\n this.render(`{{#foo-bar colors=this.colors as |value|}}{{value}}{{/foo-bar}}`, {\n colors: {\n red: 'banana'\n }\n });\n this.assertText('banana');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('banana');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'yellow');\n (0, _metal.set)(this.context, 'colors', {\n yellow: 'bus'\n });\n });\n this.assertText('bus');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'mcintosh', 'red');\n (0, _metal.set)(this.context, 'colors', {\n red: 'banana'\n });\n });\n this.assertText('banana');\n }\n\n ['@test should handle object values as nulls']() {\n this.render(`[{{get this.colors 'apple'}}] [{{if true (get this.colors 'apple')}}]`, {\n colors: null\n });\n this.assertText('[] []');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[] []');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', {\n apple: 'green',\n banana: 'purple'\n }));\n this.assertText('[green] [green]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'colors', null));\n this.assertText('[] []');\n }\n\n ['@test should handle object keys as nulls']() {\n this.render(`[{{get this.colors this.key}}] [{{if true (get this.colors this.key)}}]`, {\n colors: {\n apple: 'red',\n banana: 'yellow'\n },\n key: null\n });\n this.assertText('[] []');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[] []');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'banana'));\n this.assertText('[yellow] [yellow]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', null));\n this.assertText('[] []');\n }\n\n ['@test should handle object values and keys as nulls']() {\n this.render(`[{{get this.colors 'apple'}}] [{{if true (get this.colors this.key)}}]`, {\n colors: null,\n key: null\n });\n this.assertText('[] []');\n }\n\n ['@test get helper value should be updatable using and (mut) - static key'](assert) {\n this.render(` `, {\n source: {\n banana: 'banana'\n }\n });\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('some value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'source', {\n banana: 'banana'\n }));\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using and (mut) - dynamic key'](assert) {\n this.render(` `, {\n source: {\n apple: 'apple',\n banana: 'banana'\n },\n key: 'banana'\n });\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'source.banana', 'yellow'));\n assert.strictEqual(this.$('#get-input').val(), 'yellow');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('some value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'some value');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple'));\n assert.strictEqual(this.$('#get-input').val(), 'apple');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('some other value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'some other value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple'), 'some other value');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'key', 'banana');\n (0, _metal.set)(this.context, 'source', {\n banana: 'banana'\n });\n });\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n }\n\n ['@test get helper value should be updatable using and (mut) - dynamic nested key'](assert) {\n this.render(` `, {\n source: {\n apple: {\n gala: 'gala',\n mcintosh: 'mcintosh'\n },\n banana: 'banana'\n },\n key: 'apple.mcintosh'\n });\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'source.apple.mcintosh', 'red'));\n assert.strictEqual(this.$('#get-input').val(), 'red');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('some value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'some value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple.mcintosh'), 'some value');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'apple.gala'));\n assert.strictEqual(this.$('#get-input').val(), 'gala');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('some other value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'some other value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.apple.gala'), 'some other value');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'key', 'banana'));\n assert.strictEqual(this.$('#get-input').val(), 'banana');\n (0, _internalTestHelpers.runTask)(() => this.$('#get-input').val('yet another value').trigger('change'));\n assert.strictEqual(this.$('#get-input').val(), 'yet another value');\n assert.strictEqual((0, _metal.get)(this.context, 'source.banana'), 'yet another value');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'key', 'apple.mcintosh');\n (0, _metal.set)(this.context, 'source', {\n apple: {\n gala: 'gala',\n mcintosh: 'mcintosh'\n },\n banana: 'banana'\n });\n });\n assert.strictEqual(this.$('#get-input').val(), 'mcintosh');\n }\n\n '@test should be able to get an object value with a path from this.args in a glimmer component'() {\n class PersonComponent extends _glimmerishComponent.default {\n constructor(...args) {\n super(...args);\n this.options = ['first', 'last', 'age'];\n }\n\n }\n\n this.registerComponent('person-wrapper', {\n ComponentClass: PersonComponent,\n template: '{{#each this.options as |option|}}{{get this.args option}}{{/each}}'\n });\n this.render(' ', {\n first: 'miguel',\n last: 'andrade'\n });\n this.assertText('miguelandrade');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('miguelandrade');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'age', 30));\n this.assertText('miguelandrade30');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/hash-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _helpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{hash}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test returns a hash with the right key-value']() {\n this.render(`{{#let (hash name=\"Sergio\") as |person|}}{{person.name}}{{/let}}`);\n this.assertText('Sergio');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Sergio');\n }\n\n ['@test can have more than one key-value']() {\n this.render(`{{#let (hash name=\"Sergio\" lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/let}}`);\n this.assertText('Sergio Arbeo');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Sergio Arbeo');\n }\n\n ['@test binds values when variables are used']() {\n this.render(`{{#let (hash name=this.model.firstName lastName=\"Arbeo\") as |person|}}{{person.name}} {{person.lastName}}{{/let}}`, {\n model: {\n firstName: 'Marisa'\n }\n });\n this.assertText('Marisa Arbeo');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Marisa Arbeo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n this.assertText('Sergio Arbeo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n firstName: 'Marisa'\n }));\n this.assertText('Marisa Arbeo');\n }\n\n ['@test binds multiple values when variables are used']() {\n this.render(`{{#let (hash name=this.model.firstName lastName=this.model.lastName) as |person|}}{{person.name}} {{person.lastName}}{{/let}}`, {\n model: {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }\n });\n this.assertText('Marisa Arbeo');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Marisa Arbeo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.firstName', 'Sergio'));\n this.assertText('Sergio Arbeo');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.lastName', 'Smith'));\n this.assertText('Sergio Smith');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n firstName: 'Marisa',\n lastName: 'Arbeo'\n }));\n this.assertText('Marisa Arbeo');\n }\n\n ['@test hash helpers can be nested']() {\n this.render(`{{#let (hash person=(hash name=this.model.firstName)) as |ctx|}}{{ctx.person.name}}{{/let}}`, {\n model: {\n firstName: 'Balint'\n }\n });\n this.assertText('Balint');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Balint');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.firstName', 'Chad'));\n this.assertText('Chad');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n firstName: 'Balint'\n }));\n this.assertText('Balint');\n }\n\n ['@test should yield hash of internal properties']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n this.model = {\n firstName: 'Chad'\n };\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=this.model.firstName)}}`\n });\n this.render(`{{#foo-bar as |values|}}{{values.firstName}}{{/foo-bar}}`);\n this.assertText('Chad');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Chad');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey'));\n this.assertText('Godfrey');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model', {\n firstName: 'Chad'\n }));\n this.assertText('Chad');\n }\n\n ['@test should yield hash of internal and external properties']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n this.model = {\n firstName: 'Chad'\n };\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (hash firstName=this.model.firstName lastName=this.lastName)}}`\n });\n this.render(`{{#foo-bar lastName=this.model.lastName as |values|}}{{values.firstName}} {{values.lastName}}{{/foo-bar}}`, {\n model: {\n lastName: 'Hietala'\n }\n });\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'model.firstName', 'Godfrey');\n (0, _metal.set)(this.context, 'model.lastName', 'Chan');\n });\n this.assertText('Godfrey Chan');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(fooBarInstance, 'model', {\n firstName: 'Chad'\n });\n (0, _metal.set)(this.context, 'model', {\n lastName: 'Hietala'\n });\n });\n this.assertText('Chad Hietala');\n }\n\n ['@test works with computeds']() {\n var FooBarComponent = _helpers.Component.extend({\n fullName: (0, _metal.computed)('hash.firstName', 'hash.lastName', function () {\n return `${this.hash.firstName} ${this.hash.lastName}`;\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{this.fullName}}`\n });\n this.render(`{{foo-bar hash=(hash firstName=this.firstName lastName=this.lastName)}}`, {\n firstName: 'Chad',\n lastName: 'Hietala'\n });\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'firstName', 'Godfrey');\n (0, _metal.set)(this.context, 'lastName', 'Chan');\n });\n this.assertText('Godfrey Chan');\n }\n\n ['@test works with computeds on non-defined properties']() {\n var instance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n expectDeprecation(() => {\n (0, _metal.set)(this.hash, 'lastName', 'Hietala');\n }, /You set the '.*' property on a {{hash}} object/);\n instance = this;\n },\n\n fullName: (0, _metal.computed)('hash.firstName', 'hash.lastName', function () {\n return `${this.hash.firstName} ${this.hash.lastName}`;\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{this.fullName}}`\n });\n this.render(`{{foo-bar hash=(hash firstName=this.firstName)}}`, {\n firstName: 'Chad',\n lastName: 'Hietala'\n });\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'firstName', 'Godfrey');\n }); // needs to be separate task because of the way classic components update args\n\n (0, _internalTestHelpers.runTask)(() => {\n expectDeprecation(() => {\n (0, _metal.set)(instance.hash, 'lastName', 'Chan');\n }, /You set the '.*' property on a {{hash}} object/);\n });\n this.assertText('Godfrey Chan');\n }\n\n ['@test works when properties are set dynamically']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super();\n\n fooBarInstance = this;\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{this.hash.firstName}} {{this.hash.lastName}}`\n });\n this.render(`{{foo-bar hash=(hash firstName=this.firstName)}}`, {\n firstName: 'Chad'\n });\n this.assertText('Chad ');\n (0, _internalTestHelpers.runTask)(() => {\n expectDeprecation(() => {\n (0, _metal.set)(fooBarInstance.hash, 'lastName', 'Hietala');\n }, /You set the '.*' property on a {{hash}} object/);\n });\n this.assertText('Chad Hietala');\n (0, _internalTestHelpers.runTask)(() => {\n expectDeprecation(() => {\n (0, _metal.set)(fooBarInstance.hash, 'firstName', 'Godfrey');\n (0, _metal.set)(fooBarInstance.hash, 'lastName', 'Chan');\n }, /You set the '.*' property on a {{hash}} object/);\n });\n this.assertText('Godfrey Chan');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/helper-manager-test\", [\"@glimmer/manager\", \"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"@ember/service\", \"@glimmer/destroyable\", \"@ember/-internals/glimmer/tests/utils/debug-stack\"], function (_manager, _internalTestHelpers, _metal, _owner, _service, _destroyable, _debugStack) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n class TestHelperManager {\n constructor(owner) {\n this.capabilities = (0, _manager.helperCapabilities)('3.23', {\n hasValue: true,\n hasDestroyable: true\n });\n this.owner = owner;\n }\n\n createHelper(Helper, args) {\n return new Helper(this.owner, args);\n }\n\n getValue(instance) {\n return instance.value();\n }\n\n getDestroyable(instance) {\n return instance;\n }\n\n getDebugName() {\n return 'TEST_HELPER';\n }\n\n }\n\n class TestHelper {\n constructor(owner, args) {\n (0, _owner.setOwner)(this, owner);\n this.args = args;\n (0, _destroyable.registerDestructor)(this, () => this.willDestroy());\n }\n\n willDestroy() {}\n\n }\n\n (0, _manager.setHelperManager)(owner => new TestHelperManager(owner), TestHelper);\n\n if (true\n /* EMBER_GLIMMER_HELPER_MANAGER */\n ) {\n (0, _internalTestHelpers.moduleFor)('Helpers test: helper managers', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it works']() {\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n return 'hello';\n }\n\n });\n this.render('{{hello}}');\n this.assertText('hello');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello');\n }\n\n ['@test tracks changes to named arguments'](assert) {\n var count = 0;\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n count++;\n return this.args.named.foo;\n }\n\n });\n this.render('{{hello foo=this.foo}}', {\n foo: 123\n });\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 456));\n assert.equal(count, 2, 'rendered twice');\n this.assertText('456');\n }\n\n ['@test tracks changes to positional arguments'](assert) {\n var count = 0;\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n count++;\n return this.args.positional[0];\n }\n\n });\n this.render('{{hello this.foo}}', {\n foo: 123\n });\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 456));\n assert.equal(count, 2, 'rendered twice');\n this.assertText('456');\n }\n\n ['@test tracks changes to tracked properties'](assert) {\n var _class, _descriptor;\n\n var count = 0;\n var instance;\n this.registerCustomHelper('hello', (_class = class _class extends TestHelper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor, this);\n\n instance = this;\n }\n\n value() {\n count++;\n return this.foo;\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 123;\n }\n }), _class));\n this.render('{{hello}}');\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.equal(count, 1, 'rendered once');\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => instance.foo = 456);\n assert.equal(count, 2, 'rendered twice');\n this.assertText('456');\n }\n\n ['@test services can be injected']() {\n var _class3, _descriptor2;\n\n this.registerService('hello', _service.default.extend({\n value: 'hello'\n }));\n this.registerCustomHelper('hello', (_class3 = class _class3 extends TestHelper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"hello\", _descriptor2, this);\n }\n\n value() {\n return this.hello.value;\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"hello\", [_service.service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3));\n this.render('{{hello}}');\n this.assertText('hello');\n }\n\n ['@test destroyable is associated correctly'](assert) {\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n return 'hello';\n }\n\n willDestroy() {\n assert.ok(true, 'destructor called');\n }\n\n });\n this.render('{{hello}}');\n this.assertText('hello');\n }\n\n ['@test debug name is used for backtracking message']() {\n var _class5, _descriptor3;\n\n this.registerCustomHelper('hello', (_class5 = class _class5 extends TestHelper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor3, this);\n }\n\n value() {\n this.foo;\n this.foo = 456;\n }\n\n }, _descriptor3 = _applyDecoratedDescriptor(_class5.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 123;\n }\n }), _class5));\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('foo', '.*', {\n renderTree: ['\\\\(result of a `TEST_HELPER` helper\\\\)']\n });\n expectAssertion(() => {\n this.render('{{hello}}');\n }, expectedMessage);\n }\n\n ['@test asserts against using both `hasValue` and `hasScheduledEffect`'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _manager.helperCapabilities)('3.23', {\n hasValue: true,\n hasScheduledEffect: true\n });\n }, /You must pass either the `hasValue` OR the `hasScheduledEffect` capability when defining a helper manager. Passing neither, or both, is not permitted./);\n }\n\n ['@test asserts requiring either `hasValue` or `hasScheduledEffect`'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _manager.helperCapabilities)('3.23', {});\n }, /You must pass either the `hasValue` OR the `hasScheduledEffect` capability when defining a helper manager. Passing neither, or both, is not permitted./);\n }\n\n ['@test asserts against using `hasScheduledEffect`'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _manager.helperCapabilities)('3.23', {\n hasScheduledEffect: true\n });\n }, /The `hasScheduledEffect` capability has not yet been implemented for helper managers. Please pass `hasValue` instead/);\n }\n\n ['@test asserts against using incorrect version for capabilities'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _manager.helperCapabilities)('aoeu', {\n hasScheduledEffect: true\n });\n }, /Invalid helper manager compatibility specified/);\n }\n\n ['@test helper manager and modifier manager can be associated with the same value']() {\n (0, _manager.setModifierManager)(() => ({}), TestHelper);\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n return 'hello';\n }\n\n });\n this.render('{{hello}}');\n this.assertText('hello');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello');\n }\n\n '@test capabilities helper function must be used to generate capabilities'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n class OverrideTestHelperManager extends TestHelperManager {\n constructor(...args) {\n super(...args);\n this.capabilities = {\n hasValue: true,\n hasDestroyable: true,\n hasScheduledEffect: false\n };\n }\n\n }\n\n class TestHelper {}\n\n (0, _manager.setHelperManager)(owner => new OverrideTestHelperManager(owner), TestHelper);\n this.registerCustomHelper('hello', class extends TestHelper {\n value() {\n return 'hello';\n }\n\n });\n assert.throws(() => {\n this.render('{{hello}}');\n }, /Custom helper managers must have a `capabilities` property that is the result of calling the `capabilities\\('3.23'\\)` \\(imported via `import \\{ capabilities \\} from '@ember\\/helper';`\\). /);\n assert.verifySteps([]);\n }\n\n '@test custom helpers gives helpful assertion when reading then mutating a tracked value within constructor'() {\n var _class7, _descriptor4;\n\n this.registerCustomHelper('hello', (_class7 = class _class7 extends TestHelper {\n constructor() {\n super(...arguments); // first read the tracked property\n\n _initializerDefineProperty(this, \"foo\", _descriptor4, this);\n\n this.foo; // then attempt to update the tracked property\n\n this.foo = 456;\n }\n\n value() {\n return this.foo;\n }\n\n }, _descriptor4 = _applyDecoratedDescriptor(_class7.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 123;\n }\n }), _class7));\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('foo');\n expectAssertion(() => {\n this.render('{{hello}}');\n }, expectedMessage);\n }\n\n '@test custom helpers gives helpful assertion when reading then mutating a tracked value within value'() {\n var _class9, _descriptor5;\n\n this.registerCustomHelper('hello', (_class9 = class _class9 extends TestHelper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor5, this);\n }\n\n value() {\n // first read the tracked property\n this.foo; // then attempt to update the tracked property\n\n this.foo = 456;\n }\n\n }, _descriptor5 = _applyDecoratedDescriptor(_class9.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 123;\n }\n }), _class9));\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('foo', '.*', {\n renderTree: ['\\\\(result of a `TEST_HELPER` helper\\\\)']\n });\n expectAssertion(() => {\n this.render('{{hello}}');\n }, expectedMessage);\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/if-unless-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/shared-conditional-tests\"], function (_internalTestHelpers, _sharedConditionalTests) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: nested {{if}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{if (if ${cond} ${cond} false) ${truthy} ${falsy}}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: nested {{if}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{if (if ${cond} true ${cond}) ${truthy} ${falsy}}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{if}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `(if ${cond} ${truthy} ${falsy})`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{if}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
`;\n }\n\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{if ${cond} ${truthy} ${falsy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: inline {{if}} and {{unless}} without the inverse argument', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{if ${cond} ${truthy}}}{{unless ${cond} ${falsy}}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: nested {{unless}} helpers (returning truthy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{unless (unless ${cond} false ${cond}) ${falsy} ${truthy}}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: nested {{unless}} helpers (returning falsy values)', class extends _sharedConditionalTests.IfUnlessHelperTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{unless (unless ${cond} ${cond} true) ${falsy} ${truthy}}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{unless}} used with another helper', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `{{concat ${templates.join(' ')}}}`;\n }\n\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `(unless ${cond} ${falsy} ${truthy})`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{unless}} used in attribute position', class extends _sharedConditionalTests.IfUnlessHelperTest {\n wrapperFor(templates) {\n return `
`;\n }\n\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{unless ${cond} ${falsy} ${truthy}}}`;\n }\n\n textValue() {\n return this.$('div').attr('data-foo');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/invoke-helper-test\", [\"internal-test-helpers\", \"@glimmer/manager\", \"@ember/-internals/glimmer\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"@ember/service\", \"@glimmer/validator\", \"@glimmer/destroyable\", \"@glimmer/runtime\"], function (_internalTestHelpers, _manager, _glimmer, _metal, _owner, _service, _validator, _destroyable, _runtime) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n if (true\n /* EMBER_GLIMMER_INVOKE_HELPER */\n ) {\n (0, _internalTestHelpers.moduleFor)('Helpers test: invokeHelper', class extends _internalTestHelpers.RenderingTestCase {\n '@test it works with a component'() {\n var _class, _descriptor;\n\n class PlusOneHelper extends _glimmer.Helper {\n compute([num]) {\n return num + 1;\n }\n\n }\n\n var PlusOne = (_class = class PlusOne extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"number\", _descriptor, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class);\n this.registerComponent('plus-one', {\n template: `{{this.value}}`,\n ComponentClass: PlusOne\n });\n this.render(` `, {\n value: 4\n });\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 5));\n this.assertText('6');\n }\n\n '@test it works with simple helpers'() {\n var _class3, _descriptor2;\n\n var PlusOneHelper = (0, _glimmer.helper)(([num]) => num + 1);\n var PlusOne = (_class3 = class PlusOne extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"number\", _descriptor2, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3);\n this.registerComponent('plus-one', {\n template: `{{this.value}}`,\n ComponentClass: PlusOne\n });\n this.render(` `, {\n value: 4\n });\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 5));\n this.assertText('6');\n }\n\n '@test services can be injected if there is an owner'() {\n var _class5, _descriptor3, _class7, _descriptor4;\n\n var numberService;\n this.registerService('number', (_class5 = class _class5 extends _service.default {\n constructor() {\n super(...arguments);\n\n _initializerDefineProperty(this, \"value\", _descriptor3, this);\n\n numberService = this;\n }\n\n }, _descriptor3 = _applyDecoratedDescriptor(_class5.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 4;\n }\n }), _class5));\n var PlusOneHelper = (_class7 = class PlusOneHelper extends _glimmer.Helper {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"number\", _descriptor4, this);\n }\n\n compute() {\n return this.number.value + 1;\n }\n\n }, _descriptor4 = _applyDecoratedDescriptor(_class7.prototype, \"number\", [_service.service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class7);\n\n class PlusOne extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }\n\n this.registerComponent('plus-one', {\n template: `{{this.value}}`,\n ComponentClass: PlusOne\n });\n this.render(` `);\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => numberService.value = 5);\n this.assertText('6');\n }\n\n '@test works if there is no owner'(assert) {\n class PlusOneHelper extends _glimmer.Helper {\n compute([num]) {\n return num + 1;\n }\n\n }\n\n class PlusOne {\n constructor(number) {\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n this.number = number;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }\n\n var instance = new PlusOne(4);\n assert.notOk((0, _owner.getOwner)(instance), 'no owner exists on the wrapper');\n assert.equal(instance.value, 5, 'helper works without an owner');\n }\n\n '@test tracking for arguments works for tracked properties'(assert) {\n var _class9, _descriptor5;\n\n var count = 0;\n\n class PlusOneHelper extends _glimmer.Helper {\n compute([num]) {\n count++;\n return num + 1;\n }\n\n }\n\n var PlusOne = (_class9 = class PlusOne {\n constructor(number) {\n _initializerDefineProperty(this, \"number\", _descriptor5, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n this.number = number;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, _descriptor5 = _applyDecoratedDescriptor(_class9.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class9);\n var instance = new PlusOne(4);\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(count, 1, 'helper only called once');\n instance.number = 5;\n assert.equal(instance.value, 6, 'helper works');\n assert.equal(count, 2, 'helper called a second time');\n }\n\n '@test computeArgs only called when consumed values change'(assert) {\n var _class11, _descriptor6, _descriptor7;\n\n var count = 0;\n\n class PlusNHelper extends _glimmer.Helper {\n compute([num], {\n n\n }) {\n return num + n;\n }\n\n }\n\n var PlusN = (_class11 = class PlusN {\n constructor(number, n) {\n _initializerDefineProperty(this, \"number\", _descriptor6, this);\n\n _initializerDefineProperty(this, \"n\", _descriptor7, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusNHelper, () => {\n count++;\n return {\n positional: [this.number],\n named: {\n n: this.n\n }\n };\n });\n this.number = number;\n this.n = n;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, (_descriptor6 = _applyDecoratedDescriptor(_class11.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _descriptor7 = _applyDecoratedDescriptor(_class11.prototype, \"n\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n })), _class11);\n var instance = new PlusN(4, 1);\n assert.equal(count, 0, 'computeArgs not called yet');\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(count, 1, 'computeArgs only called once');\n instance.number = 5;\n assert.equal(instance.value, 6, 'helper works');\n assert.equal(instance.value, 6, 'helper works');\n assert.equal(count, 2, 'computeArgs called a second time');\n instance.n = 5;\n assert.equal(instance.value, 10, 'helper works');\n assert.equal(instance.value, 10, 'helper works');\n assert.equal(count, 3, 'computeArgs called a third time');\n }\n\n '@test helper updates based on internal state changes'(assert) {\n var _class13, _descriptor8;\n\n var count = 0;\n var helper;\n var PlusOneHelper = (_class13 = class PlusOneHelper extends _glimmer.Helper {\n constructor() {\n super(...arguments);\n\n _initializerDefineProperty(this, \"number\", _descriptor8, this);\n\n helper = this;\n }\n\n compute() {\n count++;\n return this.number + 1;\n }\n\n }, _descriptor8 = _applyDecoratedDescriptor(_class13.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 4;\n }\n }), _class13);\n\n class PlusOne {\n constructor() {\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper);\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }\n\n var instance = new PlusOne();\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(count, 1, 'helper only called once');\n helper.number = 5;\n assert.equal(instance.value, 6, 'helper works');\n assert.equal(count, 2, 'helper called a second time');\n }\n\n '@test helper that with constant args is constant'(assert) {\n var count = 0;\n\n class PlusOneHelper extends _glimmer.Helper {\n compute([num]) {\n count++;\n return num + 1;\n }\n\n }\n\n class PlusOne {\n constructor(number) {\n this.number = void 0;\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n this.number = number;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }\n\n var instance = new PlusOne(4);\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(count, 1, 'helper only called once');\n instance.number = 5;\n assert.equal(instance.value, 5, 'helper works');\n assert.equal(count, 1, 'helper not called a second time');\n }\n\n '@test helper destroys correctly when context object is destroyed'(assert) {\n var context = {};\n var instance;\n\n class TestHelper extends _glimmer.Helper {\n constructor() {\n super(...arguments);\n instance = this;\n }\n\n }\n\n var cache = (0, _runtime.invokeHelper)(context, TestHelper);\n (0, _destroyable.registerDestructor)(context, () => assert.step('context'));\n (0, _destroyable.registerDestructor)(cache, () => assert.step('cache'));\n (0, _destroyable.registerDestructor)(instance, () => assert.step('instance'));\n (0, _internalTestHelpers.runTask)(() => (0, _destroyable.destroy)(context));\n assert.ok((0, _destroyable.isDestroyed)(context), 'context destroyed');\n assert.ok((0, _destroyable.isDestroyed)(cache), 'cache destroyed');\n assert.ok((0, _destroyable.isDestroyed)(instance), 'instance destroyed');\n assert.verifySteps(['instance', 'cache', 'context'], 'destructors ran in correct order');\n }\n\n '@test helper destroys correctly when helper cache is destroyed'(assert) {\n var context = {};\n var instance;\n\n class TestHelper extends _glimmer.Helper {\n constructor() {\n super(...arguments);\n instance = this;\n }\n\n }\n\n var cache = (0, _runtime.invokeHelper)(context, TestHelper);\n (0, _destroyable.registerDestructor)(context, () => assert.step('context'));\n (0, _destroyable.registerDestructor)(cache, () => assert.step('cache'));\n (0, _destroyable.registerDestructor)(instance, () => assert.step('instance'));\n (0, _internalTestHelpers.runTask)(() => (0, _destroyable.destroy)(cache));\n assert.notOk((0, _destroyable.isDestroyed)(context), 'context NOT destroyed');\n assert.ok((0, _destroyable.isDestroyed)(cache), 'cache destroyed');\n assert.ok((0, _destroyable.isDestroyed)(instance), 'instance destroyed');\n assert.verifySteps(['instance', 'cache'], 'destructors ran in correct order');\n }\n\n '@test simple helper destroys correctly when context object is destroyed'(assert) {\n var context = {};\n var TestHelper = (0, _glimmer.helper)(() => {});\n var cache = (0, _runtime.invokeHelper)(context, TestHelper);\n (0, _destroyable.registerDestructor)(context, () => assert.step('context'));\n (0, _destroyable.registerDestructor)(cache, () => assert.step('cache'));\n (0, _internalTestHelpers.runTask)(() => (0, _destroyable.destroy)(context));\n assert.ok((0, _destroyable.isDestroyed)(context), 'context destroyed');\n assert.ok((0, _destroyable.isDestroyed)(cache), 'cache destroyed');\n assert.verifySteps(['cache', 'context'], 'destructors ran in correct order');\n }\n\n '@test throws an error if value is accessed after it is destroyed'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n var helper = (0, _runtime.invokeHelper)({}, class extends _glimmer.Helper {});\n (0, _internalTestHelpers.runTask)(() => (0, _destroyable.destroy)(helper));\n (0, _validator.getValue)(helper);\n }, /You attempted to get the value of a helper after the helper was destroyed, which is not allowed/);\n }\n\n '@test asserts if no context object is passed'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _runtime.invokeHelper)(undefined, class extends _glimmer.Helper {});\n }, /Expected a context object to be passed as the first parameter to invokeHelper, got undefined/);\n }\n\n '@test asserts if no manager exists for the helper definition'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n }\n\n assert.throws(() => {\n (0, _runtime.invokeHelper)({}, class {});\n }, /Attempted to load a helper, but there wasn't a helper manager associated with the definition. The definition was:/);\n }\n\n });\n }\n\n if (true\n /* EMBER_GLIMMER_HELPER_MANAGER */\n && true\n /* EMBER_GLIMMER_INVOKE_HELPER */\n ) {\n class TestHelperManager {\n constructor() {\n this.capabilities = (0, _manager.helperCapabilities)('3.23', {\n hasValue: true,\n hasDestroyable: true\n });\n }\n\n createHelper(Helper, args) {\n return new Helper(args);\n }\n\n getValue(instance) {\n return instance.value();\n }\n\n getDestroyable(instance) {\n return instance;\n }\n\n }\n\n class TestHelper {\n constructor(args) {\n this.args = args;\n (0, _destroyable.registerDestructor)(this, () => this.willDestroy());\n }\n\n willDestroy() {}\n\n }\n\n (0, _manager.setHelperManager)(owner => new TestHelperManager(owner), TestHelper);\n (0, _internalTestHelpers.moduleFor)('Helpers test: invokeHelper with custom helper managers', class extends _internalTestHelpers.RenderingTestCase {\n '@test it works with custom helper managers'() {\n var _class15, _descriptor9;\n\n class PlusOneHelper extends TestHelper {\n value() {\n return this.args.positional[0] + 1;\n }\n\n }\n\n var PlusOne = (_class15 = class PlusOne extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"number\", _descriptor9, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, _descriptor9 = _applyDecoratedDescriptor(_class15.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class15);\n this.registerComponent('plus-one', {\n template: `{{this.value}}`,\n ComponentClass: PlusOne\n });\n this.render(` `, {\n value: 4\n });\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('5');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', 5));\n this.assertText('6');\n }\n\n '@test helper that accesses no args is constant'(assert) {\n var _class17, _descriptor10;\n\n var count = 0;\n\n class PlusOneHelper extends TestHelper {\n value() {\n count++;\n return 123;\n }\n\n }\n\n var PlusOne = (_class17 = class PlusOne {\n constructor(number) {\n _initializerDefineProperty(this, \"number\", _descriptor10, this);\n\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n this.number = number;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n }, _descriptor10 = _applyDecoratedDescriptor(_class17.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class17);\n var instance = new PlusOne(4);\n assert.equal(instance.value, 123, 'helper works');\n assert.equal(instance.value, 123, 'helper works');\n assert.equal(count, 1, 'helper only called once');\n instance.number = 5;\n assert.equal(instance.value, 123, 'helper works');\n assert.equal(count, 1, 'helper not called a second time');\n }\n\n '@test helper destroys correctly when context object is destroyed'(assert) {\n var context = {};\n var instance;\n\n class MyTestHelper extends TestHelper {\n constructor() {\n super(...arguments);\n instance = this;\n }\n\n }\n\n var cache = (0, _runtime.invokeHelper)(context, MyTestHelper);\n (0, _destroyable.registerDestructor)(context, () => assert.step('context'));\n (0, _destroyable.registerDestructor)(cache, () => assert.step('cache'));\n (0, _destroyable.registerDestructor)(instance, () => assert.step('instance'));\n (0, _internalTestHelpers.runTask)(() => (0, _destroyable.destroy)(context));\n assert.ok((0, _destroyable.isDestroyed)(context), 'context destroyed');\n assert.ok((0, _destroyable.isDestroyed)(cache), 'cache destroyed');\n assert.ok((0, _destroyable.isDestroyed)(instance), 'instance destroyed');\n assert.verifySteps(['instance', 'cache', 'context'], 'destructors ran in correct order');\n }\n\n '@test args are frozen in debug builds'(assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n } else {\n assert.expect(1);\n\n class PlusOneHelper extends TestHelper {\n value() {\n assert.ok(Object.isFrozen(this.args), 'args are frozen');\n return 123;\n }\n\n }\n\n class PlusOne {\n constructor(number) {\n this.number = void 0;\n this.plusOne = (0, _runtime.invokeHelper)(this, PlusOneHelper, () => {\n return {\n positional: [this.number]\n };\n });\n this.number = number;\n }\n\n get value() {\n return (0, _validator.getValue)(this.plusOne);\n }\n\n } // get the value to trigger the assertion\n\n\n new PlusOne(4).value;\n }\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/log-test\", [\"internal-test-helpers\"], function (_internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{log}}', class extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n /* eslint-disable no-console */\n\n this.originalLog = console.log;\n this.logCalls = [];\n\n console.log = (...args) => {\n this.logCalls.push(...args);\n /* eslint-enable no-console */\n };\n }\n\n teardown() {\n super.teardown();\n /* eslint-disable no-console */\n\n console.log = this.originalLog;\n /* eslint-enable no-console */\n }\n\n assertLog(values) {\n this.assertText('');\n this.assert.strictEqual(this.logCalls.length, values.length);\n\n for (var i = 0, len = values.length; i < len; i++) {\n this.assert.strictEqual(this.logCalls[i], values[i]);\n }\n }\n\n ['@test correctly logs primitives']() {\n this.render(`{{log \"one\" 1 true}}`);\n this.assertLog(['one', 1, true]);\n }\n\n ['@test correctly logs a property']() {\n this.render(`{{log this.value}}`, {\n value: 'one'\n });\n this.assertLog(['one']);\n }\n\n ['@test correctly logs multiple arguments']() {\n this.render(`{{log \"my variable:\" this.value}}`, {\n value: 'one'\n });\n this.assertLog(['my variable:', 'one']);\n }\n\n ['@test correctly logs `this`']() {\n this.render(`{{log this}}`);\n this.assertLog([this.context]);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/mut-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{mut}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test a simple mutable binding using `mut` propagates properly']() {\n var bottom;\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.setMe}}'\n });\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=this.value}}'\n });\n this.render('{{middle-mut value=(mut this.val)}}', {\n val: 12\n });\n this.assertText('12', 'the data propagated downwards');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => bottom.attrs.setMe.update(13));\n this.assertText('13', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(bottom, 'setMe', 14));\n this.assertText('14', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12');\n }\n\n ['@test a simple mutable binding using `mut` inserts into the DOM']() {\n var bottom, middle;\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.setMe}}'\n });\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n\n }),\n template: '{{bottom-mut setMe=(mut this.value)}}'\n });\n this.render('{{middle-mut value=(mut this.val)}}', {\n val: 12\n });\n this.assertText('12', 'the data propagated downwards');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => bottom.attrs.setMe.update(13));\n this.assertText('13', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 13, \"the set propagated to middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 13, \"the set propagated to middle's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(bottom, 'setMe', 14));\n this.assertText('14', 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 14, \"the set propagated to middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 14, \"the set propagated to middle's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12');\n }\n\n ['@test passing a literal results in a assertion']() {\n this.registerComponent('bottom-mut', {\n template: '{{this.setMe}}'\n });\n expectAssertion(() => {\n this.render('{{bottom-mut setMe=(mut \"foo bar\")}}');\n }, 'You can only pass a path to mut');\n }\n\n ['@test passing the result of a helper invocation results in an assertion']() {\n this.registerComponent('bottom-mut', {\n template: '{{this.setMe}}'\n });\n expectAssertion(() => {\n this.render('{{bottom-mut setMe=(mut (concat \"foo\" \" \" \"bar\"))}}');\n }, 'You can only pass a path to mut');\n } // See https://github.com/emberjs/ember.js/commit/807a0cd for an explanation of this test\n\n\n ['@test using a string value through middle tier does not trigger assertion (due to the auto-mut transform)']() {\n var bottom;\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.stuff}}'\n });\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut stuff=this.value}}'\n });\n this.render('{{middle-mut value=\"foo\"}}');\n this.assert.equal((0, _metal.get)(bottom, 'stuff'), 'foo', 'the data propagated');\n this.assertText('foo');\n this.assertStableRerender(); // No U-R for this test\n }\n\n ['@test {{readonly}} of a {{mut}} is converted into an immutable binding']() {\n var middle, bottom;\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.setMe}}'\n });\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n\n }),\n template: '{{bottom-mut setMe=(readonly this.value)}}'\n });\n this.render('{{middle-mut value=(mut this.val)}}', {\n val: 12\n });\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => middle.attrs.value.update(13));\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 13, \"the set took effect on middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 13, \"the set took effect on middle's attr\");\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(middle, 'value', 14));\n this.assert.strictEqual((0, _metal.get)(middle, 'value'), 14, \"the set took effect on middle's prop\");\n this.assert.strictEqual(middle.attrs.value.value, 14, \"the set took effect on middle's attr\");\n this.assert.strictEqual(bottom.attrs.setMe, 14, 'the mutable binding has been converted to an immutable cell');\n this.assertText('14');\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12');\n }\n\n ['@test mutable bindings work inside of yielded content']() {\n this.registerComponent('bottom-mut', {\n template: '{{yield}}'\n });\n this.registerComponent('middle-mut', {\n template: '{{#bottom-mut}}{{@model.name}}{{/bottom-mut}}'\n });\n this.render('{{middle-mut model=(mut this.model)}}', {\n model: {\n name: 'Matthew Beale'\n }\n });\n this.assertText('Matthew Beale');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.name', 'Joel Kang'));\n this.assertText('Joel Kang');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n name: 'Matthew Beale'\n }));\n this.assertText('Matthew Beale');\n }\n\n ['@test a simple mutable binding using {{mut}} is available in hooks']() {\n var bottom;\n var willRender = [];\n var didInsert = [];\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n willRender() {\n willRender.push((0, _metal.get)(this, 'setMe'));\n },\n\n didInsertElement() {\n didInsert.push((0, _metal.get)(this, 'setMe'));\n bottom = this;\n }\n\n }),\n template: '{{this.setMe}}'\n });\n this.registerComponent('middle-mut', {\n template: '{{bottom-mut setMe=(mut this.value)}}'\n });\n this.render('{{middle-mut value=(mut this.val)}}', {\n val: 12\n });\n this.assert.deepEqual(willRender, [12], 'willReceive is [12]');\n this.assert.deepEqual(didInsert, [12], 'didInsert is [12]');\n this.assertText('12');\n this.assertStableRerender();\n this.assert.deepEqual(willRender, [12], 'willReceive is [12]');\n this.assert.deepEqual(didInsert, [12], 'didInsert is [12]');\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 12, 'the data propagated');\n (0, _internalTestHelpers.runTask)(() => bottom.attrs.setMe.update(13));\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 13, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 13, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 13, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(bottom, 'setMe', 14));\n this.assert.strictEqual((0, _metal.get)(bottom, 'setMe'), 14, \"the set took effect on bottom's prop\");\n this.assert.strictEqual(bottom.attrs.setMe.value, 14, \"the set took effect on bottom's attr\");\n this.assert.strictEqual((0, _metal.get)(this.context, 'val'), 14, 'the set propagated back up');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12');\n }\n\n ['@test a mutable binding with a backing computed property and attribute present in the root of the component is updated when the upstream property invalidates #11023']() {\n var bottom, middle;\n this.registerComponent('bottom-mut', {\n ComponentClass: _helpers.Component.extend({\n thingy: null,\n\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.thingy}}'\n });\n this.registerComponent('middle-mut', {\n ComponentClass: _helpers.Component.extend({\n baseValue: 12,\n val: (0, _metal.computed)('baseValue', function () {\n return this.get('baseValue');\n }),\n\n didInsertElement() {\n middle = this;\n }\n\n }),\n template: '{{bottom-mut thingy=(mut this.val)}}'\n });\n this.render('{{middle-mut}}');\n this.assert.strictEqual((0, _metal.get)(bottom, 'thingy'), 12, 'data propagated');\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(middle, 'baseValue', 13));\n this.assert.strictEqual((0, _metal.get)(middle, 'val'), 13, 'the set took effect');\n this.assert.strictEqual(bottom.attrs.thingy.value, 13, \"the set propagated down to bottom's attrs\");\n this.assert.strictEqual((0, _metal.get)(bottom, 'thingy'), 13, \"the set propagated down to bottom's prop\");\n this.assertText('13');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(middle, 'baseValue', 12));\n this.assertText('12');\n }\n\n ['@test automatic mutable bindings exposes a mut cell in attrs']() {\n var inner;\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n\n }),\n template: '{{this.foo}}'\n });\n this.registerComponent('x-outer', {\n template: '{{x-inner foo=this.bar}}'\n });\n this.render('{{x-outer bar=this.baz}}', {\n baz: 'foo'\n });\n this.assertText('foo');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => inner.attrs.foo.update('bar'));\n this.assert.equal(inner.attrs.foo.value, 'bar');\n this.assert.equal((0, _metal.get)(inner, 'foo'), 'bar');\n this.assertText('bar');\n (0, _internalTestHelpers.runTask)(() => inner.attrs.foo.update('foo'));\n this.assertText('foo');\n }\n\n ['@test automatic mutable bindings tolerate undefined non-stream inputs and attempts to set them']() {\n var inner;\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n\n }),\n template: '{{@model}}'\n });\n this.registerComponent('x-outer', {\n template: '{{x-inner model=this.nonexistent}}'\n });\n this.render('{{x-outer}}');\n this.assertText('');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => inner.attrs.model.update(42));\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('42');\n (0, _internalTestHelpers.runTask)(() => inner.attrs.model.update(undefined));\n this.assertText('');\n }\n\n ['@test automatic mutable bindings tolerate constant non-stream inputs and attempts to set them']() {\n var inner;\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n inner = this;\n }\n\n }),\n template: 'hello{{@model}}'\n });\n this.registerComponent('x-outer', {\n // Use `this.x` here instead of `@x` to let `x-inner` mutate `this.x`.\n // `@x` points to the literal binding from `x-outer`, which is of\n // course immutable.\n template: '{{x-inner model=this.x}}'\n });\n this.render('{{x-outer x=\"foo\"}}');\n this.assertText('hellofoo');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => inner.attrs.model.update(42));\n this.assert.equal(inner.attrs.model.value, 42);\n this.assert.equal((0, _metal.get)(inner, 'model'), 42);\n this.assertText('hello42');\n (0, _internalTestHelpers.runTask)(() => inner.attrs.model.update('foo'));\n this.assertText('hellofoo');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Mutable Bindings used in Computed Properties that are bound as attributeBindings', class extends _internalTestHelpers.RenderingTestCase {\n ['@test an attribute binding of a computed property of a 2-way bound attr recomputes when the attr changes']() {\n var input, output;\n this.registerComponent('x-input', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n input = this;\n }\n\n })\n });\n this.registerComponent('x-output', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n\n didInsertElement() {\n output = this;\n },\n\n style: (0, _metal.computed)('height', function () {\n var height = this.get('height');\n return (0, _helpers.htmlSafe)(`height: ${height}px;`);\n }),\n height: 20\n }),\n template: '{{this.height}}'\n });\n this.render('{{x-output height=this.height}}{{x-input height=(mut this.height)}}', {\n height: 60\n });\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 60px;')\n },\n content: '60'\n });\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => input.attrs.height.update(35));\n this.assert.strictEqual((0, _metal.get)(output, 'height'), 35, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'height'), 35, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 35px;')\n },\n content: '35'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(input, 'height', 36));\n this.assert.strictEqual((0, _metal.get)(output, 'height'), 36, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'height'), 36, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 36px;')\n },\n content: '36'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'height', 60));\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 60px;')\n },\n content: '60'\n });\n this.assert.strictEqual((0, _metal.get)(input, 'height'), 60);\n }\n\n ['@test an attribute binding of a computed property with a setter of a 2-way bound attr recomputes when the attr changes']() {\n var input, output;\n this.registerComponent('x-input', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n input = this;\n }\n\n })\n });\n this.registerComponent('x-output', {\n ComponentClass: _helpers.Component.extend({\n attributeBindings: ['style'],\n\n didInsertElement() {\n output = this;\n },\n\n style: (0, _metal.computed)('height', 'width', function () {\n var height = this.get('height');\n var width = this.get('width');\n return (0, _helpers.htmlSafe)(`height: ${height}px; width: ${width}px;`);\n }),\n height: 20,\n width: (0, _metal.computed)('height', {\n get() {\n return this.get('height') * 2;\n },\n\n set(keyName, width) {\n this.set('height', width / 2);\n return width;\n }\n\n })\n }),\n template: '{{this.width}}x{{this.height}}'\n });\n this.render('{{x-output width=this.width}}{{x-input width=(mut this.width)}}', {\n width: 70\n });\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 35px; width: 70px;')\n },\n content: '70x35'\n });\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(input, 'width', 80));\n this.assert.strictEqual((0, _metal.get)(output, 'width'), 80, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'width'), 80, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 40px; width: 80px;')\n },\n content: '80x40'\n });\n (0, _internalTestHelpers.runTask)(() => input.attrs.width.update(90));\n this.assert.strictEqual((0, _metal.get)(output, 'width'), 90, 'the set took effect');\n this.assert.strictEqual((0, _metal.get)(this.context, 'width'), 90, 'the set propagated back up');\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 45px; width: 90px;')\n },\n content: '90x45'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'width', 70));\n this.assertComponentElement(this.firstChild, {\n tagName: 'div',\n attrs: {\n style: (0, _internalTestHelpers.styles)('height: 35px; width: 70px;')\n },\n content: '70x35'\n });\n this.assert.strictEqual((0, _metal.get)(input, 'width'), 70);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/readonly-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{readonly}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test {{readonly}} of a path should work']() {\n var component;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n\n }),\n template: '{{this.value}}'\n });\n this.render('{{foo-bar value=(readonly this.val)}}', {\n val: 12\n });\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(component, 'value', 13));\n this.assert.notOk(component.attrs.value.update);\n this.assertText('13', 'local property is updated');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'upstream attribute is not updated'); // No U-R\n }\n\n '@test passing an action to {{readonly}} avoids mutable cell wrapping'(assert) {\n assert.expect(4);\n var outer, inner;\n this.registerComponent('x-inner', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n inner = this;\n }\n\n })\n });\n this.registerComponent('x-outer', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n outer = this;\n }\n\n }),\n template: '{{x-inner onClick=(readonly this.onClick)}}'\n });\n this.render('{{x-outer onClick=(action this.doIt)}}', {\n doIt() {\n assert.ok(true, 'action was called');\n }\n\n });\n assert.equal(typeof outer.attrs.onClick, 'function', 'function itself is present in outer component attrs');\n outer.attrs.onClick();\n assert.equal(typeof inner.attrs.onClick, 'function', 'function itself is present in inner component attrs');\n inner.attrs.onClick();\n }\n\n '@test updating a {{readonly}} property from above works'(assert) {\n var component;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n component = this;\n }\n\n }),\n template: '{{this.value}}'\n });\n this.render('{{foo-bar value=(readonly this.thing)}}', {\n thing: 'initial'\n });\n this.assertText('initial');\n this.assertStableRerender();\n assert.strictEqual(component.attrs.value, 'initial', 'no mutable cell');\n assert.strictEqual((0, _metal.get)(component, 'value'), 'initial', 'no mutable cell');\n assert.strictEqual(this.context.thing, 'initial');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'thing', 'updated!'));\n this.assertText('updated!');\n assert.strictEqual(component.attrs.value, 'updated!', 'passed down value was set in attrs');\n assert.strictEqual((0, _metal.get)(component, 'value'), 'updated!', 'passed down value was set');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'thing', 'initial'));\n this.assertText('initial');\n }\n\n '@test updating a nested path of a {{readonly}}'(assert) {\n var component;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n\n }),\n template: '{{this.value.prop}}'\n });\n this.render('{{foo-bar value=(readonly this.thing)}}', {\n thing: {\n prop: 'initial'\n }\n });\n this.assertText('initial');\n this.assertStableRerender();\n assert.notOk(component.attrs.value.update, 'no update available');\n assert.deepEqual((0, _metal.get)(component, 'value'), {\n prop: 'initial'\n });\n assert.deepEqual(this.context.thing, {\n prop: 'initial'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(component, 'value.prop', 'updated!'));\n this.assertText('updated!', 'nested path is updated');\n assert.deepEqual((0, _metal.get)(component, 'value'), {\n prop: 'updated!'\n });\n assert.deepEqual(this.context.thing, {\n prop: 'updated!'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(component, 'value.prop', 'initial'));\n this.assertText('initial');\n }\n\n ['@test {{readonly}} of a string renders correctly']() {\n var component;\n this.registerComponent('foo-bar', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n component = this;\n }\n\n }),\n template: '{{this.value}}'\n });\n this.render('{{foo-bar value=(readonly \"12\")}}');\n this.assertText('12');\n this.assertStableRerender();\n this.assert.notOk(component.attrs.value.update);\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '12');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(component, 'value', '13'));\n this.assertText('13', 'local property is updated');\n this.assert.strictEqual((0, _metal.get)(component, 'value'), '13');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(component, 'value', '12'));\n this.assertText('12');\n }\n\n ['@test {{mut}} of a {{readonly}} mutates only the middle and bottom tiers']() {\n var middle, bottom;\n this.registerComponent('x-bottom', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n bottom = this;\n }\n\n }),\n template: '{{this.bar}}'\n });\n this.registerComponent('x-middle', {\n ComponentClass: _helpers.Component.extend({\n didInsertElement() {\n middle = this;\n }\n\n }),\n template: '{{this.foo}} {{x-bottom bar=(mut this.foo)}}'\n });\n this.render('{{x-middle foo=(readonly this.val)}}', {\n val: 12\n });\n this.assertText('12 12');\n this.assertStableRerender();\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 12, \"bottom's local bar received the value\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 12, \"middle's local foo received the value\"); // updating the mut-cell directly\n\n (0, _internalTestHelpers.runTask)(() => bottom.attrs.bar.update(13));\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 13, \"bottom's local bar was updated after set of bottom's bar\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 13, \"middle's local foo was updated after set of bottom's bar\");\n this.assertText('13 13');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'But context val is not updated');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(bottom, 'bar', 14));\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 14, \"bottom's local bar was updated after set of bottom's bar\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 14, \"middle's local foo was updated after set of bottom's bar\");\n this.assertText('14 14');\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'But context val is not updated');\n this.assert.notOk(middle.attrs.foo.update, \"middle's foo attr is not a mutable cell\");\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(middle, 'foo', 15));\n this.assertText('15 15');\n this.assert.equal((0, _metal.get)(middle, 'foo'), 15, \"set of middle's foo took effect\");\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 15, \"bottom's local bar was updated after set of middle's foo\");\n this.assert.equal((0, _metal.get)(this.context, 'val'), 12, 'Context val remains unchanged');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 10));\n this.assertText('10 10');\n this.assert.equal((0, _metal.get)(bottom, 'bar'), 10, \"bottom's local bar was updated after set of context's val\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), 10, \"middle's local foo was updated after set of context's val\"); // setting as a normal property\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(bottom, 'bar', undefined));\n this.assertText(' ');\n this.assert.equal((0, _metal.get)(bottom, 'bar'), undefined, \"bottom's local bar was updated to a falsy value\");\n this.assert.equal((0, _metal.get)(middle, 'foo'), undefined, \"middle's local foo was updated to a falsy value\");\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'val', 12));\n this.assertText('12 12', 'bottom and middle were both reset');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/tracked-test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/service\", \"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/debug-stack\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_runtime, _metal, _service, _internalTestHelpers, _debugStack, _helpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('Helper Tracked Properties', class extends _internalTestHelpers.RenderingTestCase {\n '@test tracked properties rerender when updated'(assert) {\n var computeCount = 0;\n\n var PersonComponent = _helpers.Component.extend({\n name: (0, _metal.tracked)({\n value: 'bob'\n }),\n\n updateName() {\n this.name = 'sal';\n }\n\n });\n\n this.registerComponent('person', {\n ComponentClass: PersonComponent,\n template: (0, _internalTestHelpers.strip)`\n \n {{hello-world this.name}}\n \n `\n });\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return `${value}-value`;\n });\n this.render(' ');\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test nested tracked properties rerender when updated'(assert) {\n var computeCount = 0;\n\n var Person = _runtime.Object.extend({\n name: (0, _metal.tracked)({\n value: 'bob'\n })\n });\n\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return `${value}-value`;\n });\n this.render('{{hello-world this.model.name}}', {\n model: Person.create()\n });\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.context.model.name = 'sal');\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test getters update when dependent properties are invalidated'(assert) {\n var computeCount = 0;\n\n var PersonComponent = _helpers.Component.extend({\n first: (0, _metal.tracked)({\n value: 'Rob'\n }),\n last: (0, _metal.tracked)({\n value: 'Jackson'\n }),\n full: (0, _metal.nativeDescDecorator)({\n get() {\n return `${this.first} ${this.last}`;\n }\n\n }),\n\n updatePerson() {\n this.first = 'Kris';\n this.last = 'Selden';\n }\n\n });\n\n this.registerComponent('person', {\n ComponentClass: PersonComponent,\n template: (0, _internalTestHelpers.strip)`\n \n {{hello-world this.full}}\n \n `\n });\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return value;\n });\n this.render(' ');\n this.assertText('Rob Jackson');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Rob Jackson');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n this.assertText('Kris Selden');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test array properties rerender when updated'() {\n var NumListComponent = _helpers.Component.extend({\n numbers: (0, _metal.tracked)({\n initializer: () => (0, _runtime.A)([1, 2, 3])\n }),\n\n addNumber() {\n this.numbers.pushObject(4);\n }\n\n });\n\n this.registerComponent('num-list', {\n ComponentClass: NumListComponent,\n template: (0, _internalTestHelpers.strip)`\n \n {{join this.numbers}}\n \n `\n });\n this.registerHelper('join', ([value]) => {\n return value.join(', ');\n });\n this.render(' ');\n this.assertText('1, 2, 3');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n this.assertText('1, 2, 3, 4');\n }\n\n '@test custom ember array properties rerender when updated'() {\n var CustomArray = _runtime.Object.extend(_runtime.MutableArray, {\n init() {\n this._super(...arguments);\n\n this._vals = [1, 2, 3];\n },\n\n objectAt(index) {\n return this._vals[index];\n },\n\n replace(start, deleteCount, items = []) {\n this._vals.splice(start, deleteCount, ...items);\n\n (0, _metal.notifyPropertyChange)(this, '[]');\n },\n\n join() {\n return this._vals.join(...arguments);\n },\n\n get length() {\n return this._vals.length;\n }\n\n });\n\n var NumListComponent = _helpers.Component.extend({\n numbers: (0, _metal.tracked)({\n initializer: () => CustomArray.create()\n }),\n\n addNumber() {\n this.numbers.pushObject(4);\n }\n\n });\n\n this.registerComponent('num-list', {\n ComponentClass: NumListComponent,\n template: (0, _internalTestHelpers.strip)`\n \n {{join this.numbers}}\n \n `\n });\n this.registerHelper('join', ([value]) => {\n return value.join(', ');\n });\n this.render(' ');\n this.assertText('1, 2, 3');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n this.assertText('1, 2, 3, 4');\n }\n\n '@test nested getters update when dependent properties are invalidated'(assert) {\n var computeCount = 0;\n\n var Person = _runtime.Object.extend({\n first: (0, _metal.tracked)({\n value: 'Rob'\n }),\n last: (0, _metal.tracked)({\n value: 'Jackson'\n }),\n full: (0, _metal.nativeDescDecorator)({\n get() {\n return `${this.first} ${this.last}`;\n }\n\n })\n });\n\n this.registerHelper('hello-world', ([value]) => {\n computeCount++;\n return value;\n });\n this.render('{{hello-world this.model.full}}', {\n model: Person.create()\n });\n this.assertText('Rob Jackson');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Rob Jackson');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => {\n this.context.model.first = 'Kris';\n this.context.model.last = 'Selden';\n });\n this.assertText('Kris Selden');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test functional helpers autotrack based on non-argument tracked props that are accessed'(assert) {\n var computeCount = 0;\n var currentUserService;\n this.registerService('current-user', _service.default.extend({\n name: (0, _metal.tracked)({\n value: 'bob'\n }),\n\n init() {\n this._super(...arguments);\n\n currentUserService = this;\n }\n\n }));\n this.registerComponent('person', {\n ComponentClass: _helpers.Component.extend({\n currentUser: (0, _service.service)('current-user')\n }),\n template: (0, _internalTestHelpers.strip)`\n {{hello-world this.currentUser}}\n `\n });\n this.registerHelper('hello-world', ([service]) => {\n computeCount++;\n return `${service.name}-value`;\n });\n this.render(' ');\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => currentUserService.name = 'sal');\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test class based helpers are autotracked'(assert) {\n var computeCount = 0;\n\n var TrackedClass = _runtime.Object.extend({\n value: (0, _metal.tracked)({\n value: 'bob'\n })\n });\n\n var trackedInstance = TrackedClass.create();\n this.registerComponent('person', {\n ComponentClass: _helpers.Component.extend(),\n template: (0, _internalTestHelpers.strip)`{{hello-world}}`\n });\n this.registerHelper('hello-world', {\n compute() {\n computeCount++;\n return `${trackedInstance.value}-value`;\n }\n\n });\n this.render(' ');\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bob-value');\n assert.strictEqual(computeCount, 1, 'compute is called exactly 1 time');\n (0, _internalTestHelpers.runTask)(() => trackedInstance.value = 'sal');\n this.assertText('sal-value');\n assert.strictEqual(computeCount, 2, 'compute is called exactly 2 times');\n }\n\n '@test each-in autotracks non-tracked values correctly'() {\n var obj = _runtime.Object.create({\n value: 'bob'\n });\n\n this.registerComponent('person', {\n ComponentClass: _helpers.Component.extend({\n obj\n }),\n template: (0, _internalTestHelpers.strip)`\n {{#each-in this.obj as |key value|}}\n {{value}}-{{key}}\n {{/each-in}}\n `\n });\n this.render(' ');\n this.assertText('bob-value');\n (0, _internalTestHelpers.runTask)(() => obj.set('value', 'sal'));\n this.assertText('sal-value');\n }\n\n '@test each-in autotracks arrays acorrectly'() {\n var obj = _runtime.Object.create({\n arr: (0, _runtime.A)([1])\n });\n\n this.registerComponent('person', {\n ComponentClass: _helpers.Component.extend({\n obj\n }),\n template: (0, _internalTestHelpers.strip)`\n {{#each-in this.obj as |key arr|}}\n {{#each arr as |v|}}{{v}}{{/each}}\n {{/each-in}}\n `\n });\n this.render(' ');\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => obj.arr.pushObject(2));\n this.assertText('12');\n }\n\n '@test simple helper gives helpful warning when mutating a value that was tracked already'() {\n this.registerHelper('hello-world', function helloWorld([person]) {\n (0, _metal.get)(person, 'name');\n (0, _metal.set)(person, 'name', 'sam');\n });\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('name', '\\\\(unknown object\\\\)', {\n renderTree: ['\\\\(result of a `.*` helper\\\\)']\n });\n expectDeprecation(() => {\n // TODO: this must be a bug??\n expectDeprecation((0, _debugStack.backtrackingMessageFor)('undefined', undefined, {\n renderTree: ['\\\\(result of a `.*` helper\\\\)']\n }));\n this.render('{{hello-world this.model}}', {\n model: {}\n });\n }, expectedMessage);\n }\n\n '@test simple helper gives helpful deprecation when mutating a tracked property that was tracked already'() {\n var _class, _descriptor;\n\n var Person = (_class = class Person {\n constructor() {\n _initializerDefineProperty(this, \"name\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"name\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'bob';\n }\n }), _class);\n this.registerHelper('hello-world', ([person]) => {\n person.name;\n person.name = 'sam';\n });\n var expectedMessage = (0, _debugStack.backtrackingMessageFor)('name', 'Person', {\n renderTree: ['\\\\(result of a `\\\\(unknown function\\\\)` helper\\\\)']\n });\n expectDeprecation(() => {\n this.render('{{hello-world this.model}}', {\n model: new Person()\n });\n }, expectedMessage);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/unbound-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _runtime, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{unbound}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test should be able to output a property without binding']() {\n this.render(`{{unbound this.content.anUnboundString}}
`, {\n content: {\n anUnboundString: 'No spans here, son.'\n }\n });\n this.assertText('No spans here, son.');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('No spans here, son.');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'content.anUnboundString', 'HEY'));\n this.assertText('No spans here, son.');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'content', {\n anUnboundString: 'No spans here, son.'\n }));\n this.assertText('No spans here, son.');\n }\n\n ['@test should be able to use unbound helper in #each helper']() {\n this.render(`{{#each this.items as |item|}}{{unbound item}} {{/each}} `, {\n items: (0, _runtime.A)(['a', 'b', 'c', 1, 2, 3])\n });\n this.assertText('abc123');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('abc123');\n }\n\n ['@test should be able to use unbound helper in #each helper (with objects)']() {\n this.render(`{{#each this.items as |item|}}{{unbound item.wham}} {{/each}} `, {\n items: (0, _runtime.A)([{\n wham: 'bam'\n }, {\n wham: 1\n }])\n });\n this.assertText('bam1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bam1');\n (0, _internalTestHelpers.runTask)(() => this.context.items.setEach('wham', 'HEY'));\n this.assertText('bam1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'items', (0, _runtime.A)([{\n wham: 'bam'\n }, {\n wham: 1\n }])));\n this.assertText('bam1');\n }\n\n ['@test it should assert unbound cannot be called with multiple arguments']() {\n var willThrow = () => {\n this.render(`{{unbound this.foo this.bar}}`, {\n foo: 'BORK',\n bar: 'BLOOP'\n });\n };\n\n expectAssertion(willThrow, /unbound helper cannot be called with multiple params or hash params/);\n }\n\n ['@test should render on attributes']() {\n this.render(` `, {\n model: {\n foo: 'BORK'\n }\n });\n this.assertHTML(' ');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertHTML(' ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.foo', 'OOF'));\n this.assertHTML(' ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: 'BORK'\n }));\n this.assertHTML(' ');\n }\n\n ['@test should property escape unsafe hrefs']() {\n var unsafeUrls = (0, _runtime.A)([{\n name: 'Bob',\n url: 'javascript:bob-is-cool'\n }, {\n name: 'James',\n url: 'vbscript:james-is-cool'\n }, {\n name: 'Richard',\n url: 'javascript:richard-is-cool'\n }]);\n this.render(``, {\n people: unsafeUrls\n });\n var escapedHtml = (0, _internalTestHelpers.strip)`\n \n `;\n this.assertHTML(escapedHtml);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertHTML(escapedHtml);\n (0, _internalTestHelpers.runTask)(() => this.context.people.setEach('url', 'http://google.com'));\n this.assertHTML(escapedHtml);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'people', unsafeUrls));\n this.assertHTML(escapedHtml);\n }\n\n ['@skip helper form updates on parent re-render']() {\n this.render(`{{unbound this.foo}}`, {\n foo: 'BORK'\n });\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 'OOF'));\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('OOF');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', ''));\n this.assertText('OOF');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 'BORK'));\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('BORK');\n } // semantics here is not guaranteed\n\n\n ['@test sexpr form does not update no matter what']() {\n this.registerHelper('capitalize', args => args[0].toUpperCase());\n this.render(`{{capitalize (unbound this.foo)}}`, {\n foo: 'bork'\n });\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n this.assertText('BORK');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\n this.assertText('BORK');\n }\n\n ['@test sexpr in helper form does not update on parent re-render']() {\n this.registerHelper('capitalize', params => params[0].toUpperCase());\n this.registerHelper('doublize', params => `${params[0]} ${params[0]}`);\n this.render(`{{capitalize (unbound (doublize this.foo))}}`, {\n foo: 'bork'\n });\n this.assertText('BORK BORK');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('BORK BORK');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'foo', 'oof');\n this.rerender();\n });\n this.assertText('BORK BORK');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', 'blip'));\n this.assertText('BORK BORK');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'foo', 'bork');\n this.rerender();\n });\n this.assertText('BORK BORK');\n }\n\n ['@test should be able to render an unbound helper invocation']() {\n this.registerHelper('repeat', ([value], {\n count\n }) => {\n var a = [];\n\n while (a.length < count) {\n a.push(value);\n }\n\n return a.join('');\n });\n this.render(`{{unbound (repeat this.foo count=this.bar)}} {{repeat this.foo count=this.bar}} {{unbound (repeat this.foo count=2)}} {{repeat this.foo count=4}}`, {\n foo: 'X',\n bar: 5\n });\n this.assertText('XXXXX XXXXX XX XXXX');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('XXXXX XXXXX XX XXXX');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'bar', 1));\n this.assertText('XXXXX X XX XXXX');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'bar', 5));\n this.assertText('XXXXX XXXXX XX XXXX');\n }\n\n ['@test should be able to render an bound helper invocation mixed with static values']() {\n this.registerHelper('surround', ([prefix, value, suffix]) => `${prefix}-${value}-${suffix}`);\n this.render((0, _internalTestHelpers.strip)`\n {{unbound (surround this.model.prefix this.model.value \"bar\")}} {{surround this.model.prefix this.model.value \"bar\"}} {{unbound (surround \"bar\" this.model.value this.model.suffix)}} {{surround \"bar\" this.model.value this.model.suffix}}`, {\n model: {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n }\n });\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.setProperties)(this.context.model, {\n prefix: 'beforeChanged',\n value: 'coreChanged',\n suffix: 'afterChanged'\n });\n });\n this.assertText('before-core-bar beforeChanged-coreChanged-bar bar-core-after bar-coreChanged-afterChanged');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'model', {\n prefix: 'before',\n value: 'core',\n suffix: 'after'\n });\n });\n this.assertText('before-core-bar before-core-bar bar-core-after bar-core-after');\n }\n\n ['@test should be able to render unbound forms of multi-arg helpers']() {\n this.registerHelper('fauxconcat', params => params.join(''));\n this.render(`{{fauxconcat this.model.foo this.model.bar this.model.bing}} {{unbound (fauxconcat this.model.foo this.model.bar this.model.bing)}}`, {\n model: {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }\n });\n this.assertText('abc abc');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('abc abc');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.bar', 'X'));\n this.assertText('aXc abc');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: 'a',\n bar: 'b',\n bing: 'c'\n }));\n this.assertText('abc abc');\n }\n\n async ['@test should be able to render an unbound helper invocation for helpers with dependent keys']() {\n this.registerHelper('capitalizeName', {\n destroy() {\n this.removeObserver('value.firstName', this, this.recompute);\n\n this._super(...arguments);\n },\n\n compute([value]) {\n if (this.value) {\n this.removeObserver('value.firstName', this, this.recompute);\n }\n\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n return value ? (0, _metal.get)(value, 'firstName').toUpperCase() : '';\n }\n\n });\n this.registerHelper('concatNames', {\n destroy() {\n this.teardown();\n\n this._super(...arguments);\n },\n\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n\n compute([value]) {\n if (this.value) {\n this.teardown();\n }\n\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n this.addObserver('value.lastName', this, this.recompute);\n return (value ? (0, _metal.get)(value, 'firstName') : '') + (value ? (0, _metal.get)(value, 'lastName') : '');\n }\n\n });\n this.render(`{{capitalizeName this.person}} {{unbound (capitalizeName this.person)}} {{concatNames this.person}} {{unbound (concatNames this.person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n }\n\n ['@test should be able to render an unbound helper invocation in #each helper']() {\n this.registerHelper('capitalize', params => params[0].toUpperCase());\n this.render(`{{#each this.people as |person|}}{{capitalize person.firstName}} {{unbound (capitalize person.firstName)}}{{/each}}`, {\n people: (0, _runtime.A)([{\n firstName: 'shooby',\n lastName: 'taylor'\n }, {\n firstName: 'cindy',\n lastName: 'taylor'\n }])\n });\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n (0, _internalTestHelpers.runTask)(() => this.context.people.setEach('firstName', 'chad'));\n this.assertText('CHAD SHOOBYCHAD CINDY');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'people', (0, _runtime.A)([{\n firstName: 'shooby',\n lastName: 'taylor'\n }, {\n firstName: 'cindy',\n lastName: 'taylor'\n }])));\n this.assertText('SHOOBY SHOOBYCINDY CINDY');\n }\n\n async ['@test should be able to render an unbound helper invocation with bound hash options']() {\n this.registerHelper('capitalizeName', {\n destroy() {\n this.removeObserver('value.firstName', this, this.recompute);\n\n this._super(...arguments);\n },\n\n compute([value]) {\n if (this.value) {\n this.removeObserver('value.firstName', this, this.recompute);\n }\n\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n return value ? (0, _metal.get)(value, 'firstName').toUpperCase() : '';\n }\n\n });\n this.registerHelper('concatNames', {\n destroy() {\n this.teardown();\n\n this._super(...arguments);\n },\n\n teardown() {\n this.removeObserver('value.firstName', this, this.recompute);\n this.removeObserver('value.lastName', this, this.recompute);\n },\n\n compute([value]) {\n if (this.value) {\n this.teardown();\n }\n\n this.set('value', value);\n this.addObserver('value.firstName', this, this.recompute);\n this.addObserver('value.lastName', this, this.recompute);\n return (value ? (0, _metal.get)(value, 'firstName') : '') + (value ? (0, _metal.get)(value, 'lastName') : '');\n }\n\n });\n this.render(`{{capitalizeName this.person}} {{unbound (capitalizeName this.person)}} {{concatNames this.person}} {{unbound (concatNames this.person)}}`, {\n person: {\n firstName: 'shooby',\n lastName: 'taylor'\n }\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'person.firstName', 'sally'));\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertText('SALLY SHOOBY sallytaylor shoobytaylor');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'person', {\n firstName: 'shooby',\n lastName: 'taylor'\n }));\n this.assertText('SHOOBY SHOOBY shoobytaylor shoobytaylor');\n }\n\n ['@test should be able to render bound form of a helper inside unbound form of same helper']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#if (unbound this.model.foo)}}\n {{#if this.model.bar}}true{{/if}}\n {{#unless this.model.bar}}false{{/unless}}\n {{/if}}\n {{#unless (unbound this.model.notfoo)}}\n {{#if this.model.bar}}true{{/if}}\n {{#unless this.model.bar}}false{{/unless}}\n {{/unless}}`, {\n model: {\n foo: true,\n notfoo: false,\n bar: true\n }\n });\n this.assertText('truetrue');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('truetrue');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.bar', false));\n this.assertText('falsefalse');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n foo: true,\n notfoo: false,\n bar: true\n }));\n this.assertText('truetrue');\n }\n\n ['@test yielding unbound does not update']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n fooBarInstance = this;\n },\n\n model: {\n foo: 'bork'\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound this.model.foo)}}`\n });\n this.render(`{{#foo-bar as |value|}}{{value}}{{/foo-bar}}`);\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model', {\n foo: 'bork'\n }));\n this.assertText('bork');\n }\n\n ['@test yielding unbound hash does not update']() {\n var fooBarInstance;\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n fooBarInstance = this;\n },\n\n model: {\n foo: 'bork'\n }\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: `{{yield (unbound (hash foo=this.model.foo))}}`\n });\n this.render(`{{#foo-bar as |value|}}{{value.foo}}{{/foo-bar}}`);\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model.foo', 'oof'));\n this.assertText('bork');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(fooBarInstance, 'model', {\n foo: 'bork'\n }));\n this.assertText('bork');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/helpers/yield-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Helpers test: {{yield}} helper', class extends _internalTestHelpers.RenderingTestCase {\n ['@test can yield to a default block']() {\n this.registerComponent('yield-comp', {\n template: '[In layout:] {{yield}}'\n });\n this.render('{{#yield-comp}}[In Block:] {{this.object.title}}{{/yield-comp}}', {\n object: {\n title: 'Seattle'\n }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object', {\n title: 'Seattle'\n }));\n this.assertText('[In layout:] [In Block:] Seattle');\n }\n\n ['@feature(EMBER_NAMED_BLOCKS) can yield to a named block']() {\n // This test fails when the default Ember component backing class is used:\n this.registerComponent('yield-comp', {\n template: '[In layout:] {{yield to=\"block\"}}' // It passes with no backing class:\n // ComponentClass: null,\n // And it passes using `GlimmerishComponent`:\n // ComponentClass: require('../../utils/glimmerish-component').default,\n\n });\n this.render('<:block>[In block:] {{this.object.title}} ', {\n object: {\n title: 'Seattle'\n }\n });\n this.assertText('[In layout:] [In block:] Seattle');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In block:] Vancouver');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object', {\n title: 'Seattle'\n }));\n this.assertText('[In layout:] [In block:] Seattle');\n }\n\n ['@feature(EMBER_NAMED_BLOCKS) <:else> and <:inverse> named blocks']() {\n this.registerComponent('yielder', {\n template: '[:else][{{has-block \"else\"}}][{{yield to=\"else\"}}]' + '[:inverse][{{has-block \"inverse\"}}][{{yield to=\"inverse\"}}]'\n });\n this.render('[ ]' + '[<:else>Hello ]' + '[<:inverse>Goodbye ]');\n this.assertText('[[:else][false][][:inverse][false][]]' + '[[:else][true][Hello][:inverse][true][Hello]]' + '[[:else][true][Goodbye][:inverse][true][Goodbye]]');\n this.assertStableRerender();\n }\n\n ['@test templates should yield to block inside a nested component']() {\n this.registerComponent('outer-comp', {\n template: '[In layout:] {{yield}}
'\n });\n this.registerComponent('inner-comp', {\n template: '{{#outer-comp}}[In Block:] {{this.object.title}}{{/outer-comp}}'\n });\n this.render('{{inner-comp object=this.object}}', {\n object: {\n title: 'Seattle'\n }\n });\n this.assertText('[In layout:] [In Block:] Seattle');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object.title', 'Vancouver'));\n this.assertText('[In layout:] [In Block:] Vancouver');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'object', {\n title: 'Seattle'\n }));\n this.assertText('[In layout:] [In Block:] Seattle');\n }\n\n ['@test templates should yield to block, when the yield is embedded in a each helper']() {\n var list = [1, 2, 3];\n this.registerComponent('outer-comp', {\n template: '{{#each this.list as |item|}}{{yield}}{{/each}}'\n });\n this.render('{{#outer-comp list=this.list}}Hello{{/outer-comp}}', {\n list: list\n });\n this.assertText('HelloHelloHello');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'list', [4, 5]));\n this.assertText('HelloHello');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'list', list));\n this.assertText('HelloHelloHello');\n }\n\n ['@test templates should yield to block, when the yield is embedded in a if helper']() {\n this.registerComponent('outer-comp', {\n template: '{{#if this.boolean}}{{yield}}{{/if}}'\n });\n this.render('{{#outer-comp boolean=this.boolean}}Hello{{/outer-comp}}', {\n boolean: true\n });\n this.assertText('Hello');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boolean', false));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boolean', true));\n this.assertText('Hello');\n }\n\n ['@test simple curlies inside of a yielded block should work when the yield is nested inside of another view']() {\n this.registerComponent('kiwi-comp', {\n template: '{{#if this.falsy}}{{else}}{{yield}}{{/if}}'\n });\n this.render('{{#kiwi-comp}}{{this.text}}{{/kiwi-comp}}', {\n text: 'ohai'\n });\n this.assertText('ohai');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'ohai'));\n this.assertText('ohai');\n }\n\n ['@test nested simple curlies inside of a yielded block should work when the yield is nested inside of another view']() {\n this.registerComponent('parent-comp', {\n template: '{{#if this.falsy}}{{else}}{{yield}}{{/if}}'\n });\n this.registerComponent('child-comp', {\n template: '{{#if this.falsy}}{{else}}{{this.text}}{{/if}}'\n });\n this.render('{{#parent-comp}}{{child-comp text=this.text}}{{/parent-comp}}', {\n text: 'ohai'\n });\n this.assertText('ohai');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'portland'));\n this.assertText('portland');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'ohai'));\n this.assertText('ohai');\n }\n\n ['@test yielding to a non-existent block is not an error']() {\n this.registerComponent('yielding-comp', {\n template: 'Hello:{{yield}}'\n });\n this.registerComponent('outer-comp', {\n template: '{{yielding-comp}} {{this.title}}'\n });\n this.render('{{outer-comp title=this.title}}', {\n title: 'Mr. Selden'\n });\n this.assertText('Hello: Mr. Selden');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'title', 'Mr. Chag'));\n this.assertText('Hello: Mr. Chag');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'title', 'Mr. Selden'));\n this.assertText('Hello: Mr. Selden');\n }\n\n ['@test yield uses the original context']() {\n var KiwiCompComponent = _helpers.Component.extend({\n boundText: 'Inner'\n });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '{{this.boundText}}
{{yield}}
'\n });\n this.render('{{#kiwi-comp}}{{this.boundText}}{{/kiwi-comp}}', {\n boundText: 'Original'\n });\n this.assertText('InnerOriginal');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Original'));\n this.assertText('InnerOriginal');\n }\n\n [\"@test outer block param doesn't mask inner component property\"]() {\n var KiwiCompComponent = _helpers.Component.extend({\n boundText: 'Inner'\n });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '{{this.boundText}}
{{yield}}
'\n });\n this.render('{{#let this.boundText as |item|}}{{#kiwi-comp}}{{item}}{{/kiwi-comp}}{{/let}}', {\n boundText: 'Outer'\n });\n this.assertText('InnerOuter');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Otherworld'));\n this.assertText('InnerOtherworld');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Outer'));\n this.assertText('InnerOuter');\n }\n\n [\"@test inner block param doesn't mask yield property\"]() {\n var KiwiCompComponent = _helpers.Component.extend({\n boundText: 'Inner'\n });\n\n this.registerComponent('kiwi-comp', {\n ComponentClass: KiwiCompComponent,\n template: '{{#let this.boundText as |item|}}{{item}}
{{yield}}
{{/let}}'\n });\n this.render('{{#kiwi-comp}}{{this.item}}{{/kiwi-comp}}', {\n item: 'Outer'\n });\n this.assertText('InnerOuter');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'item', 'Otherworld'));\n this.assertText('InnerOtherworld');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'item', 'Outer'));\n this.assertText('InnerOuter');\n }\n\n ['@test can bind a block param to a component and use it in yield']() {\n this.registerComponent('kiwi-comp', {\n template: '{{this.content}}
{{yield}}
'\n });\n this.render('{{#let this.boundText as |item|}}{{#kiwi-comp content=item}}{{item}}{{/kiwi-comp}}{{/let}}', {\n boundText: 'Outer'\n });\n this.assertText('OuterOuter');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Update'));\n this.assertText('UpdateUpdate');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'Outer'));\n this.assertText('OuterOuter');\n } // INUR not need with no data update\n\n\n ['@test yield should not introduce a view'](assert) {\n var ParentCompComponent = _helpers.Component.extend({\n isParentComponent: true\n });\n\n var ChildCompComponent = _helpers.Component.extend({\n didReceiveAttrs() {\n this._super();\n\n var parentView = this.get('parentView');\n assert.ok(parentView.get('isParentComponent'));\n }\n\n });\n\n this.registerComponent('parent-comp', {\n ComponentClass: ParentCompComponent,\n template: '{{yield}}'\n });\n this.registerComponent('child-comp', {\n ComponentClass: ChildCompComponent\n });\n this.render('{{#parent-comp}}{{child-comp}}{{/parent-comp}}');\n }\n\n ['@test yield with nested components (#3220)']() {\n this.registerComponent('inner-component', {\n template: '{{yield}}'\n });\n this.registerComponent('outer-component', {\n template: '{{#inner-component}}{{yield}} {{/inner-component}}'\n });\n this.render('{{#outer-component}}Hello {{this.boundText}}{{/outer-component}}', {\n boundText: 'world'\n });\n this.assertText('Hello world');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'update'));\n this.assertText('Hello update');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'boundText', 'world'));\n this.assertText('Hello world');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/input-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Input element tests', class extends _internalTestHelpers.RenderingTestCase {\n runAttributeTest(attributeName, values) {\n var template = ` `;\n this.render(template, {\n value: values[0]\n });\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on initial render`);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} is set on noop rerender`);\n this.setComponentValue(values[1]);\n this.assertAttributeHasValue(attributeName, values[1], `${attributeName} is set on rerender`);\n this.setComponentValue(values[0]);\n this.assertAttributeHasValue(attributeName, values[0], `${attributeName} can be set back to the initial value`);\n }\n\n runPropertyTest(propertyName, values) {\n var attributeName = propertyName;\n var template = ` `;\n this.render(template, {\n value: values[0]\n });\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on initial render`);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} is set on noop rerender`);\n this.setComponentValue(values[1]);\n this.assertPropertyHasValue(propertyName, values[1], `${propertyName} is set on rerender`);\n this.setComponentValue(values[0]);\n this.assertPropertyHasValue(propertyName, values[0], `${propertyName} can be set back to the initial value`);\n }\n\n runFalsyValueProperty(values) {\n var value = 'value';\n var template = ` `;\n this.render(template, {\n value: values[0]\n });\n this.assertPropertyHasValue(value, '', `${value} is set on initial render`);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertPropertyHasValue(value, '', `${value} is set on noop rerender`);\n this.setComponentValue(values[1]);\n this.assertPropertyHasValue(value, values[1], `${value} is set on rerender`);\n this.setComponentValue(values[0]);\n this.assertPropertyHasValue(value, '', `${value} can be set back to the initial value`);\n }\n\n ['@test input disabled attribute']() {\n var model = {\n model: {\n value: false\n }\n };\n this.render(` `, model);\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n (0, _internalTestHelpers.runTask)(() => this.context.set('model.value', true));\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(' '); // Note the DOM output is \n\n (0, _internalTestHelpers.runTask)(() => this.context.set('model.value', 'wat'));\n this.assert.equal(this.$inputElement().prop('disabled'), true);\n this.assertHTML(' '); // Note the DOM output is \n\n (0, _internalTestHelpers.runTask)(() => this.context.set('model', {\n value: false\n }));\n this.assert.equal(this.$inputElement().prop('disabled'), false);\n this.assertHTML(' ');\n }\n\n ['@test input value attribute']() {\n this.runPropertyTest('value', ['foo', 'bar']);\n }\n\n ['@test input placeholder attribute']() {\n this.runAttributeTest('placeholder', ['foo', 'bar']);\n }\n\n ['@test input name attribute']() {\n this.runAttributeTest('name', ['nam', 'name']);\n }\n\n ['@test input maxlength attribute']() {\n this.runAttributeTest('maxlength', [2, 3]);\n }\n\n ['@test input size attribute']() {\n this.runAttributeTest('size', [2, 3]);\n }\n\n ['@test input tabindex attribute']() {\n this.runAttributeTest('tabindex', [2, 3]);\n }\n\n ['@test null input value']() {\n this.runFalsyValueProperty([null, 'hello']);\n }\n\n ['@test undefined input value']() {\n this.runFalsyValueProperty([undefined, 'hello']);\n }\n\n ['@test undefined `toString` method as input value']() {\n this.runFalsyValueProperty([Object.create(null), 'hello']);\n }\n\n ['@test cursor position is not lost when updating content']() {\n var template = ` `;\n this.render(template, {\n value: 'hola'\n });\n this.setDOMValue('hello');\n this.setSelectionRange(1, 3);\n this.setComponentValue('hello');\n this.assertSelectionRange(1, 3); // Note: We should eventually get around to testing reseting, however\n // browsers handle `selectionStart` and `selectionEnd` differently\n // when are synthetically testing movement of the cursor.\n }\n\n ['@test input can be updated multiple times']() {\n var template = ` `;\n this.render(template, {\n value: 'hola'\n });\n this.assertValue('hola', 'Value is initialised');\n this.setComponentValue('');\n this.assertValue('', 'Value is set in the DOM');\n this.setDOMValue('hola');\n this.setComponentValue('hola');\n this.assertValue('hola', 'Value is updated the first time');\n this.setComponentValue('');\n this.assertValue('', 'Value is updated the second time');\n }\n\n ['@test DOM is SSOT if value is set']() {\n var template = ` `;\n this.render(template, {\n value: 'hola'\n });\n this.assertValue('hola', 'Value is initialised');\n this.setComponentValue('hello');\n this.assertValue('hello', 'Value is initialised');\n this.setDOMValue('hola');\n this.assertValue('hola', 'DOM is used');\n this.setComponentValue('bye');\n this.assertValue('bye', 'Value is used'); // Simulates setting the input to the same value as it already is which won't cause a rerender\n\n this.setDOMValue('hola');\n this.assertValue('hola', 'DOM is used');\n this.setComponentValue('hola');\n this.assertValue('hola', 'Value is used');\n }\n\n ['@test GH18211 input checked attribute, without a value, works with the action helper']() {\n this.render(` `, {\n actions: {\n someAction() {}\n\n }\n });\n this.assertPropertyHasValue('checked', true);\n }\n\n ['@test GH18211 input checked attribute, with a value, works with the action helper']() {\n this.render(` `, {\n actions: {\n someAction() {}\n\n }\n });\n this.assertPropertyHasValue('checked', true);\n }\n\n ['@test GH18211 input checked attribute, without a value, works with attributes with values']() {\n this.render(` `, {\n actions: {\n someAction() {}\n\n }\n });\n this.assertPropertyHasValue('checked', true);\n }\n\n ['@test GH18211 input checked attribute, without a value, works with event attributes']() {\n this.render(` `, {\n actions: {\n someAction() {}\n\n }\n });\n this.assertPropertyHasValue('checked', true);\n } // private helpers and assertions\n\n\n setDOMValue(value) {\n this.inputElement().value = value;\n }\n\n setComponentValue(value) {\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'value', value));\n }\n\n setSelectionRange(start, end) {\n this.inputElement().selectionStart = start;\n this.inputElement().selectionEnd = end;\n }\n\n inputElement() {\n return this.$inputElement()[0];\n }\n\n $inputElement() {\n return this.$('input');\n }\n\n assertValue(value, message) {\n this.assertPropertyHasValue('value', value, message);\n }\n\n assertAttributeHasValue(attribute, value, message) {\n this.assert.equal(this.$inputElement().attr(attribute), value, `${attribute} ${message}`);\n }\n\n assertPropertyHasValue(property, value, message) {\n this.assert.equal(this.$inputElement().prop(property), value, `${property} ${message}`);\n }\n\n assertSelectionRange(start, end) {\n this.assert.equal(this.inputElement().selectionStart, start);\n this.assert.equal(this.inputElement().selectionEnd, end);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/modifiers/on-test\", [\"internal-test-helpers\", \"@ember/-internals/browser-environment\", \"@glimmer/manager\", \"@glimmer/runtime\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _browserEnvironment, _manager, _runtime, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('{{on}} Modifier', class extends _internalTestHelpers.RenderingTestCase {\n beforeEach() {\n // might error if getOnManagerInstance fails\n this.startingCounters = this.getOnManagerInstance().counters;\n }\n\n getOnManagerInstance() {\n // leveraging private APIs, this can be deleted if these APIs change\n // but it has been useful to verify some internal details\n return (0, _manager.getInternalModifierManager)(_runtime.on);\n }\n\n assertCounts(expected) {\n var {\n counters\n } = this.getOnManagerInstance();\n this.assert.deepEqual(counters, {\n adds: expected.adds + this.startingCounters.adds,\n removes: expected.removes + this.startingCounters.removes\n }, `counters have incremented by ${JSON.stringify(expected)}`);\n }\n\n '@test SUPPORTS_EVENT_OPTIONS is correct (private API usage)'(assert) {\n var manager = this.getOnManagerInstance();\n var {\n SUPPORTS_EVENT_OPTIONS\n } = manager;\n\n if (_browserEnvironment.isChrome || _browserEnvironment.isFirefox) {\n assert.strictEqual(SUPPORTS_EVENT_OPTIONS, true, 'is true in chrome and firefox');\n } else {\n assert.expect(0);\n }\n }\n\n ['@test it adds an event listener'](assert) {\n var count = 0;\n this.render('Click Me ', {\n callback() {\n count++;\n }\n\n });\n assert.equal(count, 0, 'not called on initial render');\n this.assertStableRerender();\n this.assertCounts({\n adds: 1,\n removes: 0\n });\n assert.equal(count, 0, 'not called on a rerender');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 1, 'has been called 1 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 2, 'has been called 2 times');\n this.assertCounts({\n adds: 1,\n removes: 0\n });\n }\n\n '@test passes the event to the listener'(assert) {\n var event;\n this.render('Click Me ', {\n callback(evt) {\n event = evt;\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.strictEqual(event.target, this.element.querySelector('button'), 'has a valid event with a target');\n this.assertCounts({\n adds: 1,\n removes: 0\n });\n }\n\n '@test the listener callback is bound'(assert) {\n var first = 0;\n var second = 0;\n\n var firstCallback = () => first++;\n\n var secondCallback = () => second++;\n\n this.render('Click Me ', {\n callback: firstCallback\n });\n assert.equal(first, 0, 'precond - first not called on initial render');\n assert.equal(second, 0, 'precond - second not called on initial render');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(first, 1, 'first has been called 1 time');\n assert.equal(second, 0, 'second not called on initial render');\n (0, _internalTestHelpers.runTask)(() => this.context.set('callback', secondCallback));\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(first, 1, 'first has been called 1 time');\n assert.equal(second, 1, 'second has been called 1 times');\n this.assertCounts({\n adds: 2,\n removes: 1\n });\n }\n\n '@test setting once named argument ensures the callback is only called once'(assert) {\n var count = 0;\n this.render('Click Me ', {\n callback() {\n count++;\n }\n\n });\n assert.equal(count, 0, 'not called on initial render');\n this.assertStableRerender();\n assert.equal(count, 0, 'not called on a rerender');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 1, 'has been called 1 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 1, 'has been called 1 times');\n this.assertCounts({\n adds: 1,\n removes: 0\n });\n }\n\n '@test changing from `once=false` to `once=true` ensures the callback can only be called once'(assert) {\n var count = 0;\n this.render('Click Me ', {\n callback() {\n count++;\n },\n\n once: false\n });\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 1, 'has been called 1 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 2, 'has been called 2 times');\n (0, _internalTestHelpers.runTask)(() => this.context.set('once', true));\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 3, 'has been called 3 time');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 3, 'is not called again');\n this.assertCounts({\n adds: 2,\n removes: 1\n });\n }\n\n '@test by default bubbling is used (capture: false)'(assert) {\n this.render(`\n \n `, {\n handleOuterClick() {\n assert.step('outer clicked');\n },\n\n handleInnerClick() {\n assert.step('inner clicked');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.$('.inner').click());\n assert.verifySteps(['inner clicked', 'outer clicked'], 'uses capture: false by default');\n }\n\n '@test specifying capture named argument uses capture semantics'(assert) {\n this.render(`\n \n `, {\n handleOuterClick() {\n assert.step('outer clicked');\n },\n\n handleInnerClick() {\n assert.step('inner clicked');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.$('.inner').click());\n assert.verifySteps(['outer clicked', 'inner clicked'], 'capture works');\n }\n\n '@test can use capture and once together'(assert) {\n this.render(`\n \n `, {\n handleOuterClick() {\n assert.step('outer clicked');\n },\n\n handleInnerClick() {\n assert.step('inner clicked');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.$('.inner').click());\n assert.verifySteps(['outer clicked', 'inner clicked'], 'capture works');\n (0, _internalTestHelpers.runTask)(() => this.$('.inner').click());\n assert.verifySteps(['inner clicked'], 'once works');\n }\n\n '@test it removes the modifier when the element is removed'(assert) {\n var count = 0;\n this.render('{{#if this.showButton}}Click Me {{/if}}', {\n callback() {\n count++;\n },\n\n showButton: true\n });\n this.assertCounts({\n adds: 1,\n removes: 0\n });\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(count, 1, 'has been called 1 time');\n (0, _internalTestHelpers.runTask)(() => this.context.set('showButton', false));\n this.assertCounts({\n adds: 1,\n removes: 1\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Rendering test: non-interactive `on` modifier', class extends _internalTestHelpers.RenderingTestCase {\n getBootOptions() {\n return {\n isInteractive: false\n };\n }\n\n beforeEach() {\n // might error if getOnManagerInstance fails\n this.startingCounters = this.getOnManagerInstance().counters;\n }\n\n getOnManagerInstance() {\n // leveraging private APIs, this can be deleted if these APIs change\n // but it has been useful to verify some internal details\n return (0, _manager.getInternalModifierManager)(_runtime.on);\n }\n\n assertCounts(expected) {\n var {\n counters\n } = this.getOnManagerInstance();\n this.assert.deepEqual(counters, {\n adds: expected.adds + this.startingCounters.adds,\n removes: expected.removes + this.startingCounters.removes\n }, `counters have incremented by ${JSON.stringify(expected)}`);\n }\n\n [`@test doesn't trigger lifecycle hooks when non-interactive`](assert) {\n this.registerComponent('foo-bar2', {\n ComponentClass: _helpers.Component.extend({\n tagName: '',\n\n fire() {\n assert.ok(false);\n }\n\n }),\n template: `Fire! `\n });\n this.render('{{#if this.showButton}} {{/if}}', {\n showButton: true\n });\n this.assertHTML('Fire! ');\n this.assertCounts({\n adds: 0,\n removes: 0\n });\n this.$('button').click();\n (0, _internalTestHelpers.runTask)(() => this.context.set('showButton', false));\n this.assertCounts({\n adds: 0,\n removes: 0\n });\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/mount-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"@ember/controller\", \"@ember/engine\", \"@ember/-internals/glimmer/tests/utils/debug-stack\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _metal, _owner, _controller, _engine, _debugStack, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('{{mount}} single param assertion', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it asserts that only a single param is passed']() {\n expectAssertion(() => {\n this.render('{{mount \"chat\" \"foo\"}}');\n }, /You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}./i);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('{{mount}} assertions', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it asserts when an invalid engine name is provided']() {\n expectAssertion(() => {\n this.render('{{mount this.engineName}}', {\n engineName: {}\n });\n }, /Invalid engine name '\\[object Object\\]' specified, engine name must be either a string, null or undefined./i);\n }\n\n ['@test it asserts that the specified engine is registered']() {\n expectAssertion(() => {\n this.render('{{mount \"chat\"}}');\n }, /You used `{{mount 'chat'}}`, but the engine 'chat' can not be found./i);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('{{mount}} test', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n var engineRegistrations = this.engineRegistrations = {};\n this.add('engine:chat', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n Object.keys(engineRegistrations).forEach(fullName => {\n this.register(fullName, engineRegistrations[fullName]);\n });\n }\n\n }));\n this.addTemplate('index', '{{mount \"chat\"}}');\n }\n\n ['@test it boots an engine, instantiates its application controller, and renders its application template'](assert) {\n this.engineRegistrations['template:application'] = (0, _helpers.compile)('Chat here, {{this.username}} ', {\n moduleName: 'my-app/templates/application.hbs'\n });\n var controller;\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n username: 'dgeb',\n\n init() {\n this._super();\n\n controller = this;\n }\n\n });\n return this.visit('/').then(() => {\n assert.ok(controller, \"engine's application controller has been instantiated\");\n var engineInstance = (0, _owner.getOwner)(controller);\n assert.strictEqual((0, _engine.getEngineParent)(engineInstance), this.applicationInstance, 'engine instance has the application instance as its parent');\n this.assertInnerHTML('Chat here, dgeb ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'username', 'chancancode'));\n this.assertInnerHTML('Chat here, chancancode ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'username', 'dgeb'));\n this.assertInnerHTML('Chat here, dgeb ');\n });\n }\n\n async ['@test it emits a useful backtracking re-render assertion message'](assert) {\n this.router.map(function () {\n this.route('route-with-mount');\n });\n this.addTemplate('index', '');\n this.addTemplate('route-with-mount', '{{mount \"chat\"}}');\n this.engineRegistrations['template:application'] = (0, _helpers.compile)('hi {{this.person.name}} [{{component-with-backtracking-set person=this.person}}]', {\n moduleName: 'my-app/templates/application.hbs'\n });\n this.engineRegistrations['controller:application'] = _controller.default.extend({\n person: {\n name: 'Alex',\n\n toString() {\n return `Person (${this.name})`;\n }\n\n }\n });\n this.engineRegistrations['template:components/component-with-backtracking-set'] = (0, _helpers.compile)('[component {{person.name}}]', {\n moduleName: 'my-app/templates/components/component-with-backtracking-set.hbs'\n });\n this.engineRegistrations['component:component-with-backtracking-set'] = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n this.set('person.name', 'Ben');\n }\n\n });\n var expectedBacktrackingMessage = (0, _debugStack.backtrackingMessageFor)('name', 'Person \\\\(Ben\\\\)', {\n renderTree: ['application', 'route-with-mount', 'chat', 'this.person.name']\n });\n await this.visit('/');\n return assert.rejectsAssertion(this.visit('/route-with-mount'), expectedBacktrackingMessage);\n }\n\n ['@test it renders with a bound engine name']() {\n this.router.map(function () {\n this.route('bound-engine-name');\n });\n var controller;\n this.add('controller:bound-engine-name', _controller.default.extend({\n engineName: null,\n\n init() {\n this._super();\n\n controller = this;\n }\n\n }));\n this.addTemplate('bound-engine-name', '{{mount this.engineName}}');\n this.add('engine:foo', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n this.register('template:application', (0, _helpers.compile)('Foo Engine ', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n\n }));\n this.add('engine:bar', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n this.register('template:application', (0, _helpers.compile)('Bar Engine ', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n\n }));\n return this.visit('/bound-engine-name').then(() => {\n this.assertInnerHTML('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n this.assertInnerHTML('Foo Engine ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', undefined));\n this.assertInnerHTML('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n this.assertInnerHTML('Foo Engine ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', 'bar'));\n this.assertInnerHTML('Bar Engine ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', 'foo'));\n this.assertInnerHTML('Foo Engine ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'engineName', null));\n this.assertInnerHTML('');\n });\n }\n\n ['@test it declares the event dispatcher as a singleton']() {\n this.router.map(function () {\n this.route('engine-event-dispatcher-singleton');\n });\n var controller;\n var component;\n this.add('controller:engine-event-dispatcher-singleton', _controller.default.extend({\n init() {\n this._super(...arguments);\n\n controller = this;\n }\n\n }));\n this.addTemplate('engine-event-dispatcher-singleton', '{{mount \"foo\"}}');\n this.add('engine:foo', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n this.register('template:application', (0, _helpers.compile)('Foo Engine: {{tagless-component}} ', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n this.register('component:tagless-component', _helpers.Component.extend({\n tagName: '',\n\n init() {\n this._super(...arguments);\n\n component = this;\n }\n\n }));\n this.register('template:components/tagless-component', (0, _helpers.compile)('Tagless Component', {\n moduleName: 'my-app/templates/components/tagless-component.hbs'\n }));\n }\n\n }));\n return this.visit('/engine-event-dispatcher-singleton').then(() => {\n this.assertInnerHTML('Foo Engine: Tagless Component ');\n var controllerOwnerEventDispatcher = (0, _owner.getOwner)(controller).lookup('event_dispatcher:main');\n var taglessComponentOwnerEventDispatcher = (0, _owner.getOwner)(component).lookup('event_dispatcher:main');\n this.assert.strictEqual(controllerOwnerEventDispatcher, taglessComponentOwnerEventDispatcher);\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('{{mount}} params tests', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.add('engine:paramEngine', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n this.register('template:application', (0, _helpers.compile)('Param Engine: {{@model.foo}} ', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n\n }));\n }\n\n ['@test it renders with static parameters']() {\n this.router.map(function () {\n this.route('engine-params-static');\n });\n this.addTemplate('engine-params-static', '{{mount \"paramEngine\" model=(hash foo=\"bar\")}}');\n return this.visit('/engine-params-static').then(() => {\n this.assertInnerHTML('Param Engine: bar ');\n });\n }\n\n ['@test it renders with bound parameters']() {\n this.router.map(function () {\n this.route('engine-params-bound');\n });\n var controller;\n this.add('controller:engine-params-bound', _controller.default.extend({\n boundParamValue: null,\n\n init() {\n this._super();\n\n controller = this;\n }\n\n }));\n this.addTemplate('engine-params-bound', '{{mount \"paramEngine\" model=(hash foo=this.boundParamValue)}}');\n return this.visit('/engine-params-bound').then(() => {\n this.assertInnerHTML('Param Engine: ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n this.assertInnerHTML('Param Engine: bar ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', undefined));\n this.assertInnerHTML('Param Engine: ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n this.assertInnerHTML('Param Engine: bar ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', 'baz'));\n this.assertInnerHTML('Param Engine: baz ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', 'bar'));\n this.assertInnerHTML('Param Engine: bar ');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(controller, 'boundParamValue', null));\n this.assertInnerHTML('Param Engine: ');\n });\n }\n\n ['@test it renders contextual components passed as parameter values']() {\n this.router.map(function () {\n this.route('engine-params-contextual-component');\n });\n this.addComponent('foo-component', {\n template: `foo-component rendered! - {{app-bar-component}}`\n });\n this.addComponent('app-bar-component', {\n ComponentClass: _helpers.Component.extend({\n tagName: ''\n }),\n template: 'rendered app-bar-component from the app'\n });\n this.add('engine:componentParamEngine', _engine.default.extend({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init() {\n this._super(...arguments);\n\n this.register('template:application', (0, _helpers.compile)('{{@model.foo}}', {\n moduleName: 'my-app/templates/application.hbs'\n }));\n }\n\n }));\n this.addTemplate('engine-params-contextual-component', '{{mount \"componentParamEngine\" model=(hash foo=(component \"foo-component\"))}}');\n return this.visit('/engine-params-contextual-component').then(() => {\n this.assertComponentElement(this.firstChild, {\n content: 'foo-component rendered! - rendered app-bar-component from the app'\n });\n });\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/outlet-test\", [\"internal-test-helpers\"], function (_internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('outlet view', class extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n var CoreOutlet = this.owner.factoryFor('view:-outlet');\n var outletTemplateFactory = this.owner.lookup('template:-outlet');\n var environment = this.owner.lookup('-environment:main');\n this.component = CoreOutlet.create({\n environment,\n template: outletTemplateFactory\n });\n }\n\n ['@test should not error when initial rendered template is undefined']() {\n var outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n (0, _internalTestHelpers.runAppend)(this.component);\n this.assertText('');\n }\n\n ['@test should render the outlet when set after DOM insertion']() {\n var outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n template: undefined\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n (0, _internalTestHelpers.runAppend)(this.component);\n this.assertText('');\n this.registerTemplate('application', 'HI{{outlet}}');\n outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')(this.owner)\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n this.assertText('HI');\n this.assertStableRerender();\n this.registerTemplate('index', 'BYE
');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: {},\n template: this.owner.lookup('template:index')(this.owner)\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n this.assertText('HIBYE');\n }\n\n ['@test should render the outlet when set before DOM insertion']() {\n this.registerTemplate('application', 'HI{{outlet}}');\n var outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: {},\n template: this.owner.lookup('template:application')(this.owner)\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n (0, _internalTestHelpers.runAppend)(this.component);\n this.assertText('HI');\n this.assertStableRerender();\n this.registerTemplate('index', 'BYE
');\n outletState.outlets.main = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: {},\n template: this.owner.lookup('template:index')(this.owner)\n },\n outlets: Object.create(null)\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n this.assertText('HIBYE');\n }\n\n ['@test outletState can pass through user code (liquid-fire initimate API) ']() {\n this.registerTemplate('outer', 'A{{#-with-dynamic-vars outletState=(identity (-get-dynamic-var \"outletState\"))}}B{{outlet}}D{{/-with-dynamic-vars}}E');\n this.registerTemplate('inner', 'C'); // This looks like it doesn't do anything, but its presence\n // guarantees that the outletState gets converted from a reference\n // to a value and then back to a reference. That is what we're\n // testing here.\n\n this.registerHelper('identity', ([a]) => a);\n var outletState = {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'outer',\n controller: {},\n template: this.owner.lookup('template:outer')(this.owner)\n },\n outlets: {\n main: {\n render: {\n owner: this.owner,\n into: undefined,\n outlet: 'main',\n name: 'inner',\n controller: {},\n template: this.owner.lookup('template:inner')(this.owner)\n },\n outlets: Object.create(null)\n }\n }\n };\n (0, _internalTestHelpers.runTask)(() => this.component.setOutletState(outletState));\n (0, _internalTestHelpers.runAppend)(this.component);\n this.assertText('ABCDE');\n this.assertStableRerender();\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/refinements-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('syntax refinements', class extends _internalTestHelpers.RenderingTestCase {\n ['@test block params should not be refined']() {\n this.registerHelper('foo', () => 'bar helper');\n this.render((0, _internalTestHelpers.strip)`\n {{#let this.var as |foo|}}\n {{foo}}\n {{/let}}\n\n ---\n\n {{#let this.var as |outlet|}}\n {{outlet}}\n {{/let}}\n\n ---\n\n {{#let this.var as |mount|}}\n {{mount}}\n {{/let}}\n\n ---\n\n {{#let this.var as |component|}}\n {{component}}\n {{/let}}\n\n ---\n\n {{#let this.var as |input|}}\n {{input}}\n {{/let}}\n\n ---\n\n {{#let this.var as |-with-dynamic-vars|}}\n {{-with-dynamic-vars}}\n {{/let}}\n\n ---\n\n {{#let this.var as |-in-element|}}\n {{-in-element}}\n {{/let}}`, {\n var: 'var'\n });\n this.assertText('var---var---var---var---var---var---var');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'var', 'RARRR!!!'));\n this.assertText('RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!---RARRR!!!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'var', 'var'));\n this.assertText('var---var---var---var---var---var---var');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/render-settled-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@ember/runloop\", \"rsvp\"], function (_internalTestHelpers, _glimmer, _runloop, _rsvp) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('renderSettled', class extends _internalTestHelpers.RenderingTestCase {\n ['@test resolves when no rendering is happening'](assert) {\n return (0, _glimmer.renderSettled)().then(() => {\n assert.ok(true, 'resolved even without rendering');\n });\n }\n\n ['@test resolves renderers exist but no runloops are triggered'](assert) {\n this.render((0, _internalTestHelpers.strip)`{{this.foo}}`, {\n foo: 'bar'\n });\n return (0, _glimmer.renderSettled)().then(() => {\n assert.ok(true, 'resolved even without runloops');\n });\n }\n\n ['@test does not create extraneous promises'](assert) {\n var first = (0, _glimmer.renderSettled)();\n var second = (0, _glimmer.renderSettled)();\n assert.strictEqual(first, second);\n return (0, _rsvp.all)([first, second]);\n }\n\n ['@test resolves when rendering has completed (after property update)']() {\n this.render((0, _internalTestHelpers.strip)`{{this.foo}}`, {\n foo: 'bar'\n });\n this.assertText('bar');\n this.component.set('foo', 'baz');\n this.assertText('bar');\n return (0, _glimmer.renderSettled)().then(() => {\n this.assertText('baz');\n });\n }\n\n ['@test resolves in run loop when renderer has settled'](assert) {\n assert.expect(3);\n this.render((0, _internalTestHelpers.strip)`{{this.foo}}`, {\n foo: 'bar'\n });\n this.assertText('bar');\n var promise;\n return (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', null, () => {\n this.component.set('foo', 'set in actions');\n promise = (0, _glimmer.renderSettled)().then(() => {\n this.assertText('set in afterRender');\n });\n (0, _runloop.schedule)('afterRender', null, () => {\n this.component.set('foo', 'set in afterRender');\n });\n }); // still not updated here\n\n this.assertText('bar');\n return promise;\n });\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/svg-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('SVG element tests', class extends _internalTestHelpers.RenderingTestCase {\n ['@test unquoted viewBox property is output'](assert) {\n var viewBoxString = '0 0 100 100';\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n assert.equal(this.firstChild.getAttribute('svg'), null);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n viewBoxString\n }));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n }\n\n ['@test quoted viewBox property is output'](assert) {\n var viewBoxString = '0 0 100 100';\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.viewBoxString', null));\n assert.equal(this.firstChild.getAttribute('svg'), null);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n viewBoxString\n }));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n }\n\n ['@test quoted viewBox property is concat']() {\n var viewBoxString = '100 100';\n this.render('
', {\n model: {\n viewBoxString\n }\n });\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.viewBoxString', '200 200'));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n viewBoxString\n }));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n }\n\n ['@test class is output']() {\n this.render(\"
\", {\n model: {\n color: 'blue'\n }\n });\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model.color', 'yellow'));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'model', {\n color: 'blue'\n }));\n this.assertInnerHTML((0, _internalTestHelpers.strip)`\n \n \n
\n `);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/each-in-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/-internals/glimmer/tests/utils/shared-conditional-tests\"], function (_internalTestHelpers, _metal, _runtime, _sharedConditionalTests) {\n \"use strict\";\n\n function EmptyFunction() {}\n\n function NonEmptyFunction() {}\n\n NonEmptyFunction.foo = 'bar';\n\n class EmptyConstructor {}\n\n class NonEmptyConstructor {}\n\n NonEmptyConstructor.foo = 'bar';\n\n class TogglingEachInTest extends _sharedConditionalTests.TogglingSyntaxConditionalsTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#each-in ${cond} as |key|}}${truthy}{{else}}${falsy}{{/each-in}}`;\n }\n\n }\n\n class BasicEachInTest extends TogglingEachInTest {}\n\n class BasicSyntaxTest extends BasicEachInTest {\n get truthyValue() {\n return {\n 'Not Empty': 1\n };\n }\n\n get falsyValue() {\n return {};\n }\n\n }\n\n class EachInProxyTest extends TogglingEachInTest {}\n\n (0, _internalTestHelpers.applyMixins)(BasicEachInTest, new _sharedConditionalTests.TruthyGenerator([{\n foo: 1\n }, _runtime.Object.create({\n 'Not Empty': 1\n }), [1], NonEmptyFunction, NonEmptyConstructor]), new _sharedConditionalTests.FalsyGenerator([null, undefined, false, '', 0, [], EmptyFunction, EmptyConstructor, {}, Object.create(null), Object.create({}), Object.create({\n 'Not Empty': 1\n }), _runtime.Object.create()]));\n (0, _internalTestHelpers.applyMixins)(EachInProxyTest, new _sharedConditionalTests.TruthyGenerator([_runtime.ObjectProxy.create({\n content: {\n 'Not empty': 1\n }\n })]), new _sharedConditionalTests.FalsyGenerator([_runtime.ObjectProxy.create(), _runtime.ObjectProxy.create({\n content: null\n }), _runtime.ObjectProxy.create({\n content: {}\n }), _runtime.ObjectProxy.create({\n content: Object.create(null)\n }), _runtime.ObjectProxy.create({\n content: Object.create({})\n }), _runtime.ObjectProxy.create({\n content: Object.create({\n 'Not Empty': 1\n })\n }), _runtime.ObjectProxy.create({\n content: _runtime.Object.create()\n })])); // Truthy/Falsy tests\n\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with `ObjectProxy`', class extends EachInProxyTest {\n get truthyValue() {\n return _runtime.ObjectProxy.create({\n content: {\n 'Not Empty': 1\n }\n });\n }\n\n get falsyValue() {\n return _runtime.ObjectProxy.create({\n content: null\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}}', BasicSyntaxTest); // Rendering tests\n\n class AbstractEachInTest extends _internalTestHelpers.RenderingTestCase {\n createHash()\n /* hash */\n {\n throw new Error('Not implemented: `createHash`');\n }\n\n makeHash(obj) {\n var {\n hash,\n delegate\n } = this.createHash(obj);\n this.hash = hash;\n this.delegate = delegate;\n return hash;\n }\n\n replaceHash(hash) {\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'hash', this.createHash(hash).hash));\n }\n\n clear() {\n return (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'hash', this.createHash({}).hash));\n }\n\n setProp(key, value) {\n return (0, _internalTestHelpers.runTask)(() => this.delegate.setProp(this.context, key, value));\n }\n\n updateNestedValue(key, innerKey, value) {\n return (0, _internalTestHelpers.runTask)(() => this.delegate.updateNestedValue(this.context, key, innerKey, value));\n }\n\n render(template, context = {}) {\n if (this.hash !== undefined) {\n context.hash = this.hash;\n }\n\n if (this.type !== undefined) {\n context.type = this.type;\n }\n\n context.secretKey = 'asd';\n return super.render(template, context);\n }\n\n }\n\n class EachInTest extends AbstractEachInTest {\n [`@test it repeats the given block for each item in the hash`]() {\n this.makeHash({\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n this.render(`{{#each-in this.hash as |category count|}}{{category}}: {{count}} {{else}}Empty!{{/each-in}} `);\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n // Not al backing data structures allow kvo tracking. Maps and Iterables don't\n this.setProp('Tweets', 100);\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n this.clear();\n this.assertText('Empty!');\n }\n\n [`@test it can render sub-paths of each item`](assert) {\n this.makeHash({\n Smartphones: {\n reports: {\n unitsSold: 8203\n }\n },\n 'JavaScript Frameworks': {\n reports: {\n unitsSold: Infinity\n }\n }\n });\n this.render(`{{#each-in this.hash as |category data|}}{{category}}: {{data.reports.unitsSold}} {{else}}Empty!{{/each-in}} `);\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n this.setProp('Tweets', {\n reports: {\n unitsSold: 100\n }\n });\n this.assertText('Smartphones: 8203JavaScript Frameworks: InfinityTweets: 100');\n }\n\n (0, _internalTestHelpers.runTask)(() => this.updateNestedValue('Smartphones', 'reports.unitsSold', 8204));\n assert.ok(this.textValue().indexOf('Smartphones: 8204') > -1);\n this.clear();\n this.assertText('Empty!');\n }\n\n [`@test it can render duplicate items`]() {\n this.makeHash({\n Smartphones: 8203,\n Tablets: 8203,\n 'JavaScript Frameworks': Infinity,\n Bugs: Infinity\n });\n this.render(`{{#each-in this.hash key='@identity' as |category count|}}{{category}}: {{count}} {{/each-in}} `);\n this.assertText('Smartphones: 8203Tablets: 8203JavaScript Frameworks: InfinityBugs: Infinity');\n this.assertStableRerender();\n\n if (this.allowsSetProp) {\n this.setProp('Smartphones', 100);\n this.setProp('Tweets', 443115);\n this.assertText('Smartphones: 100Tablets: 8203JavaScript Frameworks: InfinityBugs: InfinityTweets: 443115');\n }\n\n this.clear();\n this.assertText('');\n }\n\n [`@test it repeats the given block when the hash is dynamic`]() {\n var {\n hash: categories\n } = this.createHash({\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n var {\n hash: otherCategories\n } = this.createHash({\n Emberinios: 533462,\n Tweets: 7323\n });\n var context = {\n hashes: {\n categories,\n otherCategories,\n type: 'categories'\n }\n };\n this.render(`{{#each-in (get this.hashes this.hashes.type) as |category count|}}{{category}}: {{count}} {{else}}Empty!{{/each-in}} `, context);\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(context, 'hashes.type', 'otherCategories'));\n this.assertText('Emberinios: 533462Tweets: 7323');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(context, 'hashes.type', 'nonExistent'));\n this.clear();\n this.assertText('Empty!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(context, 'hashes.type', 'categories'));\n this.assertText('Smartphones: 8203JavaScript Frameworks: Infinity');\n }\n\n ['@test keying off of `undefined` does not render']() {\n this.makeHash({});\n this.render(`{{#each-in this.hash as |key value|}}{{key}}: {{value.baz}}{{else}}Empty!{{/each-in}}`);\n this.assertText('Empty!');\n this.assertStableRerender();\n this.replaceHash({\n bar: {\n baz: 'Here!'\n }\n });\n this.assertText('bar: Here!');\n this.clear();\n this.assertText('Empty!');\n }\n\n [`@test it can render items with a key of empty string`]() {\n this.makeHash({\n '': 'empty-string',\n a: 'a'\n });\n this.render(`{{#each-in this.hash as |key value|}}{{key}}: {{value}} {{else}}Empty!{{/each-in}} `);\n this.assertText(': empty-stringa: a');\n this.assertStableRerender();\n this.clear();\n this.assertText('Empty!');\n }\n\n [`@test it can render items that contain keys with periods in them`]() {\n this.makeHash({\n 'period.key': 'a',\n 'other.period.key': 'b'\n });\n this.render(`{{#each-in this.hash as |key value|}}{{key}}: {{value}} {{else}}Empty!{{/each-in}} `);\n this.assertText('period.key: aother.period.key: b');\n this.assertStableRerender();\n this.clear();\n this.assertText('Empty!');\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with POJOs', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n\n createHash(pojo) {\n return {\n hash: pojo,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context.hash, key, value);\n },\n\n updateNestedValue(context, key, innerKey, value) {\n var target = context.hash[key];\n (0, _metal.set)(target, innerKey, value);\n }\n\n }\n };\n }\n\n [`@test it only iterates over an object's own properties`]() {\n var protoCategories = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n var categories = Object.create(protoCategories);\n categories['Televisions'] = 183;\n categories['Alarm Clocks'] = 999;\n this.render(`{{#each-in this.categories as |category count|}}{{category}}: {{count}} {{else}}Empty!{{/each-in}} `, {\n categories\n });\n this.assertText('Televisions: 183Alarm Clocks: 999');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(protoCategories, 'Robots', 666);\n (0, _metal.set)(categories, 'Tweets', 443115);\n });\n this.assertText('Televisions: 183Alarm Clocks: 999Tweets: 443115');\n categories = Object.create(protoCategories);\n categories['Televisions'] = 183;\n categories['Alarm Clocks'] = 999;\n }\n\n [`@test it does not observe direct property mutations (not going through set) on the object`]() {\n this.render((0, _internalTestHelpers.strip)`\n \n {{#each-in this.categories as |category count|}}\n {{category}}: {{count}} \n {{/each-in}}\n \n `, {\n categories: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 8203 \n JavaScript Frameworks: Infinity \n \n `);\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n var categories = (0, _metal.get)(this.context, 'categories');\n delete categories.Smartphones;\n });\n this.assertInvariants();\n (0, _internalTestHelpers.runTask)(() => {\n var categories = (0, _metal.get)(this.context, 'categories');\n categories['Emberinios'] = 123456;\n });\n this.assertInvariants();\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'categories', {\n Emberinios: 123456\n });\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n `);\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'categories', {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n });\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 8203 \n JavaScript Frameworks: Infinity \n \n `);\n }\n\n ['@test it skips holes in sparse arrays']() {\n var arr = [];\n arr[5] = 'foo';\n arr[6] = 'bar';\n this.render((0, _internalTestHelpers.strip)`\n {{#each-in this.arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, {\n arr\n });\n this.assertText('[5:foo][6:bar]');\n this.assertStableRerender();\n }\n\n ['@test it iterate over array with `in` instead of walking over elements']() {\n var arr = [1, 2, 3];\n arr.foo = 'bar';\n this.render((0, _internalTestHelpers.strip)`\n {{#each-in this.arr as |key value|}}\n [{{key}}:{{value}}]\n {{/each-in}}`, {\n arr\n });\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(arr, 'zomg', 'lol');\n });\n this.assertText('[0:1][1:2][2:3][foo:bar][zomg:lol]');\n arr = [1, 2, 3];\n arr.foo = 'bar';\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arr', arr));\n this.assertText('[0:1][1:2][2:3][foo:bar]');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with EmberObjects', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n\n createHash(pojo) {\n var hash = _runtime.Object.create(pojo);\n\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n\n updateNestedValue(context, key, innerKey, value) {\n var target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n\n }\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with object proxies', class extends EachInTest {\n constructor() {\n super(...arguments);\n this.allowsSetProp = true;\n }\n\n createHash(pojo) {\n var hash = _runtime.ObjectProxy.create({\n content: pojo\n });\n\n return {\n hash,\n delegate: {\n setProp(context, key, value) {\n (0, _metal.set)(context, `hash.${key}`, value);\n },\n\n updateNestedValue(context, key, innerKey, value) {\n var target = (0, _metal.get)(context.hash, key);\n (0, _metal.set)(target, innerKey, value);\n }\n\n }\n };\n }\n\n ['@test it iterates over the content, not the proxy']() {\n var content = {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n };\n\n var proxy = _runtime.ObjectProxy.create({\n content,\n foo: 'bar'\n });\n\n this.render((0, _internalTestHelpers.strip)`\n \n {{#each-in this.categories as |category count|}}\n {{category}}: {{count}} \n {{/each-in}}\n \n `, {\n categories: proxy\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 8203 \n JavaScript Frameworks: Infinity \n \n `);\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(proxy, 'content.Smartphones', 100);\n (0, _metal.set)(proxy, 'content.Tweets', 443115);\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 100 \n JavaScript Frameworks: Infinity \n Tweets: 443115 \n \n `);\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(proxy, 'content', {\n Smartphones: 100,\n Tablets: 20\n });\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 100 \n Tablets: 20 \n \n `);\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'categories', _runtime.ObjectProxy.create({\n content: {\n Smartphones: 8203,\n 'JavaScript Frameworks': Infinity\n }\n })));\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n Smartphones: 8203 \n JavaScript Frameworks: Infinity \n \n `);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with ES6 Maps', class extends EachInTest {\n createHash(pojo) {\n var map = new Map();\n Object.keys(pojo).forEach(key => {\n map.set(key, pojo[key]);\n });\n return {\n hash: map,\n delegate: {\n updateNestedValue(context, key, innerKey, value) {\n var target = context.hash.get(key);\n (0, _metal.set)(target, innerKey, value);\n }\n\n }\n };\n }\n\n [`@test it supports having objects as keys on ES6 Maps`]() {\n var map = new Map();\n map.set({\n name: 'one'\n }, 'foo');\n map.set({\n name: 'two'\n }, 'bar');\n this.render((0, _internalTestHelpers.strip)`\n \n {{#each-in this.map key=\"@identity\" as |key value|}}\n {{key.name}}: {{value}} \n {{/each-in}}\n `, {\n map\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n `);\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n var map = new Map();\n map.set({\n name: 'three'\n }, 'qux');\n (0, _metal.set)(this.context, 'map', map);\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n \n `);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each-in}} with custom iterables', class extends EachInTest {\n createHash(pojo) {\n var ary = Object.keys(pojo).reduce((accum, key) => {\n return accum.concat([[key, pojo[key]]]);\n }, []);\n var iterable = {\n [Symbol.iterator]: () => makeIterator(ary)\n };\n return {\n hash: iterable,\n delegate: {\n updateNestedValue(context, key, innerKey, value) {\n var ary = Array.from(context.hash);\n var target = ary.find(([k]) => k === key)[1];\n (0, _metal.set)(target, innerKey, value);\n }\n\n }\n };\n }\n\n }); // Utils\n\n function makeIterator(ary) {\n var index = 0;\n return {\n next() {\n return index < ary.length ? {\n value: ary[index++],\n done: false\n } : {\n done: true\n };\n }\n\n };\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/each-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/-internals/glimmer/tests/utils/helpers\", \"@ember/-internals/glimmer/tests/utils/shared-conditional-tests\"], function (_internalTestHelpers, _metal, _runtime, _helpers, _sharedConditionalTests) {\n \"use strict\";\n\n class ArrayDelegate {\n constructor(content, target) {\n this._array = content;\n this._target = target || this;\n } // The following methods are APIs used by the tests\n\n\n toArray() {\n return this._array.slice();\n }\n\n objectAt(idx) {\n return this._array[idx];\n }\n\n clear() {\n this._array.length = 0;\n this.arrayContentDidChange();\n }\n\n replace(idx, del, ins) {\n this._array.splice(idx, del, ...ins);\n\n this.arrayContentDidChange();\n }\n\n unshiftObject(obj) {\n this._array.unshift(obj);\n\n this.arrayContentDidChange();\n }\n\n unshiftObjects(arr) {\n this._array.unshift(...arr);\n\n this.arrayContentDidChange();\n }\n\n pushObject(obj) {\n this._array.push(obj);\n\n this.arrayContentDidChange();\n }\n\n pushObjects(arr) {\n this._array.push(...arr);\n\n this.arrayContentDidChange();\n }\n\n shiftObject() {\n var obj = this._array.shift();\n\n this.arrayContentDidChange();\n return obj;\n }\n\n popObject() {\n var obj = this._array.pop();\n\n this.arrayContentDidChange();\n return obj;\n }\n\n insertAt(idx, obj) {\n this._array.splice(idx, 0, obj);\n\n this.arrayContentDidChange();\n }\n\n removeAt(idx, len = 1) {\n this._array.splice(idx, len);\n\n this.arrayContentDidChange();\n }\n\n arrayContentDidChange() {\n (0, _metal.notifyPropertyChange)(this._target, '[]');\n (0, _metal.notifyPropertyChange)(this._target, 'length');\n }\n\n toString() {\n return `#<${this.constructor.name || 'UnknownArrayDelegate'}>`;\n }\n\n toJSON() {\n return this.toString();\n }\n\n }\n\n var makeSet = (() => {\n // IE11 does not support `new Set(items);`\n var set = new Set([1, 2, 3]);\n\n if (set.size === 3) {\n return items => new Set(items);\n } else {\n return items => {\n var s = new Set();\n items.forEach(value => s.add(value));\n return s;\n };\n }\n })();\n\n class SetDelegate extends ArrayDelegate {\n constructor(set) {\n var array = [];\n set.forEach(value => array.push(value));\n super(array, set);\n this._set = set;\n }\n\n arrayContentDidChange() {\n this._set.clear();\n\n this._array.forEach(value => this._set.add(value));\n\n super.arrayContentDidChange();\n }\n\n }\n\n class ForEachable extends ArrayDelegate {\n get length() {\n return this._array.length;\n }\n\n forEach(callback) {\n this._array.forEach(callback);\n }\n\n }\n\n var ArrayIterable;\n ArrayIterable = class extends ArrayDelegate {\n [Symbol.iterator]() {\n return this._array[Symbol.iterator]();\n }\n\n };\n\n class TogglingEachTest extends _sharedConditionalTests.TogglingSyntaxConditionalsTest {\n get truthyValue() {\n return ['non-empty'];\n }\n\n get falsyValue() {\n return [];\n }\n\n }\n\n class BasicEachTest extends TogglingEachTest {}\n\n var TRUTHY_CASES = [['hello'], (0, _runtime.A)(['hello']), makeSet(['hello']), new ForEachable(['hello']), _runtime.ArrayProxy.create({\n content: ['hello']\n }), _runtime.ArrayProxy.create({\n content: (0, _runtime.A)(['hello'])\n }), new ArrayIterable(['hello'])];\n var FALSY_CASES = [null, undefined, false, '', 0, [], (0, _runtime.A)([]), makeSet([]), new ForEachable([]), _runtime.ArrayProxy.create({\n content: []\n }), _runtime.ArrayProxy.create({\n content: (0, _runtime.A)([])\n }), new ArrayIterable([])];\n (0, _internalTestHelpers.applyMixins)(BasicEachTest, new _sharedConditionalTests.TruthyGenerator(TRUTHY_CASES), new _sharedConditionalTests.FalsyGenerator(FALSY_CASES), _sharedConditionalTests.ArrayTestCases);\n (0, _internalTestHelpers.moduleFor)('Syntax test: toggling {{#each}}', class extends BasicEachTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: toggling {{#each as}}', class extends BasicEachTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n\n });\n\n class EachEdgeCasesTest extends TogglingEachTest {}\n\n (0, _internalTestHelpers.applyMixins)(EachEdgeCasesTest, new _sharedConditionalTests.FalsyGenerator([true, 'hello', 1, Object, function () {}, {}, {\n foo: 'bar'\n }, Object.create(null), Object.create({}), Object.create({\n foo: 'bar'\n })]));\n (0, _internalTestHelpers.moduleFor)('Syntax test: toggling {{#each}}', class extends EachEdgeCasesTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#each ${cond}}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: toggling {{#each as}}', class extends EachEdgeCasesTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#each ${cond} as |test|}}${truthy}{{else}}${falsy}{{/each}}`;\n }\n\n });\n\n class AbstractEachTest extends _internalTestHelpers.RenderingTestCase {\n /* abstract */\n createList()\n /* items */\n {\n throw new Error('Not implemented: `createList`');\n }\n\n makeList(items) {\n var {\n list,\n delegate\n } = this.createList(items);\n this.list = list;\n this.delegate = delegate;\n }\n\n replaceList(list) {\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'list', this.createList(list).list));\n }\n\n forEach(callback) {\n return this.delegate.toArray().forEach(callback);\n }\n\n objectAt(idx) {\n return this.delegate.objectAt(idx);\n }\n\n clear() {\n return this.delegate.clear();\n }\n\n replace(idx, del, ins) {\n return this.delegate.replace(idx, del, ins);\n }\n\n unshiftObject(obj) {\n return this.delegate.unshiftObject(obj);\n }\n\n unshiftObjects(arr) {\n return this.delegate.unshiftObjects(arr);\n }\n\n pushObject(obj) {\n return this.delegate.pushObject(obj);\n }\n\n pushObjects(arr) {\n return this.delegate.pushObjects(arr);\n }\n\n shiftObject() {\n return this.delegate.shiftObject();\n }\n\n popObject() {\n return this.delegate.popObject();\n }\n\n insertAt(idx, obj) {\n return this.delegate.insertAt(idx, obj);\n }\n\n removeAt(idx, len) {\n return this.delegate.removeAt(idx, len);\n }\n\n render(template, context = {}) {\n if (this.list !== undefined) {\n context.list = this.list;\n }\n\n return super.render(template, context);\n }\n\n }\n\n class EachTest extends AbstractEachTest {\n /* single each */\n ['@test it repeats the given block for each item in the array']() {\n this.makeList([{\n text: 'hello'\n }]);\n this.render(`{{#each this.list as |item|}}{{item.text}}{{else}}Empty{{/each}}`);\n this.assertText('hello');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('hello');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.objectAt(0), 'text', 'Hello'));\n this.assertText('Hello');\n (0, _internalTestHelpers.runTask)(() => {\n this.pushObject({\n text: ' '\n });\n this.pushObject({\n text: 'World'\n });\n });\n this.assertText('Hello World');\n (0, _internalTestHelpers.runTask)(() => {\n this.pushObject({\n text: 'Earth'\n });\n this.removeAt(1);\n this.insertAt(1, {\n text: 'Globe'\n });\n });\n this.assertText('HelloGlobeWorldEarth');\n (0, _internalTestHelpers.runTask)(() => {\n this.pushObject({\n text: 'Planet'\n });\n this.removeAt(1);\n this.insertAt(1, {\n text: ' '\n });\n this.pushObject({\n text: ' '\n });\n this.pushObject({\n text: 'Earth'\n });\n this.removeAt(3);\n });\n this.assertText('Hello WorldPlanet Earth');\n (0, _internalTestHelpers.runTask)(() => {\n this.pushObject({\n text: 'Globe'\n });\n this.removeAt(1);\n this.insertAt(1, {\n text: ' '\n });\n this.pushObject({\n text: ' '\n });\n this.pushObject({\n text: 'World'\n });\n this.removeAt(2);\n });\n this.assertText('Hello Planet EarthGlobe World');\n (0, _internalTestHelpers.runTask)(() => this.replace(2, 4, [{\n text: 'my'\n }]));\n this.assertText('Hello my World');\n (0, _internalTestHelpers.runTask)(() => this.clear());\n this.assertText('Empty');\n this.replaceList([{\n text: 'hello'\n }]);\n this.assertText('hello');\n }\n\n ['@test it receives the index as the second parameter']() {\n this.makeList([{\n text: 'hello'\n }, {\n text: 'world'\n }]);\n this.render(`{{#each this.list as |item index|}}[{{index}}. {{item.text}}]{{/each}}`);\n this.assertText('[0. hello][1. world]');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.insertAt(1, {\n text: 'my'\n }));\n this.assertText('[0. hello][1. my][2. world]');\n this.replaceList([{\n text: 'hello'\n }, {\n text: 'world'\n }]);\n this.assertText('[0. hello][1. world]');\n }\n\n ['@test it accepts a string key']() {\n this.makeList([{\n text: 'hello'\n }, {\n text: 'world'\n }]);\n this.render(`{{#each this.list key='text' as |item|}}{{item.text}}{{/each}}`);\n this.assertText('helloworld');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject({\n text: 'again'\n }));\n this.assertText('helloworldagain');\n this.replaceList([{\n text: 'hello'\n }, {\n text: 'world'\n }]);\n this.assertText('helloworld');\n }\n\n ['@test it accepts a numeric key']() {\n this.makeList([{\n id: 1\n }, {\n id: 2\n }]);\n this.render(`{{#each this.list key='id' as |item|}}{{item.id}}{{/each}}`);\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject({\n id: 3\n }));\n this.assertText('123');\n this.replaceList([{\n id: 1\n }, {\n id: 2\n }]);\n this.assertText('12');\n }\n\n ['@test it can specify @index as the key']() {\n this.makeList([{\n id: 1\n }, {\n id: 2\n }]);\n this.render(`{{#each this.list key='@index' as |item|}}{{item.id}}{{/each}}`);\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject({\n id: 3\n }));\n this.assertText('123');\n this.replaceList([{\n id: 1\n }, {\n id: 2\n }]);\n this.assertText('12');\n }\n\n ['@test it can specify @identity as the key for arrays of primitives']() {\n this.makeList([1, 2]);\n this.render(`{{#each this.list key='@identity' as |item|}}{{item}}{{/each}}`);\n this.assertText('12');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject(3));\n this.assertText('123');\n this.replaceList([1, 2]);\n this.assertText('12');\n }\n\n ['@test it can specify @identity as the key for mixed arrays of objects and primitives']() {\n this.makeList([1, {\n id: 2\n }, 3]);\n this.render(`{{#each this.list key='@identity' as |item|}}{{if item.id item.id item}}{{/each}}`);\n this.assertText('123');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.insertAt(2, {\n id: 4\n }));\n this.assertText('1243');\n this.replaceList([1, {\n id: 2\n }, 3]);\n this.assertText('123');\n }\n\n ['@test it can render duplicate primitive items']() {\n this.makeList(['a', 'a', 'a']);\n this.render(`{{#each this.list as |item|}}{{item}}{{/each}}`);\n this.assertText('aaa');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject('a'));\n this.assertText('aaaa');\n (0, _internalTestHelpers.runTask)(() => this.pushObject('a'));\n this.assertText('aaaaa');\n this.replaceList(['a', 'a', 'a']);\n this.assertText('aaa');\n }\n\n [`@test updating and setting within #each`]() {\n this.makeList([{\n value: 1\n }, {\n value: 2\n }, {\n value: 3\n }]);\n\n var FooBarComponent = _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n this.isEven = true;\n this.tagName = 'li';\n },\n\n _isEven() {\n this.set('isEven', this.get('item.value') % 2 === 0);\n },\n\n didUpdate() {\n this._isEven();\n }\n\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooBarComponent,\n template: '{{#if this.isEven}}{{this.item.value}}{{/if}}'\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#each this.list as |item|}}\n Prev \n {{foo-bar item=item}}\n Next \n {{/each}}\n `);\n this.assertText('Prev1NextPrev2NextPrev3Next');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.objectAt(0), 'value', 3));\n this.assertText('PrevNextPrev2NextPrev3Next');\n this.replaceList([{\n value: 1\n }, {\n value: 2\n }, {\n value: 3\n }]);\n this.assertText('Prev1NextPrev2NextPrev3Next');\n }\n\n ['@test it can render duplicate objects']() {\n var duplicateItem = {\n text: 'foo'\n };\n this.makeList([duplicateItem, duplicateItem, {\n text: 'bar'\n }, {\n text: 'baz'\n }]);\n this.render(`{{#each this.list as |item|}}{{item.text}}{{/each}}`);\n this.assertText('foofoobarbaz');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObject(duplicateItem));\n this.assertText('foofoobarbazfoo');\n (0, _internalTestHelpers.runTask)(() => this.pushObject(duplicateItem));\n this.assertText('foofoobarbazfoofoo');\n this.replaceList([duplicateItem, duplicateItem, {\n text: 'bar'\n }, {\n text: 'baz'\n }]);\n this.assertText('foofoobarbaz');\n }\n\n [`@test it maintains DOM stability when condition changes between objects with the same keys`]() {\n this.makeList([{\n text: 'Hello'\n }, {\n text: ' '\n }, {\n text: 'world'\n }]);\n this.render(`{{#each this.list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n this.assertText('Hello world');\n this.takeSnapshot();\n (0, _internalTestHelpers.runTask)(() => {\n this.popObject();\n this.popObject();\n this.pushObject({\n text: ' '\n });\n this.pushObject({\n text: 'world'\n });\n });\n this.assertText('Hello world');\n this.assertInvariants();\n this.replaceList([{\n text: 'Hello'\n }, {\n text: ' '\n }, {\n text: 'world'\n }]);\n this.assertText('Hello world');\n this.assertInvariants();\n }\n\n [`@test it maintains DOM stability for stable keys when list is updated`]() {\n this.makeList([{\n text: 'Hello'\n }, {\n text: ' '\n }, {\n text: 'world'\n }]);\n this.render(`{{#each this.list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n this.assertText('Hello world');\n this.assertStableRerender();\n var oldSnapshot = this.takeSnapshot();\n (0, _internalTestHelpers.runTask)(() => {\n this.unshiftObject({\n text: ', '\n });\n this.unshiftObject({\n text: 'Hi'\n });\n this.pushObject({\n text: '!'\n });\n this.pushObject({\n text: 'earth'\n });\n });\n this.assertText('Hi, Hello world!earth');\n this.assertPartialInvariants(2, 5);\n this.replaceList([{\n text: 'Hello'\n }, {\n text: ' '\n }, {\n text: 'world'\n }]);\n this.assertText('Hello world');\n this.assertInvariants(oldSnapshot, this.takeSnapshot());\n }\n\n [`@test it renders all items with duplicate key values`]() {\n this.makeList([{\n text: 'Hello'\n }, {\n text: 'Hello'\n }, {\n text: 'Hello'\n }]);\n this.render(`{{#each this.list key=\"text\" as |item|}}{{item.text}}{{/each}}`);\n this.assertText('HelloHelloHello');\n (0, _internalTestHelpers.runTask)(() => {\n this.forEach(hash => (0, _metal.set)(hash, 'text', 'Goodbye'));\n });\n this.assertText('GoodbyeGoodbyeGoodbye');\n this.replaceList([{\n text: 'Hello'\n }, {\n text: 'Hello'\n }, {\n text: 'Hello'\n }]);\n this.assertText('HelloHelloHello');\n }\n\n ['@test context is not changed to the inner scope inside an {{#each as}} block']() {\n this.makeList([{\n name: 'Chad'\n }, {\n name: 'Zack'\n }, {\n name: 'Asa'\n }]);\n this.render(`{{this.name}}-{{#each this.list as |person|}}{{this.name}}{{/each}}-{{this.name}}`, {\n name: 'Joel'\n });\n this.assertText('Joel-JoelJoelJoel-Joel');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.shiftObject());\n this.assertText('Joel-JoelJoel-Joel');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Godfrey'));\n this.assertText('Godfrey-GodfreyGodfrey-Godfrey');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Joel'));\n this.replaceList([{\n name: 'Chad'\n }, {\n name: 'Zack'\n }, {\n name: 'Asa'\n }]);\n this.assertText('Joel-JoelJoelJoel-Joel');\n }\n\n ['@test can access the item and the original scope']() {\n this.makeList([{\n name: 'Tom Dale'\n }, {\n name: 'Yehuda Katz'\n }, {\n name: 'Godfrey Chan'\n }]);\n this.render(`{{#each this.list key=\"name\" as |person|}}[{{this.title}}: {{person.name}}]{{/each}}`, {\n title: 'Señor Engineer'\n });\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.objectAt(1), 'name', 'Stefan Penner');\n this.removeAt(0);\n this.pushObject({\n name: 'Tom Dale'\n });\n this.insertAt(1, {\n name: 'Chad Hietala'\n });\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n this.assertText('[Principal Engineer: Stefan Penner][Principal Engineer: Chad Hietala][Principal Engineer: Godfrey Chan][Principal Engineer: Tom Dale]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'title', 'Señor Engineer'));\n this.replaceList([{\n name: 'Tom Dale'\n }, {\n name: 'Yehuda Katz'\n }, {\n name: 'Godfrey Chan'\n }]);\n this.assertText('[Señor Engineer: Tom Dale][Señor Engineer: Yehuda Katz][Señor Engineer: Godfrey Chan]');\n }\n\n ['@test the scoped variable is not available outside the {{#each}} block.']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n this.makeList(['Yehuda']);\n this.render(`{{name}}-{{#each this.list as |name|}}{{name}}{{/each}}-{{name}}`, {\n name: 'Stef'\n });\n this.assertText('Stef-Yehuda-Stef');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Stef-Yehuda-Stef');\n (0, _internalTestHelpers.runTask)(() => this.pushObjects([' ', 'Katz']));\n this.assertText('Stef-Yehuda Katz-Stef');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n this.assertText('Tom-Yehuda Katz-Tom');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Stef'));\n this.replaceList(['Yehuda']);\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test inverse template is displayed with context']() {\n this.makeList([]);\n this.render(`{{#each this.list as |thing|}}Has Thing{{else}}No Thing {{this.otherThing}}{{/each}}`, {\n otherThing: 'bar'\n });\n this.assertText('No Thing bar');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('No Thing bar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'otherThing', 'biz'));\n this.assertText('No Thing biz');\n (0, _internalTestHelpers.runTask)(() => this.pushObject('non-empty'));\n this.assertText('Has Thing');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'otherThing', 'baz'));\n this.assertText('Has Thing');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'otherThing', 'bar'));\n this.replaceList([]);\n this.assertText('No Thing bar');\n }\n\n ['@test content that are not initially present updates correctly GH#13983']() {\n // The root cause of this bug is that Glimmer did not call `didInitializeChildren`\n // on the inserted `TryOpcode`, causing that `TryOpcode` to have an uninitialized\n // tag. Currently the only way to observe this the \"JUMP-IF-NOT-MODIFIED\", i.e. by\n // wrapping it in an component.\n this.registerComponent('x-wrapper', {\n template: '{{yield}}'\n });\n this.makeList([]);\n this.render(`{{#x-wrapper}}{{#each this.list as |obj|}}[{{obj.text}}]{{/each}}{{/x-wrapper}}`);\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.pushObject({\n text: 'foo'\n }));\n this.assertText('[foo]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.objectAt(0), 'text', 'FOO'));\n this.assertText('[FOO]');\n (0, _internalTestHelpers.runTask)(() => this.pushObject({\n text: 'bar'\n }));\n this.assertText('[FOO][bar]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.objectAt(1), 'text', 'BAR'));\n this.assertText('[FOO][BAR]');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.objectAt(1), 'text', 'baz'));\n this.assertText('[FOO][baz]');\n (0, _internalTestHelpers.runTask)(() => this.replace(1, 1, [{\n text: 'BAZ'\n }]));\n this.assertText('[FOO][BAZ]');\n this.replaceList([]);\n this.assertText('');\n }\n\n ['@test empty trusted content clears properly [GH#16314]']() {\n this.makeList(['hello']);\n this.render(`before {{#each this.list as |value|}}{{{value}}}{{/each}} after`);\n this.assertText('before hello after');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => this.pushObjects([null, ' world']));\n this.assertText('before hello world after');\n (0, _internalTestHelpers.runTask)(() => this.replace(1, 2, [undefined, ' world!']));\n this.assertText('before hello world! after');\n (0, _internalTestHelpers.runTask)(() => this.replace(1, 2, [(0, _helpers.htmlSafe)(''), ' world!!']));\n this.assertText('before hello world!! after');\n this.replaceList(['hello']);\n this.assertText('before hello after');\n }\n /* multi each */\n\n\n ['@test re-using the same variable with different {{#each}} blocks does not override each other']() {\n var admins = this.createList([{\n name: 'Tom Dale'\n }]);\n var users = this.createList([{\n name: 'Yehuda Katz'\n }]);\n this.render(`Admin: {{#each this.admins key=\"name\" as |person|}}[{{person.name}}]{{/each}} User: {{#each this.users key=\"name\" as |person|}}[{{person.name}}]{{/each}}`, {\n admins: admins.list,\n users: users.list\n });\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n (0, _internalTestHelpers.runTask)(() => {\n admins.delegate.pushObject({\n name: 'Godfrey Chan'\n });\n (0, _metal.set)(users.delegate.objectAt(0), 'name', 'Stefan Penner');\n });\n this.assertText('Admin: [Tom Dale][Godfrey Chan] User: [Stefan Penner]');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'admins', this.createList([{\n name: 'Tom Dale'\n }]).list);\n (0, _metal.set)(this.context, 'users', this.createList([{\n name: 'Yehuda Katz'\n }]).list);\n });\n this.assertText('Admin: [Tom Dale] User: [Yehuda Katz]');\n }\n\n [`@test an outer {{#each}}'s scoped variable does not clobber an inner {{#each}}'s property if they share the same name - Issue #1315`]() {\n var content = this.createList(['X', 'Y']);\n var options = this.createList([{\n label: 'One',\n value: 1\n }, {\n label: 'Two',\n value: 2\n }]);\n this.render((0, _internalTestHelpers.strip)`\n {{#each this.content as |value|}}\n {{value}}-\n {{#each this.options as |option|}}\n {{option.value}}:{{option.label}}\n {{/each}}\n {{/each}}\n `, {\n content: content.list,\n options: options.list\n });\n this.assertText('X-1:One2:TwoY-1:One2:Two');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n content.delegate.pushObject('Z');\n (0, _metal.set)(options.delegate.objectAt(0), 'value', 0);\n });\n this.assertText('X-0:One2:TwoY-0:One2:TwoZ-0:One2:Two');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'content', this.createList(['X', 'Y']).list);\n (0, _metal.set)(this.context, 'options', this.createList([{\n label: 'One',\n value: 1\n }, {\n label: 'Two',\n value: 2\n }]).list);\n });\n this.assertText('X-1:One2:TwoY-1:One2:Two');\n }\n\n ['@test the scoped variable is not available outside the {{#each}} block']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n var first = this.createList(['Limbo']);\n var fifth = this.createList(['Wrath']);\n var ninth = this.createList(['Treachery']);\n this.render(`{{ring}}-{{#each this.first as |ring|}}{{ring}}-{{#each this.fifth as |ring|}}{{ring}}-{{#each this.ninth as |ring|}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}-{{/each}}{{ring}}`, {\n ring: 'Greed',\n first: first.list,\n fifth: fifth.list,\n ninth: ninth.list\n });\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n fifth.delegate.insertAt(0, 'D');\n });\n this.assertText('O-Limbo-D-Treachery-D-Wrath-Treachery-Wrath-Limbo-O');\n (0, _internalTestHelpers.runTask)(() => {\n first.delegate.pushObject('I');\n ninth.delegate.replace(0, 1, ['K']);\n });\n this.assertText('O-Limbo-D-K-D-Wrath-K-Wrath-Limbo-I-D-K-D-Wrath-K-Wrath-I-O');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'ring', 'Greed');\n (0, _metal.set)(this.context, 'first', this.createList(['Limbo']).list);\n (0, _metal.set)(this.context, 'fifth', this.createList(['Wrath']).list);\n (0, _metal.set)(this.context, 'ninth', this.createList(['Treachery']).list);\n });\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#each this.name as |foo|}}, then {{#each foo as |bar|}}']() {\n var inner = this.createList(['caterpillar']);\n var outer = this.createList([inner.list]);\n this.render(`{{#each this.name key=\"@index\" as |foo|}}{{#each foo as |bar|}}{{bar}}{{/each}}{{/each}}`, {\n name: outer.list\n });\n this.assertText('caterpillar');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('caterpillar');\n (0, _internalTestHelpers.runTask)(() => {\n inner.delegate.replace(0, 1, ['lady']);\n outer.delegate.pushObject(this.createList(['bird']).list);\n });\n this.assertText('ladybird');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', this.createList([this.createList(['caterpillar']).list]).list));\n this.assertText('caterpillar');\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with native arrays', class extends EachTest {\n createList(items) {\n return {\n list: items,\n delegate: new ArrayDelegate(items, items)\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with emberA-wrapped arrays', class extends EachTest {\n createList(items) {\n var wrapped = (0, _runtime.A)(items);\n return {\n list: wrapped,\n delegate: wrapped\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with native Set', class extends EachTest {\n createList(items) {\n var set = makeSet(items);\n return {\n list: set,\n delegate: new SetDelegate(set)\n };\n }\n\n ['@test it can render duplicate primitive items'](assert) {\n assert.ok(true, 'not supported by Set');\n }\n\n ['@test it can render duplicate objects'](assert) {\n assert.ok(true, 'not supported by Set');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array-like objects implementing forEach', class extends EachTest {\n createList(items) {\n var forEachable = new ForEachable(items);\n return {\n list: forEachable,\n delegate: forEachable\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array-like objects implementing Symbol.iterator', class extends EachTest {\n createList(items) {\n var iterable = new ArrayIterable(items);\n return {\n list: iterable,\n delegate: iterable\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array proxies, modifying itself', class extends EachTest {\n createList(items) {\n var proxty = _runtime.ArrayProxy.create({\n content: (0, _runtime.A)(items)\n });\n\n return {\n list: proxty,\n delegate: proxty\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array proxies, replacing its content', class extends EachTest {\n createList(items) {\n var wrapped = (0, _runtime.A)(items);\n return {\n list: wrapped,\n delegate: _runtime.ArrayProxy.create({\n content: wrapped\n })\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array proxies, arrangedContent depends on external content', class extends EachTest {\n createList(items) {\n var wrapped = (0, _runtime.A)(items);\n\n var proxy = _runtime.ArrayProxy.extend({\n arrangedContent: (0, _metal.computed)('wrappedItems.[]', function () {\n // Slice the items to ensure that updates must be propogated\n return this.wrappedItems.slice();\n })\n }).create({\n wrappedItems: wrapped\n });\n\n return {\n list: proxy,\n delegate: wrapped\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with array proxies, content is updated after init', class extends EachTest {\n createList(items) {\n var wrapped = (0, _runtime.A)(items);\n\n var proxy = _runtime.ArrayProxy.extend({\n setup: (0, _metal.on)('init', function () {\n this.set('content', (0, _runtime.A)(wrapped));\n })\n }).create();\n\n return {\n list: proxy,\n delegate: wrapped\n };\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each as}} undefined path', class extends _internalTestHelpers.RenderingTestCase {\n ['@test keying off of `undefined` does not render']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#each this.foo.bar.baz as |thing|}}\n {{thing}}\n {{/each}}`, {\n foo: {}\n });\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: ['Here!']\n }\n }));\n this.assertText('Here!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {}));\n this.assertText('');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each}} with sparse arrays', class extends _internalTestHelpers.RenderingTestCase {\n ['@test it should itterate over holes']() {\n var sparseArray = [];\n sparseArray[3] = 'foo';\n sparseArray[4] = 'bar';\n this.render((0, _internalTestHelpers.strip)`\n {{#each this.list as |value key|}}\n [{{key}}:{{value}}]\n {{/each}}`, {\n list: (0, _runtime.A)(sparseArray)\n });\n this.assertText('[0:][1:][2:][3:foo][4:bar]');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => {\n var list = (0, _metal.get)(this.context, 'list');\n list.pushObject('baz');\n });\n this.assertText('[0:][1:][2:][3:foo][4:bar][5:baz]');\n }\n\n });\n /* globals MutationObserver: false */\n\n if (typeof MutationObserver === 'function') {\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#each as}} DOM mutation test', class extends _internalTestHelpers.RenderingTestCase {\n constructor() {\n super(...arguments);\n this.observer = null;\n }\n\n observe(element) {\n var observer = this.observer = new MutationObserver(function () {});\n observer.observe(element, {\n childList: true,\n characterData: true\n });\n }\n\n teardown() {\n if (this.observer) {\n this.observer.disconnect();\n }\n\n super.teardown();\n }\n\n assertNoMutation() {\n this.assert.deepEqual(this.observer.takeRecords(), [], 'Expected no mutations');\n }\n\n expectMutations() {\n this.assert.ok(this.observer.takeRecords().length > 0, 'Expected some mutations');\n }\n\n ['@test {{#each}} should not mutate a subtree when the array has not changed [GH #14332]']() {\n var page = {\n title: 'Blog Posts'\n };\n var model = [{\n title: 'Rails is omakase'\n }, {\n title: 'Ember is omakase'\n }];\n this.render((0, _internalTestHelpers.strip)`\n {{this.page.title}} \n\n \n {{#each this.model as |post|}}\n {{post.title}} \n {{/each}}\n \n `, {\n page,\n model\n });\n this.assertHTML((0, _internalTestHelpers.strip)`\n Blog Posts \n\n \n Rails is omakase \n Ember is omakase \n \n `);\n this.observe(this.$('#posts')[0]); // MutationObserver is async\n\n return _runtime.RSVP.Promise.resolve(() => {\n this.assertStableRerender();\n }).then(() => {\n this.assertNoMutation();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'page', {\n title: 'Essays'\n }));\n this.assertHTML((0, _internalTestHelpers.strip)`\n Essays \n\n \n Rails is omakase \n Ember is omakase \n \n `);\n }).then(() => {\n this.assertNoMutation();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context.page, 'title', 'Think Pieces™'));\n this.assertHTML((0, _internalTestHelpers.strip)`\n Think Pieces™ \n\n \n Rails is omakase \n Ember is omakase \n \n `);\n }).then(() => {\n // The last set is localized to the `page` object, so we do not expect Glimmer\n // to re-iterate the list\n this.assertNoMutation();\n });\n }\n\n });\n }\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/if-unless-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer/tests/utils/helpers\", \"@ember/-internals/glimmer/tests/utils/shared-conditional-tests\"], function (_internalTestHelpers, _runtime, _metal, _helpers, _sharedConditionalTests) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#if}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#unless}} with inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#unless ${cond}}}${falsy}{{else}}${truthy}{{/unless}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#if}} and {{#unless}} without inverse', class extends _sharedConditionalTests.IfUnlessWithSyntaxTest {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#if ${cond}}}${truthy}{{/if}}{{#unless ${cond}}}${falsy}{{/unless}}`;\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#if}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test using `if` with an `{{each}}` destroys components when transitioning to and from inverse (GH #12267)'](assert) {\n var destroyedChildrenCount = 0;\n this.registerComponent('foo-bar', {\n template: '{{this.number}}',\n ComponentClass: _helpers.Component.extend({\n willDestroy() {\n this._super();\n\n destroyedChildrenCount++;\n }\n\n })\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#if this.cond}}\n {{#each this.numbers as |number|}}\n {{foo-bar number=number}}\n {{/each}}\n {{else}}\n Nothing Here!\n {{/if}}`, {\n cond: true,\n numbers: (0, _runtime.A)([1, 2, 3])\n });\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('123');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', false));\n this.assertText('Nothing Here!');\n assert.equal(destroyedChildrenCount, 3, 'the children were properly destroyed');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', true));\n this.assertText('123');\n }\n\n ['@test looking up `undefined` property defaults to false']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#if this.foo.bar.baz}}\n Here!\n {{else}}\n Nothing Here!\n {{/if}}`, {\n foo: {}\n });\n this.assertText('Nothing Here!');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Nothing Here!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: true\n }\n }));\n this.assertText('Here!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {}));\n this.assertText('Nothing Here!');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/let-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\"], function (_internalTestHelpers, _metal, _runtime) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Syntax test: {{#let as}}', class extends _internalTestHelpers.RenderingTestCase {\n templateFor({\n cond,\n truthy,\n falsy\n }) {\n return `{{#let ${cond} as |test|}}${truthy}{{else}}${falsy}{{/let}}`;\n }\n\n ['@test it renders the block if `undefined` is passed as an argument']() {\n this.render((0, _internalTestHelpers.strip)`\n {{#let this.foo.bar.baz as |thing|}}\n value: \"{{thing}}\"\n {{/let}}`, {\n foo: {}\n });\n this.assertText('value: \"\"');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('value: \"\"');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {\n bar: {\n baz: 'Here!'\n }\n }));\n this.assertText('value: \"Here!\"');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'foo', {}));\n this.assertText('value: \"\"');\n }\n\n ['@test it renders the block if arguments are falsey']() {\n this.render(`{{#let this.cond1 this.cond2 as |cond|}}value: \"{{this.cond1}}\"{{/let}}`, {\n cond1: false\n });\n this.assertText('value: \"false\"');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('value: \"false\"');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', ''));\n this.assertText('value: \"\"');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', 0));\n this.assertText('value: \"0\"');\n }\n\n ['@test it yields multiple arguments in order']() {\n this.render(`{{#let this.foo this.bar this.baz.name as |a b c|}}{{a}} {{b}} {{c}}{{/let}}`, {\n foo: 'Señor Engineer',\n bar: '',\n baz: {\n name: 'Dale'\n }\n });\n this.assertText('Señor Engineer Dale');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'bar', 'Tom'));\n this.assertText('Señor Engineer Tom Dale');\n }\n\n ['@test can access alias and original scope']() {\n this.render(`{{#let this.person as |tom|}}{{this.title}}: {{tom.name}}{{/let}}`, {\n title: 'Señor Engineer',\n person: {\n name: 'Tom Dale'\n }\n });\n this.assertText('Señor Engineer: Tom Dale');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Señor Engineer: Tom Dale');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'person.name', 'Yehuda Katz');\n (0, _metal.set)(this.context, 'title', 'Principal Engineer');\n });\n this.assertText('Principal Engineer: Yehuda Katz');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'person', {\n name: 'Tom Dale'\n });\n (0, _metal.set)(this.context, 'title', 'Señor Engineer');\n });\n this.assertText('Señor Engineer: Tom Dale');\n }\n\n ['@test the scoped variable is not available outside the {{#let}} block.']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n this.render(`{{name}}-{{#let this.other as |name|}}{{name}}{{/let}}-{{name}}`, {\n name: 'Stef',\n other: 'Yehuda'\n });\n this.assertText('Stef-Yehuda-Stef');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Stef-Yehuda-Stef');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'other', 'Chad'));\n this.assertText('Stef-Chad-Stef');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Tom'));\n this.assertText('Tom-Chad-Tom');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'name', 'Stef');\n (0, _metal.set)(this.context, 'other', 'Yehuda');\n });\n this.assertText('Stef-Yehuda-Stef');\n }\n\n ['@test can access alias of a proxy']() {\n this.render(`{{#let this.proxy as |person|}}{{person.name}}{{/let}}`, {\n proxy: _runtime.ObjectProxy.create({\n content: {\n name: 'Tom Dale'\n }\n })\n });\n this.assertText('Tom Dale');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Tom Dale');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'proxy.name', 'Yehuda Katz'));\n this.assertText('Yehuda Katz');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'proxy.content', {\n name: 'Godfrey Chan'\n }));\n this.assertText('Godfrey Chan');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'proxy.content.name', 'Stefan Penner'));\n this.assertText('Stefan Penner');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'proxy.content', null));\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'proxy', _runtime.ObjectProxy.create({\n content: {\n name: 'Tom Dale'\n }\n })));\n this.assertText('Tom Dale');\n }\n\n ['@test can access alias of an array']() {\n this.render(`{{#let this.arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/let}}`, {\n arrayThing: (0, _runtime.A)(['Hello', ' ', 'world'])\n });\n this.assertText('Hello world');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Hello world');\n (0, _internalTestHelpers.runTask)(() => {\n var array = (0, _metal.get)(this.context, 'arrayThing');\n array.replace(0, 1, ['Goodbye']);\n (0, _runtime.removeAt)(array, 1);\n array.insertAt(1, ', ');\n array.pushObject('!');\n });\n this.assertText('Goodbye, world!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'arrayThing', ['Hello', ' ', 'world']));\n this.assertText('Hello world');\n }\n\n ['@test `attrs` can be used as a block param [GH#14678]']() {\n this.render('{{#let this.hash as |attrs|}}[{{this.hash.foo}}-{{attrs.foo}}]{{/let}}', {\n hash: {\n foo: 'foo'\n }\n });\n this.assertText('[foo-foo]');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('[foo-foo]');\n (0, _internalTestHelpers.runTask)(() => this.context.set('hash.foo', 'FOO'));\n this.assertText('[FOO-FOO]');\n (0, _internalTestHelpers.runTask)(() => this.context.set('hash.foo', 'foo'));\n this.assertText('[foo-foo]');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Syntax test: Multiple {{#let as}} helpers', class extends _internalTestHelpers.RenderingTestCase {\n ['@test re-using the same variable with different {{#let}} blocks does not override each other']() {\n this.render(`Admin: {{#let this.admin as |person|}}{{person.name}}{{/let}} User: {{#let this.user as |person|}}{{person.name}}{{/let}}`, {\n admin: {\n name: 'Tom Dale'\n },\n user: {\n name: 'Yehuda Katz'\n }\n });\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'admin.name', 'Godfrey Chan');\n (0, _metal.set)(this.context, 'user.name', 'Stefan Penner');\n });\n this.assertText('Admin: Godfrey Chan User: Stefan Penner');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'admin', {\n name: 'Tom Dale'\n });\n (0, _metal.set)(this.context, 'user', {\n name: 'Yehuda Katz'\n });\n });\n this.assertText('Admin: Tom Dale User: Yehuda Katz');\n }\n\n ['@test the scoped variable is not available outside the {{#let}} block']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n this.render(`{{ring}}-{{#let this.first as |ring|}}{{ring}}-{{#let this.fifth as |ring|}}{{ring}}-{{#let this.ninth as |ring|}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}-{{/let}}{{ring}}`, {\n ring: 'Greed',\n first: 'Limbo',\n fifth: 'Wrath',\n ninth: 'Treachery'\n });\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'ring', 'O');\n (0, _metal.set)(this.context, 'fifth', 'D');\n });\n this.assertText('O-Limbo-D-Treachery-D-Limbo-O');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'first', 'I');\n (0, _metal.set)(this.context, 'ninth', 'K');\n });\n this.assertText('O-I-D-K-D-I-O');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'ring', 'Greed');\n (0, _metal.set)(this.context, 'first', 'Limbo');\n (0, _metal.set)(this.context, 'fifth', 'Wrath');\n (0, _metal.set)(this.context, 'ninth', 'Treachery');\n });\n this.assertText('Greed-Limbo-Wrath-Treachery-Wrath-Limbo-Greed');\n }\n\n ['@test it should support {{#let name as |foo|}}, then {{#let foo as |bar|}}']() {\n this.render(`{{#let this.name as |foo|}}{{#let foo as |bar|}}{{bar}}{{/let}}{{/let}}`, {\n name: 'caterpillar'\n });\n this.assertText('caterpillar');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('caterpillar');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'butterfly'));\n this.assertText('butterfly');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'caterpillar'));\n this.assertText('caterpillar');\n }\n\n ['@test updating the context should update the alias']() {\n this.render(`{{#let this as |person|}}{{person.name}}{{/let}}`, {\n name: 'Los Pivots'\n });\n this.assertText('Los Pivots');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('Los Pivots');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', \"l'Pivots\"));\n this.assertText(\"l'Pivots\");\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'Los Pivots'));\n this.assertText('Los Pivots');\n }\n\n ['@test nested {{#let}} blocks should have access to root context']() {\n expectDeprecation(/The `[^`]+` property(?: path)? was used in the `[^`]+` template without using `this`. This fallback behavior has been deprecated, all properties must be looked up on `this` when used in the template: {{[^}]+}}/);\n this.render((0, _internalTestHelpers.strip)`\n {{name}}\n {{#let this.committer1.name as |name|}}\n [{{name}}\n {{#let this.committer2.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n {{#let this.committer2.name as |name|}}\n [{{name}}\n {{#let this.committer1.name as |name|}}\n [{{name}}]\n {{/let}}\n {{name}}]\n {{/let}}\n {{name}}\n `, {\n name: 'ebryn',\n committer1: {\n name: 'trek'\n },\n committer2: {\n name: 'machty'\n }\n });\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'name', 'chancancode'));\n this.assertText('chancancode[trek[machty]trek]chancancode[machty[trek]machty]chancancode');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'committer1', {\n name: 'krisselden'\n }));\n this.assertText('chancancode[krisselden[machty]krisselden]chancancode[machty[krisselden]machty]chancancode');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'committer1.name', 'wycats');\n (0, _metal.set)(this.context, 'committer2', {\n name: 'rwjblue'\n });\n });\n this.assertText('chancancode[wycats[rwjblue]wycats]chancancode[rwjblue[wycats]rwjblue]chancancode');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'name', 'ebryn');\n (0, _metal.set)(this.context, 'committer1', {\n name: 'trek'\n });\n (0, _metal.set)(this.context, 'committer2', {\n name: 'machty'\n });\n });\n this.assertText('ebryn[trek[machty]trek]ebryn[machty[trek]machty]ebryn');\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/public-in-element-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _glimmer, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('{{in-element}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test allows rendering into an external element']() {\n var someElement = document.createElement('div');\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'Whoop!');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'Huzzah!!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'Huzzah!!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'Whoop!');\n }\n\n [\"@test it replaces the external element's content by default\"]() {\n var someElement = document.createElement('div');\n someElement.appendChild(document.createTextNode('foo '));\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement insertBefore=undefined}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'bar'\n });\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'bar');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'bar!!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'bar!!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'bar'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'bar');\n }\n\n ['@test allows appending to the external element with insertBefore=null']() {\n var someElement = document.createElement('div');\n someElement.appendChild(document.createTextNode('foo '));\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement insertBefore=null}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'bar'\n });\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'foo bar');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'bar!!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'foo bar!!');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'bar'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, 'foo bar');\n }\n\n ['@test does not allow insertBefore=non-null-value']() {\n var someElement = document.createElement('div');\n expectAssertion(() => {\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement insertBefore=\".foo\"}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n }, /Can only pass null to insertBefore in in-element, received:/);\n }\n\n ['@test does not allow null as a destination element']() {\n var someElement = null;\n expectAssertion(() => {\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n }, /You cannot pass a null or undefined destination element to in-element/);\n }\n\n ['@test does not undefined as a destination element']() {\n var someElement = undefined;\n expectAssertion(() => {\n this.render((0, _internalTestHelpers.strip)`\n {{#in-element this.someElement}}\n {{this.text}}\n {{/in-element}}\n `, {\n someElement,\n text: 'Whoop!'\n });\n }, /You cannot pass a null or undefined destination element to in-element/);\n }\n\n ['@test components are cleaned up properly'](assert) {\n var hooks = [];\n var someElement = document.createElement('div');\n this.registerComponent('modal-display', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n hooks.push('didInsertElement');\n },\n\n willDestroyElement() {\n hooks.push('willDestroyElement');\n }\n\n }),\n template: `{{this.text}}`\n });\n this.render((0, _internalTestHelpers.strip)`\n {{#if this.showModal}}\n {{#in-element this.someElement}}\n {{modal-display text=this.text}}\n {{/in-element}}\n {{/if}}\n `, {\n someElement,\n text: 'Whoop!',\n showModal: false\n });\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, '');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'showModal', true));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'Huzzah!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Huzzah!'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'Whoop!'));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n this.assertComponentElement(someElement.firstChild, {\n content: 'Whoop!'\n });\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'showModal', false));\n (0, _internalTestHelpers.equalTokens)(this.element, '');\n (0, _internalTestHelpers.equalTokens)(someElement, '');\n assert.deepEqual(hooks, ['didInsertElement', 'willDestroyElement']);\n }\n\n ['@test appending to the root element should not cause double clearing']() {\n this.render((0, _internalTestHelpers.strip)`\n Before\n {{#in-element this.rootElement insertBefore=null}}\n {{this.text}}\n {{/in-element}}\n After\n `, {\n rootElement: this.element,\n text: 'Whoop!'\n });\n (0, _internalTestHelpers.equalTokens)(this.element, 'BeforeWhoop!After');\n this.assertStableRerender();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'text', 'Huzzah!'));\n (0, _internalTestHelpers.equalTokens)(this.element, 'BeforeHuzzah!After'); // teardown happens in afterEach and should not cause double-clearing error\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/integration/syntax/with-dynamic-var-test\", [\"internal-test-helpers\"], function (_internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('{{-with-dynamic-var}}', class extends _internalTestHelpers.RenderingTestCase {\n ['@test does not allow setting values other than outletState']() {\n expectAssertion(() => {\n this.render((0, _internalTestHelpers.strip)`\n {{#-with-dynamic-vars foo=\"bar\"}}\n {{-get-dynamic-var 'foo'}}\n {{/-with-dynamic-vars}}\n `);\n }, /Using `-with-dynamic-scope` is only supported for `outletState` \\(you used `foo`\\)./);\n }\n\n ['@test allows setting/getting outletState']() {\n // this is simply asserting that we can write and read outletState\n // the actual value being used here is not what is used in real life\n // feel free to change the value being set and asserted as needed\n this.render((0, _internalTestHelpers.strip)`\n {{#-with-dynamic-vars outletState=\"bar\"}}\n {{-get-dynamic-var 'outletState'}}\n {{/-with-dynamic-vars}}\n `);\n this.assertText('bar');\n }\n\n ['@test does not allow getting values other than outletState']() {\n expectAssertion(() => {\n this.render(`{{-get-dynamic-var 'foo'}}`);\n }, /Using `-get-dynamic-scope` is only supported for `outletState` \\(you used `foo`\\)./);\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/unit/outlet-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@ember/runloop\"], function (_internalTestHelpers, _glimmer, _runloop) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Glimmer OutletView', class extends _internalTestHelpers.AbstractTestCase {\n ['@test render in the render queue'](assert) {\n var didAppendOutletView = 0;\n var expectedOutlet = '#foo.bar';\n var renderer = {\n appendOutletView(view, target) {\n didAppendOutletView++;\n assert.equal(view, outletView);\n assert.equal(target, expectedOutlet);\n }\n\n };\n var outletView = new _glimmer.OutletView({}, {\n lookup() {\n return renderer;\n }\n\n });\n (0, _runloop.run)(() => {\n assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (before appendTo)');\n outletView.appendTo(expectedOutlet);\n assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (sync after appendTo)');\n (0, _runloop.schedule)('actions', () => assert.equal(didAppendOutletView, 0, 'appendOutletView should not yet have been called (in actions)'));\n (0, _runloop.schedule)('render', () => assert.equal(didAppendOutletView, 1, 'appendOutletView should be invoked in render'));\n });\n }\n\n });\n});","define(\"@ember/-internals/glimmer/tests/unit/runtime-resolver-cache-test\", [\"@ember/-internals/environment\", \"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/glimmer\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_environment, _internalTestHelpers, _metal, _glimmer, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-glimmer runtime resolver cache', class extends _internalTestHelpers.RenderingTestCase {\n '@test a helper definition is only generated once'() {\n this.registerHelper('foo-bar', () => 'foo-bar helper!');\n this.registerHelper('baz-qux', () => 'baz-qux helper!'); // snapshot counters\n\n this.getCacheCounters();\n this.render(`\n {{~#if this.cond~}}\n {{foo-bar}}\n {{~else~}}\n {{baz-qux}}\n {{~/if}}`, {\n cond: true\n });\n this.assertText('foo-bar helper!');\n this.expectCacheChanges({\n helperDefinitionCount: 1,\n // from this.render\n templateCacheMisses: 1,\n // from debugRenderTree\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 1 : 0\n }, 'calculate foo-bar helper only'); // show component-two for the first time\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', false));\n this.assertText('baz-qux helper!');\n this.expectCacheChanges({\n helperDefinitionCount: 1\n }, 'calculate baz-qux helper, misses cache'); // show foo-bar again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', true));\n this.assertText('foo-bar helper!');\n this.expectCacheChanges({}, 'toggle back to foo-bar cache hit'); // show baz-qux again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', false));\n this.assertText('baz-qux helper!');\n this.expectCacheChanges({}, 'toggle back to baz-qux cache hit');\n }\n\n '@test a component definition is only generated once'() {\n // static layout\n this.registerComponent('component-one', {\n template: 'One'\n });\n this.registerComponent('component-two', {\n ComponentClass: _helpers.Component.extend(),\n template: 'Two'\n }); // snapshot counters\n\n this.getCacheCounters(); // show component-one for the first time\n\n this.render(`{{component this.componentName}}`, {\n componentName: 'component-one'\n });\n this.assertText('One');\n this.expectCacheChanges({\n componentDefinitionCount: 1,\n // 1 from this.render, 1 from component-one\n templateCacheMisses: 2,\n // debugRenderTree\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 1 : 0\n }, 'test case component and component-one no change'); // show component-two for the first time\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n this.assertText('Two');\n this.expectCacheChanges({\n componentDefinitionCount: 1,\n templateCacheMisses: 1\n }, 'component-two first render'); // show component-one again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'componentName', 'component-one'));\n this.assertText('One');\n this.expectCacheChanges({}, 'toggle back to component-one no change'); // show component-two again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'componentName', 'component-two'));\n this.assertText('Two');\n this.expectCacheChanges({}, 'toggle back to component-two no change');\n }\n\n ['@test each template is only compiled once']() {\n // static layout\n this.registerComponent('component-one', {\n template: 'One'\n }); // test directly import template factory onto late bound layout\n\n var Two = _helpers.Component.extend({\n layout: this.compile('Two')\n });\n\n this.registerComponent('component-two', {\n ComponentClass: Two\n }); // inject layout onto component, share layout with component-one\n\n var Root = _helpers.Component.extend({\n layout: this.owner.lookup('template:components/component-one')\n });\n\n this.registerComponent('root-component', {\n ComponentClass: Root\n }); // template instance shared between to template managers\n\n var rootFactory = this.owner.factoryFor('component:root-component'); // snapshot counters\n\n this.getCacheCounters(); // show component-one for the first time\n\n this.render(`\n {{~#if this.cond~}}\n {{component-one}}\n {{~else~}}\n {{component-two}}\n {{~/if}}`, {\n cond: true\n });\n this.assertText('One');\n this.expectCacheChanges({\n componentDefinitionCount: 1,\n templateCacheMisses: 2,\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 1 : 0\n }, 'test case component and component-one no change'); // show component-two for the first time\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', false));\n this.assertText('Two');\n this.expectCacheChanges({\n templateCacheMisses: 1,\n componentDefinitionCount: 1,\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 1 : 0\n }, 'component-two first render misses template cache'); // show component-one again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', true));\n this.assertText('One');\n this.expectCacheChanges({}, 'toggle back to component-one no change'); // show component-two again\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', false));\n this.assertText('Two');\n this.expectCacheChanges({\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 2 : 1\n }, 'toggle back to component-two hits template cache'); // render new root append\n\n var root = rootFactory.create();\n\n try {\n (0, _internalTestHelpers.runAppend)(root);\n this.assertText('TwoOne'); // roots have different capabilities so this will hit\n\n this.expectCacheChanges({\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 2 : 1\n }, 'append root with component-one no change'); // render new root append\n\n var root2 = rootFactory.create();\n\n try {\n (0, _internalTestHelpers.runAppend)(root2);\n this.assertText('TwoOneOne');\n this.expectCacheChanges({\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 2 : 1\n }, 'append another root no change');\n } finally {\n (0, _internalTestHelpers.runDestroy)(root2);\n }\n } finally {\n (0, _internalTestHelpers.runDestroy)(root);\n }\n }\n\n getCacheCounters() {\n var {\n componentDefinitionCount,\n helperDefinitionCount\n } = this.renderer._context.constants;\n return this._counters = {\n templateCacheHits: _glimmer.templateCacheCounters.cacheHit || 0,\n templateCacheMisses: _glimmer.templateCacheCounters.cacheMiss || 0,\n componentDefinitionCount,\n helperDefinitionCount\n };\n }\n\n expectCacheChanges(expected, message) {\n var lastState = this._counters;\n var state = this.getCacheCounters();\n var actual = diff(state, lastState);\n this.assert.deepEqual(actual, stripZeroes(expected), message);\n }\n\n });\n\n function stripZeroes(value) {\n var res = {};\n Object.keys(value).forEach(key => {\n if (value[key]) {\n res[key] = value[key];\n }\n });\n return res;\n }\n\n function diff(state, lastState) {\n var res = {};\n Object.keys(state).forEach(key => {\n var delta = state[key] - lastState[key];\n\n if (delta !== 0) {\n res[key] = state[key] - lastState[key];\n }\n });\n return res;\n }\n});","define(\"@ember/-internals/glimmer/tests/unit/template-factory-test\", [\"@ember/-internals/environment\", \"internal-test-helpers\", \"@ember/-internals/glimmer\", \"ember-template-compiler\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_environment, _internalTestHelpers, _glimmer, _emberTemplateCompiler, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Template factory test', class extends _internalTestHelpers.RenderingTestCase {\n ['@test the template factory returned from precompile is the same as compile'](assert) {\n // snapshot counters\n this.getCacheCounters();\n var {\n owner\n } = this;\n var templateStr = 'Hello {{this.name}}';\n var options = {\n moduleName: 'my-app/templates/some-module.hbs'\n };\n var spec = (0, _emberTemplateCompiler.precompile)(templateStr, options);\n var body = `exports.default = template(${spec});`;\n var module = new Function('exports', 'template', body);\n var exports = {};\n module(exports, _glimmer.template);\n var Precompiled = exports['default'];\n var Compiled = (0, _emberTemplateCompiler.compile)(templateStr, options);\n assert.equal(typeof Precompiled, 'function', 'precompiled is a factory');\n assert.equal(typeof Compiled, 'function', 'compiled is a factory');\n this.expectCacheChanges({}, 'no changes');\n var precompiled = Precompiled(owner);\n this.expectCacheChanges({\n templateCacheMisses: 1\n }, 'misses 1');\n var compiled = Compiled(owner);\n this.expectCacheChanges({\n templateCacheMisses: 1\n }, 'misses 1');\n assert.ok(typeof precompiled.spec !== 'string', 'Spec has been parsed');\n assert.ok(typeof compiled.spec !== 'string', 'Spec has been parsed');\n this.registerComponent('x-precompiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Precompiled\n })\n });\n this.registerComponent('x-compiled', {\n ComponentClass: _helpers.Component.extend({\n layout: Compiled\n })\n });\n this.render('{{x-precompiled name=\"precompiled\"}} {{x-compiled name=\"compiled\"}}');\n this.expectCacheChanges({\n templateCacheHits: _environment.ENV._DEBUG_RENDER_TREE ? 5 : 2,\n // from this.render\n templateCacheMisses: 1\n }, 'hits 2');\n this.assertText('Hello precompiled Hello compiled');\n }\n\n getCacheCounters() {\n return this._counters = {\n templateCacheHits: _glimmer.templateCacheCounters.cacheHit,\n templateCacheMisses: _glimmer.templateCacheCounters.cacheMiss\n };\n }\n\n expectCacheChanges(expected, message) {\n var lastState = this._counters;\n var state = this.getCacheCounters();\n var actual = diff(state, lastState);\n this.assert.deepEqual(actual, expected, message);\n }\n\n });\n\n function diff(state, lastState) {\n var res = {};\n Object.keys(state).forEach(key => {\n var delta = state[key] - lastState[key];\n\n if (delta !== 0) {\n res[key] = state[key] - lastState[key];\n }\n });\n return res;\n }\n});","define(\"@ember/-internals/glimmer/tests/utils/debug-stack\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.debugStackMessageFor = debugStackMessageFor;\n _exports.backtrackingMessageFor = backtrackingMessageFor;\n\n function debugStackMessage(message, renderTree, includeTopLevel) {\n var topLevel = includeTopLevel ? '-top-level\\n {4}' : '';\n return `${message}[\\\\S\\\\s]*- While rendering:\\n {2}${topLevel}${renderTree.join('\\\\n\\\\s*')}`;\n }\n\n function debugStackMessageFor(message, {\n renderTree,\n includeTopLevel = true\n }) {\n // Join with a regex that consumes all characters\n return new RegExp(debugStackMessage(message, renderTree, includeTopLevel));\n }\n\n function backtrackingMessageFor(key, obj, {\n renderTree,\n includeTopLevel = true\n } = {}) {\n // Start off with standard backtracking assertion\n var message;\n\n if (obj) {\n message = `You attempted to update \\`${key}\\` on \\`${obj}\\``;\n } else {\n message = `You attempted to update \\`${key}\\``;\n }\n\n if (renderTree) {\n message = debugStackMessage(`${message}[\\\\S\\\\s]*\\`${key}\\` was first used:`, renderTree, includeTopLevel);\n } // Join with a regex that consumes all characters\n\n\n return new RegExp(`${message}[\\\\S\\\\s]*Stack trace for the update:`);\n }\n});","define(\"@ember/-internals/glimmer/tests/utils/glimmerish-component\", [\"exports\", \"@glimmer/manager\", \"@ember/-internals/glimmer\", \"@ember/-internals/owner\"], function (_exports, _manager, _glimmer, _owner) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class GlimmerishComponentManager {\n constructor(owner) {\n this.capabilities = (0, _manager.componentCapabilities)('3.13', {\n updateHook: false\n });\n this.owner = owner;\n }\n\n createComponent(Factory, args) {\n return new Factory(this.owner, args.named);\n }\n\n getContext(component) {\n return component;\n }\n\n }\n\n class GlimmerishComponent {\n constructor(owner, args) {\n (0, _owner.setOwner)(this, owner);\n this.args = args;\n }\n\n }\n\n (0, _glimmer.setComponentManager)(() => new GlimmerishComponentManager(), GlimmerishComponent);\n var _default = GlimmerishComponent;\n _exports.default = _default;\n});","define(\"@ember/-internals/glimmer/tests/utils/helpers\", [\"exports\", \"ember-template-compiler\", \"internal-test-helpers\", \"@ember/-internals/glimmer\"], function (_exports, _emberTemplateCompiler, _internalTestHelpers, _glimmer) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"precompile\", {\n enumerable: true,\n get: function () {\n return _emberTemplateCompiler.precompile;\n }\n });\n Object.defineProperty(_exports, \"compile\", {\n enumerable: true,\n get: function () {\n return _internalTestHelpers.compile;\n }\n });\n Object.defineProperty(_exports, \"Helper\", {\n enumerable: true,\n get: function () {\n return _glimmer.Helper;\n }\n });\n Object.defineProperty(_exports, \"helper\", {\n enumerable: true,\n get: function () {\n return _glimmer.helper;\n }\n });\n Object.defineProperty(_exports, \"Component\", {\n enumerable: true,\n get: function () {\n return _glimmer.Component;\n }\n });\n Object.defineProperty(_exports, \"InteractiveRenderer\", {\n enumerable: true,\n get: function () {\n return _glimmer.InteractiveRenderer;\n }\n });\n Object.defineProperty(_exports, \"InertRenderer\", {\n enumerable: true,\n get: function () {\n return _glimmer.InertRenderer;\n }\n });\n Object.defineProperty(_exports, \"htmlSafe\", {\n enumerable: true,\n get: function () {\n return _glimmer.htmlSafe;\n }\n });\n Object.defineProperty(_exports, \"SafeString\", {\n enumerable: true,\n get: function () {\n return _glimmer.SafeString;\n }\n });\n Object.defineProperty(_exports, \"DOMChanges\", {\n enumerable: true,\n get: function () {\n return _glimmer.DOMChanges;\n }\n });\n Object.defineProperty(_exports, \"isHTMLSafe\", {\n enumerable: true,\n get: function () {\n return _glimmer.isHTMLSafe;\n }\n });\n});","define(\"@ember/-internals/glimmer/tests/utils/shared-conditional-tests\", [\"exports\", \"internal-test-helpers\", \"@ember/-internals/glimmer\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_exports, _internalTestHelpers, _glimmer, _metal, _runtime, _helpers) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.IfUnlessWithSyntaxTest = _exports.TogglingSyntaxConditionalsTest = _exports.IfUnlessHelperTest = _exports.TogglingHelperConditionalsTest = _exports.TogglingConditionalsTest = _exports.ArrayTestCases = _exports.ObjectTestCases = _exports.BasicConditionalsTest = _exports.StableFalsyGenerator = _exports.StableTruthyGenerator = _exports.FalsyGenerator = _exports.TruthyGenerator = void 0;\n\n /* eslint-disable no-new-wrappers */\n class AbstractConditionalsTest extends _internalTestHelpers.RenderingTestCase {\n get truthyValue() {\n return true;\n }\n\n get falsyValue() {\n return false;\n }\n\n wrapperFor(templates) {\n return templates.join('');\n }\n\n wrappedTemplateFor(options) {\n return this.wrapperFor([this.templateFor(options)]);\n }\n /* abstract */\n\n\n templateFor()\n /* { cond, truthy, falsy } */\n {\n // e.g. `{{#if ${cond}}}${truthy}{{else}}${falsy}{{/if}}`\n throw new Error('Not implemented: `templateFor`');\n }\n /* abstract */\n\n\n renderValues()\n /* ...values */\n {\n throw new Error('Not implemented: `renderValues`');\n }\n\n }\n\n class AbstractGenerator {\n constructor(cases) {\n this.cases = cases;\n }\n /* abstract */\n\n\n generate()\n /* value, idx */\n {\n throw new Error('Not implemented: `generate`');\n }\n\n }\n /*\n The test cases in this file generally follow the following pattern:\n \n 1. Render with [ truthy, ...(other truthy variations), falsy, ...(other falsy variations) ]\n 2. No-op rerender\n 3. Make all of them falsy (through interior mutation)\n 4. Make all of them truthy (through interior mutation, sometimes with some slight variations)\n 5. Reset them to their original values (through replacement)\n */\n\n\n class TruthyGenerator extends AbstractGenerator {\n generate(value, idx) {\n return {\n [`@test it should consider ${JSON.stringify(value)} truthy [${idx}]`]() {\n this.renderValues(value);\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', value));\n this.assertText('T1');\n }\n\n };\n }\n\n }\n\n _exports.TruthyGenerator = TruthyGenerator;\n\n class FalsyGenerator extends AbstractGenerator {\n generate(value, idx) {\n return {\n [`@test it should consider ${JSON.stringify(value)} falsy [${idx}]`]() {\n this.renderValues(value);\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', value));\n this.assertText('F1');\n }\n\n };\n }\n\n }\n\n _exports.FalsyGenerator = FalsyGenerator;\n\n class StableTruthyGenerator extends TruthyGenerator {\n generate(value, idx) {\n return Object.assign(super.generate(value, idx), {\n [`@test it maintains DOM stability when condition changes from ${value} to another truthy value and back [${idx}]`]() {\n this.renderValues(value);\n this.assertText('T1');\n this.takeSnapshot();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.truthyValue));\n this.assertText('T1');\n this.assertInvariants();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', value));\n this.assertText('T1');\n this.assertInvariants();\n }\n\n });\n }\n\n }\n\n _exports.StableTruthyGenerator = StableTruthyGenerator;\n\n class StableFalsyGenerator extends FalsyGenerator {\n generate(value, idx) {\n return Object.assign(super.generate(value), {\n [`@test it maintains DOM stability when condition changes from ${value} to another falsy value and back [${idx}]`]() {\n this.renderValues(value);\n this.assertText('F1');\n this.takeSnapshot();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n this.assertText('F1');\n this.assertInvariants();\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', value));\n this.assertText('F1');\n this.assertInvariants();\n }\n\n });\n }\n\n }\n\n _exports.StableFalsyGenerator = StableFalsyGenerator;\n\n class ObjectProxyGenerator extends AbstractGenerator {\n generate(value, idx) {\n // This is inconsistent with our usual to-bool policy, but the current proxy implementation\n // simply uses !!content to determine truthiness\n if (value) {\n return {\n [`@test it should consider an object proxy with \\`${JSON.stringify(value)}\\` truthy [${idx}]`]() {\n this.renderValues(_runtime.ObjectProxy.create({\n content: value\n }));\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1.content', this.falsyValue));\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({\n content: value\n })));\n this.assertText('T1');\n }\n\n };\n } else {\n return {\n [`@test it should consider an object proxy with \\`${JSON.stringify(value)}\\` falsy [${idx}]`]() {\n this.renderValues(_runtime.ObjectProxy.create({\n content: value\n }));\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('F1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1.content', this.truthyValue));\n this.assertText('T1');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({\n content: value\n })));\n this.assertText('F1');\n }\n\n };\n }\n }\n\n } // Testing behaviors shared across all conditionals, i.e. {{#if}}, {{#unless}},\n // {{#each}}, {{#each-in}}, (if) and (unless)\n\n\n class BasicConditionalsTest extends AbstractConditionalsTest {\n ['@test it renders the corresponding block based on the conditional']() {\n this.renderValues(this.truthyValue, this.falsyValue);\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n this.assertText('F1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n this.assertText('T1T2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n this.assertText('T1F2');\n }\n\n } // Testing behaviors related to ember objects, object proxies, etc\n\n\n _exports.BasicConditionalsTest = BasicConditionalsTest;\n var ObjectTestCases = {\n ['@test it considers object proxies without content falsy']() {\n this.renderValues(_runtime.ObjectProxy.create({\n content: {}\n }), _runtime.ObjectProxy.create({\n content: _runtime.Object.create()\n }), _runtime.ObjectProxy.create({\n content: null\n }));\n this.assertText('T1T2F3');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1T2F3');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n this.assertText('F1F2F3');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1.content', _runtime.Object.create());\n (0, _metal.set)(this.context, 'cond2.content', {});\n (0, _metal.set)(this.context, 'cond3.content', {\n foo: 'bar'\n });\n });\n this.assertText('T1T2T3');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ObjectProxy.create({\n content: {}\n }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ObjectProxy.create({\n content: _runtime.Object.create()\n }));\n (0, _metal.set)(this.context, 'cond3', _runtime.ObjectProxy.create({\n content: null\n }));\n });\n this.assertText('T1T2F3');\n }\n\n }; // Testing behaviors related to arrays and array proxies\n\n _exports.ObjectTestCases = ObjectTestCases;\n var ArrayTestCases = {\n ['@test it considers empty arrays falsy']() {\n this.renderValues((0, _runtime.A)(['hello']), (0, _runtime.A)());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1'), 0));\n this.assertText('F1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.get)(this.context, 'cond1').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2').pushObjects([1]);\n });\n this.assertText('T1T2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', (0, _runtime.A)(['hello']));\n (0, _metal.set)(this.context, 'cond2', (0, _runtime.A)());\n });\n this.assertText('T1F2');\n },\n\n ['@test it considers array proxies without content falsy']() {\n this.renderValues(_runtime.ArrayProxy.create({\n content: (0, _runtime.A)(['hello'])\n }), _runtime.ArrayProxy.create({\n content: null\n }));\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1.content', null);\n (0, _metal.set)(this.context, 'cond2.content', null);\n });\n this.assertText('F1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1.content', (0, _runtime.A)(['hello']));\n (0, _metal.set)(this.context, 'cond2.content', (0, _runtime.A)([1]));\n });\n this.assertText('T1T2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({\n content: (0, _runtime.A)(['hello'])\n }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({\n content: null\n }));\n });\n this.assertText('T1F2');\n },\n\n ['@test it considers array proxies with empty arrays falsy']() {\n this.renderValues(_runtime.ArrayProxy.create({\n content: (0, _runtime.A)(['hello'])\n }), _runtime.ArrayProxy.create({\n content: (0, _runtime.A)()\n }));\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => (0, _runtime.removeAt)((0, _metal.get)(this.context, 'cond1.content'), 0));\n this.assertText('F1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.get)(this.context, 'cond1.content').pushObject('hello');\n (0, _metal.get)(this.context, 'cond2.content').pushObjects([1]);\n });\n this.assertText('T1T2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', _runtime.ArrayProxy.create({\n content: (0, _runtime.A)(['hello'])\n }));\n (0, _metal.set)(this.context, 'cond2', _runtime.ArrayProxy.create({\n content: (0, _runtime.A)()\n }));\n });\n this.assertText('T1F2');\n }\n\n };\n _exports.ArrayTestCases = ArrayTestCases;\n var IfUnlessWithTestCases = [new StableTruthyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), {}, {\n foo: 'bar'\n }, _runtime.Object.create(), _runtime.Object.create({\n foo: 'bar'\n }), _runtime.ObjectProxy.create({\n content: true\n }), Object, function () {}, async function () {}, new String('hello'), new String(''), new Boolean(true), new Boolean(false), new Date(), (0, _glimmer.htmlSafe)(' ')]), new StableFalsyGenerator([false, null, undefined, '', 0, [], (0, _runtime.A)(), _runtime.ObjectProxy.create({\n content: undefined\n }), (0, _glimmer.htmlSafe)('')]), new ObjectProxyGenerator([true, ' ', 'hello', 'false', 'null', 'undefined', 1, ['hello'], (0, _runtime.A)(['hello']), _runtime.ArrayProxy.create({\n content: ['hello']\n }), _runtime.ArrayProxy.create({\n content: []\n }), {}, {\n foo: 'bar'\n }, _runtime.Object.create(), _runtime.Object.create({\n foo: 'bar'\n }), _runtime.ObjectProxy.create({\n content: true\n }), _runtime.ObjectProxy.create({\n content: undefined\n }), new String('hello'), new String(''), new Boolean(true), new Boolean(false), new Date(), false, null, undefined, '', 0, [], (0, _runtime.A)()]), ObjectTestCases, ArrayTestCases]; // Testing behaviors shared across the \"toggling\" conditionals, i.e. {{#if}},\n // {{#unless}}, {{#each}}, {{#each-in}}, (if) and (unless)\n\n class TogglingConditionalsTest extends BasicConditionalsTest {} // Testing behaviors shared across the (if) and (unless) helpers\n\n\n _exports.TogglingConditionalsTest = TogglingConditionalsTest;\n\n class TogglingHelperConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n var templates = [];\n var context = {};\n\n for (var i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({\n cond: `this.cond${i}`,\n truthy: `this.t${i}`,\n falsy: `this.f${i}`\n }));\n context[`t${i}`] = `T${i}`;\n context[`f${i}`] = `F${i}`;\n context[`cond${i}`] = values[i - 1];\n }\n\n var wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, context);\n }\n\n ['@test it has access to the outer scope from both templates']() {\n var template = this.wrapperFor([this.templateFor({\n cond: 'this.cond1',\n truthy: 'this.truthy',\n falsy: 'this.falsy'\n }), this.templateFor({\n cond: 'this.cond2',\n truthy: 'this.truthy',\n falsy: 'this.falsy'\n })]);\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n this.assertText('YESNO');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('YESNO');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n this.assertText('YASSNOPE');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n this.assertText('NOPEYASS');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'truthy', 'YES');\n (0, _metal.set)(this.context, 'falsy', 'NO');\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n this.assertText('YESNO');\n }\n\n ['@test it does not update when the unbound helper is used']() {\n var template = this.wrapperFor([this.templateFor({\n cond: '(unbound this.cond1)',\n truthy: '\"T1\"',\n falsy: '\"F1\"'\n }), this.templateFor({\n cond: '(unbound this.cond2)',\n truthy: '\"T2\"',\n falsy: '\"F2\"'\n })]);\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue\n });\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n this.assertText('T1F2');\n }\n\n ['@test evaluation should be lazy'](assert) {\n var truthyEvaluated;\n var falsyEvaluated;\n\n var withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n var withoutEvaluatingFalsy = callback => {\n falsyEvaluated = false;\n callback();\n assert.ok(!falsyEvaluated, 'x-falsy is not evaluated');\n };\n\n this.registerHelper('x-truthy', {\n compute() {\n truthyEvaluated = true;\n return 'T';\n }\n\n });\n this.registerHelper('x-falsy', {\n compute() {\n falsyEvaluated = true;\n return 'F';\n }\n\n });\n var template = this.wrappedTemplateFor({\n cond: 'this.cond',\n // pass values so the helpers don't eagerly compute\n truthy: '(x-truthy this.foo)',\n falsy: '(x-falsy this.foo)'\n });\n withoutEvaluatingFalsy(() => this.render(template, {\n cond: this.truthyValue\n }));\n this.assertText('T');\n withoutEvaluatingFalsy(() => (0, _internalTestHelpers.runTask)(() => this.rerender()));\n this.assertText('T');\n withoutEvaluatingTruthy(() => (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n this.assertText('F');\n withoutEvaluatingTruthy(() => (0, _internalTestHelpers.runTask)(() => this.rerender()));\n this.assertText('F');\n withoutEvaluatingFalsy(() => (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n this.assertText('T');\n }\n\n }\n\n _exports.TogglingHelperConditionalsTest = TogglingHelperConditionalsTest;\n\n class IfUnlessHelperTest extends TogglingHelperConditionalsTest {}\n\n _exports.IfUnlessHelperTest = IfUnlessHelperTest;\n (0, _internalTestHelpers.applyMixins)(IfUnlessHelperTest, ...IfUnlessWithTestCases); // Testing behaviors shared across the \"toggling\" syntatical constructs,\n // i.e. {{#if}}, {{#unless}}, {{#each}} and {{#each-in}}\n\n class TogglingSyntaxConditionalsTest extends TogglingConditionalsTest {\n renderValues(...values) {\n var templates = [];\n var context = {};\n\n for (var i = 1; i <= values.length; i++) {\n templates.push(this.templateFor({\n cond: `this.cond${i}`,\n truthy: `{{this.t}}${i}`,\n falsy: `{{this.f}}${i}`\n }));\n context[`cond${i}`] = values[i - 1];\n }\n\n var wrappedTemplate = this.wrapperFor(templates);\n this.render(wrappedTemplate, Object.assign({\n t: 'T',\n f: 'F'\n }, context));\n }\n\n ['@test it does not update when the unbound helper is used']() {\n var template = `${this.templateFor({\n cond: '(unbound this.cond1)',\n truthy: 'T1',\n falsy: 'F1'\n })}${this.templateFor({\n cond: '(unbound this.cond2)',\n truthy: 'T2',\n falsy: 'F2'\n })}`;\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue\n });\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond1', this.falsyValue));\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n this.assertText('T1F2');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n this.assertText('T1F2');\n }\n\n ['@test it has access to the outer scope from both templates']() {\n var template = this.wrapperFor([this.templateFor({\n cond: 'this.cond1',\n truthy: '{{this.truthy}}',\n falsy: '{{this.falsy}}'\n }), this.templateFor({\n cond: 'this.cond2',\n truthy: '{{this.truthy}}',\n falsy: '{{this.falsy}}'\n })]);\n this.render(template, {\n cond1: this.truthyValue,\n cond2: this.falsyValue,\n truthy: 'YES',\n falsy: 'NO'\n });\n this.assertText('YESNO');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('YESNO');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'truthy', 'YASS');\n (0, _metal.set)(this.context, 'falsy', 'NOPE');\n });\n this.assertText('YASSNOPE');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n });\n this.assertText('NOPEYASS');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'truthy', 'YES');\n (0, _metal.set)(this.context, 'falsy', 'NO');\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n });\n this.assertText('YESNO');\n }\n\n ['@test it updates correctly when enclosing another conditional']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n var inner = this.templateFor({\n cond: 'this.inner',\n truthy: 'T-inner',\n falsy: 'F-inner'\n });\n var template = this.wrappedTemplateFor({\n cond: 'this.outer',\n truthy: inner,\n falsy: 'F-outer'\n });\n this.render(template, {\n outer: this.truthyValue,\n inner: this.truthyValue\n });\n this.assertText('T-inner');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('T-inner'); // Changes the inner bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'inner', this.falsyValue));\n this.assertText('F-inner'); // Now rerender the outer conditional, which require first clearing its bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n this.assertText('F-outer');\n }\n\n ['@test it updates correctly when enclosing #each']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n var template = this.wrappedTemplateFor({\n cond: 'this.outer',\n truthy: '{{#each this.inner as |text|}}{{text}}{{/each}}',\n falsy: 'F-outer'\n });\n this.render(template, {\n outer: this.truthyValue,\n inner: ['inner', '-', 'before']\n });\n this.assertText('inner-before');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('inner-before'); // Changes the inner bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'inner', ['inner-after']));\n this.assertText('inner-after'); // Now rerender the outer conditional, which require first clearing its bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n this.assertText('F-outer'); // Reset\n\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'inner', ['inner-again']);\n (0, _metal.set)(this.context, 'outer', this.truthyValue);\n });\n this.assertText('inner-again'); // Now clear the inner bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'inner', []));\n this.assertText(''); // Now rerender the outer conditional, which require first clearing its bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n this.assertText('F-outer');\n }\n\n ['@test it updates correctly when enclosing triple-curlies']() {\n // This tests whether the outer conditional tracks its bounds correctly as its inner bounds changes\n var template = this.wrappedTemplateFor({\n cond: 'this.outer',\n truthy: '{{{this.inner}}}',\n falsy: 'F-outer'\n });\n this.render(template, {\n outer: this.truthyValue,\n inner: 'inner -before '\n });\n this.assertText('inner-before');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n this.assertText('inner-before'); // Changes the inner bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'inner', 'inner-after
'));\n this.assertText('inner-after'); // Now rerender the outer conditional, which require first clearing its bounds\n\n (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'outer', this.falsyValue));\n this.assertText('F-outer');\n }\n\n ['@test child conditional should not render children if parent conditional becomes false'](assert) {\n var childCreated = false;\n this.registerComponent('foo-bar', {\n template: 'foo-bar',\n ComponentClass: _helpers.Component.extend({\n init() {\n this._super(...arguments);\n\n childCreated = true;\n }\n\n })\n });\n var innerTemplate = this.templateFor({\n cond: 'this.cond2',\n truthy: '{{foo-bar}}',\n falsy: ''\n });\n var wrappedTemplate = this.wrappedTemplateFor({\n cond: 'this.cond1',\n truthy: innerTemplate,\n falsy: ''\n });\n this.render(wrappedTemplate, {\n cond1: this.truthyValue,\n cond2: this.falsyValue\n });\n assert.ok(!childCreated);\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => this.rerender());\n assert.ok(!childCreated);\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond2', this.truthyValue);\n (0, _metal.set)(this.context, 'cond1', this.falsyValue);\n });\n assert.ok(!childCreated);\n this.assertText('');\n (0, _internalTestHelpers.runTask)(() => {\n (0, _metal.set)(this.context, 'cond2', this.falsyValue);\n (0, _metal.set)(this.context, 'cond1', this.truthyValue);\n });\n assert.ok(!childCreated);\n this.assertText('');\n }\n\n ['@test evaluation should be lazy'](assert) {\n var truthyEvaluated;\n var falsyEvaluated;\n\n var withoutEvaluatingTruthy = callback => {\n truthyEvaluated = false;\n callback();\n assert.ok(!truthyEvaluated, 'x-truthy is not evaluated');\n };\n\n var withoutEvaluatingFalsy = callback => {\n falsyEvaluated = false;\n callback();\n assert.ok(!falsyEvaluated, 'x-falsy is not evaluated');\n };\n\n this.registerHelper('x-truthy', {\n compute() {\n truthyEvaluated = true;\n return 'T';\n }\n\n });\n this.registerHelper('x-falsy', {\n compute() {\n falsyEvaluated = true;\n return 'F';\n }\n\n });\n var template = this.wrappedTemplateFor({\n cond: 'this.cond',\n truthy: '{{x-truthy}}',\n falsy: '{{x-falsy}}'\n });\n withoutEvaluatingFalsy(() => this.render(template, {\n cond: this.truthyValue\n }));\n this.assertText('T');\n withoutEvaluatingFalsy(() => (0, _internalTestHelpers.runTask)(() => this.rerender()));\n this.assertText('T');\n withoutEvaluatingTruthy(() => (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', this.falsyValue)));\n this.assertText('F');\n withoutEvaluatingTruthy(() => (0, _internalTestHelpers.runTask)(() => this.rerender()));\n this.assertText('F');\n withoutEvaluatingFalsy(() => (0, _internalTestHelpers.runTask)(() => (0, _metal.set)(this.context, 'cond', this.truthyValue)));\n this.assertText('T');\n }\n\n }\n\n _exports.TogglingSyntaxConditionalsTest = TogglingSyntaxConditionalsTest;\n\n class IfUnlessWithSyntaxTest extends TogglingSyntaxConditionalsTest {}\n\n _exports.IfUnlessWithSyntaxTest = IfUnlessWithSyntaxTest;\n (0, _internalTestHelpers.applyMixins)(IfUnlessWithSyntaxTest, ...IfUnlessWithTestCases);\n});","define(\"@ember/-internals/glimmer/tests/utils/string-test\", [\"internal-test-helpers\", \"@ember/-internals/glimmer/tests/utils/helpers\"], function (_internalTestHelpers, _helpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('SafeString', class extends _internalTestHelpers.AbstractTestCase {\n ['@test htmlSafe should return an instance of SafeString']() {\n var safeString = (0, _helpers.htmlSafe)('you need to be more bold ');\n this.assert.ok(safeString instanceof _helpers.SafeString, 'should be a SafeString');\n }\n\n ['@test htmlSafe should return an empty string for null']() {\n var safeString = (0, _helpers.htmlSafe)(null);\n this.assert.equal(safeString instanceof _helpers.SafeString, true, 'should be a SafeString');\n this.assert.equal(safeString.toString(), '', 'should return an empty string');\n }\n\n ['@test htmlSafe should return an instance of SafeString for an empty string']() {\n var safeString = (0, _helpers.htmlSafe)();\n this.assert.equal(safeString instanceof _helpers.SafeString, true, 'should be a SafeString');\n this.assert.equal(safeString.toString(), '', 'should return an empty string');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('SafeString isHTMLSafe', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isHTMLSafe should detect SafeString']() {\n var safeString = (0, _helpers.htmlSafe)('Emphasize the important things.');\n this.assert.ok((0, _helpers.isHTMLSafe)(safeString));\n }\n\n ['@test isHTMLSafe should not detect SafeString on primatives']() {\n this.assert.notOk((0, _helpers.isHTMLSafe)('Hello World'));\n this.assert.notOk((0, _helpers.isHTMLSafe)({}));\n this.assert.notOk((0, _helpers.isHTMLSafe)([]));\n this.assert.notOk((0, _helpers.isHTMLSafe)(10));\n this.assert.notOk((0, _helpers.isHTMLSafe)(null));\n }\n\n });\n});","define(\"@ember/-internals/meta/tests/listeners_test\", [\"internal-test-helpers\", \"@ember/-internals/meta\"], function (_internalTestHelpers, _meta) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.meta listeners', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basics'](assert) {\n var t = {};\n var m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n var matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n m.removeFromListeners('hello', t, 'm');\n matching = m.matchingListeners('hello');\n assert.equal(matching, undefined);\n }\n\n ['@test inheritance'](assert) {\n var matching;\n var target = {};\n var parent = {};\n var parentMeta = (0, _meta.meta)(parent);\n parentMeta.addToListeners('hello', target, 'm', 0);\n var child1 = Object.create(parent);\n var m1 = (0, _meta.meta)(child1);\n var child2 = Object.create(parent);\n var m2 = (0, _meta.meta)(child2);\n var child3 = Object.create(parent);\n var m3 = (0, _meta.meta)(child3);\n m3.removeFromListeners('hello', target, 'm');\n matching = m3.matchingListeners('hello');\n assert.deepEqual(matching, undefined, 'no listeners for child3');\n m3.addToListeners('hello', target, 'm', 0);\n matching = m3.matchingListeners('hello');\n assert.deepEqual(matching, [target, 'm', false], 'listener still exists for child1');\n m3.removeFromListeners('hello', target, 'm');\n matching = m3.matchingListeners('hello');\n assert.deepEqual(matching, undefined, 'no listeners for child3');\n matching = m1.matchingListeners('hello');\n assert.deepEqual(matching, [target, 'm', false], 'listener still exists for child1');\n matching = m2.matchingListeners('hello');\n assert.deepEqual(matching, [target, 'm', false], 'listener still exists for child2');\n m1.removeFromListeners('hello', target, 'm');\n matching = m1.matchingListeners('hello');\n assert.equal(matching, undefined, 'listener removed from child1');\n matching = m2.matchingListeners('hello');\n assert.deepEqual(matching, [target, 'm', false], 'listener still exists for child2');\n matching = parentMeta.matchingListeners('hello');\n assert.deepEqual(matching, [target, 'm', false], 'listener still present for parent');\n }\n\n ['@test deduplication'](assert) {\n var t = {};\n var m = (0, _meta.meta)({});\n m.addToListeners('hello', t, 'm', 0);\n m.addToListeners('hello', t, 'm', 0);\n var matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n assert.equal(matching[0], t);\n }\n\n ['@test parent caching'](assert) {\n if (true\n /* DEBUG */\n ) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n }\n\n class Class {}\n\n var classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n var instance = new Class();\n var m = (0, _meta.meta)(instance);\n var matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n\n if (true\n /* DEBUG */\n ) {\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n }\n\n matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n\n if (true\n /* DEBUG */\n ) {\n assert.equal(_meta.counters.flattenedListenersCalls, 3);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n }\n }\n\n ['@test parent cache invalidation'](assert) {\n if (true\n /* DEBUG */\n ) {\n _meta.counters.flattenedListenersCalls = 0;\n _meta.counters.parentListenersUsed = 0;\n _meta.counters.listenersInherited = 0;\n }\n\n class Class {}\n\n var classMeta = (0, _meta.meta)(Class.prototype);\n classMeta.addToListeners('hello', null, 'm', 0);\n var instance = new Class();\n var m = (0, _meta.meta)(instance);\n var matching = m.matchingListeners('hello');\n assert.equal(matching.length, 3);\n\n if (true\n /* DEBUG */\n ) {\n assert.equal(_meta.counters.flattenedListenersCalls, 2);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 0);\n }\n\n m.addToListeners('hello', null, 'm2');\n matching = m.matchingListeners('hello');\n assert.equal(matching.length, 6);\n\n if (true\n /* DEBUG */\n ) {\n assert.equal(_meta.counters.flattenedListenersCalls, 4);\n assert.equal(_meta.counters.parentListenersUsed, 1);\n assert.equal(_meta.counters.listenersInherited, 1);\n }\n }\n\n ['@test reopen after flatten'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(0);\n return;\n } // Ensure counter is zeroed\n\n\n _meta.counters.reopensAfterFlatten = 0;\n\n class Class1 {}\n\n var class1Meta = (0, _meta.meta)(Class1.prototype);\n class1Meta.addToListeners('hello', null, 'm', 0);\n var instance1 = new Class1();\n var m1 = (0, _meta.meta)(instance1);\n\n class Class2 {}\n\n var class2Meta = (0, _meta.meta)(Class2.prototype);\n class2Meta.addToListeners('hello', null, 'm', 0);\n var instance2 = new Class2();\n var m2 = (0, _meta.meta)(instance2);\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n assert.equal(_meta.counters.reopensAfterFlatten, 0, 'no reopen calls yet');\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'reopen calls after invalidating parent cache');\n m1.addToListeners('world', null, 'm', 0);\n m2.addToListeners('world', null, 'm', 0);\n m1.matchingListeners('world');\n m2.matchingListeners('world');\n assert.equal(_meta.counters.reopensAfterFlatten, 1, 'no reopen calls after mutating leaf nodes');\n class1Meta.removeFromListeners('hello', null, 'm');\n class2Meta.removeFromListeners('hello', null, 'm');\n m1.matchingListeners('hello');\n m2.matchingListeners('hello');\n assert.equal(_meta.counters.reopensAfterFlatten, 2, 'one reopen call after mutating parents');\n class1Meta.addToListeners('hello', null, 'm', 0);\n m1.matchingListeners('hello');\n class2Meta.addToListeners('hello', null, 'm', 0);\n m2.matchingListeners('hello');\n assert.equal(_meta.counters.reopensAfterFlatten, 3, 'one reopen call after mutating parents and flattening out of order');\n }\n\n '@test removed listeners are removed from the underlying structure GH#1112213'(assert) {\n // this is using private API to confirm the underlying data structure is properly maintained\n // and should be changed to match the data structure as needed\n class Class1 {}\n\n var class1Meta = (0, _meta.meta)(Class1.prototype);\n class1Meta.addToListeners('hello', null, 'm', 0);\n var instance1 = new Class1();\n var m1 = (0, _meta.meta)(instance1);\n\n function listenerFunc() {}\n\n m1.removeFromListeners('hello', null, 'm', 0);\n m1.addToListeners('stringListener', null, 'm', 0);\n m1.addToListeners('functionListener', null, listenerFunc, 0);\n m1.removeFromListeners('functionListener', null, listenerFunc, 0);\n m1.removeFromListeners('stringListener', null, 'm', 0);\n assert.equal(m1.flattenedListeners().length, 1, 'instance listeners correctly removed, inherited listeners remain');\n }\n\n });\n});","define(\"@ember/-internals/meta/tests/meta_test\", [\"internal-test-helpers\", \"@ember/-internals/meta\"], function (_internalTestHelpers, _meta) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.meta', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should return the same hash for an object'](assert) {\n var obj = {};\n (0, _meta.meta)(obj).foo = 'bar';\n assert.equal((0, _meta.meta)(obj).foo, 'bar', 'returns same hash with multiple calls to Ember.meta()');\n }\n\n ['@test meta is not enumerable'](assert) {\n var proto, obj, props, prop;\n proto = {\n foo: 'bar'\n };\n (0, _meta.meta)(proto);\n obj = Object.create(proto);\n (0, _meta.meta)(obj);\n obj.bar = 'baz';\n props = [];\n\n for (prop in obj) {\n props.push(prop);\n }\n\n assert.deepEqual(props.sort(), ['bar', 'foo']);\n\n if (typeof JSON !== 'undefined' && 'stringify' in JSON) {\n try {\n JSON.stringify(obj);\n } catch (e) {\n assert.ok(false, 'meta should not fail JSON.stringify');\n }\n }\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/accessors/get_path_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n var obj;\n (0, _internalTestHelpers.moduleFor)('get with path', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n },\n foothis: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n },\n falseValue: false,\n emptyString: '',\n Wuz: {\n nar: 'foo'\n },\n nullValue: null\n };\n }\n\n teardown() {\n obj = undefined;\n } // ..........................................................\n // LOCAL PATHS\n //\n\n\n ['@test [obj, foo] -> obj.foo'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foo'), obj.foo);\n }\n\n ['@test [obj, foo.bar] -> obj.foo.bar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foo.bar'), obj.foo.bar);\n }\n\n ['@test [obj, foothis.bar] -> obj.foothis.bar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'foothis.bar'), obj.foothis.bar);\n }\n\n ['@test [obj, falseValue.notDefined] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'falseValue.notDefined'), undefined);\n }\n\n ['@test [obj, emptyString.length] -> 0'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'emptyString.length'), 0);\n }\n\n ['@test [obj, nullValue.notDefined] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'nullValue.notDefined'), undefined);\n } // ..........................................................\n // GLOBAL PATHS TREATED LOCAL WITH GET\n //\n\n\n ['@test [obj, Wuz] -> obj.Wuz'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'Wuz'), obj.Wuz);\n }\n\n ['@test [obj, Wuz.nar] -> obj.Wuz.nar'](assert) {\n assert.deepEqual((0, _metal.get)(obj, 'Wuz.nar'), obj.Wuz.nar);\n }\n\n ['@test [obj, Foo] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'Foo'), undefined);\n }\n\n ['@test [obj, Foo.bar] -> (undefined)'](assert) {\n assert.strictEqual((0, _metal.get)(obj, 'Foo.bar'), undefined);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/accessors/get_properties_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('getProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test can retrieve a hash of properties from an object via an argument list or array of property names'](assert) {\n var obj = {\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n };\n assert.deepEqual((0, _metal.getProperties)(obj, 'firstName', 'lastName'), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, 'firstName', 'lastName'), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, 'lastName'), {\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj), {});\n assert.deepEqual((0, _metal.getProperties)(obj, ['firstName', 'lastName']), {\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, ['firstName']), {\n firstName: 'Steve'\n });\n assert.deepEqual((0, _metal.getProperties)(obj, []), {});\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/accessors/get_test\", [\"@ember/-internals/environment\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/runloop\", \"@glimmer/destroyable\"], function (_environment, _runtime, _metal, _internalTestHelpers, _runloop, _destroyable) {\n \"use strict\";\n\n function aget(x, y) {\n return x[y];\n }\n\n (0, _internalTestHelpers.moduleFor)('get', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should get arbitrary properties on an object'](assert) {\n var obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null\n };\n\n for (var key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n assert.equal((0, _metal.get)(obj, key), obj[key], key);\n }\n }\n\n ['@test should retrieve a number key on an object'](assert) {\n var obj = {\n 1: 'first'\n };\n assert.equal((0, _metal.get)(obj, 1), 'first');\n }\n\n ['@test should retrieve an array index'](assert) {\n var arr = ['first', 'second'];\n assert.equal((0, _metal.get)(arr, 0), 'first');\n assert.equal((0, _metal.get)(arr, 1), 'second');\n }\n\n ['@test should retrieve an empty string key on an object'](assert) {\n var obj = {\n '': 'empty-string'\n };\n assert.equal((0, _metal.get)(obj, ''), 'empty-string');\n }\n\n ['@test should return undefined when passed an empty string if that key does not exist on an object'](assert) {\n var obj = {\n tomster: true\n };\n assert.equal((0, _metal.get)(obj, ''), undefined);\n }\n\n ['@test should not access a property more than once'](assert) {\n var count = 0;\n var obj = {\n get id() {\n return ++count;\n }\n\n };\n (0, _metal.get)(obj, 'id');\n assert.equal(count, 1);\n }\n\n ['@test should call unknownProperty on watched values if the value is undefined using getFromEmberMetal()/set()'](assert) {\n var obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n\n };\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should return value from unknown');\n }\n\n ['@test should call unknownProperty on watched values if the value is undefined using accessors'](assert) {\n if (_environment.ENV.USES_ACCESSORS) {\n var obj = {\n unknownProperty(key) {\n assert.equal(key, 'foo', 'should pass key');\n return 'FOO';\n }\n\n };\n assert.equal(aget(obj, 'foo'), 'FOO', 'should return value from unknown');\n } else {\n assert.ok('SKIPPING ACCESSORS');\n }\n }\n\n ['@test get works with paths correctly'](assert) {\n var func = function () {};\n\n func.bar = 'awesome';\n\n var destroyedObj = _runtime.Object.create({\n bar: 'great'\n });\n\n (0, _runloop.run)(() => destroyedObj.destroy());\n assert.equal((0, _metal.get)({\n foo: null\n }, 'foo.bar'), undefined);\n assert.equal((0, _metal.get)({\n foo: {\n bar: 'hello'\n }\n }, 'foo.bar.length'), 5);\n assert.equal((0, _metal.get)({\n foo: func\n }, 'foo.bar'), 'awesome');\n assert.equal((0, _metal.get)({\n foo: func\n }, 'foo.bar.length'), 7);\n assert.equal((0, _metal.get)({}, 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)(function () {}, 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)('', 'foo.bar.length'), undefined);\n assert.equal((0, _metal.get)({\n foo: destroyedObj\n }, 'foo.bar'), undefined);\n }\n\n ['@test warn on attempts to call get with no arguments']() {\n expectAssertion(function () {\n (0, _metal.get)('aProperty');\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to call get with only one argument']() {\n expectAssertion(function () {\n (0, _metal.get)('aProperty');\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to call get with more then two arguments']() {\n expectAssertion(function () {\n (0, _metal.get)({}, 'aProperty', true);\n }, /Get must be called with two arguments;/i);\n }\n\n ['@test warn on attempts to get a property of undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'aProperty');\n }, /Cannot call get with 'aProperty' on an undefined object/i);\n }\n\n ['@test warn on attempts to get a property path of undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'aProperty.on.aPath');\n }, /Cannot call get with 'aProperty.on.aPath' on an undefined object/);\n }\n\n ['@test warn on attempts to get a property of null']() {\n expectAssertion(function () {\n (0, _metal.get)(null, 'aProperty');\n }, /Cannot call get with 'aProperty' on an undefined object/);\n }\n\n ['@test warn on attempts to get a property path of null']() {\n expectAssertion(function () {\n (0, _metal.get)(null, 'aProperty.on.aPath');\n }, /Cannot call get with 'aProperty.on.aPath' on an undefined object/);\n }\n\n ['@test warn on attempts to use get with an unsupported property path']() {\n var obj = {};\n expectAssertion(() => (0, _metal.get)(obj, null), /The key provided to get must be a string or number, you passed null/);\n expectAssertion(() => (0, _metal.get)(obj, NaN), /The key provided to get must be a string or number, you passed NaN/);\n expectAssertion(() => (0, _metal.get)(obj, undefined), /The key provided to get must be a string or number, you passed undefined/);\n expectAssertion(() => (0, _metal.get)(obj, false), /The key provided to get must be a string or number, you passed false/);\n } // ..........................................................\n // BUGS\n //\n\n\n ['@test (regression) watched properties on unmodified inherited objects should still return their original value'](assert) {\n var MyMixin = _metal.Mixin.create({\n someProperty: 'foo',\n propertyDidChange: (0, _metal.observer)('someProperty', () => {})\n });\n\n var baseObject = MyMixin.apply({});\n var theRealObject = Object.create(baseObject);\n assert.equal((0, _metal.get)(theRealObject, 'someProperty'), 'foo', 'should return the set value, not false');\n (0, _runloop.run)(() => (0, _destroyable.destroy)(baseObject));\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/accessors/set_path_test\", [\"@ember/-internals/environment\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_environment, _metal, _internalTestHelpers) {\n \"use strict\";\n\n var originalLookup = _environment.context.lookup;\n var lookup;\n var obj;\n\n function commonSetup() {\n _environment.context.lookup = lookup = {};\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n };\n }\n\n function commonTeardown() {\n _environment.context.lookup = originalLookup;\n obj = null;\n }\n\n (0, _internalTestHelpers.moduleFor)('set with path', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n commonSetup();\n }\n\n teardown() {\n commonTeardown();\n }\n\n ['@test [Foo, bar] -> Foo.bar'](assert) {\n lookup.Foo = {\n toString() {\n return 'Foo';\n }\n\n }; // Behave like an Ember.Namespace\n\n (0, _metal.set)(lookup.Foo, 'bar', 'baz');\n assert.equal((0, _metal.get)(lookup.Foo, 'bar'), 'baz');\n } // ..........................................................\n //\n // LOCAL PATHS\n\n\n ['@test [obj, foo] -> obj.foo'](assert) {\n (0, _metal.set)(obj, 'foo', 'BAM');\n assert.equal((0, _metal.get)(obj, 'foo'), 'BAM');\n }\n\n ['@test [obj, foo.bar] -> obj.foo.bar'](assert) {\n (0, _metal.set)(obj, 'foo.bar', 'BAM');\n assert.equal((0, _metal.get)(obj, 'foo.bar'), 'BAM');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('set with path - deprecated', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n commonSetup();\n }\n\n teardown() {\n commonTeardown();\n } // ..........................................................\n // DEPRECATED\n //\n\n\n ['@test [obj, bla.bla] gives a proper exception message'](assert) {\n var exceptionMessage = 'Property set failed: object in path \"bla\" could not be found.';\n\n try {\n (0, _metal.set)(obj, 'bla.bla', 'BAM');\n } catch (ex) {\n assert.equal(ex.message, exceptionMessage);\n }\n }\n\n ['@test set(xobj, foo.baz.bat, ...) -> EXCEPTION'](assert) {\n assert.throws(() => (0, _metal.set)(obj, 'foo.baz.bat', 'BAM'));\n }\n\n ['@test trySet(obj, foo.baz.bat, ...)'](assert) {\n (0, _metal.trySet)(obj, 'foo.baz.bat', 'BAM');\n assert.ok(true, 'does not raise');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/accessors/set_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_runtime, _metal, _internalTestHelpers) {\n \"use strict\";\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n (0, _internalTestHelpers.moduleFor)('set', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should set arbitrary properties on an object'](assert) {\n var obj = {\n string: 'string',\n number: 23,\n boolTrue: true,\n boolFalse: false,\n nullValue: null,\n undefinedValue: undefined\n };\n var newObj = {};\n\n for (var key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n assert.equal((0, _metal.set)(newObj, key, obj[key]), obj[key], 'should return value');\n assert.ok(key in newObj, 'should have key');\n assert.ok(Object.prototype.hasOwnProperty.call(newObj, key), 'should have key');\n assert.equal((0, _metal.get)(newObj, key), obj[key], 'should set value');\n }\n }\n\n ['@test should set a number key on an object'](assert) {\n var obj = {};\n (0, _metal.set)(obj, 1, 'first');\n assert.equal(obj[1], 'first');\n }\n\n ['@test should set an array index'](assert) {\n var arr = ['first', 'second'];\n (0, _metal.set)(arr, 1, 'lol');\n assert.deepEqual(arr, ['first', 'lol']);\n }\n\n ['@test should call setUnknownProperty if defined and value is undefined'](assert) {\n var obj = {\n count: 0,\n\n unknownProperty() {\n assert.ok(false, 'should not invoke unknownProperty if setUnknownProperty is defined');\n },\n\n setUnknownProperty(key, value) {\n assert.equal(key, 'foo', 'should pass key');\n assert.equal(value, 'BAR', 'should pass key');\n this.count++;\n return 'FOO';\n }\n\n };\n assert.equal((0, _metal.set)(obj, 'foo', 'BAR'), 'BAR', 'should return set value');\n assert.equal(obj.count, 1, 'should have invoked');\n }\n\n ['@test warn on attempts to call set with undefined as object']() {\n expectAssertion(() => (0, _metal.set)(undefined, 'aProperty', 'BAM'), /Cannot call set with 'aProperty' on an undefined object./);\n }\n\n ['@test warn on attempts to call set with null as object']() {\n expectAssertion(() => (0, _metal.set)(null, 'aProperty', 'BAM'), /Cannot call set with 'aProperty' on an undefined object./);\n }\n\n ['@test warn on attempts to use set with an unsupported property path']() {\n var obj = {};\n expectAssertion(() => (0, _metal.set)(obj, null, 42), /The key provided to set must be a string or number, you passed null/);\n expectAssertion(() => (0, _metal.set)(obj, NaN, 42), /The key provided to set must be a string or number, you passed NaN/);\n expectAssertion(() => (0, _metal.set)(obj, undefined, 42), /The key provided to set must be a string or number, you passed undefined/);\n expectAssertion(() => (0, _metal.set)(obj, false, 42), /The key provided to set must be a string or number, you passed false/);\n }\n\n ['@test warn on attempts of calling set on a destroyed object']() {\n var obj = {\n isDestroyed: true\n };\n expectAssertion(() => (0, _metal.set)(obj, 'favoriteFood', 'hot dogs'), 'calling set on destroyed object: [object Object].favoriteFood = hot dogs');\n }\n\n ['@test does not trigger auto-run assertion for objects that have not been tagged'](assert) {\n var obj = {};\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test does not warn on attempts of calling set on a destroyed object with `trySet`'](assert) {\n var obj = {\n isDestroyed: true\n };\n (0, _metal.trySet)(obj, 'favoriteFood', 'hot dogs');\n assert.equal(obj.favoriteFood, undefined, 'does not set and does not error');\n }\n\n ['@test should work with native setters'](assert) {\n var count = 0;\n\n class Foo {\n constructor() {\n this.__foo = '';\n }\n\n get foo() {\n return this.__foo;\n }\n\n set foo(value) {\n count++;\n this.__foo = `computed ${value}`;\n }\n\n }\n\n var obj = new Foo();\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value');\n assert.equal(count, 1, 'should have native setter');\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed bar', 'should return new value');\n }\n\n ['@test should respect prototypical inheritance when subclasses override CPs'](assert) {\n var ParentClass = _runtime.Object.extend({\n prop: (0, _metal.computed)({\n set(key, val) {\n assert.ok(false, 'incorrect setter called');\n this._val = val;\n }\n\n })\n });\n\n var SubClass = ParentClass.extend({\n set prop(val) {\n assert.ok(true, 'correct setter called');\n this._val = val;\n }\n\n });\n var instance = SubClass.create();\n instance.prop = 123;\n }\n\n ['@test should respect prototypical inheritance when subclasses override CPs with native classes'](assert) {\n var _class;\n\n var ParentClass = (_class = class ParentClass extends _runtime.Object {\n set prop(val) {\n assert.ok(false, 'incorrect setter called');\n this._val = val;\n }\n\n }, _applyDecoratedDescriptor(_class.prototype, \"prop\", [_metal.computed], Object.getOwnPropertyDescriptor(_class.prototype, \"prop\"), _class.prototype), _class);\n\n class SubClass extends ParentClass {\n set prop(val) {\n assert.ok(true, 'correct setter called');\n this._val = val;\n }\n\n }\n\n var instance = SubClass.create();\n instance.prop = 123;\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/alias_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@glimmer/destroyable\", \"@glimmer/validator\"], function (_metal, _runtime, _internalTestHelpers, _destroyable, _validator) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n var obj, count;\n\n function incrementCount() {\n count++;\n }\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/metal/alias', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {\n foo: {\n faz: 'FOO'\n }\n };\n count = 0;\n }\n\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n ['@test should proxy get to alt key'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n }\n\n ['@test should proxy set to alt key'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.set)(obj, 'bar', 'BAR');\n assert.equal((0, _metal.get)(obj, 'foo.faz'), 'BAR');\n }\n\n async ['@test old dependent keys should not trigger property changes'](assert) {\n var obj1 = Object.create(null);\n (0, _metal.defineProperty)(obj1, 'foo', null, null);\n (0, _metal.defineProperty)(obj1, 'bar', (0, _metal.alias)('foo'));\n (0, _metal.defineProperty)(obj1, 'baz', (0, _metal.alias)('foo'));\n (0, _metal.defineProperty)(obj1, 'baz', (0, _metal.alias)('bar')); // redefine baz\n\n (0, _metal.addObserver)(obj1, 'baz', incrementCount);\n (0, _metal.set)(obj1, 'foo', 'FOO');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n (0, _metal.removeObserver)(obj1, 'baz', incrementCount);\n (0, _metal.set)(obj1, 'foo', 'OOF');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n }\n\n ['@test nested aliases should trigger computed property invalidation [GH#19279]'](assert) {\n var AttributeModel = _runtime.Object.extend({\n countAdditives: (0, _metal.alias)('additives.length'),\n additives: (0, _runtime.A)()\n });\n\n var RootModel = _runtime.Object.extend({\n allAdditives: (0, _metal.computed)('metaAttributes.@each.countAdditives', function () {\n return this.metaAttributes.reduce((acc, el) => {\n return acc.concat(el.additives);\n }, []);\n }),\n metaAttributes: (0, _runtime.A)([AttributeModel.create()])\n });\n\n var model = RootModel.create();\n assert.equal(model.allAdditives.length, 0);\n model.metaAttributes[0].additives.pushObject('foo');\n assert.equal(model.allAdditives.length, 1);\n }\n\n async [`@test inheriting an observer of the alias from the prototype then\n redefining the alias on the instance to another property dependent on same key\n does not call the observer twice`](assert) {\n var obj1 = _runtime.Object.extend({\n foo: null,\n bar: (0, _metal.alias)('foo'),\n baz: (0, _metal.alias)('foo'),\n incrementCount\n });\n\n (0, _metal.addObserver)(obj1.prototype, 'baz', null, 'incrementCount');\n var obj2 = obj1.create();\n (0, _metal.defineProperty)(obj2, 'baz', (0, _metal.alias)('bar')); // override baz\n\n (0, _metal.set)(obj2, 'foo', 'FOO');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n (0, _metal.removeObserver)(obj2, 'baz', null, 'incrementCount');\n (0, _metal.set)(obj2, 'foo', 'OOF');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n }\n\n async ['@test an observer of the alias works if added after defining the alias'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n }\n\n async ['@test an observer of the alias works if added before defining the alias'](assert) {\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n }\n\n ['@test alias is dirtied if interior object of alias is set after consumption'](assert) {\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n (0, _metal.get)(obj, 'bar');\n var tag = (0, _metal.tagForProperty)(obj, 'bar');\n var tagValue = (0, _validator.valueForTag)(tag);\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n assert.ok(!(0, _validator.validateTag)(tag, tagValue), 'setting the aliased key should dirty the object');\n }\n\n ['@test setting alias on self should fail assertion']() {\n expectAssertion(() => (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('bar')), \"Setting alias 'bar' on self\");\n }\n\n ['@test property tags are bumped when the source changes [GH#17243]'](assert) {\n function assertPropertyTagChanged(obj, keyName, callback) {\n var tag = (0, _metal.tagForProperty)(obj, keyName);\n var before = (0, _validator.valueForTag)(tag);\n callback();\n assert.notOk((0, _validator.validateTag)(tag, before), `tagForProperty ${keyName} should change`);\n }\n\n function assertPropertyTagUnchanged(obj, keyName, callback) {\n var tag = (0, _metal.tagForProperty)(obj, keyName);\n var before = (0, _validator.valueForTag)(tag);\n callback();\n assert.ok((0, _validator.validateTag)(tag, before), `tagForProperty ${keyName} should not change`);\n }\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.alias)('foo.faz'));\n assertPropertyTagUnchanged(obj, 'bar', () => {\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n });\n assertPropertyTagChanged(obj, 'bar', () => {\n (0, _metal.set)(obj, 'foo.faz', 'BAR');\n });\n assertPropertyTagUnchanged(obj, 'bar', () => {\n assert.equal((0, _metal.get)(obj, 'bar'), 'BAR');\n });\n assertPropertyTagUnchanged(obj, 'bar', () => {\n (0, _metal.addObserver)(obj, 'bar', incrementCount);\n (0, _metal.removeObserver)(obj, 'bar', incrementCount);\n });\n assertPropertyTagChanged(obj, 'bar', () => {\n (0, _metal.set)(obj, 'foo.faz', 'FOO');\n });\n assertPropertyTagUnchanged(obj, 'bar', () => {\n assert.equal((0, _metal.get)(obj, 'bar'), 'FOO');\n });\n }\n\n ['@test nested aliases update their chained dependencies properly'](assert) {\n var _dec, _class, _descriptor, _dec2, _class3;\n\n var count = 0;\n var Inner = (_dec = (0, _metal.alias)('pojo'), (_class = class Inner {\n constructor() {\n _initializerDefineProperty(this, \"aliased\", _descriptor, this);\n\n this.pojo = {\n value: 123\n };\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"aliased\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class));\n var Outer = (_dec2 = (0, _metal.computed)('inner.aliased.value'), (_class3 = class Outer {\n constructor() {\n this.inner = new Inner();\n }\n\n get value() {\n count++;\n return this.inner.aliased.value;\n }\n\n }, _applyDecoratedDescriptor(_class3.prototype, \"value\", [_dec2], Object.getOwnPropertyDescriptor(_class3.prototype, \"value\"), _class3.prototype), _class3));\n var outer = new Outer();\n assert.equal(outer.value, 123, 'Property works');\n outer.value;\n assert.equal(count, 1, 'Property was properly cached');\n (0, _metal.set)(outer, 'inner.pojo.value', 456);\n assert.equal(outer.value, 456, 'Property was invalidated correctly');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/cached/get_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n if (true\n /* EMBER_CACHED */\n ) {\n (0, _internalTestHelpers.moduleFor)('@cached decorator: get', class extends _internalTestHelpers.AbstractTestCase {\n '@test it works'() {\n var _class, _descriptor, _descriptor2;\n\n var assert = this.assert;\n var Person = (_class = class Person {\n constructor() {\n _initializerDefineProperty(this, \"firstName\", _descriptor, this);\n\n _initializerDefineProperty(this, \"lastName\", _descriptor2, this);\n }\n\n get fullName() {\n var fullName = `${this.firstName} ${this.lastName}`;\n assert.step(fullName);\n return fullName;\n }\n\n }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"firstName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'Jen';\n }\n }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"lastName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'Weber';\n }\n }), _applyDecoratedDescriptor(_class.prototype, \"fullName\", [_metal.cached], Object.getOwnPropertyDescriptor(_class.prototype, \"fullName\"), _class.prototype)), _class);\n var person = new Person();\n assert.verifySteps([], 'getter is not called after class initialization');\n assert.strictEqual(person.fullName, 'Jen Weber');\n assert.verifySteps(['Jen Weber'], 'getter was called after property access');\n assert.strictEqual(person.fullName, 'Jen Weber');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n person.firstName = 'Kenneth';\n assert.verifySteps([], 'changing a property does not trigger an eager re-computation');\n assert.strictEqual(person.fullName, 'Kenneth Weber');\n assert.verifySteps(['Kenneth Weber'], 'accessing the property triggers a re-computation');\n assert.strictEqual(person.fullName, 'Kenneth Weber');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n person.lastName = 'Larsen';\n assert.verifySteps([], 'changing a property does not trigger an eager re-computation');\n assert.strictEqual(person.fullName, 'Kenneth Larsen');\n assert.verifySteps(['Kenneth Larsen'], 'accessing the property triggers a re-computation');\n }\n\n '@test it has a separate cache per class instance'() {\n var _class3, _descriptor3, _descriptor4;\n\n var assert = this.assert;\n var Person = (_class3 = class Person {\n constructor(firstName, lastName) {\n _initializerDefineProperty(this, \"firstName\", _descriptor3, this);\n\n _initializerDefineProperty(this, \"lastName\", _descriptor4, this);\n\n this.firstName = firstName;\n this.lastName = lastName;\n }\n\n get fullName() {\n var fullName = `${this.firstName} ${this.lastName}`;\n assert.step(fullName);\n return fullName;\n }\n\n }, (_descriptor3 = _applyDecoratedDescriptor(_class3.prototype, \"firstName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _descriptor4 = _applyDecoratedDescriptor(_class3.prototype, \"lastName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _applyDecoratedDescriptor(_class3.prototype, \"fullName\", [_metal.cached], Object.getOwnPropertyDescriptor(_class3.prototype, \"fullName\"), _class3.prototype)), _class3);\n var jen = new Person('Jen', 'Weber');\n var chris = new Person('Chris', 'Garrett');\n assert.verifySteps([], 'getter is not called after class initialization');\n assert.strictEqual(jen.fullName, 'Jen Weber');\n assert.verifySteps(['Jen Weber'], 'getter was called after property access');\n assert.strictEqual(jen.fullName, 'Jen Weber');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n assert.strictEqual(chris.fullName, 'Chris Garrett', 'other instance has a different value');\n assert.verifySteps(['Chris Garrett'], 'getter was called after property access');\n assert.strictEqual(chris.fullName, 'Chris Garrett');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n chris.lastName = 'Manson';\n assert.verifySteps([], 'changing a property does not trigger an eager re-computation');\n assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n assert.strictEqual(chris.fullName, 'Chris Manson');\n assert.verifySteps(['Chris Manson'], 'getter was called after property access');\n assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');\n assert.verifySteps([], 'getter was not called again after repeated property access');\n }\n\n });\n }\n});","define(\"@ember/-internals/metal/tests/computed_decorator_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_runtime, _metal, _internalTestHelpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('computed - decorator - compatibility', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed can be used to compose new decorators'](assert) {\n var _class, _descriptor;\n\n var firstName = 'Diana';\n var firstNameAlias = (0, _metal.computed)('firstName', {\n get() {\n return this.firstName;\n }\n\n });\n var Class1 = (_class = class Class1 {\n constructor() {\n this.firstName = firstName;\n\n _initializerDefineProperty(this, \"otherFirstName\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"otherFirstName\", [firstNameAlias], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class);\n\n var Class2 = _runtime.Object.extend({\n firstName,\n otherFirstName: firstNameAlias\n });\n\n var obj1 = new Class1();\n var obj2 = Class2.create();\n assert.equal(firstName, obj1.otherFirstName);\n assert.equal(firstName, obj2.otherFirstName);\n }\n\n ['@test decorator can still have a configuration object'](assert) {\n var _dec, _class3, _descriptor2;\n\n var Foo = (_dec = (0, _metal.computed)('foo', {\n get() {\n return this.bar;\n }\n\n }), (_class3 = class Foo {\n constructor() {\n this.bar = 'something';\n this.foo = 'else';\n\n _initializerDefineProperty(this, \"baz\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"baz\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3));\n var obj1 = new Foo();\n assert.equal('something', obj1.baz);\n }\n\n ['@test it works with functions'](assert) {\n var _dec2, _class5, _descriptor3;\n\n assert.expect(2);\n var Foo = (_dec2 = (0, _metal.computed)('first', 'last', function () {\n assert.equal(this.first, 'rob');\n assert.equal(this.last, 'jackson');\n }), (_class5 = class Foo {\n constructor() {\n this.first = 'rob';\n this.last = 'jackson';\n\n _initializerDefineProperty(this, \"fullName\", _descriptor3, this);\n }\n\n }, _descriptor3 = _applyDecoratedDescriptor(_class5.prototype, \"fullName\", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class5));\n var obj = new Foo();\n (0, _metal.get)(obj, 'fullName');\n }\n\n ['@test computed property can be defined and accessed on a class constructor'](assert) {\n var _class7, _class8, _temp;\n\n var count = 0;\n var Obj = (_class7 = (_temp = _class8 = class Obj {\n static get foo() {\n count++;\n return this.bar;\n }\n\n }, _class8.bar = 123, _temp), _applyDecoratedDescriptor(_class7, \"foo\", [_metal.computed], Object.getOwnPropertyDescriptor(_class7, \"foo\"), _class7), _class7);\n assert.equal(Obj.foo, 123, 'should return value');\n Obj.foo;\n assert.equal(count, 1, 'should only call getter once');\n }\n\n ['@test it works with computed desc'](assert) {\n var _dec3, _class9, _descriptor4;\n\n assert.expect(4);\n var expectedName = 'rob jackson';\n var expectedFirst = 'rob';\n var expectedLast = 'jackson';\n var Foo = (_dec3 = (0, _metal.computed)('first', 'last', {\n get() {\n assert.equal(this.first, expectedFirst, 'getter: first name matches');\n assert.equal(this.last, expectedLast, 'getter: last name matches');\n return `${this.first} ${this.last}`;\n },\n\n set(key, name) {\n assert.equal(name, expectedName, 'setter: name matches');\n var [first, last] = name.split(' ');\n (0, _metal.setProperties)(this, {\n first,\n last\n });\n return name;\n }\n\n }), (_class9 = class Foo {\n constructor() {\n this.first = 'rob';\n this.last = 'jackson';\n\n _initializerDefineProperty(this, \"fullName\", _descriptor4, this);\n }\n\n }, _descriptor4 = _applyDecoratedDescriptor(_class9.prototype, \"fullName\", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class9));\n var obj = new Foo();\n (0, _metal.get)(obj, 'fullName');\n expectedName = 'yehuda katz';\n expectedFirst = 'yehuda';\n expectedLast = 'katz';\n (0, _metal.set)(obj, 'fullName', 'yehuda katz');\n assert.strictEqual((0, _metal.get)(obj, 'fullName'), expectedName, 'return value of getter is new value of property');\n }\n\n ['@test it throws if it receives a desc and decorates a getter/setter']() {\n expectAssertion(() => {\n var _dec4, _class11;\n\n var Foo = (_dec4 = (0, _metal.computed)('bar', {\n get() {\n return this.bar;\n }\n\n }), (_class11 = class Foo {\n constructor() {\n this.bar = void 0;\n }\n\n set foo(value) {\n (0, _metal.set)(this, 'bar', value);\n }\n\n }, _applyDecoratedDescriptor(_class11.prototype, \"foo\", [_dec4], Object.getOwnPropertyDescriptor(_class11.prototype, \"foo\"), _class11.prototype), _class11));\n new Foo();\n }, /Attempted to apply a computed property that already has a getter\\/setter to a foo, but it is a method or an accessor./);\n }\n\n ['@test it throws if a CP is passed to it']() {\n expectAssertion(() => {\n var _dec5, _class13, _descriptor5;\n\n var Foo = (_dec5 = (0, _metal.computed)('bar', (0, _metal.computed)({\n get() {\n return this._foo;\n }\n\n })), (_class13 = class Foo {\n constructor() {\n this.bar = void 0;\n\n _initializerDefineProperty(this, \"foo\", _descriptor5, this);\n }\n\n }, _descriptor5 = _applyDecoratedDescriptor(_class13.prototype, \"foo\", [_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class13));\n new Foo();\n }, 'You attempted to pass a computed property instance to computed(). Computed property instances are decorator functions, and cannot be passed to computed() because they cannot be turned into decorators twice');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - decorator - usage tests', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property asserts the presence of a getter']() {\n expectAssertion(() => {\n var _dec6, _class15;\n\n var TestObj = (_dec6 = (0, _metal.computed)(), (_class15 = class TestObj {\n nonGetter() {\n return true;\n }\n\n }, _applyDecoratedDescriptor(_class15.prototype, \"nonGetter\", [_dec6], Object.getOwnPropertyDescriptor(_class15.prototype, \"nonGetter\"), _class15.prototype), _class15));\n new TestObj();\n }, /Try converting it to a getter/);\n }\n\n ['@test computed property works with a getter'](assert) {\n var _class16;\n\n var TestObj = (_class16 = class TestObj {\n get someGetter() {\n return true;\n }\n\n }, _applyDecoratedDescriptor(_class16.prototype, \"someGetter\", [_metal.computed], Object.getOwnPropertyDescriptor(_class16.prototype, \"someGetter\"), _class16.prototype), _class16);\n var instance = new TestObj();\n assert.ok(instance.someGetter);\n }\n\n ['@test computed property with dependent key and getter'](assert) {\n var _dec7, _class17;\n\n var TestObj = (_dec7 = (0, _metal.computed)('other'), (_class17 = class TestObj {\n constructor() {\n this.other = true;\n }\n\n get someGetter() {\n return `${this.other}`;\n }\n\n }, _applyDecoratedDescriptor(_class17.prototype, \"someGetter\", [_dec7], Object.getOwnPropertyDescriptor(_class17.prototype, \"someGetter\"), _class17.prototype), _class17));\n var instance = new TestObj();\n assert.equal(instance.someGetter, 'true');\n (0, _metal.set)(instance, 'other', false);\n assert.equal(instance.someGetter, 'false');\n }\n\n ['@test computed property can be accessed without `get`'](assert) {\n var _dec8, _class19;\n\n var count = 0;\n var Obj = (_dec8 = (0, _metal.computed)(), (_class19 = class Obj {\n get foo() {\n count++;\n return `computed foo`;\n }\n\n }, _applyDecoratedDescriptor(_class19.prototype, \"foo\", [_dec8], Object.getOwnPropertyDescriptor(_class19.prototype, \"foo\"), _class19.prototype), _class19));\n var obj = new Obj();\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test defining computed property should invoke property on get'](assert) {\n var _dec9, _class20;\n\n var count = 0;\n var Obj = (_dec9 = (0, _metal.computed)(), (_class20 = class Obj {\n get foo() {\n count++;\n return `computed foo`;\n }\n\n }, _applyDecoratedDescriptor(_class20.prototype, \"foo\", [_dec9], Object.getOwnPropertyDescriptor(_class20.prototype, \"foo\"), _class20.prototype), _class20));\n var obj = new Obj();\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test setter is invoked with correct parameters'](assert) {\n var _dec10, _class21;\n\n var count = 0;\n var Obj = (_dec10 = (0, _metal.computed)(), (_class21 = class Obj {\n constructor() {\n this.__foo = 'not set';\n }\n\n get foo() {\n return this.__foo;\n }\n\n set foo(value) {\n count++;\n this.__foo = `computed ${value}`;\n }\n\n }, _applyDecoratedDescriptor(_class21.prototype, \"foo\", [_dec10], Object.getOwnPropertyDescriptor(_class21.prototype, \"foo\"), _class21.prototype), _class21));\n var obj = new Obj();\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value with set()');\n assert.equal(count, 1, 'should have invoked computed property');\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed bar', 'should return new value with get()');\n }\n\n ['@test when not returning from setter, getter is called'](assert) {\n var _dec11, _class23;\n\n var count = 0;\n var Obj = (_dec11 = (0, _metal.computed)(), (_class23 = class Obj {\n constructor() {\n this.__foo = 'not set';\n }\n\n get foo() {\n count++;\n return this.__foo;\n }\n\n set foo(value) {\n this.__foo = `computed ${value}`;\n }\n\n }, _applyDecoratedDescriptor(_class23.prototype, \"foo\", [_dec11], Object.getOwnPropertyDescriptor(_class23.prototype, \"foo\"), _class23.prototype), _class23));\n var obj = new Obj();\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value with set()');\n assert.equal(count, 1, 'should have invoked getter');\n }\n\n ['@test when returning from setter, getter is not called'](assert) {\n var _dec12, _class25;\n\n var count = 0;\n var Obj = (_dec12 = (0, _metal.computed)(), (_class25 = class Obj {\n constructor() {\n this.__foo = 'not set';\n }\n\n get foo() {\n count++;\n return this.__foo;\n }\n\n set foo(value) {\n this.__foo = `computed ${value}`; // eslint-disable-next-line no-setter-return\n\n return this.__foo;\n }\n\n }, _applyDecoratedDescriptor(_class25.prototype, \"foo\", [_dec12], Object.getOwnPropertyDescriptor(_class25.prototype, \"foo\"), _class25.prototype), _class25));\n var obj = new Obj();\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value with set()');\n assert.equal(count, 0, 'should not have invoked getter');\n }\n\n ['@test throws if a value is decorated twice']() {\n expectAssertion(() => {\n var _class27;\n\n var Obj = (_class27 = class Obj {\n get foo() {\n return this._foo;\n }\n\n }, _applyDecoratedDescriptor(_class27.prototype, \"foo\", [_metal.computed, _metal.computed], Object.getOwnPropertyDescriptor(_class27.prototype, \"foo\"), _class27.prototype), _class27);\n new Obj();\n }, \"Only one computed property decorator can be applied to a class field or accessor, but 'foo' was decorated twice. You may have added the decorator to both a getter and setter, which is unnecessary.\");\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/computed_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/meta\", \"@ember/-internals/metal\", \"@ember/runloop\", \"internal-test-helpers\", \"@glimmer/destroyable\"], function (_runtime, _meta, _metal, _runloop, _internalTestHelpers, _destroyable) {\n \"use strict\";\n\n var _dec, _class;\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n var obj, objA, objB, count, func;\n\n class ComputedTestCase extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n var destroyables = [obj, objA, objB].filter(Boolean);\n obj = objA = objB = count = func = undefined;\n destroyables.forEach(_destroyable.destroy);\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('computed', class extends ComputedTestCase {\n ['@test isComputed is true for computed property on a factory'](assert) {\n var Obj = _runtime.Object.extend({\n foo: (0, _metal.computed)(function () {})\n });\n\n Obj.proto(); // ensure the prototype is \"collapsed\" / merged\n\n assert.ok((0, _metal.isComputed)(Obj.prototype, 'foo'));\n }\n\n ['@test isComputed is true for computed property on an instance'](assert) {\n obj = _runtime.Object.extend({\n foo: (0, _metal.computed)(function () {})\n }).create();\n assert.ok((0, _metal.isComputed)(obj, 'foo'));\n }\n\n ['@test computed property should be an instance of descriptor'](assert) {\n assert.ok((0, _metal.isClassicDecorator)((0, _metal.computed)(function () {})));\n }\n\n ['@test computed properties assert the presence of a getter or setter function']() {\n expectAssertion(function () {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('nogetternorsetter', {}));\n }, 'Computed properties must receive a getter or a setter, you passed none.');\n }\n\n ['@test computed properties check for the presence of a function or configuration object']() {\n expectAssertion(function () {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('nolastargument'));\n }, 'Attempted to use @computed on someProp, but it did not have a getter or a setter. You must either pass a get a function or getter/setter to @computed directly (e.g. `@computed({ get() { ... } })`) or apply @computed directly to a getter/setter');\n } // non valid properties are stripped away in the process of creating a computed property descriptor\n\n\n ['@test computed properties defined with an object only allow `get` and `set` keys']() {\n expectAssertion(function () {\n obj = _runtime.Object.extend({\n someProp: (0, _metal.computed)({\n get() {},\n\n set() {},\n\n other() {}\n\n })\n });\n obj.create().someProp;\n }, 'Config object passed to computed can only contain `get` and `set` keys.');\n }\n\n ['@test computed property can be accessed without `get`'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\n assert.equal(obj.foo, 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test defining computed property should invoke property on get'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function (key) {\n count++;\n return 'computed ' + key;\n }));\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed foo', 'should return value');\n assert.equal(count, 1, 'should have invoked computed property');\n }\n\n ['@test computed property can be defined and accessed on a class constructor'](assert) {\n var count = 0;\n\n var Obj = _runtime.Object.extend();\n\n Obj.reopenClass({\n bar: 123,\n foo: (0, _metal.computed)(function () {\n count++;\n return this.bar;\n })\n });\n assert.equal(Obj.foo, 123, 'should return value');\n Obj.foo;\n assert.equal(count, 1, 'should only call getter once');\n }\n\n ['@test defining computed property should invoke property on set'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n\n set(key, value) {\n count++;\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n\n }));\n assert.equal((0, _metal.set)(obj, 'foo', 'bar'), 'bar', 'should return set value');\n assert.equal(count, 1, 'should have invoked computed property');\n assert.equal((0, _metal.get)(obj, 'foo'), 'computed bar', 'should return new value');\n } // this should be a unit test elsewhere\n // computed is more integration-like, and this test asserts on implementation details.\n // ['@test defining a computed property with a dependent key ending with @each is expanded to []'](\n // assert\n // ) {\n // let cp = computed('blazo.@each', function() {});\n // assert.deepEqual(cp._dependentKeys, ['blazo.[]']);\n // cp = computed('qux', 'zoopa.@each', function() {});\n // assert.deepEqual(cp._dependentKeys, ['qux', 'zoopa.[]']);\n // }\n\n\n ['@test defining a computed property with a dependent key more than one level deep beyond @each throws an assertion']() {\n expectNoWarning(() => {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('todos', () => {}));\n });\n expectNoWarning(() => {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('todos.@each.owner', () => {}));\n });\n var expected = /Dependent keys containing @each only work one level deep./;\n expectAssertion(() => {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('todos.@each.owner.name', () => {}));\n }, expected);\n expectAssertion(() => {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)('todos.@each.owner.@each.name', () => {}));\n }, expected);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed should inherit through prototype', class extends ComputedTestCase {\n beforeEach() {\n objA = {\n __foo: 'FOO'\n };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n\n set(key, value) {\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n\n }));\n objB = Object.create(objA);\n objB.__foo = 'FOO'; // make a copy;\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should get FOO from B');\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should NOT change B');\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'computed bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should NOT change A');\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'computed bar', 'should NOT change B');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('redefining computed property to normal', class extends ComputedTestCase {\n beforeEach() {\n objA = {\n __foo: 'FOO'\n };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n\n set(key, value) {\n this['__' + key] = 'computed ' + value;\n return this['__' + key];\n }\n\n }));\n objB = Object.create(objA);\n (0, _metal.defineProperty)(objB, 'foo'); // make this just a normal property.\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), undefined, 'should get undefined from B');\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), undefined, 'should NOT change B');\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BIFF', 'should NOT change A');\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'computed BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar', 'should NOT change B');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('redefining computed property to another property', class extends ComputedTestCase {\n beforeEach() {\n objA = {\n __foo: 'FOO'\n };\n (0, _metal.defineProperty)(objA, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n\n set(key, value) {\n this['__' + key] = 'A ' + value;\n return this['__' + key];\n }\n\n }));\n objB = Object.create(objA);\n objB.__foo = 'FOO';\n (0, _metal.defineProperty)(objB, 'foo', (0, _metal.computed)({\n get(key) {\n return this['__' + key];\n },\n\n set(key, value) {\n this['__' + key] = 'B ' + value;\n return this['__' + key];\n }\n\n }));\n }\n\n ['@test using get() and set()'](assert) {\n assert.equal((0, _metal.get)(objA, 'foo'), 'FOO', 'should get FOO from A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should get FOO from B');\n (0, _metal.set)(objA, 'foo', 'BIFF');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BIFF', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'FOO', 'should NOT change B');\n (0, _metal.set)(objB, 'foo', 'bar');\n assert.equal((0, _metal.get)(objB, 'foo'), 'B bar', 'should change B');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BIFF', 'should NOT change A');\n (0, _metal.set)(objA, 'foo', 'BAZ');\n assert.equal((0, _metal.get)(objA, 'foo'), 'A BAZ', 'should change A');\n assert.equal((0, _metal.get)(objB, 'foo'), 'B bar', 'should NOT change B');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - metadata', class extends _internalTestHelpers.AbstractTestCase {\n ['@test can set metadata on a computed property'](assert) {\n var computedProperty = (0, _metal.computed)(function () {});\n computedProperty.meta({\n key: 'keyValue'\n });\n assert.equal(computedProperty.meta().key, 'keyValue', 'saves passed meta hash to the _meta property');\n }\n\n ['@test meta should return an empty hash if no meta is set'](assert) {\n var computedProperty = (0, _metal.computed)(function () {});\n assert.deepEqual(computedProperty.meta(), {}, 'returned value is an empty hash');\n }\n\n }); // ..........................................................\n // CACHEABLE\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - cacheable', class extends ComputedTestCase {\n beforeEach() {\n obj = {};\n count = 0;\n\n var func = function () {\n count++;\n return 'bar ' + count;\n };\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get: func,\n set: func\n }));\n }\n\n ['@test cacheable should cache'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'first get');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'second get');\n assert.equal(count, 1, 'should only invoke once');\n }\n\n ['@test modifying a cacheable property should update cache'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'first get');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'second get');\n assert.equal((0, _metal.set)(obj, 'foo', 'baz'), 'baz', 'setting');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 2', 'third get');\n assert.equal(count, 2, 'should not invoke again');\n }\n\n ['@test inherited property should not pick up cache'](assert) {\n var objB = Object.create(obj);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'obj first get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB first get');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1', 'obj second get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB second get');\n (0, _metal.set)(obj, 'foo', 'baz'); // modify A\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 3', 'obj third get');\n assert.equal((0, _metal.get)(objB, 'foo'), 'bar 2', 'objB third get');\n }\n\n ['@test meta.valueFor should return the cached value'](assert) {\n assert.equal((0, _meta.meta)(obj).valueFor('foo'), undefined, 'should not yet be a cached value');\n (0, _metal.get)(obj, 'foo');\n assert.equal((0, _meta.meta)(obj).valueFor('foo'), 'bar 1', 'should retrieve cached value');\n }\n\n ['@test meta.valueFor should return falsy cached values'](assert) {\n (0, _metal.defineProperty)(obj, 'falsy', (0, _metal.computed)(function () {\n return false;\n }));\n assert.equal((0, _meta.meta)(obj).valueFor('falsy'), undefined, 'should not yet be a cached value');\n (0, _metal.get)(obj, 'falsy');\n assert.equal((0, _meta.meta)(obj).valueFor('falsy'), false, 'should retrieve cached value');\n }\n\n ['@test setting a cached computed property passes the old value as the third argument'](assert) {\n obj = {\n foo: 0\n };\n var receivedOldValue;\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)('foo', {\n get() {},\n\n set(key, value, oldValue) {\n receivedOldValue = oldValue;\n return value;\n }\n\n }));\n (0, _metal.set)(obj, 'plusOne', 1);\n assert.strictEqual(receivedOldValue, undefined, 'oldValue should be undefined');\n (0, _metal.set)(obj, 'plusOne', 2);\n assert.strictEqual(receivedOldValue, 1, 'oldValue should be 1');\n (0, _metal.set)(obj, 'plusOne', 3);\n assert.strictEqual(receivedOldValue, 2, 'oldValue should be 2');\n }\n\n }); // ..........................................................\n // DEPENDENT KEYS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey', class extends ComputedTestCase {\n beforeEach() {\n obj = {\n bar: 'baz'\n };\n count = 0;\n\n var getterAndSetter = function () {\n count++;\n (0, _metal.get)(this, 'bar');\n return 'bar ' + count;\n };\n\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('bar', {\n get: getterAndSetter,\n set: getterAndSetter\n }));\n }\n\n ['@test circular keys should not blow up'](assert) {\n var func = function () {\n count++;\n return 'bar ' + count;\n };\n\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)('foo', {\n get: func,\n set: func\n }));\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('bar', function () {\n count++;\n return 'foo ' + count;\n }));\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'get once');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'cached retrieve');\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should invalidate bar -> foo -> bar\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'should recache');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'cached retrieve');\n }\n\n ['@test redefining a property should undo old dependent keys'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar 1');\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('baz', function () {\n count++;\n return 'baz ' + count;\n }));\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n (0, _metal.set)(obj, 'bar', 'BIFF'); // should not kill cache\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 2');\n (0, _metal.set)(obj, 'baz', 'BOP');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz 3');\n }\n\n ['@test can watch multiple dependent keys specified declaratively via brace expansion'](assert) {\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('qux.{bar,baz}', function () {\n count++;\n return 'foo ' + count;\n }));\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'get once');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 1', 'cached retrieve');\n (0, _metal.set)(obj, 'qux', {});\n (0, _metal.set)(obj, 'qux.bar', 'bar'); // invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 2', 'foo invalidated from bar');\n (0, _metal.set)(obj, 'qux.baz', 'baz'); // invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'foo invalidated from baz');\n (0, _metal.set)(obj, 'qux.quux', 'quux'); // do not invalidate foo\n\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo 3', 'foo not invalidated by quux');\n }\n\n ['@test throws assertion if brace expansion notation has spaces']() {\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'roo', (0, _metal.computed)('fee.{bar, baz,bop , }', function () {\n count++;\n return 'roo ' + count;\n }));\n }, /cannot contain spaces/);\n }\n\n ['@test throws an assertion if an uncached `get` is called after object is destroyed']() {\n (0, _runloop.run)(() => (0, _destroyable.destroy)(obj));\n\n obj.toString = () => '';\n\n var message = 'Attempted to access the computed .foo on a destroyed object, which is not allowed';\n expectAssertion(() => (0, _metal.get)(obj, 'foo'), message);\n }\n\n ['@test does not throw an assertion if an uncached `get` is called on computed without dependencies after object is destroyed'](assert) {\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return 'baz';\n }));\n (0, _runloop.run)(() => (0, _destroyable.destroy)(obj));\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'CP calculated successfully');\n }\n\n }); // ..........................................................\n // CHAINED DEPENDENT KEYS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - dependentkey with chained properties', class extends ComputedTestCase {\n beforeEach() {\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n };\n count = 0;\n\n func = function () {\n count++;\n return (0, _metal.get)(obj, 'foo.bar.baz.biff') + ' ' + count;\n };\n }\n\n ['@test depending on simple chain'](assert) {\n // assign computed property\n (0, _metal.defineProperty)(obj, 'prop', (0, _metal.computed)('foo.bar.baz.biff', func));\n assert.equal((0, _metal.get)(obj, 'prop'), 'BIFF 1');\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 2');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 2');\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', {\n biff: 'BLOB'\n });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLOB 3');\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 4');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 4');\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', {\n baz: {\n biff: 'BOOM'\n }\n });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BOOM 5');\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 6');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 6');\n (0, _metal.set)(obj, 'foo', {\n bar: {\n baz: {\n biff: 'BLARG'\n }\n }\n });\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BLARG 7');\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 8');\n assert.equal((0, _metal.get)(obj, 'prop'), 'BUZZ 8');\n (0, _metal.defineProperty)(obj, 'prop');\n (0, _metal.set)(obj, 'prop', 'NONE');\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE');\n (0, _metal.set)(obj, 'foo', {\n bar: {\n baz: {\n biff: 'BLARG'\n }\n }\n });\n assert.equal((0, _metal.get)(obj, 'prop'), 'NONE'); // should do nothing\n\n assert.equal(count, 8, 'should be not have invoked computed again');\n }\n\n ['@test chained dependent keys should evaluate computed properties lazily'](assert) {\n (0, _metal.defineProperty)(obj.foo.bar, 'b', (0, _metal.computed)(func));\n (0, _metal.defineProperty)(obj.foo, 'c', (0, _metal.computed)('bar.b', function () {}));\n assert.equal(count, 0, 'b should not run');\n }\n\n }); // ..........................................................\n // improved-cp-syntax\n //\n\n (0, _internalTestHelpers.moduleFor)('computed - improved cp syntax', class extends _internalTestHelpers.AbstractTestCase {\n ['@test setter and getters are passed using an object'](assert) {\n var testObj = _runtime.Object.extend({\n a: '1',\n b: '2',\n aInt: (0, _metal.computed)('a', {\n get(keyName) {\n assert.equal(keyName, 'aInt', 'getter receives the keyName');\n return parseInt(this.get('a'));\n },\n\n set(keyName, value, oldValue) {\n assert.equal(keyName, 'aInt', 'setter receives the keyName');\n assert.equal(value, 123, 'setter receives the new value');\n assert.equal(oldValue, 1, 'setter receives the old value');\n this.set('a', String(value)); // side effect\n\n return parseInt(this.get('a'));\n }\n\n })\n }).create();\n\n assert.ok(testObj.get('aInt') === 1, 'getter works');\n testObj.set('aInt', 123);\n assert.ok(testObj.get('a') === '123', 'setter works');\n assert.ok(testObj.get('aInt') === 123, 'cp has been updated too');\n }\n\n ['@test an omitted setter cannot be set later'](assert) {\n var testObj = _runtime.Object.extend({\n a: '1',\n b: '2',\n aInt: (0, _metal.computed)('a', {\n get(keyName) {\n assert.equal(keyName, 'aInt', 'getter receives the keyName');\n return parseInt(this.get('a'));\n }\n\n })\n }).create();\n\n assert.ok(testObj.get('aInt') === 1, 'getter works');\n assert.ok(testObj.get('a') === '1');\n expectAssertion(() => {\n testObj.set('aInt', '123');\n }, /Cannot override the computed property `aInt` on <\\(unknown\\):ember\\d*>./);\n }\n\n ['@test getter can be omited'](assert) {\n var testObj = _runtime.Object.extend({\n com: (0, _metal.computed)({\n set(key, value) {\n return value;\n }\n\n })\n }).create();\n\n assert.ok(testObj.get('com') === undefined);\n testObj.set('com', '123');\n assert.ok(testObj.get('com') === '123', 'cp has been updated');\n }\n\n ['@test the return value of the setter gets cached'](assert) {\n var testObj = _runtime.Object.extend({\n a: '1',\n sampleCP: (0, _metal.computed)('a', {\n get() {\n assert.ok(false, 'The getter should not be invoked');\n return 'get-value';\n },\n\n set() {\n return 'set-value';\n }\n\n })\n }).create();\n\n testObj.set('sampleCP', 'abcd');\n assert.ok(testObj.get('sampleCP') === 'set-value', 'The return value of the CP was cached');\n }\n\n }); // ..........................................................\n // BUGS\n //\n\n (0, _internalTestHelpers.moduleFor)('computed edge cases', class extends ComputedTestCase {\n ['@test adding a computed property should show up in key iteration'](assert) {\n obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {}));\n var found = [];\n\n for (var key in obj) {\n found.push(key);\n }\n\n assert.ok(found.indexOf('foo') >= 0, 'should find computed property in iteration found=' + found);\n assert.ok('foo' in obj, 'foo in obj should pass');\n }\n\n [\"@test when setting a value after it had been retrieved empty don't pass function UNDEFINED as oldValue\"](assert) {\n obj = {};\n var oldValueIsNoFunction = true;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)({\n get() {},\n\n set(key, value, oldValue) {\n if (typeof oldValue === 'function') {\n oldValueIsNoFunction = false;\n }\n\n return undefined;\n }\n\n }));\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', undefined);\n assert.ok(oldValueIsNoFunction);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - setter', class extends ComputedTestCase {\n async ['@test setting a watched computed property'](assert) {\n obj = {\n firstName: 'Yehuda',\n lastName: 'Katz'\n };\n (0, _metal.defineProperty)(obj, 'fullName', (0, _metal.computed)('firstName', 'lastName', {\n get() {\n return (0, _metal.get)(this, 'firstName') + ' ' + (0, _metal.get)(this, 'lastName');\n },\n\n set(key, value) {\n var values = value.split(' ');\n (0, _metal.set)(this, 'firstName', values[0]);\n (0, _metal.set)(this, 'lastName', values[1]);\n return value;\n }\n\n }));\n var fullNameDidChange = 0;\n var firstNameDidChange = 0;\n var lastNameDidChange = 0;\n (0, _metal.addObserver)(obj, 'fullName', function () {\n fullNameDidChange++;\n });\n (0, _metal.addObserver)(obj, 'firstName', function () {\n firstNameDidChange++;\n });\n (0, _metal.addObserver)(obj, 'lastName', function () {\n lastNameDidChange++;\n });\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Yehuda Katz');\n (0, _metal.set)(obj, 'fullName', 'Yehuda Katz');\n (0, _metal.set)(obj, 'fullName', 'Kris Selden');\n assert.equal((0, _metal.get)(obj, 'fullName'), 'Kris Selden');\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Kris');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Selden');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(fullNameDidChange, 1);\n assert.equal(firstNameDidChange, 1);\n assert.equal(lastNameDidChange, 1);\n }\n\n async ['@test setting a cached computed property that modifies the value you give it'](assert) {\n obj = {\n foo: 0\n };\n (0, _metal.defineProperty)(obj, 'plusOne', (0, _metal.computed)('foo', {\n get() {\n return (0, _metal.get)(this, 'foo') + 1;\n },\n\n set(key, value) {\n (0, _metal.set)(this, 'foo', value);\n return value + 1;\n }\n\n }));\n var plusOneDidChange = 0;\n (0, _metal.addObserver)(obj, 'plusOne', function () {\n plusOneDidChange++;\n });\n assert.equal((0, _metal.get)(obj, 'plusOne'), 1);\n (0, _metal.set)(obj, 'plusOne', 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n (0, _metal.set)(obj, 'plusOne', 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'plusOne'), 2);\n assert.equal(plusOneDidChange, 1);\n (0, _metal.set)(obj, 'foo', 5);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'plusOne'), 6);\n assert.equal(plusOneDidChange, 2);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - default setter', class extends ComputedTestCase {\n async [\"@test raises assertion when setting a value on a computed property that doesn't handle sets\"](assert) {\n obj = {};\n var observerFired = false;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)(function () {\n return 'foo';\n }));\n (0, _metal.addObserver)(obj, 'foo', null, () => observerFired = true);\n expectAssertion(() => {\n (0, _metal.set)(obj, 'foo', 'bar');\n }, /Cannot override the computed property `foo` on \\[object Object\\]./);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.notOk(observerFired, 'The observer was not notified');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - readOnly', class extends ComputedTestCase {\n ['@test is chainable'](assert) {\n var cp = (0, _metal.computed)(function () {});\n var readOnlyCp = cp.readOnly();\n assert.equal(cp, readOnlyCp);\n }\n\n ['@test throws assertion if called over a CP with a setter defined with the new syntax']() {\n expectAssertion(() => {\n obj = {};\n (0, _metal.defineProperty)(obj, 'someProp', (0, _metal.computed)({\n get() {},\n\n set() {}\n\n }).readOnly());\n }, /Computed properties that define a setter using the new syntax cannot be read-only/);\n }\n\n ['@test protects against setting'](assert) {\n obj = {};\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)(function () {\n return 'barValue';\n }).readOnly());\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n assert.throws(() => {\n (0, _metal.set)(obj, 'bar', 'newBar');\n }, /Cannot set read-only property \"bar\" on object:/);\n assert.equal((0, _metal.get)(obj, 'bar'), 'barValue');\n }\n\n });\n var LazyObject = (_dec = (0, _metal.computed)('_value'), (_class = class LazyObject {\n constructor() {\n this.value = 123;\n }\n\n get value() {\n return (0, _metal.get)(this, '_value');\n }\n\n set value(value) {\n (0, _metal.set)(this, '_value', value);\n }\n\n static create() {\n obj = new LazyObject(); // ensure a tag exists for the value computed\n\n (0, _metal.get)(obj, 'value');\n return obj;\n }\n\n }, _applyDecoratedDescriptor(_class.prototype, \"value\", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, \"value\"), _class.prototype), _class));\n (0, _internalTestHelpers.moduleFor)('computed - lazy dependencies', class extends ComputedTestCase {\n '@test computed properties with lazy dependencies work as expected'(assert) {\n var _dec2, _dec3, _class3;\n\n var calledCount = 0;\n var lazyObject = LazyObject.create();\n var ObjectWithLazyDep = (_dec2 = (0, _metal.computed)('lazyObject.value'), _dec3 = (0, _metal.computed)('otherProp'), (_class3 = class ObjectWithLazyDep {\n get someProp() {\n return ++calledCount;\n }\n\n get lazyObject() {\n return lazyObject;\n }\n\n }, (_applyDecoratedDescriptor(_class3.prototype, \"someProp\", [_dec2], Object.getOwnPropertyDescriptor(_class3.prototype, \"someProp\"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, \"lazyObject\", [_dec3], Object.getOwnPropertyDescriptor(_class3.prototype, \"lazyObject\"), _class3.prototype)), _class3));\n obj = new ObjectWithLazyDep(); // Get someProp and setup the lazy dependency\n\n assert.equal(obj.someProp, 1, 'called the first time');\n assert.equal(obj.someProp, 1, 'returned cached value the second time'); // Finish the lazy dependency\n\n assert.equal(obj.lazyObject.value, 123, 'lazyObject returns expected value');\n assert.equal(obj.someProp, 1, 'someProp was not dirtied by propB being calculated for the first time');\n (0, _metal.set)(lazyObject, 'value', 456);\n assert.equal(obj.someProp, 2, 'someProp dirtied by lazyObject.value changing');\n (0, _metal.set)(lazyObject, 'value', 789);\n assert.equal(obj.someProp, 3, 'someProp still dirtied by otherProp when lazyObject.value is dirty');\n }\n\n '@test computed properties with lazy dependencies do not dirty until dependencies have been read at least once'(assert) {\n var _dec4, _dec5, _class4;\n\n var calledCount = 0;\n var lazyObject = LazyObject.create();\n var ObjectWithLazyDep = (_dec4 = (0, _metal.computed)('lazyObject.value'), _dec5 = (0, _metal.computed)('otherProp'), (_class4 = class ObjectWithLazyDep {\n get someProp() {\n return ++calledCount;\n }\n\n get lazyObject() {\n return lazyObject;\n }\n\n }, (_applyDecoratedDescriptor(_class4.prototype, \"someProp\", [_dec4], Object.getOwnPropertyDescriptor(_class4.prototype, \"someProp\"), _class4.prototype), _applyDecoratedDescriptor(_class4.prototype, \"lazyObject\", [_dec5], Object.getOwnPropertyDescriptor(_class4.prototype, \"lazyObject\"), _class4.prototype)), _class4));\n obj = new ObjectWithLazyDep();\n assert.equal(obj.someProp, 1, 'called the first time');\n assert.equal(obj.someProp, 1, 'returned cached value the second time'); // dirty the object value before the dependency has been finished\n\n (0, _metal.set)(lazyObject, 'value', 456);\n assert.equal(obj.lazyObject.value, 456, 'propB returns expected value');\n assert.equal(obj.someProp, 1, 'someProp was not dirtied by propB being dirtied before it has been calculated');\n }\n\n '@test computed properties with lazy dependencies work correctly if lazy dependency is more recent'(assert) {\n var _dec6, _dec7, _class5;\n\n var calledCount = 0;\n var lazyObject = LazyObject.create();\n var ObjectWithLazyDep = (_dec6 = (0, _metal.computed)('lazyObject.value'), _dec7 = (0, _metal.computed)('otherProp'), (_class5 = class ObjectWithLazyDep {\n get someProp() {\n return ++calledCount;\n }\n\n get lazyObject() {\n return lazyObject;\n }\n\n }, (_applyDecoratedDescriptor(_class5.prototype, \"someProp\", [_dec6], Object.getOwnPropertyDescriptor(_class5.prototype, \"someProp\"), _class5.prototype), _applyDecoratedDescriptor(_class5.prototype, \"lazyObject\", [_dec7], Object.getOwnPropertyDescriptor(_class5.prototype, \"lazyObject\"), _class5.prototype)), _class5));\n obj = new ObjectWithLazyDep();\n (0, _metal.set)(lazyObject, 'value', 456);\n assert.equal(obj.someProp, 1, 'called the first time');\n assert.equal(obj.someProp, 1, 'returned cached value the second time');\n assert.equal(obj.lazyObject.value, 456, 'lazyObject returns expected value');\n assert.equal(obj.someProp, 1, 'someProp was not dirtied by lazyObject being dirtied before it has been calculated');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('computed - observer interop', class extends ComputedTestCase {\n async '@test observers that do not consume computed properties still work'(assert) {\n var _dec8, _class6;\n\n assert.expect(2);\n var Foo = (_dec8 = (0, _metal.computed)('otherProp'), (_class6 = class Foo {\n constructor() {\n this.otherProp = 123;\n }\n\n get someProp() {\n return this.otherProp;\n }\n\n }, _applyDecoratedDescriptor(_class6.prototype, \"someProp\", [_dec8], Object.getOwnPropertyDescriptor(_class6.prototype, \"someProp\"), _class6.prototype), _class6));\n obj = new Foo();\n (0, _metal.addObserver)(obj, 'otherProp', obj, () => assert.ok(true, 'otherProp observer called when it was changed'), false);\n (0, _metal.addObserver)(obj, 'someProp', obj, () => assert.ok(false, 'someProp observer called when it was not changed'), false);\n (0, _metal.set)(obj, 'otherProp', 456);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'someProp'), 456, '');\n (0, _metal.addObserver)(obj, 'anotherProp', obj, () => {}, false);\n (0, _metal.set)(obj, 'anotherProp', 123);\n await (0, _internalTestHelpers.runLoopSettled)();\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/events_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/props/events_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test listener should receive event - removing should remove'](assert) {\n var obj = {};\n var count = 0;\n\n function F() {\n count++;\n }\n\n (0, _metal.addListener)(obj, 'event!', F);\n assert.equal(count, 0, 'nothing yet');\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'received event');\n (0, _metal.removeListener)(obj, 'event!', F);\n count = 0;\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 0, 'received event');\n }\n\n ['@test listeners should be inherited'](assert) {\n var count = 0;\n var obj = {\n func() {\n count++;\n }\n\n };\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n var obj2 = Object.create(obj);\n assert.equal(count, 0, 'nothing yet');\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 1, 'received event');\n (0, _metal.removeListener)(obj2, 'event!', null, 'func');\n count = 0;\n (0, _metal.sendEvent)(obj2, 'event!');\n assert.equal(count, 0, 'did not receive event');\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'should still invoke on parent');\n }\n\n ['@test adding a listener more than once should only invoke once'](assert) {\n var count = 0;\n var obj = {\n func() {\n count++;\n }\n\n };\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n (0, _metal.addListener)(obj, 'event!', null, 'func');\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(count, 1, 'should only invoke once');\n }\n\n ['@test adding a listener with a target should invoke with target'](assert) {\n var obj = {};\n var target;\n target = {\n count: 0,\n\n method() {\n this.count++;\n }\n\n };\n (0, _metal.addListener)(obj, 'event!', target, target.method);\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 1, 'should invoke');\n }\n\n ['@test adding a listener with string method should lookup method on event delivery'](assert) {\n var obj = {};\n var target;\n target = {\n count: 0,\n\n method() {}\n\n };\n (0, _metal.addListener)(obj, 'event!', target, 'method');\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 0, 'should invoke but do nothing');\n\n target.method = function () {\n this.count++;\n };\n\n (0, _metal.sendEvent)(obj, 'event!');\n assert.equal(target.count, 1, 'should invoke now');\n }\n\n ['@test calling sendEvent with extra params should be passed to listeners'](assert) {\n var obj = {};\n var params = null;\n (0, _metal.addListener)(obj, 'event!', function () {\n params = Array.prototype.slice.call(arguments);\n });\n (0, _metal.sendEvent)(obj, 'event!', ['foo', 'bar']);\n assert.deepEqual(params, ['foo', 'bar'], 'params should be saved');\n }\n\n ['@test hasListeners tells you if there are listeners for a given event'](assert) {\n var obj = {};\n\n function F() {}\n\n function F2() {}\n\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'no listeners at first');\n (0, _metal.addListener)(obj, 'event!', F);\n (0, _metal.addListener)(obj, 'event!', F2);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n (0, _metal.removeListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n (0, _metal.removeListener)(obj, 'event!', F2);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), false, 'has no more listeners');\n (0, _metal.addListener)(obj, 'event!', F);\n assert.equal((0, _metal.hasListeners)(obj, 'event!'), true, 'has listeners');\n }\n\n ['@test a listener can be added as part of a mixin'](assert) {\n var triggered = 0;\n\n var MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.on)('bar', function () {\n triggered++;\n }),\n foo2: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n\n var obj = {};\n MyMixin.apply(obj);\n (0, _metal.sendEvent)(obj, 'bar');\n assert.equal(triggered, 2, 'should invoke listeners');\n }\n\n [`@test 'on' asserts for invalid arguments`]() {\n expectAssertion(() => {\n _metal.Mixin.create({\n foo1: (0, _metal.on)('bar')\n });\n }, 'on expects function as last argument');\n expectAssertion(() => {\n _metal.Mixin.create({\n foo1: (0, _metal.on)(function () {})\n });\n }, 'on called without valid event names');\n }\n\n ['@test a listener added as part of a mixin may be overridden'](assert) {\n var triggered = 0;\n\n var FirstMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('bar', function () {\n triggered++;\n })\n });\n\n var SecondMixin = _metal.Mixin.create({\n foo: (0, _metal.on)('baz', function () {\n triggered++;\n })\n });\n\n var obj = {};\n FirstMixin.apply(obj);\n SecondMixin.apply(obj);\n (0, _metal.sendEvent)(obj, 'bar');\n assert.equal(triggered, 0, 'should not invoke from overridden property');\n (0, _metal.sendEvent)(obj, 'baz');\n assert.equal(triggered, 1, 'should invoke from subclass property');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/expand_properties_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n var foundProperties = [];\n\n function addProperty(property) {\n foundProperties.push(property);\n }\n\n (0, _internalTestHelpers.moduleFor)('Property Brace Expansion Test', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n foundProperties = [];\n }\n\n ['@test Properties without expansions are unaffected'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('a', addProperty);\n (0, _metal.expandProperties)('a.b', addProperty);\n (0, _metal.expandProperties)('a.b.[]', addProperty);\n (0, _metal.expandProperties)('a.b.@each.c', addProperty);\n assert.deepEqual(['a', 'a.b', 'a.b.[]', 'a.b.@each.c'].sort(), foundProperties.sort());\n }\n\n ['@test A single expansion at the end expands properly'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('a.b.{c,d}', addProperty);\n assert.deepEqual(['a.b.c', 'a.b.d'].sort(), foundProperties.sort());\n }\n\n ['@test A property with only a brace expansion expands correctly'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('{a,b,c}', addProperty);\n var expected = ['a', 'b', 'c'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Expansions with single properties only expand once'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('a.b.{c}.d.{e}', addProperty);\n assert.deepEqual(['a.b.c.d.e'], foundProperties);\n }\n\n ['@test A single brace expansion expands correctly'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('a.{b,c,d}.e', addProperty);\n var expected = ['a.b.e', 'a.c.e', 'a.d.e'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Multiple brace expansions work correctly'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('{a,b,c}.d.{e,f}.g', addProperty);\n var expected = ['a.d.e.g', 'a.d.f.g', 'b.d.e.g', 'b.d.f.g', 'c.d.e.g', 'c.d.f.g'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test A property with only brace expansions expands correctly'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('{a,b,c}.{d}.{e,f}', addProperty);\n var expected = ['a.d.e', 'a.d.f', 'b.d.e', 'b.d.f', 'c.d.e', 'c.d.f'];\n assert.deepEqual(expected.sort(), foundProperties.sort());\n }\n\n ['@test Nested brace expansions are not allowed']() {\n var nestedBraceProperties = ['a.{b.{c,d}}', 'a.{{b}.c}', 'a.{b,c}.{d.{e,f}.g', 'a.{b.{c}', 'a.{b,c}}', 'model.{bar,baz'];\n nestedBraceProperties.forEach(invalidProperties => {\n expectAssertion(() => (0, _metal.expandProperties)(invalidProperties, addProperty));\n }, /Brace expanded properties have to be balanced and cannot be nested/);\n }\n\n ['@test A property with no braces does not expand'](assert) {\n assert.expect(1);\n (0, _metal.expandProperties)('a,b,c.d.e,f', addProperty);\n assert.deepEqual(foundProperties, ['a,b,c.d.e,f']);\n }\n\n ['@test A pattern must be a string'](assert) {\n assert.expect(1);\n expectAssertion(() => {\n (0, _metal.expandProperties)([1, 2], addProperty);\n }, /A computed property key must be a string/);\n }\n\n ['@test A pattern must not contain a space'](assert) {\n assert.expect(1);\n expectAssertion(function () {\n (0, _metal.expandProperties)('{a, b}', addProperty);\n }, /Brace expanded properties cannot contain spaces, e.g. \"user.{firstName, lastName}\" should be \"user.{firstName,lastName}\"/);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/injected_property_test\", [\"@ember/-internals/owner\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_owner, _metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('inject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test injected properties should be descriptors'](assert) {\n assert.ok((0, _metal.isClassicDecorator)((0, _metal.inject)('type')));\n }\n\n ['@test injected properties should be overridable'](assert) {\n var obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.inject)('type'));\n (0, _metal.set)(obj, 'foo', 'bar');\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should return the overridden value');\n }\n\n ['@test getting on an object without an owner or container should fail assertion']() {\n var obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.inject)('type', 'name'));\n expectAssertion(function () {\n (0, _metal.get)(obj, 'foo');\n }, /Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container./);\n }\n\n ['@test getting on an object without an owner but with a container should not fail'](assert) {\n var obj = {\n container: {\n lookup(key) {\n assert.ok(true, 'should call container.lookup');\n return key;\n }\n\n }\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.inject)('type', 'name'));\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:name', 'should return the value of container.lookup');\n }\n\n ['@test getting should return a lookup on the container'](assert) {\n assert.expect(2);\n var obj = {};\n (0, _owner.setOwner)(obj, {\n lookup(key) {\n assert.ok(true, 'should call container.lookup');\n return key;\n }\n\n });\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.inject)('type', 'name'));\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:name', 'should return the value of container.lookup');\n }\n\n ['@test omitting the lookup name should default to the property name'](assert) {\n var obj = {};\n (0, _owner.setOwner)(obj, {\n lookup(key) {\n return key;\n }\n\n });\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.inject)('type'));\n assert.equal((0, _metal.get)(obj, 'foo'), 'type:foo', 'should lookup the type using the property name');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/is_blank_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('isBlank', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isBlank'](assert) {\n var string = 'string';\n\n var fn = function () {};\n\n var object = {\n length: 0\n };\n assert.equal(true, (0, _metal.isBlank)(null), 'for null');\n assert.equal(true, (0, _metal.isBlank)(undefined), 'for undefined');\n assert.equal(true, (0, _metal.isBlank)(''), 'for an empty String');\n assert.equal(true, (0, _metal.isBlank)(' '), 'for a whitespace String');\n assert.equal(true, (0, _metal.isBlank)('\\n\\t'), 'for another whitespace String');\n assert.equal(false, (0, _metal.isBlank)('\\n\\t Hi'), 'for a String with whitespaces');\n assert.equal(false, (0, _metal.isBlank)(true), 'for true');\n assert.equal(false, (0, _metal.isBlank)(false), 'for false');\n assert.equal(false, (0, _metal.isBlank)(string), 'for a String');\n assert.equal(false, (0, _metal.isBlank)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isBlank)(0), 'for 0');\n assert.equal(true, (0, _metal.isBlank)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isBlank)({}), 'for an empty Object');\n assert.equal(true, (0, _metal.isBlank)(object), \"for an Object that has zero 'length'\");\n assert.equal(false, (0, _metal.isBlank)([1, 2, 3]), 'for a non-empty array');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/is_empty_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/lib/system/object_proxy\"], function (_metal, _internalTestHelpers, _object_proxy) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('isEmpty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isEmpty'](assert) {\n var string = 'string';\n\n var fn = function () {};\n\n var object = {\n length: 0\n };\n\n var proxy = _object_proxy.default.create({\n content: {\n size: 0\n }\n });\n\n assert.equal(true, (0, _metal.isEmpty)(null), 'for null');\n assert.equal(true, (0, _metal.isEmpty)(undefined), 'for undefined');\n assert.equal(true, (0, _metal.isEmpty)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isEmpty)(' '), 'for a whitespace String');\n assert.equal(false, (0, _metal.isEmpty)('\\n\\t'), 'for another whitespace String');\n assert.equal(false, (0, _metal.isEmpty)(true), 'for true');\n assert.equal(false, (0, _metal.isEmpty)(false), 'for false');\n assert.equal(false, (0, _metal.isEmpty)(string), 'for a String');\n assert.equal(false, (0, _metal.isEmpty)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isEmpty)(0), 'for 0');\n assert.equal(true, (0, _metal.isEmpty)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isEmpty)({}), 'for an empty Object');\n assert.equal(true, (0, _metal.isEmpty)(object), \"for an Object that has zero 'length'\");\n assert.equal(true, (0, _metal.isEmpty)(proxy), \"for a proxy that has zero 'size'\");\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/is_none_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('isNone', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isNone'](assert) {\n var string = 'string';\n\n var fn = function () {};\n\n assert.equal(true, (0, _metal.isNone)(null), 'for null');\n assert.equal(true, (0, _metal.isNone)(undefined), 'for undefined');\n assert.equal(false, (0, _metal.isNone)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isNone)(true), 'for true');\n assert.equal(false, (0, _metal.isNone)(false), 'for false');\n assert.equal(false, (0, _metal.isNone)(string), 'for a String');\n assert.equal(false, (0, _metal.isNone)(fn), 'for a Function');\n assert.equal(false, (0, _metal.isNone)(0), 'for 0');\n assert.equal(false, (0, _metal.isNone)([]), 'for an empty Array');\n assert.equal(false, (0, _metal.isNone)({}), 'for an empty Object');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/is_present_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('isPresent', class extends _internalTestHelpers.AbstractTestCase {\n ['@test isPresent'](assert) {\n var string = 'string';\n\n var fn = function () {};\n\n var object = {\n length: 0\n };\n assert.equal(false, (0, _metal.isPresent)(), 'for no params');\n assert.equal(false, (0, _metal.isPresent)(null), 'for null');\n assert.equal(false, (0, _metal.isPresent)(undefined), 'for undefined');\n assert.equal(false, (0, _metal.isPresent)(''), 'for an empty String');\n assert.equal(false, (0, _metal.isPresent)(' '), 'for a whitespace String');\n assert.equal(false, (0, _metal.isPresent)('\\n\\t'), 'for another whitespace String');\n assert.equal(true, (0, _metal.isPresent)('\\n\\t Hi'), 'for a String with whitespaces');\n assert.equal(true, (0, _metal.isPresent)(true), 'for true');\n assert.equal(true, (0, _metal.isPresent)(false), 'for false');\n assert.equal(true, (0, _metal.isPresent)(string), 'for a String');\n assert.equal(true, (0, _metal.isPresent)(fn), 'for a Function');\n assert.equal(true, (0, _metal.isPresent)(0), 'for 0');\n assert.equal(false, (0, _metal.isPresent)([]), 'for an empty Array');\n assert.equal(true, (0, _metal.isPresent)({}), 'for an empty Object');\n assert.equal(false, (0, _metal.isPresent)(object), \"for an Object that has zero 'length'\");\n assert.equal(true, (0, _metal.isPresent)([1, 2, 3]), 'for a non-empty array');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/libraries_test\", [\"@ember/debug\", \"@ember/-internals/metal\", \"@ember/canary-features\", \"internal-test-helpers\"], function (_debug, _metal, _canaryFeatures, _internalTestHelpers) {\n \"use strict\";\n\n var libs, registry;\n var originalWarn = (0, _debug.getDebugFunction)('warn');\n\n function noop() {}\n\n (0, _internalTestHelpers.moduleFor)('Libraries registry', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n libs = new _metal.Libraries();\n registry = libs._registry;\n }\n\n afterEach() {\n libs = null;\n registry = null;\n (0, _debug.setDebugFunction)('warn', originalWarn);\n }\n\n ['@test core libraries come before other libraries'](assert) {\n assert.expect(2);\n libs.register('my-lib', '2.0.0a');\n libs.registerCoreLibrary('DS', '1.0.0-beta.2');\n assert.equal(registry[0].name, 'DS');\n assert.equal(registry[1].name, 'my-lib');\n }\n\n ['@test only the first registration of a library is stored'](assert) {\n assert.expect(3); // overwrite warn to suppress the double registration warning (see https://github.com/emberjs/ember.js/issues/16391)\n\n (0, _debug.setDebugFunction)('warn', noop);\n libs.register('magic', 1.23);\n libs.register('magic', 2.23);\n assert.equal(registry[0].name, 'magic');\n assert.equal(registry[0].version, 1.23);\n assert.equal(registry.length, 1);\n }\n\n ['@test isRegistered returns correct value'](assert) {\n if (_canaryFeatures.EMBER_LIBRARIES_ISREGISTERED) {\n assert.expect(3);\n assert.equal(libs.isRegistered('magic'), false);\n libs.register('magic', 1.23);\n assert.equal(libs.isRegistered('magic'), true);\n libs.deRegister('magic');\n assert.equal(libs.isRegistered('magic'), false);\n } else {\n assert.expect(0);\n }\n }\n\n ['@test attempting to register a library that is already registered warns you'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n assert.expect(1);\n libs.register('magic', 1.23);\n (0, _debug.setDebugFunction)('warn', function (msg, test) {\n if (!test) {\n assert.equal(msg, 'Library \"magic\" is already registered with Ember.');\n }\n }); // Should warn us\n\n libs.register('magic', 2.23);\n }\n\n ['@test libraries can be de-registered'](assert) {\n assert.expect(2);\n libs.register('lib1', '1.0.0b');\n libs.register('lib2', '1.0.0b');\n libs.register('lib3', '1.0.0b');\n libs.deRegister('lib1');\n libs.deRegister('lib3');\n assert.equal(registry[0].name, 'lib2');\n assert.equal(registry.length, 1);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/main_test\", [\"ember/version\", \"internal-test-helpers\"], function (_version, _internalTestHelpers) {\n \"use strict\";\n\n // From https://github.com/semver/semver.org/issues/59 & https://regex101.com/r/vW1jA8/6\n var SEMVER_REGEX = /^((?:0|(?:[1-9]\\d*)))\\.((?:0|(?:[1-9]\\d*)))\\.((?:0|(?:[1-9]\\d*)))(?:-([0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*))?$/;\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/metal/core/main', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.VERSION is in alignment with SemVer v2.0.0'](assert) {\n assert.ok(SEMVER_REGEX.test(_version.default), `Ember.VERSION (${_version.default})is valid SemVer v2.0.0`);\n }\n\n ['@test SEMVER_REGEX properly validates and invalidates version numbers'](assert) {\n function validateVersionString(versionString, expectedResult) {\n assert.equal(SEMVER_REGEX.test(versionString), expectedResult);\n } // Positive test cases\n\n\n validateVersionString('1.11.3', true);\n validateVersionString('1.0.0-beta.16.1', true);\n validateVersionString('1.12.1+canary.aba1412', true);\n validateVersionString('2.0.0-beta.1+canary.bb344775', true);\n validateVersionString('3.1.0-foobarBaz+30d70bd3', true); // Negative test cases\n\n validateVersionString('1.11.3.aba18a', false);\n validateVersionString('1.11', false);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/accessor_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin Accessors', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works with getters'](assert) {\n var count = 0;\n\n var MixinA = _metal.Mixin.create({\n get prop() {\n return count++;\n }\n\n });\n\n var obj = {};\n MixinA.apply(obj);\n assert.equal(obj.prop, 0, 'getter defined correctly');\n assert.equal(obj.prop, 1, 'getter defined correctly');\n }\n\n ['@test works with setters'](assert) {\n var MixinA = _metal.Mixin.create({\n set prop(value) {\n this._prop = value + 1;\n }\n\n });\n\n var obj = {};\n MixinA.apply(obj);\n obj.prop = 0;\n assert.equal(obj._prop, 1, 'setter defined correctly');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/apply_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n function K() {}\n\n (0, _internalTestHelpers.moduleFor)('Mixin.apply', class extends _internalTestHelpers.AbstractTestCase {\n ['@test using apply() should apply properties'](assert) {\n var MixinA = _metal.Mixin.create({\n foo: 'FOO',\n baz: K\n });\n\n var obj = {};\n (0, _metal.mixin)(obj, MixinA);\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should apply foo');\n assert.equal((0, _metal.get)(obj, 'baz'), K, 'should apply foo');\n }\n\n ['@test applying anonymous properties'](assert) {\n var obj = {};\n (0, _metal.mixin)(obj, {\n foo: 'FOO',\n baz: K\n });\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO', 'should apply foo');\n assert.equal((0, _metal.get)(obj, 'baz'), K, 'should apply foo');\n }\n\n ['@test applying null values']() {\n expectAssertion(() => (0, _metal.mixin)({}, null));\n }\n\n ['@test applying a property with an undefined value'](assert) {\n var obj = {\n tagName: ''\n };\n (0, _metal.mixin)(obj, {\n tagName: undefined\n });\n assert.strictEqual((0, _metal.get)(obj, 'tagName'), '');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/computed_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n function K() {\n return this;\n }\n\n (0, _internalTestHelpers.moduleFor)('Mixin Computed Properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test overriding computed properties'](assert) {\n var MixinA, MixinB, MixinC, MixinD;\n var obj;\n window.testStarted = true;\n MixinA = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return 'A';\n })\n });\n MixinB = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'B';\n })\n });\n MixinC = _metal.Mixin.create(MixinA, {\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'C';\n })\n });\n MixinD = _metal.Mixin.create({\n aProp: (0, _metal.computed)(function () {\n return this._super(...arguments) + 'D';\n })\n });\n obj = {};\n MixinB.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AB', 'should expose super for B');\n obj = {};\n MixinC.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AC', 'should expose super for C');\n obj = {};\n MixinA.apply(obj);\n MixinD.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'AD', 'should define super for D');\n obj = {};\n (0, _metal.defineProperty)(obj, 'aProp', (0, _metal.computed)(function () {\n return 'obj';\n }));\n MixinD.apply(obj);\n assert.equal((0, _metal.get)(obj, 'aProp'), 'objD', 'should preserve original computed property');\n }\n\n ['@test calling set on overridden computed properties'](assert) {\n var SuperMixin, SubMixin;\n var obj;\n var superGetOccurred = false;\n var superSetOccurred = false;\n SuperMixin = _metal.Mixin.create({\n aProp: (0, _metal.computed)({\n get() {\n superGetOccurred = true;\n },\n\n set() {\n superSetOccurred = true;\n }\n\n })\n });\n SubMixin = _metal.Mixin.create(SuperMixin, {\n aProp: (0, _metal.computed)({\n get() {\n return this._super(...arguments);\n },\n\n set() {\n return this._super(...arguments);\n }\n\n })\n });\n obj = {};\n SubMixin.apply(obj);\n (0, _metal.set)(obj, 'aProp', 'set thyself');\n assert.ok(superSetOccurred, 'should pass set to _super');\n superSetOccurred = false; // reset the set assertion\n\n obj = {};\n SubMixin.apply(obj);\n (0, _metal.get)(obj, 'aProp');\n assert.ok(superGetOccurred, 'should pass get to _super');\n (0, _metal.set)(obj, 'aProp', 'set thyself');\n assert.ok(superSetOccurred, 'should pass set to _super after getting');\n }\n\n ['@test setter behavior asserts when overriding computed properties'](assert) {\n var obj = {};\n\n var MixinA = _metal.Mixin.create({\n cpWithSetter2: (0, _metal.computed)(K),\n cpWithSetter3: (0, _metal.computed)(K),\n cpWithoutSetter: (0, _metal.computed)(K)\n });\n\n var cpWasCalled = false;\n\n var MixinB = _metal.Mixin.create({\n cpWithSetter2: (0, _metal.computed)({\n get: K,\n\n set() {\n cpWasCalled = true;\n }\n\n }),\n cpWithSetter3: (0, _metal.computed)({\n get: K,\n\n set() {\n cpWasCalled = true;\n }\n\n }),\n cpWithoutSetter: (0, _metal.computed)(function () {\n cpWasCalled = true;\n })\n });\n\n MixinA.apply(obj);\n MixinB.apply(obj);\n (0, _metal.set)(obj, 'cpWithSetter2', 'test');\n assert.ok(cpWasCalled, 'The computed property setter was called when defined with two args');\n cpWasCalled = false;\n (0, _metal.set)(obj, 'cpWithSetter3', 'test');\n assert.ok(cpWasCalled, 'The computed property setter was called when defined with three args');\n cpWasCalled = false;\n expectAssertion(() => {\n (0, _metal.set)(obj, 'cpWithoutSetter', 'test');\n }, /Cannot override the computed property `cpWithoutSetter` on \\[object Object\\]./);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/concatenated_properties_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin concatenatedProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining concatenated properties should concat future version'](assert) {\n var MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n var MixinB = _metal.Mixin.create({\n foo: ['d', 'e', 'f']\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['a', 'b', 'c', 'd', 'e', 'f']);\n }\n\n ['@test ensure we do not needlessly scan concatenatedProperties array'](assert) {\n var MixinA = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n var MixinB = _metal.Mixin.create({\n concatenatedProperties: null\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual(obj.concatenatedProperties, []);\n }\n\n ['@test concatenatedProperties should be concatenated'](assert) {\n var MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: ['a', 'b', 'c']\n });\n\n var MixinB = _metal.Mixin.create({\n concatenatedProperties: 'bar',\n foo: ['d', 'e', 'f'],\n bar: [1, 2, 3]\n });\n\n var MixinC = _metal.Mixin.create({\n bar: [4, 5, 6]\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.deepEqual((0, _metal.get)(obj, 'concatenatedProperties'), ['foo', 'bar'], 'get concatenatedProperties');\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['a', 'b', 'c', 'd', 'e', 'f'], 'get foo');\n assert.deepEqual((0, _metal.get)(obj, 'bar'), [1, 2, 3, 4, 5, 6], 'get bar');\n }\n\n ['@test adding a prop that is a number should make array'](assert) {\n var MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: [1, 2, 3]\n });\n\n var MixinB = _metal.Mixin.create({\n foo: 4\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), [1, 2, 3, 4]);\n }\n\n ['@test adding a prop that is a string should make array'](assert) {\n var MixinA = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 'bar'\n });\n\n var obj = (0, _metal.mixin)({}, MixinA);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), ['bar']);\n }\n\n ['@test adding a non-concatenable property that already has a defined value should result in an array with both values'](assert) {\n var mixinA = _metal.Mixin.create({\n foo: 1\n });\n\n var mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foo'],\n foo: 2\n });\n\n var obj = (0, _metal.mixin)({}, mixinA, mixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), [1, 2]);\n }\n\n ['@test adding a concatenable property that already has a defined value should result in a concatenated value'](assert) {\n var mixinA = _metal.Mixin.create({\n foobar: 'foo'\n });\n\n var mixinB = _metal.Mixin.create({\n concatenatedProperties: ['foobar'],\n foobar: 'bar'\n });\n\n var obj = (0, _metal.mixin)({}, mixinA, mixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foobar'), ['foo', 'bar']);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/detect_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin.detect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detect() finds a directly applied mixin'](assert) {\n var MixinA = _metal.Mixin.create();\n\n var obj = {};\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n MixinA.apply(obj);\n assert.equal(MixinA.detect(obj), true, 'MixinA.detect(obj) after apply()');\n }\n\n ['@test detect() finds nested mixins'](assert) {\n var MixinA = _metal.Mixin.create({});\n\n var MixinB = _metal.Mixin.create(MixinA);\n\n var obj = {};\n assert.equal(MixinA.detect(obj), false, 'MixinA.detect(obj) before apply()');\n MixinB.apply(obj);\n assert.equal(MixinA.detect(obj), true, 'MixinA.detect(obj) after apply()');\n }\n\n ['@test detect() finds mixins on other mixins'](assert) {\n var MixinA = _metal.Mixin.create({});\n\n var MixinB = _metal.Mixin.create(MixinA);\n\n assert.equal(MixinA.detect(MixinB), true, 'MixinA is part of MixinB');\n assert.equal(MixinB.detect(MixinA), false, 'MixinB is not part of MixinA');\n }\n\n ['@test detect handles null values'](assert) {\n var MixinA = _metal.Mixin.create();\n\n assert.equal(MixinA.detect(null), false);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/introspection_test\", [\"@ember/-internals/utils\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_utils, _metal, _internalTestHelpers) {\n \"use strict\";\n\n // NOTE: A previous iteration differentiated between public and private props\n // as well as methods vs props. We are just keeping these for testing; the\n // current impl doesn't care about the differences as much...\n var PrivateProperty = _metal.Mixin.create({\n _foo: '_FOO'\n });\n\n var PublicProperty = _metal.Mixin.create({\n foo: 'FOO'\n });\n\n var PrivateMethod = _metal.Mixin.create({\n _fooMethod() {}\n\n });\n\n var PublicMethod = _metal.Mixin.create({\n fooMethod() {}\n\n });\n\n var BarProperties = _metal.Mixin.create({\n _bar: '_BAR',\n bar: 'bar'\n });\n\n var BarMethods = _metal.Mixin.create({\n _barMethod() {},\n\n barMethod() {}\n\n });\n\n var Combined = _metal.Mixin.create(BarProperties, BarMethods);\n\n var obj;\n (0, _internalTestHelpers.moduleFor)('Basic introspection', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = {};\n (0, _metal.mixin)(obj, PrivateProperty, PublicProperty, PrivateMethod, PublicMethod, Combined);\n }\n\n ['@test Ember.mixins()'](assert) {\n function mapGuids(ary) {\n return ary.map(x => (0, _utils.guidFor)(x));\n }\n\n assert.deepEqual(mapGuids(_metal.Mixin.mixins(obj)), mapGuids([PrivateProperty, PublicProperty, PrivateMethod, PublicMethod, Combined, BarProperties, BarMethods]), 'should return included mixins');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/merged_properties_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_runtime, _metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin mergedProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining mergedProperties should merge future version'](assert) {\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n a: true,\n b: true,\n c: true\n }\n });\n\n var MixinB = _metal.Mixin.create({\n foo: {\n d: true,\n e: true,\n f: true\n }\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: true,\n b: true,\n c: true,\n d: true,\n e: true,\n f: true\n });\n }\n\n ['@test defining mergedProperties on future mixin should merged into past'](assert) {\n var MixinA = _metal.Mixin.create({\n foo: {\n a: true,\n b: true,\n c: true\n }\n });\n\n var MixinB = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n d: true,\n e: true,\n f: true\n }\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: true,\n b: true,\n c: true,\n d: true,\n e: true,\n f: true\n });\n }\n\n ['@test defining mergedProperties with null properties should keep properties null'](assert) {\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: null\n });\n\n var MixinB = _metal.Mixin.create({\n foo: null\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.equal((0, _metal.get)(obj, 'foo'), null);\n }\n\n [\"@test mergedProperties' properties can get overwritten\"](assert) {\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n a: 1\n }\n });\n\n var MixinB = _metal.Mixin.create({\n foo: {\n a: 2\n }\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB);\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: 2\n });\n }\n\n ['@test mergedProperties should be concatenated'](assert) {\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n a: true,\n b: true,\n c: true\n }\n });\n\n var MixinB = _metal.Mixin.create({\n mergedProperties: 'bar',\n foo: {\n d: true,\n e: true,\n f: true\n },\n bar: {\n a: true,\n l: true\n }\n });\n\n var MixinC = _metal.Mixin.create({\n bar: {\n e: true,\n x: true\n }\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.deepEqual((0, _metal.get)(obj, 'mergedProperties'), ['foo', 'bar'], 'get mergedProperties');\n assert.deepEqual((0, _metal.get)(obj, 'foo'), {\n a: true,\n b: true,\n c: true,\n d: true,\n e: true,\n f: true\n }, 'get foo');\n assert.deepEqual((0, _metal.get)(obj, 'bar'), {\n a: true,\n l: true,\n e: true,\n x: true\n }, 'get bar');\n }\n\n ['@test mergedProperties should exist even if not explicitly set on create'](assert) {\n var AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 'a',\n b: {\n c: 'ccc'\n }\n }\n });\n\n var obj = AnObj.create({\n options: {\n a: 'A'\n }\n });\n assert.equal((0, _metal.get)(obj, 'options').a, 'A');\n assert.equal((0, _metal.get)(obj, 'options').b.c, 'ccc');\n }\n\n ['@test defining mergedProperties at create time should not modify the prototype'](assert) {\n var AnObj = _runtime.Object.extend({\n mergedProperties: ['options'],\n options: {\n a: 1\n }\n });\n\n var objA = AnObj.create({\n options: {\n a: 2\n }\n });\n var objB = AnObj.create({\n options: {\n a: 3\n }\n });\n assert.equal((0, _metal.get)(objA, 'options').a, 2);\n assert.equal((0, _metal.get)(objB, 'options').a, 3);\n }\n\n [\"@test mergedProperties' overwriting methods can call _super\"](assert) {\n assert.expect(4);\n\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n meth(a) {\n assert.equal(a, 'WOOT', \"_super successfully called MixinA's `foo.meth` method\");\n return 'WAT';\n }\n\n }\n });\n\n var MixinB = _metal.Mixin.create({\n foo: {\n meth() {\n assert.ok(true, \"MixinB's `foo.meth` method called\");\n return this._super(...arguments);\n }\n\n }\n });\n\n var MixinC = _metal.Mixin.create({\n foo: {\n meth(a) {\n assert.ok(true, \"MixinC's `foo.meth` method called\");\n return this._super(a);\n }\n\n }\n });\n\n var obj = (0, _metal.mixin)({}, MixinA, MixinB, MixinC);\n assert.equal(obj.foo.meth('WOOT'), 'WAT');\n }\n\n ['@test Merging an Array should raise an error'](assert) {\n assert.expect(1);\n\n var MixinA = _metal.Mixin.create({\n mergedProperties: ['foo'],\n foo: {\n a: true,\n b: true,\n c: true\n }\n });\n\n var MixinB = _metal.Mixin.create({\n foo: ['a']\n });\n\n expectAssertion(() => {\n (0, _metal.mixin)({}, MixinA, MixinB);\n }, 'You passed in `[\"a\"]` as the value for `foo` but `foo` cannot be an Array');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/method_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin Methods', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining simple methods'](assert) {\n var MixinA, obj, props;\n props = {\n publicMethod() {\n return 'publicMethod';\n },\n\n _privateMethod() {\n return 'privateMethod';\n }\n\n };\n MixinA = _metal.Mixin.create(props);\n obj = {};\n MixinA.apply(obj); // but should be defined\n\n assert.equal(props.publicMethod(), 'publicMethod', 'publicMethod is func');\n assert.equal(props._privateMethod(), 'privateMethod', 'privateMethod is func');\n }\n\n ['@test overriding public methods'](assert) {\n var MixinA, MixinB, MixinD, MixinF, obj;\n MixinA = _metal.Mixin.create({\n publicMethod() {\n return 'A';\n }\n\n });\n MixinB = _metal.Mixin.create(MixinA, {\n publicMethod() {\n return this._super(...arguments) + 'B';\n }\n\n });\n MixinD = _metal.Mixin.create(MixinA, {\n publicMethod() {\n return this._super(...arguments) + 'D';\n }\n\n });\n MixinF = _metal.Mixin.create({\n publicMethod() {\n return this._super(...arguments) + 'F';\n }\n\n });\n obj = {};\n MixinB.apply(obj);\n assert.equal(obj.publicMethod(), 'AB', 'should define super for A and B');\n obj = {};\n MixinD.apply(obj);\n assert.equal(obj.publicMethod(), 'AD', 'should define super for A and B');\n obj = {};\n MixinA.apply(obj);\n MixinF.apply(obj);\n assert.equal(obj.publicMethod(), 'AF', 'should define super for A and F');\n obj = {\n publicMethod() {\n return 'obj';\n }\n\n };\n MixinF.apply(obj);\n assert.equal(obj.publicMethod(), 'objF', 'should define super for F');\n }\n\n ['@test overriding inherited objects'](assert) {\n var cnt = 0;\n\n var MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n\n });\n\n var MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n\n cnt++;\n }\n\n });\n\n var objA = {};\n MixinA.apply(objA);\n var objB = Object.create(objA);\n MixinB.apply(objB);\n cnt = 0;\n objB.foo();\n assert.equal(cnt, 2, 'should invoke both methods');\n cnt = 0;\n objA.foo();\n assert.equal(cnt, 1, 'should not screw w/ parent obj');\n }\n\n ['@test Including the same mixin more than once will only run once'](assert) {\n var cnt = 0;\n\n var MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n\n });\n\n var MixinB = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n\n });\n\n var MixinC = _metal.Mixin.create(MixinA, {\n foo() {\n this._super(...arguments);\n }\n\n });\n\n var MixinD = _metal.Mixin.create(MixinB, MixinC, MixinA, {\n foo() {\n this._super(...arguments);\n }\n\n });\n\n var obj = {};\n MixinD.apply(obj);\n MixinA.apply(obj); // try to apply again..\n\n cnt = 0;\n obj.foo();\n assert.equal(cnt, 1, 'should invoke MixinA.foo one time');\n }\n\n ['@test _super from a single mixin with no superclass does not error'](assert) {\n var MixinA = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n\n });\n\n var obj = {};\n MixinA.apply(obj);\n obj.foo();\n assert.ok(true);\n }\n\n ['@test _super from a first-of-two mixins with no superclass function does not error'](assert) {\n // _super was previously calling itself in the second assertion.\n // Use remaining count of calls to ensure it doesn't loop indefinitely.\n var remaining = 3;\n\n var MixinA = _metal.Mixin.create({\n foo() {\n if (remaining-- > 0) {\n this._super(...arguments);\n }\n }\n\n });\n\n var MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n }\n\n });\n\n var obj = {};\n MixinA.apply(obj);\n MixinB.apply(obj);\n obj.foo();\n assert.ok(true);\n }\n\n }); // ..........................................................\n // CONFLICTS\n //\n\n (0, _internalTestHelpers.moduleFor)('Method Conflicts', class extends _internalTestHelpers.AbstractTestCase {\n ['@test overriding toString'](assert) {\n var MixinA = _metal.Mixin.create({\n toString() {\n return 'FOO';\n }\n\n });\n\n var obj = {};\n MixinA.apply(obj);\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n obj = {};\n (0, _metal.mixin)(obj, {\n toString() {\n return 'FOO';\n }\n\n });\n assert.equal(obj.toString(), 'FOO', 'should override toString w/o error');\n }\n\n }); // ..........................................................\n // BUGS\n //\n\n (0, _internalTestHelpers.moduleFor)('system/mixin/method_test BUGS', class extends _internalTestHelpers.AbstractTestCase {\n ['@test applying several mixins at once with sup already defined causes infinite loop'](assert) {\n var cnt = 0;\n\n var MixinA = _metal.Mixin.create({\n foo() {\n cnt++;\n }\n\n });\n\n var MixinB = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n\n cnt++;\n }\n\n });\n\n var MixinC = _metal.Mixin.create({\n foo() {\n this._super(...arguments);\n\n cnt++;\n }\n\n });\n\n var obj = {};\n (0, _metal.mixin)(obj, MixinA); // sup already exists\n\n (0, _metal.mixin)(obj, MixinB, MixinC); // must be more than one mixin\n\n cnt = 0;\n obj.foo();\n assert.equal(cnt, 3, 'should invoke all 3 methods');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/observer_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@glimmer/destroyable\"], function (_metal, _internalTestHelpers, _destroyable) {\n \"use strict\";\n\n var obj;\n (0, _internalTestHelpers.moduleFor)('Mixin observer', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n async ['@test global observer helper'](assert) {\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test global observer helper takes multiple params'](assert) {\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar', 'baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n (0, _metal.set)(obj, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 2, 'should invoke observer after change');\n (0, _destroyable.destroy)(obj);\n await (0, _internalTestHelpers.runLoopSettled)();\n }\n\n async ['@test replacing observer should remove old observer'](assert) {\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var Mixin2 = _metal.Mixin.create({\n foo: (0, _metal.observer)('baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 10);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin, Mixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 10, 'should invoke observer after change');\n }\n\n async ['@test observing chain with property before'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n bar: obj2,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with property after'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n }),\n bar: obj2\n });\n\n obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with property in mixin applied later'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var MyMixin2 = _metal.Mixin.create({\n bar: obj2\n });\n\n obj = (0, _metal.mixin)({}, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n MyMixin2.apply(obj);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with existing property'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({\n bar: obj2\n }, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with property in mixin before'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin2 = _metal.Mixin.create({\n bar: obj2\n });\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin2, MyMixin);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with property in mixin after'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n\n var MyMixin2 = _metal.Mixin.create({\n bar: obj2\n });\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({}, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n async ['@test observing chain with overridden property'](assert) {\n var obj2 = {\n baz: 'baz'\n };\n var obj3 = {\n baz: 'foo'\n };\n\n var MyMixin2 = _metal.Mixin.create({\n bar: obj3\n });\n\n var MyMixin = _metal.Mixin.create({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n obj = (0, _metal.mixin)({\n bar: obj2\n }, MyMixin, MyMixin2);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj2, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n (0, _metal.set)(obj3, 'baz', 'BEAR');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/reopen_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/runloop\", \"internal-test-helpers\"], function (_runtime, _metal, _runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Mixin#reopen', class extends _internalTestHelpers.AbstractTestCase {\n ['@test using reopen() to add more properties to a simple'](assert) {\n var MixinA = _metal.Mixin.create({\n foo: 'FOO',\n baz: 'BAZ'\n });\n\n MixinA.reopen({\n bar: 'BAR',\n foo: 'FOO2'\n });\n var obj = {};\n MixinA.apply(obj);\n assert.equal((0, _metal.get)(obj, 'foo'), 'FOO2', 'mixin() should override');\n assert.equal((0, _metal.get)(obj, 'baz'), 'BAZ', 'preserve MixinA props');\n assert.equal((0, _metal.get)(obj, 'bar'), 'BAR', 'include MixinB props');\n }\n\n ['@test using reopen() and calling _super where there is not a super function does not cause infinite recursion'](assert) {\n var Taco = _runtime.Object.extend({\n createBreakfast() {\n // There is no original createBreakfast function.\n // Calling the wrapped _super function here\n // used to end in an infinite call loop\n this._super(...arguments);\n\n return 'Breakfast!';\n }\n\n });\n\n Taco.reopen({\n createBreakfast() {\n return this._super(...arguments);\n }\n\n });\n var taco = Taco.create();\n var result;\n (0, _runloop.run)(() => {\n try {\n result = taco.createBreakfast();\n } catch (e) {\n result = 'Your breakfast was interrupted by an infinite stack error.';\n }\n });\n assert.equal(result, 'Breakfast!');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/mixin/without_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('without', class extends _internalTestHelpers.AbstractTestCase {\n ['@test without should create a new mixin excluding named properties'](assert) {\n var MixinA = _metal.Mixin.create({\n foo: 'FOO',\n bar: 'BAR'\n });\n\n var MixinB = MixinA.without('bar');\n var obj = {};\n MixinB.apply(obj);\n assert.equal(obj.foo, 'FOO', 'should defined foo');\n assert.equal(obj.bar, undefined, 'should not define bar');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/namespace_search_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('NamespaceSearch', class extends _internalTestHelpers.AbstractTestCase {\n ['@test classToString: null as this inside class must not throw error'](assert) {\n var mixin = _metal.Mixin.create();\n\n assert.equal(mixin.toString(), '(unknown mixin)', 'this = null should be handled on Mixin.toString() call');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/native_desc_decorator_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_runtime, _metal, _internalTestHelpers) {\n \"use strict\";\n\n var classes = [class {\n static module(title) {\n return `${title}: using defineProperty on an object directly`;\n }\n\n constructor() {\n this.object = {};\n }\n\n install(key, desc, assert) {\n var {\n object\n } = this;\n (0, _metal.defineProperty)(object, key, desc);\n assert.ok(Object.prototype.hasOwnProperty.call(object, key));\n }\n\n set(key, value) {\n this.object[key] = value;\n }\n\n finalize() {\n return this.object;\n }\n\n source() {\n return this.object;\n }\n\n }, class {\n static module(title) {\n return `${title}: using defineProperty on a prototype`;\n }\n\n constructor() {\n this.proto = {};\n }\n\n install(key, desc, assert) {\n var {\n proto\n } = this;\n (0, _metal.defineProperty)(proto, key, desc);\n assert.ok(Object.prototype.hasOwnProperty.call(proto, key));\n }\n\n set(key, value) {\n this.proto[key] = value;\n }\n\n finalize() {\n return Object.create(this.proto);\n }\n\n source() {\n return this.proto;\n }\n\n }, class {\n static module(title) {\n return `${title}: in EmberObject.extend()`;\n }\n\n constructor() {\n this.klass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.klass = _runtime.Object.extend(this.props);\n return this.klass.create();\n }\n\n source() {\n return this.klass.prototype;\n }\n\n }, class {\n static module(title) {\n return `${title}: in EmberObject.extend() through a mixin`;\n }\n\n constructor() {\n this.klass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.klass = _runtime.Object.extend(_metal.Mixin.create(this.props));\n return this.klass.create();\n }\n\n source() {\n return this.klass.prototype;\n }\n\n }, class {\n static module(title) {\n return `${title}: inherited from another EmberObject super class`;\n }\n\n constructor() {\n this.superklass = null;\n this.props = {};\n }\n\n install(key, desc) {\n this.props[key] = desc;\n }\n\n set(key, value) {\n this.props[key] = value;\n }\n\n finalize() {\n this.superklass = _runtime.Object.extend(this.props);\n return this.superklass.extend().create();\n }\n\n source() {\n return this.superklass.prototype;\n }\n\n }];\n classes.forEach(TestClass => {\n (0, _internalTestHelpers.moduleFor)(TestClass.module('@ember/-internals/metal/nativeDescDecorator'), class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining a configurable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n configurable: true,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n delete source.foo;\n assert.strictEqual(obj.foo, undefined);\n Object.defineProperty(source, 'foo', {\n configurable: true,\n value: 'baz'\n });\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a non-configurable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n configurable: false,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n assert.throws(() => delete source.foo, TypeError);\n assert.throws(() => Object.defineProperty(source, 'foo', {\n configurable: true,\n value: 'baz'\n }), TypeError);\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining an enumerable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n enumerable: true,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n assert.ok(Object.keys(source).indexOf('foo') !== -1);\n }\n\n ['@test defining a non-enumerable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n enumerable: false,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n assert.ok(Object.keys(source).indexOf('foo') === -1);\n }\n\n ['@test defining a writable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n writable: true,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n source.foo = 'baz';\n assert.equal(obj.foo, 'baz');\n obj.foo = 'bat';\n assert.equal(obj.foo, 'bat');\n }\n\n ['@test defining a non-writable property'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n writable: false,\n value: 'bar'\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n var source = factory.source();\n assert.throws(() => source.foo = 'baz', TypeError);\n assert.throws(() => obj.foo = 'baz', TypeError);\n assert.equal(obj.foo, 'bar');\n }\n\n ['@test defining a getter'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n get: function () {\n return this.__foo__;\n }\n }), assert);\n factory.set('__foo__', 'bar');\n var obj = factory.finalize();\n assert.equal(obj.foo, 'bar');\n obj.__foo__ = 'baz';\n assert.equal(obj.foo, 'baz');\n }\n\n ['@test defining a setter'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n factory.set('__foo__', 'bar');\n var obj = factory.finalize();\n assert.equal(obj.__foo__, 'bar');\n obj.foo = 'baz';\n assert.equal(obj.__foo__, 'baz');\n }\n\n ['@test combining multiple setter and getters'](assert) {\n var factory = new TestClass(assert);\n factory.install('foo', (0, _metal.nativeDescDecorator)({\n get: function () {\n return this.__foo__;\n },\n set: function (value) {\n this.__foo__ = value;\n }\n }), assert);\n factory.set('__foo__', 'foo');\n factory.install('bar', (0, _metal.nativeDescDecorator)({\n get: function () {\n return this.__bar__;\n },\n set: function (value) {\n this.__bar__ = value;\n }\n }), assert);\n factory.set('__bar__', 'bar');\n factory.install('fooBar', (0, _metal.nativeDescDecorator)({\n get: function () {\n return this.foo + '-' + this.bar;\n }\n }), assert);\n var obj = factory.finalize();\n assert.equal(obj.fooBar, 'foo-bar');\n obj.foo = 'FOO';\n assert.equal(obj.fooBar, 'FOO-bar');\n obj.__bar__ = 'BAR';\n assert.equal(obj.fooBar, 'FOO-BAR');\n assert.throws(() => obj.fooBar = 'foobar', TypeError);\n assert.equal(obj.fooBar, 'FOO-BAR');\n }\n\n });\n });\n});","define(\"@ember/-internals/metal/tests/observer_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@glimmer/destroyable\", \"@ember/-internals/meta\"], function (_metal, _internalTestHelpers, _destroyable, _meta) {\n \"use strict\";\n\n function K() {}\n\n var obj; // ..........................................................\n // ADD OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('addObserver', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n ['@test observer should assert to invalid input']() {\n expectAssertion(() => {\n (0, _metal.observer)(() => {});\n }, 'observer called without valid path');\n expectAssertion(() => {\n (0, _metal.observer)(null);\n }, 'observer must be provided a function or an observer definition');\n expectAssertion(() => {\n (0, _metal.observer)({});\n }, 'observer called without a function');\n expectAssertion(() => {\n (0, _metal.observer)({\n fn() {}\n\n });\n }, 'observer called without valid path');\n expectAssertion(() => {\n (0, _metal.observer)({\n fn() {},\n\n dependentKeys: []\n });\n }, 'observer called without valid path');\n expectAssertion(() => {\n (0, _metal.observer)({\n fn() {},\n\n dependentKeys: ['foo']\n });\n }, 'observer called without sync');\n }\n\n async ['@test observer should fire when property is modified'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar', 'should invoke AFTER value changed');\n count++;\n });\n (0, _metal.set)(obj, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n async ['@test observer supports keys with colons'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo:bar:baz', function () {\n assert.equal((0, _metal.get)(obj, 'foo:bar:baz'), 'bar', 'should invoke AFTER value changed');\n count++;\n });\n (0, _metal.set)(obj, 'foo:bar:baz', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should have invoked observer');\n }\n\n async ['@test observer should fire when dependent property is modified'](assert) {\n obj = {\n bar: 'bar'\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('bar', function () {\n return (0, _metal.get)(this, 'bar').toUpperCase();\n }));\n (0, _metal.get)(obj, 'foo');\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n assert.equal((0, _metal.get)(obj, 'foo'), 'BAZ', 'should have invoked after prop change');\n count++;\n });\n (0, _metal.set)(obj, 'bar', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should have invoked observer');\n } // https://github.com/emberjs/ember.js/issues/18246\n\n\n async ['@test observer should fire when computed property is modified'](assert) {\n obj = {\n bar: 'bar'\n };\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('bar', {\n get() {\n return (0, _metal.get)(this, 'bar');\n },\n\n set(key, value) {\n return value;\n }\n\n }));\n (0, _metal.get)(obj, 'foo');\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'should have invoked after prop change');\n count++;\n });\n (0, _metal.set)(obj, 'foo', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should have invoked observer');\n assert.equal((0, _metal.get)(obj, 'foo'), 'baz', 'computed should have correct value');\n }\n\n async ['@test observer should continue to fire after dependent properties are accessed'](assert) {\n var observerCount = 0;\n obj = {};\n (0, _metal.defineProperty)(obj, 'prop', (0, _metal.computed)(function () {\n return Math.random();\n }));\n (0, _metal.defineProperty)(obj, 'anotherProp', (0, _metal.computed)('prop', function () {\n return (0, _metal.get)(this, 'prop') + Math.random();\n }));\n (0, _metal.addObserver)(obj, 'prop', function () {\n observerCount++;\n });\n (0, _metal.get)(obj, 'anotherProp');\n\n for (var i = 0; i < 10; i++) {\n (0, _metal.notifyPropertyChange)(obj, 'prop');\n await (0, _internalTestHelpers.runLoopSettled)();\n }\n\n assert.equal(observerCount, 10, 'should continue to fire indefinitely');\n }\n\n async ['@test observers watching multiple properties via brace expansion should fire when the properties change'](assert) {\n obj = {};\n var count = 0;\n (0, _metal.mixin)(obj, {\n observeFooAndBar: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n (0, _metal.set)(obj, 'foo', 'foo');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'observer specified via brace expansion invoked on property change');\n (0, _metal.set)(obj, 'bar', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2, 'observer specified via brace expansion invoked on property change');\n (0, _metal.set)(obj, 'baz', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2, 'observer not invoked on unspecified property');\n }\n\n async ['@test observers watching multiple properties via brace expansion should fire when dependent properties change'](assert) {\n obj = {\n baz: 'Initial'\n };\n var count = 0;\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('bar', function () {\n return (0, _metal.get)(this, 'bar').toLowerCase();\n }));\n (0, _metal.defineProperty)(obj, 'bar', (0, _metal.computed)('baz', function () {\n return (0, _metal.get)(this, 'baz').toUpperCase();\n }));\n (0, _metal.mixin)(obj, {\n fooAndBarWatcher: (0, _metal.observer)('{foo,bar}', function () {\n count++;\n })\n });\n (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'baz', 'Baz');\n await (0, _internalTestHelpers.runLoopSettled)(); // fire once for foo, once for bar\n\n assert.equal(count, 2, 'observer specified via brace expansion invoked on dependent property change');\n (0, _metal.set)(obj, 'quux', 'Quux');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2, 'observer not fired on unspecified property');\n }\n\n async ['@test removing an chain observer on change should not fail'](assert) {\n var foo = {\n bar: 'bar'\n };\n var obj1 = {\n foo: foo\n };\n var obj2 = {\n foo: foo\n };\n var obj3 = {\n foo: foo\n };\n var obj4 = {\n foo: foo\n };\n var count1 = 0;\n var count2 = 0;\n var count3 = 0;\n var count4 = 0;\n\n function observer1() {\n count1++;\n }\n\n function observer2() {\n count2++;\n }\n\n function observer3() {\n count3++;\n (0, _metal.removeObserver)(obj1, 'foo.bar', observer1);\n (0, _metal.removeObserver)(obj2, 'foo.bar', observer2);\n (0, _metal.removeObserver)(obj4, 'foo.bar', observer4);\n }\n\n function observer4() {\n count4++;\n }\n\n (0, _metal.addObserver)(obj1, 'foo.bar', observer1);\n (0, _metal.addObserver)(obj2, 'foo.bar', observer2);\n (0, _metal.addObserver)(obj3, 'foo.bar', observer3);\n (0, _metal.addObserver)(obj4, 'foo.bar', observer4);\n (0, _metal.set)(foo, 'bar', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count1, 1, 'observer1 fired');\n assert.equal(count2, 1, 'observer2 fired');\n assert.equal(count3, 1, 'observer3 fired');\n assert.equal(count4, 0, 'observer4 did not fire');\n (0, _destroyable.destroy)(obj1);\n (0, _destroyable.destroy)(obj2);\n (0, _destroyable.destroy)(obj3);\n (0, _destroyable.destroy)(obj4);\n }\n\n async ['@test deferring property change notifications'](assert) {\n obj = {\n foo: 'foo'\n };\n var fooCount = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n fooCount++;\n });\n (0, _metal.beginPropertyChanges)();\n (0, _metal.set)(obj, 'foo', 'BIFF');\n (0, _metal.set)(obj, 'foo', 'BAZ');\n (0, _metal.endPropertyChanges)();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(fooCount, 1, 'foo should have fired once');\n }\n\n async ['@test addObserver should respect targets with methods'](assert) {\n var observed = obj = {\n foo: 'foo'\n };\n var target1 = {\n count: 0,\n\n didChange(obj, keyName) {\n var value = (0, _metal.get)(obj, keyName);\n assert.equal(this, target1, 'should invoke with this');\n assert.equal(obj, observed, 'param1 should be observed object');\n assert.equal(keyName, 'foo', 'param2 should be keyName');\n assert.equal(value, 'BAZ', 'param3 should new value');\n this.count++;\n }\n\n };\n var target2 = {\n count: 0,\n\n didChange(obj, keyName) {\n var value = (0, _metal.get)(obj, keyName);\n assert.equal(this, target2, 'should invoke with this');\n assert.equal(obj, observed, 'param1 should be observed object');\n assert.equal(keyName, 'foo', 'param2 should be keyName');\n assert.equal(value, 'BAZ', 'param3 should new value');\n this.count++;\n }\n\n };\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, target2.didChange);\n (0, _metal.set)(observed, 'foo', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n }\n\n async ['@test addObserver should allow multiple objects to observe a property'](assert) {\n var observed = obj = {\n foo: 'foo'\n };\n var target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n\n };\n var target2 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n\n };\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, 'didChange');\n (0, _metal.set)(observed, 'foo', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n }\n\n }); // ..........................................................\n // REMOVE OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('removeObserver', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n async ['@test removing observer should stop firing'](assert) {\n obj = {};\n var count = 0;\n\n function F() {\n count++;\n }\n\n (0, _metal.addObserver)(obj, 'foo', F);\n (0, _metal.set)(obj, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should have invoked observer');\n (0, _metal.removeObserver)(obj, 'foo', F);\n (0, _metal.set)(obj, 'foo', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, \"removed observer shouldn't fire\");\n }\n\n async ['@test local observers can be removed'](assert) {\n var barObserved = 0;\n\n var MyMixin = _metal.Mixin.create({\n foo1: (0, _metal.observer)('bar', function () {\n barObserved++;\n }),\n foo2: (0, _metal.observer)('bar', function () {\n barObserved++;\n })\n });\n\n obj = {};\n MyMixin.apply(obj);\n (0, _metal.set)(obj, 'bar', 'HI!');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(barObserved, 2, 'precond - observers should be fired');\n (0, _metal.removeObserver)(obj, 'bar', null, 'foo1');\n barObserved = 0;\n (0, _metal.set)(obj, 'bar', 'HI AGAIN!');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(barObserved, 1, 'removed observers should not be called');\n }\n\n async ['@test removeObserver should respect targets with methods'](assert) {\n var observed = {\n foo: 'foo'\n };\n var target1 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n\n };\n var target2 = {\n count: 0,\n\n didChange() {\n this.count++;\n }\n\n };\n (0, _metal.addObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.addObserver)(observed, 'foo', target2, target2.didChange);\n (0, _metal.set)(observed, 'foo', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(target1.count, 1, 'target1 observer should have fired');\n assert.equal(target2.count, 1, 'target2 observer should have fired');\n (0, _metal.removeObserver)(observed, 'foo', target1, 'didChange');\n (0, _metal.removeObserver)(observed, 'foo', target2, target2.didChange);\n target1.count = target2.count = 0;\n (0, _metal.set)(observed, 'foo', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(target1.count, 0, 'target1 observer should not fire again');\n assert.equal(target2.count, 0, 'target2 observer should not fire again');\n }\n\n }); // ..........................................................\n // CHAINED OBSERVERS\n //\n\n var count;\n (0, _internalTestHelpers.moduleFor)('addObserver - dependentkey with chained properties', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n }\n\n obj = undefined;\n count = 0;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n\n beforeEach() {\n obj = {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n },\n Capital: {\n foo: {\n bar: {\n baz: {\n biff: 'BIFF'\n }\n }\n }\n }\n };\n count = 0;\n }\n\n async ['@test depending on a chain with a computed property'](assert) {\n (0, _metal.defineProperty)(obj, 'computed', (0, _metal.computed)(function () {\n return {\n foo: 'bar'\n };\n }));\n var changed = 0;\n (0, _metal.addObserver)(obj, 'computed.foo', function () {\n changed++;\n });\n assert.equal((0, _meta.meta)(obj).valueFor('computed'), undefined, 'addObserver should not compute CP');\n (0, _metal.set)(obj, 'computed.foo', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(changed, 1, 'should fire observer');\n }\n\n async ['@test depending on a simple chain'](assert) {\n var val;\n (0, _metal.addObserver)(obj, 'foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(target, key);\n count++;\n });\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar'), 'baz', {\n biff: 'BLARG'\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n (0, _metal.set)((0, _metal.get)(obj, 'foo'), 'bar', {\n baz: {\n biff: 'BOOM'\n }\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n (0, _metal.set)(obj, 'foo', {\n bar: {\n baz: {\n biff: 'BLARG'\n }\n }\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n (0, _metal.set)((0, _metal.get)(obj, 'foo.bar.baz'), 'biff', 'BUZZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n var foo = (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'foo', 'BOO');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, undefined);\n assert.equal(count, 6);\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n\n async ['@test depending on a chain with a capitalized first key'](assert) {\n var val;\n (0, _metal.addObserver)(obj, 'Capital.foo.bar.baz.biff', function (target, key) {\n val = (0, _metal.get)(obj, key);\n count++;\n });\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BUZZ');\n assert.equal(count, 1);\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar'), 'baz', {\n biff: 'BLARG'\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BLARG');\n assert.equal(count, 2);\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo'), 'bar', {\n baz: {\n biff: 'BOOM'\n }\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BOOM');\n assert.equal(count, 3);\n (0, _metal.set)(obj, 'Capital.foo', {\n bar: {\n baz: {\n biff: 'BLARG'\n }\n }\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BLARG');\n assert.equal(count, 4);\n (0, _metal.set)((0, _metal.get)(obj, 'Capital.foo.bar.baz'), 'biff', 'BUZZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, 'BUZZ');\n assert.equal(count, 5);\n var foo = (0, _metal.get)(obj, 'foo');\n (0, _metal.set)(obj, 'Capital.foo', 'BOO');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(val, undefined);\n assert.equal(count, 6);\n (0, _metal.set)(foo.bar.baz, 'biff', 'BOOM');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 6, 'should be not have invoked observer');\n }\n\n }); // ..........................................................\n // SETTING IDENTICAL VALUES\n //\n\n (0, _internalTestHelpers.moduleFor)('props/observer_test - setting identical values', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n }\n\n obj = undefined;\n count = 0;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n\n async ['@test setting simple prop should not trigger'](assert) {\n obj = {\n foo: 'bar'\n };\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n (0, _metal.set)(obj, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 0, 'should not trigger observer');\n (0, _metal.set)(obj, 'foo', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should trigger observer');\n (0, _metal.set)(obj, 'foo', 'baz');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'should not trigger observer again');\n } // The issue here is when a computed property is directly set with a value, then has a\n // dependent key change (which triggers a cache expiration and recomputation), observers will\n // not be fired if the CP setter is called with the last set value.\n\n\n async ['@test setting a cached computed property whose value has changed should trigger'](assert) {\n obj = {};\n (0, _metal.defineProperty)(obj, 'foo', (0, _metal.computed)('baz', {\n get: function () {\n return (0, _metal.get)(this, 'baz');\n },\n set: function (key, value) {\n return value;\n }\n }));\n var count = 0;\n (0, _metal.addObserver)(obj, 'foo', function () {\n count++;\n });\n (0, _metal.set)(obj, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n (0, _metal.set)(obj, 'baz', 'qux');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(obj, 'foo'), 'qux');\n (0, _metal.set)(obj, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 3);\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Keys behavior with observers', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n ['@test should not leak properties on the prototype'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.addObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(obj), []);\n (0, _metal.removeObserver)(obj, 'type', K);\n }\n\n ['@test observing a non existent property'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.addObserver)(obj, 'brand', K);\n assert.deepEqual(Object.keys(obj), []);\n (0, _metal.set)(obj, 'brand', 'Corona');\n assert.deepEqual(Object.keys(obj), ['brand']);\n (0, _metal.removeObserver)(obj, 'brand', K);\n }\n\n ['@test with observers switched on and off'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(obj), []);\n }\n\n ['@test observers switched on and off with setter in between'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.set)(obj, 'type', 'ale');\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(obj), ['type']);\n }\n\n ['@test observer switched on and off and then setter'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n (0, _metal.set)(obj, 'type', 'ale');\n assert.deepEqual(Object.keys(obj), ['type']);\n }\n\n ['@test observers switched on and off with setter in between (observed property is not shadowing)'](assert) {\n function Beer() {}\n\n obj = new Beer();\n (0, _metal.set)(obj, 'type', 'ale');\n assert.deepEqual(Object.keys(obj), ['type'], 'only set');\n var otherBeer = new Beer();\n (0, _metal.addObserver)(otherBeer, 'type', K);\n (0, _metal.set)(otherBeer, 'type', 'ale');\n assert.deepEqual(Object.keys(otherBeer), ['type'], 'addObserver -> set');\n var yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n var itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\n (0, _destroyable.destroy)(otherBeer);\n (0, _destroyable.destroy)(yetAnotherBeer);\n (0, _destroyable.destroy)(itsMyLastBeer);\n }\n\n ['@test observers switched on and off with setter in between (observed property is shadowing one on the prototype)'](assert) {\n function Beer() {}\n\n Beer.prototype.type = 'ipa';\n obj = new Beer();\n (0, _metal.set)(obj, 'type', 'ale');\n assert.deepEqual(Object.keys(obj), ['type'], 'after set');\n var otherBeer = new Beer();\n (0, _metal.addObserver)(otherBeer, 'type', K);\n (0, _metal.set)(otherBeer, 'type', 'ale');\n assert.deepEqual(Object.keys(otherBeer), ['type'], 'addObserver -> set');\n var yetAnotherBeer = new Beer();\n (0, _metal.addObserver)(yetAnotherBeer, 'type', K);\n (0, _metal.set)(yetAnotherBeer, 'type', 'ale');\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(yetAnotherBeer), ['type'], 'addObserver -> set -> removeObserver');\n var itsMyLastBeer = new Beer();\n (0, _metal.set)(itsMyLastBeer, 'type', 'ale');\n (0, _metal.addObserver)(obj, 'type', K);\n (0, _metal.removeObserver)(obj, 'type', K);\n assert.deepEqual(Object.keys(itsMyLastBeer), ['type'], 'set -> removeObserver');\n (0, _destroyable.destroy)(otherBeer);\n (0, _destroyable.destroy)(yetAnotherBeer);\n (0, _destroyable.destroy)(itsMyLastBeer);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('changeProperties - sync observers', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n }\n\n '@test observers added/removed during changeProperties should do the right thing.'(assert) {\n obj = {\n foo: 0\n };\n\n function Observer() {\n this.didChangeCount = 0;\n }\n\n Observer.prototype = {\n add() {\n (0, _metal.addObserver)(obj, 'foo', this, 'didChange', true);\n },\n\n remove() {\n (0, _metal.removeObserver)(obj, 'foo', this, 'didChange', true);\n },\n\n didChange() {\n this.didChangeCount++;\n }\n\n };\n var addedBeforeFirstChangeObserver = new Observer();\n var addedAfterFirstChangeObserver = new Observer();\n var addedAfterLastChangeObserver = new Observer();\n var removedBeforeFirstChangeObserver = new Observer();\n var removedBeforeLastChangeObserver = new Observer();\n var removedAfterLastChangeObserver = new Observer();\n removedBeforeFirstChangeObserver.add();\n removedBeforeLastChangeObserver.add();\n removedAfterLastChangeObserver.add();\n (0, _metal.changeProperties)(function () {\n removedBeforeFirstChangeObserver.remove();\n addedBeforeFirstChangeObserver.add();\n (0, _metal.set)(obj, 'foo', 1);\n assert.equal(addedBeforeFirstChangeObserver.didChangeCount, 0, 'addObserver called before the first change is deferred');\n addedAfterFirstChangeObserver.add();\n removedBeforeLastChangeObserver.remove();\n (0, _metal.set)(obj, 'foo', 2);\n assert.equal(addedAfterFirstChangeObserver.didChangeCount, 0, 'addObserver called after the first change is deferred');\n addedAfterLastChangeObserver.add();\n removedAfterLastChangeObserver.remove();\n });\n assert.equal(removedBeforeFirstChangeObserver.didChangeCount, 0, 'removeObserver called before the first change sees none');\n assert.equal(addedBeforeFirstChangeObserver.didChangeCount, 1, 'addObserver called before the first change sees only 1');\n assert.equal(addedAfterFirstChangeObserver.didChangeCount, 1, 'addObserver called after the first change sees 1');\n assert.equal(addedAfterLastChangeObserver.didChangeCount, 1, 'addObserver called after the last change sees 1');\n assert.equal(removedBeforeLastChangeObserver.didChangeCount, 0, 'removeObserver called before the last change sees none');\n assert.equal(removedAfterLastChangeObserver.didChangeCount, 0, 'removeObserver called after the last change sees none');\n }\n\n '@test calling changeProperties while executing deferred observers works correctly'(assert) {\n obj = {\n foo: 0\n };\n var fooDidChange = 0;\n (0, _metal.addObserver)(obj, 'foo', () => {\n fooDidChange++;\n (0, _metal.changeProperties)(() => {});\n }, undefined, true);\n (0, _metal.changeProperties)(() => {\n (0, _metal.set)(obj, 'foo', 1);\n });\n assert.equal(fooDidChange, 1);\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/performance_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@glimmer/destroyable\"], function (_metal, _internalTestHelpers, _destroyable) {\n \"use strict\";\n\n var obj;\n /*\n This test file is designed to capture performance regressions related to\n deferred computation. Things like run loops, computed properties, and bindings\n should run the minimum amount of times to achieve best performance, so any\n bugs that cause them to get evaluated more than necessary should be put here.\n */\n\n (0, _internalTestHelpers.moduleFor)('Computed Properties - Number of times evaluated', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n if (obj !== undefined) {\n (0, _destroyable.destroy)(obj);\n obj = undefined;\n }\n\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n\n async ['@test computed properties that depend on multiple properties should run only once per run loop'](assert) {\n obj = {\n a: 'a',\n b: 'b',\n c: 'c'\n };\n var cpCount = 0;\n var obsCount = 0;\n (0, _metal.defineProperty)(obj, 'abc', (0, _metal.computed)('a', 'b', 'c', function (key) {\n cpCount++;\n return 'computed ' + key;\n }));\n (0, _metal.get)(obj, 'abc');\n cpCount = 0;\n (0, _metal.addObserver)(obj, 'abc', function () {\n obsCount++;\n });\n (0, _metal.beginPropertyChanges)();\n (0, _metal.set)(obj, 'a', 'aa');\n (0, _metal.set)(obj, 'b', 'bb');\n (0, _metal.set)(obj, 'c', 'cc');\n (0, _metal.endPropertyChanges)();\n (0, _metal.get)(obj, 'abc');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(cpCount, 1, 'The computed property is only invoked once');\n assert.equal(obsCount, 1, 'The observer is only invoked once');\n }\n\n ['@test computed properties are not executed if they are the last segment of an observer chain pain'](assert) {\n obj = {\n bar: {\n baz: {}\n }\n };\n var count = 0;\n (0, _metal.defineProperty)(obj.bar.baz, 'bam', (0, _metal.computed)(function () {\n count++;\n }));\n (0, _metal.addObserver)(obj, 'bar.baz.bam', function () {});\n (0, _metal.notifyPropertyChange)((0, _metal.get)(obj, 'bar.baz'), 'bam');\n assert.equal(count, 0, 'should not have recomputed property');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/properties_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('defineProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test toString'](assert) {\n var obj = {};\n (0, _metal.defineProperty)(obj, 'toString', undefined, function () {\n return 'FOO';\n });\n assert.equal(obj.toString(), 'FOO', 'should replace toString');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Ember.deprecateProperty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test enables access to deprecated property and returns the value of the new property'](assert) {\n assert.expect(3);\n var obj = {\n foo: 'bar'\n };\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', {\n id: 'baz-deprecation',\n until: 'some.version'\n });\n expectDeprecation();\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n obj.foo = 'blammo';\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n }\n\n ['@test deprecatedKey is not enumerable'](assert) {\n assert.expect(2);\n var obj = {\n foo: 'bar',\n blammo: 'whammy'\n };\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', {\n id: 'baz-deprecation',\n until: 'some.version'\n });\n\n for (var prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n assert.notEqual(prop, 'baz');\n }\n }\n }\n\n ['@test enables setter to deprecated property and updates the value of the new property'](assert) {\n assert.expect(3);\n var obj = {\n foo: 'bar'\n };\n (0, _metal.deprecateProperty)(obj, 'baz', 'foo', {\n id: 'baz-deprecation',\n until: 'some.version'\n });\n expectDeprecation();\n obj.baz = 'bloop';\n assert.equal(obj.foo, 'bloop', 'updating baz updates foo');\n assert.equal(obj.baz, obj.foo, 'baz and foo are equal');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/property_events_test\", [\"@ember/-internals/meta\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_meta, _metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('notifyPropertyChange', class extends _internalTestHelpers.AbstractTestCase {\n ['@test notifies property changes on instances'](assert) {\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n\n }\n\n var foo = new Foo();\n (0, _metal.notifyPropertyChange)(foo, 'bar');\n }\n\n ['@test notifies property changes on instances with meta'](assert) {\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n\n }\n\n var foo = new Foo();\n (0, _meta.meta)(foo); // setup meta\n\n (0, _metal.notifyPropertyChange)(foo, 'bar');\n }\n\n ['@test does not notify on class prototypes with meta'](assert) {\n assert.expect(0);\n\n class Foo {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'bar', 'property change notified');\n }\n\n }\n\n var foo = new Foo();\n (0, _meta.meta)(foo.constructor.prototype); // setup meta for prototype\n\n (0, _metal.notifyPropertyChange)(foo.constructor.prototype, 'bar');\n }\n\n ['@test does not notify on non-class prototypes with meta'](assert) {\n assert.expect(0);\n var foo = {\n [_metal.PROPERTY_DID_CHANGE](prop) {\n assert.equal(prop, 'baz', 'property change notified');\n }\n\n };\n var bar = Object.create(foo);\n (0, _meta.meta)(foo); // setup meta for prototype\n\n (0, _meta.meta)(bar); // setup meta for instance, switch prototype\n\n (0, _metal.notifyPropertyChange)(foo, 'baz');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/set_properties_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\"], function (_metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('setProperties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test supports setting multiple attributes at once'](assert) {\n assert.deepEqual((0, _metal.setProperties)(null, null), null, 'noop for null properties and null object');\n assert.deepEqual((0, _metal.setProperties)(undefined, undefined), undefined, 'noop for undefined properties and undefined object');\n assert.deepEqual((0, _metal.setProperties)({}), undefined, 'noop for no properties');\n assert.deepEqual((0, _metal.setProperties)({}, undefined), undefined, 'noop for undefined');\n assert.deepEqual((0, _metal.setProperties)({}, null), null, 'noop for null');\n assert.deepEqual((0, _metal.setProperties)({}, NaN), NaN, 'noop for NaN');\n assert.deepEqual((0, _metal.setProperties)({}, {}), {}, 'meh');\n var props = (0, _metal.setProperties)({}, {\n foo: undefined\n });\n assert.deepEqual(props, {\n foo: undefined\n }, 'Setting undefined value');\n assert.ok('foo' in props, 'Setting undefined value');\n assert.deepEqual(Object.keys(props), ['foo'], 'Setting undefined value');\n assert.deepEqual((0, _metal.setProperties)({}, {\n foo: 1\n }), {\n foo: 1\n }, 'Set a single property');\n assert.deepEqual((0, _metal.setProperties)({}, {\n foo: 1,\n bar: 1\n }), {\n foo: 1,\n bar: 1\n }, 'Set multiple properties');\n assert.deepEqual((0, _metal.setProperties)({\n foo: 2,\n baz: 2\n }, {\n foo: 1\n }), {\n foo: 1\n }, 'Set one of multiple properties');\n assert.deepEqual((0, _metal.setProperties)({\n foo: 2,\n baz: 2\n }, {\n bar: 2\n }), {\n bar: 2\n }, 'Set an additional, previously unset property');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/tracked/classic_classes_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@glimmer/validator\"], function (_internalTestHelpers, _metal, _validator) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('@tracked decorator - classic classes', class extends _internalTestHelpers.AbstractTestCase {\n [`@test validators for tracked getters with dependencies should invalidate when the dependencies invalidate`](assert) {\n var obj = {};\n (0, _metal.defineProperty)(obj, 'first', (0, _metal.tracked)());\n (0, _metal.defineProperty)(obj, 'last', (0, _metal.tracked)());\n (0, _metal.defineProperty)(obj, 'full', (0, _metal.nativeDescDecorator)({\n get() {\n return `${this.first} ${this.last}`;\n },\n\n set(value) {\n var [first, last] = value.split(' ');\n this.first = first;\n this.last = last;\n }\n\n }));\n obj.first = 'Tom';\n obj.last = 'Dale';\n var tag = (0, _validator.track)(() => obj.full);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal(obj.full, 'Tom Dale', 'The full name starts correct');\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.full = 'Melanie Sumner';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false);\n assert.equal(obj.full, 'Melanie Sumner');\n assert.equal(obj.first, 'Melanie');\n assert.equal(obj.last, 'Sumner');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test can pass a default value to the tracked decorator`](assert) {\n class Tracked {\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }\n\n (0, _metal.defineProperty)(Tracked.prototype, 'first', (0, _metal.tracked)({\n value: 'Tom'\n }));\n (0, _metal.defineProperty)(Tracked.prototype, 'last', (0, _metal.tracked)({\n value: 'Dale'\n }));\n var obj = new Tracked();\n assert.equal(obj.full, 'Tom Dale', 'Default values are correctly assign');\n }\n\n [`@test errors if used directly on a classic class`]() {\n expectAssertion(() => {\n class Tracked {\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }\n\n (0, _metal.defineProperty)(Tracked.prototype, 'first', _metal.tracked);\n }, \"@tracked can only be used directly as a native decorator. If you're using tracked in classic classes, add parenthesis to call it like a function: tracked()\");\n }\n\n [`@test errors on any keys besides 'value', 'get', or 'set' being passed`]() {\n expectAssertion(() => {\n class Tracked {\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }\n\n (0, _metal.defineProperty)(Tracked.prototype, 'first', (0, _metal.tracked)({\n foo() {}\n\n }));\n }, \"The options object passed to tracked() may only contain a 'value' or 'initializer' property, not both. Received: [foo]\");\n }\n\n [`@test errors if 'value' and 'get'/'set' are passed together`]() {\n expectAssertion(() => {\n class Tracked {\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }\n\n (0, _metal.defineProperty)(Tracked.prototype, 'first', (0, _metal.tracked)({\n value: 123,\n initializer: () => 123\n }));\n }, \"The options object passed to tracked() may only contain a 'value' or 'initializer' property, not both. Received: [value,initializer]\");\n }\n\n [`@test errors on anything besides an options object being passed`]() {\n expectAssertion(() => {\n class Tracked {\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }\n\n (0, _metal.defineProperty)(Tracked.prototype, 'first', (0, _metal.tracked)(null));\n }, \"tracked() may only receive an options object containing 'value' or 'initializer', received null\");\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('@tracked decorator - native decorator behavior', class extends _internalTestHelpers.AbstractTestCase {\n [`@test errors if options are passed to native decorator`]() {\n expectAssertion(() => {\n var _dec, _class, _descriptor;\n\n var Tracked = (_dec = (0, _metal.tracked)(), (_class = class Tracked {\n constructor() {\n _initializerDefineProperty(this, \"first\", _descriptor, this);\n }\n\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"first\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class));\n new Tracked();\n }, \"You attempted to set a default value for first with the @tracked({ value: 'default' }) syntax. You can only use this syntax with classic classes. For native classes, you can use class initializers: @tracked field = 'default';\");\n }\n\n [`@test errors if options are passed to native decorator (GH#17764)`](assert) {\n var _class3, _descriptor2;\n\n var Tracked = (_class3 = class Tracked {\n constructor() {\n _initializerDefineProperty(this, \"value\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3);\n var obj = new Tracked();\n assert.strictEqual(obj.value, undefined, 'uninitilized value defaults to undefined');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/tracked/get_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n var createObj = function () {\n var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5;\n\n var Obj = (_class = class Obj {\n constructor() {\n _initializerDefineProperty(this, \"string\", _descriptor, this);\n\n _initializerDefineProperty(this, \"number\", _descriptor2, this);\n\n _initializerDefineProperty(this, \"boolTrue\", _descriptor3, this);\n\n _initializerDefineProperty(this, \"boolFalse\", _descriptor4, this);\n\n _initializerDefineProperty(this, \"nullValue\", _descriptor5, this);\n }\n\n }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"string\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'string';\n }\n }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 23;\n }\n }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"boolTrue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return true;\n }\n }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"boolFalse\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return false;\n }\n }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"nullValue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return null;\n }\n })), _class);\n return new Obj();\n };\n\n (0, _internalTestHelpers.moduleFor)('@tracked decorator: get', class extends _internalTestHelpers.AbstractTestCase {\n '@test should get arbitrary properties on an object'() {\n var obj = createObj();\n\n for (var key in obj) {\n this.assert.equal((0, _metal.get)(obj, key), obj[key], key);\n }\n }\n\n '@test should get a @tracked path'() {\n var _class3, _descriptor6, _class5, _descriptor7, _class7, _descriptor8;\n\n var Key = (_class3 = class Key {\n constructor() {\n this.key = 'some-key';\n\n _initializerDefineProperty(this, \"value\", _descriptor6, this);\n }\n\n }, _descriptor6 = _applyDecoratedDescriptor(_class3.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return `value for ${this.key}`;\n }\n }), _class3);\n var Path = (_class5 = class Path {\n constructor() {\n _initializerDefineProperty(this, \"key\", _descriptor7, this);\n }\n\n }, _descriptor7 = _applyDecoratedDescriptor(_class5.prototype, \"key\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return new Key();\n }\n }), _class5);\n var Obj = (_class7 = class Obj {\n constructor() {\n _initializerDefineProperty(this, \"path\", _descriptor8, this);\n }\n\n }, _descriptor8 = _applyDecoratedDescriptor(_class7.prototype, \"path\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return new Path();\n }\n }), _class7);\n var obj = new Obj();\n this.assert.equal((0, _metal.get)(obj, 'path.key.value'), 'value for some-key');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/tracked/set_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _metal) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n var createObj = () => {\n var _class, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6;\n\n var Obj = (_class = class Obj {\n constructor() {\n _initializerDefineProperty(this, \"string\", _descriptor, this);\n\n _initializerDefineProperty(this, \"number\", _descriptor2, this);\n\n _initializerDefineProperty(this, \"boolTrue\", _descriptor3, this);\n\n _initializerDefineProperty(this, \"boolFalse\", _descriptor4, this);\n\n _initializerDefineProperty(this, \"nullValue\", _descriptor5, this);\n\n _initializerDefineProperty(this, \"undefinedValue\", _descriptor6, this);\n }\n\n }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"string\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'string';\n }\n }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"number\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 23;\n }\n }), _descriptor3 = _applyDecoratedDescriptor(_class.prototype, \"boolTrue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return true;\n }\n }), _descriptor4 = _applyDecoratedDescriptor(_class.prototype, \"boolFalse\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return false;\n }\n }), _descriptor5 = _applyDecoratedDescriptor(_class.prototype, \"nullValue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return null;\n }\n }), _descriptor6 = _applyDecoratedDescriptor(_class.prototype, \"undefinedValue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n })), _class);\n return new Obj();\n };\n\n (0, _internalTestHelpers.moduleFor)('@tracked set', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should set arbitrary properties on an object'](assert) {\n var _class3, _descriptor7;\n\n var obj = createObj();\n var Obj = (_class3 = class Obj {\n constructor() {\n _initializerDefineProperty(this, \"undefinedValue\", _descriptor7, this);\n }\n\n }, _descriptor7 = _applyDecoratedDescriptor(_class3.prototype, \"undefinedValue\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'emberjs';\n }\n }), _class3);\n var newObj = new Obj();\n\n for (var key in obj) {\n assert.equal((0, _metal.set)(newObj, key, obj[key]), obj[key], 'should return value');\n assert.equal((0, _metal.get)(newObj, key), obj[key], 'should set value');\n }\n }\n\n ['@test set should not throw an error when setting on shadowed properties'](assert) {\n var _class5, _descriptor8;\n\n var Obj = (_class5 = class Obj {\n constructor() {\n _initializerDefineProperty(this, \"value\", _descriptor8, this);\n\n Object.defineProperty(this, 'value', {\n writable: true,\n value: 'emberjs'\n });\n }\n\n }, _descriptor8 = _applyDecoratedDescriptor(_class5.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'emberjs';\n }\n }), _class5);\n var newObj = new Obj();\n (0, _metal.set)(newObj, 'value', 123);\n assert.equal(newObj.value, 123, 'it worked');\n }\n\n });\n});","define(\"@ember/-internals/metal/tests/tracked/validation_test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@glimmer/validator\"], function (_metal, _internalTestHelpers, _validator) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('@tracked get validation', class extends _internalTestHelpers.AbstractTestCase {\n [`@test autotracking should work with tracked fields`](assert) {\n var _class, _descriptor;\n\n var Tracked = (_class = class Tracked {\n constructor(first) {\n _initializerDefineProperty(this, \"first\", _descriptor, this);\n\n this.first = first;\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"first\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n }), _class);\n var obj = new Tracked('Tom', 'Dale');\n var tag = (0, _validator.track)(() => obj.first);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal(obj.first, 'Tom', 'The full name starts correct');\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.first = 'Thomas';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false);\n assert.equal(obj.first, 'Thomas');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test autotracking should work with initializers`](assert) {\n var _class3, _descriptor2, _descriptor3;\n\n var Tracked = (_class3 = class Tracked {\n constructor() {\n _initializerDefineProperty(this, \"first\", _descriptor2, this);\n\n _initializerDefineProperty(this, \"second\", _descriptor3, this);\n }\n\n }, (_descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"first\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return `first: ${this.second}`;\n }\n }), _descriptor3 = _applyDecoratedDescriptor(_class3.prototype, \"second\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'second';\n }\n })), _class3);\n var obj = new Tracked();\n var tag = (0, _validator.track)(() => obj.first);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal(obj.first, 'first: second', 'The value initializes correctly');\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.second = '2nd'; // See: https://github.com/glimmerjs/glimmer-vm/pull/1018\n // assert.equal(validate(tag, snapshot), true);\n\n assert.equal(obj.first, 'first: second', 'The value stays the same once initialized');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.first = 'FIRST!!!';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false);\n assert.equal(obj.first, 'FIRST!!!');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test autotracking should work with native getters`](assert) {\n var _class5, _descriptor4, _descriptor5;\n\n var Tracked = (_class5 = class Tracked {\n constructor(first, last) {\n _initializerDefineProperty(this, \"first\", _descriptor4, this);\n\n _initializerDefineProperty(this, \"last\", _descriptor5, this);\n\n this.first = first;\n this.last = last;\n }\n\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n }, (_descriptor4 = _applyDecoratedDescriptor(_class5.prototype, \"first\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n }), _descriptor5 = _applyDecoratedDescriptor(_class5.prototype, \"last\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n })), _class5);\n var obj = new Tracked('Tom', 'Dale');\n var tag = (0, _validator.track)(() => obj.full);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal(obj.full, 'Tom Dale', 'The full name starts correct');\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.first = 'Thomas';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false);\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test autotracking should work with native setters`](assert) {\n var _class7, _descriptor6, _descriptor7;\n\n var Tracked = (_class7 = class Tracked {\n constructor(first, last) {\n _initializerDefineProperty(this, \"first\", _descriptor6, this);\n\n _initializerDefineProperty(this, \"last\", _descriptor7, this);\n\n this.first = first;\n this.last = last;\n }\n\n get full() {\n return `${this.first} ${this.last}`;\n }\n\n set full(value) {\n var [first, last] = value.split(' ');\n this.first = first;\n this.last = last;\n }\n\n }, (_descriptor6 = _applyDecoratedDescriptor(_class7.prototype, \"first\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n }), _descriptor7 = _applyDecoratedDescriptor(_class7.prototype, \"last\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n })), _class7);\n var obj = new Tracked('Tom', 'Dale');\n var tag = (0, _validator.track)(() => obj.full);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal(obj.full, 'Tom Dale', 'The full name starts correct');\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n obj.full = 'Melanie Sumner';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false);\n assert.equal(obj.full, 'Melanie Sumner');\n assert.equal(obj.first, 'Melanie');\n assert.equal(obj.last, 'Sumner');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test interaction with Ember object model (tracked property depending on Ember property)`](assert) {\n class Tracked {\n constructor(name) {\n this.name = name;\n }\n\n get full() {\n return `${(0, _metal.get)(this, 'name.first')} ${(0, _metal.get)(this, 'name.last')}`;\n }\n\n }\n\n var tom = {\n first: 'Tom',\n last: 'Dale'\n };\n var obj = new Tracked(tom);\n var tag = (0, _validator.track)(() => obj.full);\n assert.equal(obj.full, 'Tom Dale');\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with Ember set');\n assert.equal(obj.full, 'Thomas Dale');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n (0, _metal.set)(obj, 'name', {\n first: 'Ricardo',\n last: 'Mendes'\n });\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with Ember set');\n assert.equal(obj.full, 'Ricardo Mendes');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n [`@test interaction with Ember object model (Ember computed property depending on tracked property)`](assert) {\n var _class9, _descriptor8, _descriptor9;\n\n class EmberObject {\n constructor(name) {\n this.name = name;\n }\n\n }\n\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('name.first', 'name.last', function () {\n var name = (0, _metal.get)(this, 'name');\n return `${name.first} ${name.last}`;\n }));\n var Name = (_class9 = class Name {\n constructor(first, last) {\n _initializerDefineProperty(this, \"first\", _descriptor8, this);\n\n _initializerDefineProperty(this, \"last\", _descriptor9, this);\n\n this.first = first;\n this.last = last;\n }\n\n }, (_descriptor8 = _applyDecoratedDescriptor(_class9.prototype, \"first\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _descriptor9 = _applyDecoratedDescriptor(_class9.prototype, \"last\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n })), _class9);\n var tom = new Name('Tom', 'Dale');\n var obj = new EmberObject(tom);\n var tag = (0, _metal.tagForProperty)(obj, 'full');\n var full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n tom.first = 'Thomas';\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with tracked properties');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n }\n\n ['@test interaction with the Ember object model (paths going through tracked properties)'](assert) {\n var _class11, _descriptor10;\n\n var self;\n\n class EmberObject {\n constructor(contact) {\n this.contact = void 0;\n this.contact = contact;\n self = this;\n }\n\n }\n\n (0, _metal.defineProperty)(EmberObject.prototype, 'full', (0, _metal.computed)('contact.name.first', 'contact.name.last', function () {\n var contact = (0, _metal.get)(self, 'contact');\n return `${(0, _metal.get)(contact.name, 'first')} ${(0, _metal.get)(contact.name, 'last')}`;\n }));\n var Contact = (_class11 = class Contact {\n constructor(name) {\n _initializerDefineProperty(this, \"name\", _descriptor10, this);\n\n this.name = name;\n }\n\n }, _descriptor10 = _applyDecoratedDescriptor(_class11.prototype, \"name\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return undefined;\n }\n }), _class11);\n\n class EmberName {\n constructor(first, last) {\n this.first = void 0;\n this.last = void 0;\n this.first = first;\n this.last = last;\n }\n\n }\n\n var tom = new EmberName('Tom', 'Dale');\n var contact = new Contact(tom);\n var obj = new EmberObject(contact);\n var tag = (0, _metal.tagForProperty)(obj, 'full');\n var full = (0, _metal.get)(obj, 'full');\n assert.equal(full, 'Tom Dale');\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n (0, _metal.set)(tom, 'first', 'Thomas');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Thomas Dale');\n snapshot = (0, _validator.valueForTag)(tag);\n tom = contact.name = new EmberName('T', 'Dale');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'T Dale');\n snapshot = (0, _validator.valueForTag)(tag);\n (0, _metal.set)(tom, 'first', 'Tizzle');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after setting with Ember.set');\n assert.equal((0, _metal.get)(obj, 'full'), 'Tizzle Dale');\n }\n\n ['@test ember get interaction with arrays'](assert) {\n class EmberObject {\n constructor() {\n this.array = [];\n }\n\n }\n\n var obj = new EmberObject();\n var array;\n var tag = (0, _validator.track)(() => array = (0, _metal.get)(obj, 'array'));\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.deepEqual(array, []);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n array.push(1);\n (0, _metal.notifyPropertyChange)(array, '[]');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after pushing an object and notifying on the array');\n }\n\n ['@test native get interaction with arrays'](assert) {\n var _class13, _descriptor11;\n\n var EmberObject = (_class13 = class EmberObject {\n constructor() {\n _initializerDefineProperty(this, \"array\", _descriptor11, this);\n }\n\n }, _descriptor11 = _applyDecoratedDescriptor(_class13.prototype, \"array\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return [];\n }\n }), _class13);\n var obj = new EmberObject();\n var array;\n var tag = (0, _validator.track)(() => array = obj.array);\n var snapshot = (0, _validator.valueForTag)(tag);\n assert.deepEqual(array, []);\n assert.equal((0, _validator.validateTag)(tag, snapshot), true);\n array.push(1);\n (0, _metal.notifyPropertyChange)(array, '[]');\n assert.equal((0, _validator.validateTag)(tag, snapshot), false, 'invalid after pushing an object and notifying on the array');\n }\n\n ['@test gives helpful assertion when a tracked property is mutated after access in with an autotracking transaction']() {\n var _class15, _descriptor12;\n\n var EmberObject = (_class15 = class EmberObject {\n constructor() {\n _initializerDefineProperty(this, \"value\", _descriptor12, this);\n }\n\n }, _descriptor12 = _applyDecoratedDescriptor(_class15.prototype, \"value\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class15);\n var obj = new EmberObject();\n expectAssertion(() => {\n (0, _validator.track)(() => {\n obj.value;\n obj.value = 123;\n });\n }, /You attempted to update `value` on `EmberObject`, but it had already been used previously in the same computation/);\n }\n\n ['@test gives helpful deprecation when a tracked property is mutated after access within unknownProperty within an autotracking transaction']() {\n var _class17, _descriptor13;\n\n var EmberObject = (_class17 = class EmberObject {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor13, this);\n }\n\n unknownProperty() {\n this.foo;\n this.foo = 123;\n }\n\n }, _descriptor13 = _applyDecoratedDescriptor(_class17.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class17);\n var obj = new EmberObject();\n expectDeprecation(() => {\n (0, _validator.track)(() => {\n (0, _metal.get)(obj, 'bar');\n });\n }, /You attempted to update `foo` on `EmberObject`, but it had already been used previously in the same computation/);\n }\n\n ['@test get() does not entangle in the autotracking stack until after retrieving the value'](assert) {\n assert.expect(0);\n\n class EmberObject {\n get foo() {\n (0, _metal.notifyPropertyChange)(this, 'foo');\n return 123;\n }\n\n }\n\n var obj = new EmberObject();\n (0, _validator.track)(() => {\n (0, _metal.get)(obj, 'foo');\n });\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/ext/controller_test\", [\"@ember/-internals/owner\", \"@ember/controller\", \"internal-test-helpers\"], function (_owner, _controller, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/routing/ext/controller', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test transitionToRoute considers an engine's mountPoint\"](assert) {\n var router = {\n transitionTo(route) {\n return route;\n }\n\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n var controller = _controller.default.create({\n target: router\n });\n\n (0, _owner.setOwner)(controller, engineInstance);\n expectDeprecation(() => {\n assert.strictEqual(controller.transitionToRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n }, /Calling transitionToRoute on a controller is deprecated/);\n expectDeprecation(() => {\n assert.strictEqual(controller.transitionToRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n }, /Calling transitionToRoute on a controller is deprecated/);\n expectDeprecation(() => {\n assert.throws(() => controller.transitionToRoute('/posts'), 'throws when trying to use a url');\n }, /Calling transitionToRoute on a controller is deprecated/);\n var queryParams = {};\n expectDeprecation(() => {\n assert.strictEqual(controller.transitionToRoute(queryParams), queryParams, 'passes query param only transitions through');\n }, /Calling transitionToRoute on a controller is deprecated/);\n }\n\n [\"@test replaceRoute considers an engine's mountPoint\"](assert) {\n var router = {\n replaceWith(route) {\n return route;\n }\n\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n var controller = _controller.default.create({\n target: router\n });\n\n (0, _owner.setOwner)(controller, engineInstance);\n expectDeprecation(() => {\n assert.strictEqual(controller.replaceRoute('application'), 'foo.bar.application', 'properly prefixes application route');\n }, /Calling replaceRoute on a controller is deprecated/);\n expectDeprecation(() => {\n assert.strictEqual(controller.replaceRoute('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n }, /Calling replaceRoute on a controller is deprecated/);\n expectDeprecation(() => {\n assert.throws(() => controller.replaceRoute('/posts'), 'throws when trying to use a url');\n }, /Calling replaceRoute on a controller is deprecated/);\n var queryParams = {};\n expectDeprecation(() => {\n assert.strictEqual(controller.replaceRoute(queryParams), queryParams, 'passes query param only transitions through');\n }, /Calling replaceRoute on a controller is deprecated/);\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/location/auto_location_test\", [\"@ember/-internals/browser-environment\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@glimmer/owner\", \"@ember/-internals/routing/lib/location/auto_location\", \"@ember/-internals/routing/lib/location/history_location\", \"@ember/-internals/routing/lib/location/hash_location\", \"@ember/-internals/routing/lib/location/none_location\", \"internal-test-helpers\"], function (_browserEnvironment, _runloop, _metal, _owner, _auto_location, _history_location, _hash_location, _none_location, _internalTestHelpers) {\n \"use strict\";\n\n function mockBrowserLocation(overrides, assert) {\n return Object.assign({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n\n }, overrides);\n }\n\n function mockBrowserHistory(overrides, assert) {\n return Object.assign({\n pushState() {\n assert.ok(false, 'history.pushState should not be called during testing');\n },\n\n replaceState() {\n assert.ok(false, 'history.replaceState should not be called during testing');\n }\n\n }, overrides);\n }\n\n function createLocation(location, history) {\n owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('location:history', _history_location.default);\n owner.register('location:hash', _hash_location.default);\n owner.register('location:none', _none_location.default);\n var props = {\n location: location,\n history: history,\n global: {}\n };\n (0, _owner.setOwner)(props, owner);\n\n var autolocation = _auto_location.default.create(props);\n\n return autolocation;\n }\n\n var location, owner;\n (0, _internalTestHelpers.moduleFor)('AutoLocation', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n if (owner) {\n (0, _runloop.run)(owner, 'destroy');\n owner = location = undefined;\n }\n }\n\n ['@test AutoLocation should have the `global`'](assert) {\n var location = _auto_location.default.create();\n\n assert.ok(location.global, 'has a global defined');\n assert.strictEqual(location.global, _browserEnvironment.window, 'has the environments window global');\n }\n\n [\"@test AutoLocation should return concrete implementation's value for `getURL`\"](assert) {\n var browserLocation = mockBrowserLocation({}, assert);\n var browserHistory = mockBrowserHistory({}, assert);\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n var concreteImplementation = (0, _metal.get)(location, 'concreteImplementation');\n\n concreteImplementation.getURL = function () {\n return '/lincoln/park';\n };\n\n assert.equal(location.getURL(), '/lincoln/park');\n }\n\n ['@test AutoLocation should use a HistoryLocation instance when pushStates is supported'](assert) {\n var browserLocation = mockBrowserLocation({}, assert);\n var browserHistory = mockBrowserHistory({}, assert);\n location = createLocation(browserLocation, browserHistory);\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _history_location.default);\n }\n\n ['@test AutoLocation should use a HashLocation instance when pushStates are not supported, but hashchange events are and the URL is already in the HashLocation format'](assert) {\n var browserLocation = mockBrowserLocation({\n hash: '#/testd'\n }, assert);\n location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n\n };\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _hash_location.default);\n }\n\n ['@test AutoLocation should use a NoneLocation instance when neither history nor hashchange are supported.'](assert) {\n location = createLocation(mockBrowserLocation({}, assert));\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _none_location.default);\n }\n\n [\"@test AutoLocation should use an index path (i.e. '/') without any location.hash as OK for HashLocation\"](assert) {\n var browserLocation = mockBrowserLocation({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n\n replace() {\n assert.ok(false, 'location.replace should not be called');\n }\n\n }, assert);\n location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n\n };\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _hash_location.default, 'uses a HashLocation');\n }\n\n ['@test AutoLocation should transform the URL for hashchange-only browsers viewing a HistoryLocation-formatted path'](assert) {\n assert.expect(3);\n var browserLocation = mockBrowserLocation({\n hash: '',\n hostname: 'test.com',\n href: 'http://test.com/test',\n pathname: '/test',\n protocol: 'http:',\n port: '',\n search: '',\n\n replace(path) {\n assert.equal(path, 'http://test.com/#/test', 'location.replace should be called with normalized HashLocation path');\n }\n\n }, assert);\n var location = createLocation(browserLocation);\n location.global = {\n onhashchange() {}\n\n };\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation') instanceof _none_location.default, 'NoneLocation should be used while we attempt to location.replace()');\n assert.equal((0, _metal.get)(location, 'cancelRouterSetup'), true, 'cancelRouterSetup should be set so the router knows.');\n }\n\n ['@test AutoLocation should replace the URL for pushState-supported browsers viewing a HashLocation-formatted url'](assert) {\n assert.expect(2);\n var browserLocation = mockBrowserLocation({\n hash: '#/test',\n hostname: 'test.com',\n href: 'http://test.com/#/test',\n pathname: '/',\n protocol: 'http:',\n port: '',\n search: ''\n }, assert);\n var browserHistory = mockBrowserHistory({\n replaceState(state, title, path) {\n assert.equal(path, '/test', 'history.replaceState should be called with normalized HistoryLocation url');\n }\n\n }, assert);\n var location = createLocation(browserLocation, browserHistory);\n location.detect();\n assert.ok((0, _metal.get)(location, 'concreteImplementation'), _history_location.default);\n }\n\n ['@test AutoLocation requires any rootURL given to end in a trailing forward slash'](assert) {\n var browserLocation = mockBrowserLocation({}, assert);\n var expectedMsg = /rootURL must end with a trailing forward slash e.g. \"\\/app\\/\"/;\n location = createLocation(browserLocation);\n location.rootURL = 'app';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n location.rootURL = '/app';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg); // Note the trailing whitespace\n\n location.rootURL = '/app/ ';\n expectAssertion(function () {\n location.detect();\n }, expectedMsg);\n }\n\n ['@test AutoLocation provides its rootURL to the concreteImplementation'](assert) {\n var browserLocation = mockBrowserLocation({\n pathname: '/some/subdir/derp'\n }, assert);\n var browserHistory = mockBrowserHistory({}, assert);\n location = createLocation(browserLocation, browserHistory);\n location.rootURL = '/some/subdir/';\n location.detect();\n var concreteLocation = (0, _metal.get)(location, 'concreteImplementation');\n assert.equal(location.rootURL, concreteLocation.rootURL);\n }\n\n ['@test getHistoryPath() should return a normalized, HistoryLocation-supported path'](assert) {\n var browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/about?foo=bar#foo',\n pathname: '/app/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n assert.equal((0, _auto_location.getHistoryPath)('/app/', browserLocation), '/app/about?foo=bar#foo', 'URLs already in HistoryLocation form should come out the same');\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#/about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#/about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHistoryPath)('/app/', browserLocation), '/app/about?foo=bar#foo', 'HashLocation formed URLs should be normalized');\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHistoryPath)('/app', browserLocation), '/app/#about?foo=bar#foo', \"URLs with a hash not following #/ convention shouldn't be normalized as a route\");\n }\n\n ['@test getHashPath() should return a normalized, HashLocation-supported path'](assert) {\n var browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#/about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#/about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/about?foo=bar#foo', 'URLs already in HistoryLocation form should come out the same');\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/about?foo=bar#foo',\n pathname: '/app/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/about?foo=bar#foo', 'HistoryLocation formed URLs should be normalized');\n browserLocation = mockBrowserLocation({\n href: 'http://test.com/app/#about?foo=bar#foo',\n pathname: '/app/',\n search: '',\n hash: '#about?foo=bar#foo'\n }, assert);\n assert.equal((0, _auto_location.getHashPath)('/app/', browserLocation), '/app/#/#about?foo=bar#foo', \"URLs with a hash not following #/ convention shouldn't be normalized as a route\");\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/location/hash_location_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/routing/lib/location/hash_location\", \"internal-test-helpers\"], function (_runloop, _metal, _hash_location, _internalTestHelpers) {\n \"use strict\";\n\n var location;\n\n function createLocation(options, assert) {\n var HashTestLocation = _hash_location.default.extend({\n _location: {\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n\n }\n });\n\n if (!options) {\n options = {};\n }\n\n location = HashTestLocation.create(options);\n }\n\n function mockBrowserLocation(path) {\n // This is a neat trick to auto-magically extract the hostname from any\n // url by letting the browser do the work ;)\n var tmp = document.createElement('a');\n tmp.href = path;\n var protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n var pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n return {\n hash: tmp.hash,\n host: tmp.host || 'localhost',\n hostname: tmp.hostname || 'localhost',\n href: tmp.href,\n pathname: pathname,\n port: tmp.port || '',\n protocol: protocol,\n search: tmp.search\n };\n }\n\n function triggerHashchange() {\n var event = document.createEvent('HTMLEvents');\n event.initEvent('hashchange', true, false);\n window.dispatchEvent(event);\n }\n\n (0, _internalTestHelpers.moduleFor)('HashLocation', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _runloop.run)(function () {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test HashLocation.getURL() returns the current url'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#/foo/bar')\n }, assert);\n assert.equal(location.getURL(), '/foo/bar');\n }\n\n ['@test HashLocation.getURL() includes extra hashes'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#/foo#bar#car')\n }, assert);\n assert.equal(location.getURL(), '/foo#bar#car');\n }\n\n ['@test HashLocation.getURL() assumes location.hash without #/ prefix is not a route path'](assert) {\n createLocation({\n _location: mockBrowserLocation('/#foo#bar')\n }, assert);\n assert.equal(location.getURL(), '/#foo#bar');\n }\n\n ['@test HashLocation.getURL() returns a normal forward slash when there is no location.hash'](assert) {\n createLocation({\n _location: mockBrowserLocation('/')\n }, assert);\n assert.equal(location.getURL(), '/');\n }\n\n ['@test HashLocation.setURL() correctly sets the url'](assert) {\n createLocation({}, assert);\n location.setURL('/bar');\n assert.equal((0, _metal.get)(location, 'location.hash'), '/bar');\n assert.equal((0, _metal.get)(location, 'lastSetURL'), '/bar');\n }\n\n ['@test HashLocation.replaceURL() correctly replaces to the path with a page reload'](assert) {\n assert.expect(2);\n createLocation({\n _location: {\n replace(path) {\n assert.equal(path, '#/foo');\n }\n\n }\n }, assert);\n location.replaceURL('/foo');\n assert.equal((0, _metal.get)(location, 'lastSetURL'), '/foo');\n }\n\n ['@test HashLocation.onUpdateURL callback executes as expected'](assert) {\n assert.expect(1);\n createLocation({\n _location: mockBrowserLocation('/#/foo/bar')\n }, assert);\n\n var callback = function (param) {\n assert.equal(param, '/foo/bar', 'path is passed as param');\n };\n\n location.onUpdateURL(callback);\n triggerHashchange();\n }\n\n [\"@test HashLocation.onUpdateURL doesn't execute callback if lastSetURL === path\"](assert) {\n assert.expect(0);\n createLocation({\n _location: {\n hash: '#/foo/bar'\n },\n lastSetURL: '/foo/bar'\n }, assert);\n\n var callback = function () {\n assert.ok(false, 'callback should not be called');\n };\n\n location.onUpdateURL(callback);\n triggerHashchange();\n }\n\n ['@test HashLocation.formatURL() prepends a # to the provided string'](assert) {\n createLocation({}, assert);\n assert.equal(location.formatURL('/foo#bar'), '#/foo#bar');\n }\n\n ['@test HashLocation.willDestroy() cleans up hashchange event listener'](assert) {\n assert.expect(1);\n createLocation({}, assert);\n\n var callback = function () {\n assert.ok(true, 'should invoke callback once');\n };\n\n location.onUpdateURL(callback);\n triggerHashchange();\n (0, _runloop.run)(location, 'destroy');\n location = null;\n triggerHashchange();\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/location/history_location_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/routing/lib/location/history_location\", \"internal-test-helpers\"], function (_runloop, _metal, _history_location, _internalTestHelpers) {\n \"use strict\";\n\n var FakeHistory, HistoryTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\n }\n\n location = HistoryTestLocation.create(options);\n }\n\n function mockBrowserLocation(path) {\n // This is a neat trick to auto-magically extract the hostname from any\n // url by letting the browser do the work ;)\n var tmp = document.createElement('a');\n tmp.href = path;\n var protocol = !tmp.protocol || tmp.protocol === ':' ? 'http' : tmp.protocol;\n var pathname = tmp.pathname.match(/^\\//) ? tmp.pathname : '/' + tmp.pathname;\n return {\n hash: tmp.hash,\n host: tmp.host || 'localhost',\n hostname: tmp.hostname || 'localhost',\n href: tmp.href,\n pathname: pathname,\n port: tmp.port || '',\n protocol: protocol,\n search: tmp.search\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('HistoryLocation', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n FakeHistory = {\n state: null,\n _states: [],\n\n replaceState(state) {\n this.state = state;\n this._states[0] = state;\n },\n\n pushState(state) {\n this.state = state;\n\n this._states.unshift(state);\n }\n\n };\n HistoryTestLocation = _history_location.default.extend({\n history: FakeHistory\n });\n }\n\n teardown() {\n (0, _runloop.run)(() => {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test HistoryLocation initState does not get fired on init'](assert) {\n assert.expect(1);\n HistoryTestLocation.reopen({\n init() {\n assert.ok(true, 'init was called');\n\n this._super(...arguments);\n },\n\n initState() {\n assert.ok(false, 'initState() should not be called automatically');\n }\n\n });\n createLocation();\n }\n\n [\"@test webkit doesn't fire popstate on page load\"](assert) {\n assert.expect(1);\n HistoryTestLocation.reopen({\n initState() {\n this._super(...arguments); // these two should be equal to be able\n // to successfully detect webkit initial popstate\n\n\n assert.equal(this._previousURL, this.getURL());\n }\n\n });\n createLocation();\n location.initState();\n }\n\n ['@test with href sets `baseURL`'](assert) {\n assert.expect(1);\n var base = document.createElement('base');\n base.setAttribute('href', '/foo/');\n document.head.appendChild(base);\n\n try {\n createLocation();\n location.initState();\n assert.strictEqual(location.get('baseURL'), '/foo/');\n } finally {\n document.head.removeChild(base);\n }\n }\n\n ['@test without href is ignored'](assert) {\n assert.expect(1);\n var base = document.createElement('base');\n base.setAttribute('target', '_parent');\n document.head.appendChild(base);\n\n try {\n createLocation();\n location.initState();\n assert.strictEqual(location.get('baseURL'), '');\n } finally {\n document.head.removeChild(base);\n }\n }\n\n ['@test base URL is removed when retrieving the current pathname'](assert) {\n assert.expect(1);\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'baseURL', '/base/');\n },\n\n initState() {\n this._super(...arguments);\n\n assert.equal(this.getURL(), '/foo/bar');\n }\n\n });\n createLocation();\n location.initState();\n }\n\n ['@test base URL is preserved when moving around'](assert) {\n assert.expect(2);\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'baseURL', '/base/');\n }\n\n });\n createLocation();\n location.initState();\n location.setURL('/one/two');\n assert.equal(location.history.state.path, '/base/one/two');\n assert.ok(location.history.state.uuid);\n }\n\n ['@test setURL continues to set even with a null state (iframes may set this)'](assert) {\n createLocation();\n location.initState();\n FakeHistory.pushState(null);\n location.setURL('/three/four');\n assert.equal(location.history.state.path, '/three/four');\n assert.ok(location.history.state.uuid);\n }\n\n ['@test replaceURL continues to set even with a null state (iframes may set this)'](assert) {\n createLocation();\n location.initState();\n FakeHistory.pushState(null);\n location.replaceURL('/three/four');\n assert.equal(location.history.state.path, '/three/four');\n assert.ok(location.history.state.uuid);\n }\n\n ['@test HistoryLocation.getURL() returns the current url, excluding both rootURL and baseURL'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/base/foo/bar'));\n (0, _metal.set)(this, 'rootURL', '/app/');\n (0, _metal.set)(this, 'baseURL', '/base/');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar');\n }\n\n ['@test HistoryLocation.getURL() returns the current url, does not remove rootURL if its not at start of url'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar/baz'));\n (0, _metal.set)(this, 'rootURL', '/bar/');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test HistoryLocation.getURL() will not remove the rootURL when only a partial match'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'rootURL', '/bar/');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/bars/baz');\n }\n\n ['@test HistoryLocation.getURL() returns the current url, does not remove baseURL if its not at start of url'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar/baz'));\n (0, _metal.set)(this, 'baseURL', '/bar/');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test HistoryLocation.getURL() will not remove the baseURL when only a partial match'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/bars/baz'));\n (0, _metal.set)(this, 'baseURL', '/bar/');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/bars/baz');\n }\n\n ['@test HistoryLocation.getURL() includes location.search'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin'));\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar?time=morphin');\n }\n\n ['@test HistoryLocation.getURL() includes location.hash'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar#pink-power-ranger'));\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar#pink-power-ranger');\n }\n\n ['@test HistoryLocation.getURL() includes location.hash and location.search'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/foo/bar?time=morphin#pink-power-ranger'));\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar?time=morphin#pink-power-ranger');\n }\n\n ['@test HistoryLocation.getURL() drops duplicate slashes'](assert) {\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n var location = mockBrowserLocation('//admin//profile//');\n location.pathname = '//admin//profile//'; // mockBrowserLocation does not allow for `//`, so force it\n\n (0, _metal.set)(this, 'location', location);\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/admin/profile/');\n }\n\n ['@test Existing state is preserved on init'](assert) {\n var existingState = {\n path: '/route/path',\n uuid: 'abcd'\n };\n FakeHistory.state = existingState;\n HistoryTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'location', mockBrowserLocation('/route/path'));\n }\n\n });\n createLocation();\n location.initState();\n assert.deepEqual(location.history.state, existingState);\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/location/none_location_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/routing/lib/location/none_location\", \"internal-test-helpers\"], function (_runloop, _metal, _none_location, _internalTestHelpers) {\n \"use strict\";\n\n var NoneTestLocation, location;\n\n function createLocation(options) {\n if (!options) {\n options = {};\n }\n\n location = NoneTestLocation.create(options);\n }\n\n (0, _internalTestHelpers.moduleFor)('NoneLocation', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n NoneTestLocation = _none_location.default.extend({});\n }\n\n teardown() {\n (0, _runloop.run)(() => {\n if (location) {\n location.destroy();\n }\n });\n }\n\n ['@test NoneLocation.formatURL() returns the current url always appending rootURL'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'rootURL', '/en/');\n }\n\n });\n createLocation();\n assert.equal(location.formatURL('/foo/bar'), '/en/foo/bar');\n }\n\n ['@test NoneLocation.getURL() returns the current path minus rootURL'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'rootURL', '/foo/');\n (0, _metal.set)(this, 'path', '/foo/bar');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/bar');\n }\n\n ['@test NoneLocation.getURL() will remove the rootURL only from the beginning of a url'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/foo/bar/baz');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/foo/bar/baz');\n }\n\n ['@test NoneLocation.getURL() will not remove the rootURL when only a partial match'](assert) {\n NoneTestLocation.reopen({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'rootURL', '/bar/');\n (0, _metal.set)(this, 'path', '/bars/baz');\n }\n\n });\n createLocation();\n assert.equal(location.getURL(), '/bars/baz');\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/location/util_test\", [\"@ember/-internals/routing/lib/location/util\", \"internal-test-helpers\"], function (_util, _internalTestHelpers) {\n \"use strict\";\n\n function mockBrowserLocation(overrides, assert) {\n return Object.assign({\n href: 'http://test.com/',\n pathname: '/',\n hash: '',\n search: '',\n\n replace() {\n assert.ok(false, 'location.replace should not be called during testing');\n }\n\n }, overrides);\n }\n\n (0, _internalTestHelpers.moduleFor)('Location Utilities', class extends _internalTestHelpers.AbstractTestCase {\n ['@test replacePath cannot be used to redirect to a different origin'](assert) {\n assert.expect(1);\n var expectedURL;\n var location = {\n protocol: 'http:',\n hostname: 'emberjs.com',\n port: '1337',\n\n replace(url) {\n assert.equal(url, expectedURL);\n }\n\n };\n expectedURL = 'http://emberjs.com:1337//google.com';\n (0, _util.replacePath)(location, '//google.com');\n }\n\n ['@test getPath() should normalize location.pathname, making sure it always returns a leading slash'](assert) {\n var location = mockBrowserLocation({\n pathname: 'test'\n }, assert);\n assert.equal((0, _util.getPath)(location), '/test', 'When there is no leading slash, one is added.');\n location = mockBrowserLocation({\n pathname: '/test'\n }, assert);\n assert.equal((0, _util.getPath)(location), '/test', \"When a leading slash is already there, it isn't added again\");\n }\n\n ['@test getQuery() should return location.search as-is'](assert) {\n var location = mockBrowserLocation({\n search: '?foo=bar'\n }, assert);\n assert.equal((0, _util.getQuery)(location), '?foo=bar');\n }\n\n ['@test getFullPath() should return full pathname including query and hash'](assert) {\n var location = mockBrowserLocation({\n href: 'http://test.com/about?foo=bar#foo',\n pathname: '/about',\n search: '?foo=bar',\n hash: '#foo'\n }, assert);\n assert.equal((0, _util.getFullPath)(location), '/about?foo=bar#foo');\n }\n\n ['@test Feature-Detecting onhashchange'](assert) {\n assert.equal((0, _util.supportsHashChange)(undefined, {\n onhashchange() {}\n\n }), true, 'When not in IE, use onhashchange existence as evidence of the feature');\n assert.equal((0, _util.supportsHashChange)(undefined, {}), false, 'When not in IE, use onhashchange absence as evidence of the feature absence');\n assert.equal((0, _util.supportsHashChange)(7, {\n onhashchange() {}\n\n }), false, 'When in IE7 compatibility mode, never report existence of the feature');\n assert.equal((0, _util.supportsHashChange)(8, {\n onhashchange() {}\n\n }), true, 'When in IE8+, use onhashchange existence as evidence of the feature');\n }\n\n ['@test Feature-detecting the history API'](assert) {\n assert.equal((0, _util.supportsHistory)('', {\n pushState: true\n }), true, 'returns true if not Android Gingerbread and history.pushState exists');\n assert.equal((0, _util.supportsHistory)('', {}), false, \"returns false if history.pushState doesn't exist\");\n assert.equal((0, _util.supportsHistory)('', undefined), false, \"returns false if history doesn't exist\");\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', {\n pushState: true\n }), false, 'returns false if Android 2.x stock browser (not Chrome) claiming to support pushState');\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 4.0.3; nl-nl; GT-N7000 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', {\n pushState: true\n }), false, 'returns false for Android 4.0.x stock browser (not Chrome) claiming to support pushState');\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; U; Android 20.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1', {\n pushState: true\n }), true, 'returns true if Android version begins with 2, but is greater than 2');\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19', {\n pushState: true\n }), true, 'returns true for Chrome (not stock browser) on Android 4.0.x'); // Windows Phone UA and History API: https://github.com/Modernizr/Modernizr/issues/1471\n\n assert.equal((0, _util.supportsHistory)('Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537', {\n pushState: true\n }), true, 'returns true for Windows Phone 8.1 with misleading user agent string');\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/system/cache_test\", [\"@ember/-internals/routing/lib/system/cache\", \"internal-test-helpers\"], function (_cache, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('BucketCache', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.cache = new _cache.default();\n }\n\n ['@test has - returns false when bucket is not in cache'](assert) {\n assert.strictEqual(this.cache.has('foo'), false);\n assert.strictEqual(this.cache.has('constructor'), false);\n }\n\n ['@test has - returns true when bucket is in cache'](assert) {\n var token = {};\n this.cache.stash('foo', 'bar', token);\n this.cache.stash('constructor', 'bar', token);\n assert.strictEqual(this.cache.has('foo'), true);\n assert.strictEqual(this.cache.has('constructor'), true);\n }\n\n ['@test lookup - returns stashed value if key does exist in bucket'](assert) {\n var token = {};\n var defaultValue = {};\n this.cache.stash('foo', 'bar', token);\n assert.strictEqual(this.cache.lookup('foo', 'bar', defaultValue), token);\n }\n\n ['@test lookup - returns default value if key does not exist in bucket'](assert) {\n var token = {};\n var defaultValue = {};\n this.cache.stash('foo', 'bar', token);\n assert.strictEqual(this.cache.lookup('foo', 'boo', defaultValue), defaultValue);\n assert.strictEqual(this.cache.lookup('foo', 'constructor', defaultValue), defaultValue);\n }\n\n ['@test lookup - returns default value if bucket does not exist'](assert) {\n var defaultValue = {};\n assert.strictEqual(this.cache.lookup('boo', 'bar', defaultValue), defaultValue);\n assert.strictEqual(this.cache.lookup('constructor', 'bar', defaultValue), defaultValue);\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/system/controller_for_test\", [\"@ember/controller\", \"@ember/-internals/routing/lib/system/controller_for\", \"@ember/-internals/routing/lib/system/generate_controller\", \"internal-test-helpers\", \"@ember/debug\"], function (_controller, _controller_for, _generate_controller, _internalTestHelpers, _debug) {\n \"use strict\";\n\n var originalDebug = (0, _debug.getDebugFunction)('debug');\n\n var noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('controllerFor', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test controllerFor should lookup for registered controllers'](assert) {\n this.add('controller:app', _controller.default.extend());\n return this.visit('/').then(() => {\n var appInstance = this.applicationInstance;\n var appController = appInstance.lookup('controller:app');\n var controller = (0, _controller_for.default)(appInstance, 'app');\n assert.equal(appController, controller, 'should find app controller');\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('generateController', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n ['@test generateController should return Controller'](assert) {\n return this.visit('/').then(() => {\n var controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n assert.ok(controller instanceof _controller.default, 'should return controller');\n });\n }\n\n ['@test generateController should return controller:basic if resolved'](assert) {\n var BasicController = _controller.default.extend();\n\n this.add('controller:basic', BasicController);\n return this.visit('/').then(() => {\n var controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n assert.ok(controller instanceof BasicController, 'should return controller');\n });\n }\n\n ['@test generateController should return controller:basic if registered'](assert) {\n var BasicController = _controller.default.extend();\n\n this.application.register('controller:basic', BasicController);\n return this.visit('/').then(() => {\n var controller = (0, _generate_controller.default)(this.applicationInstance, 'home');\n assert.ok(controller instanceof BasicController, 'should return base class of controller');\n });\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/system/dsl_test\", [\"@ember/-internals/routing/lib/system/router\", \"internal-test-helpers\"], function (_router, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.Router = class extends _router.default {};\n this.routerInstance = new this.Router((0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true\n }\n }));\n }\n\n teardown() {\n this.Router = null;\n this.routerInstance = null;\n }\n\n ['@test should fail when using a reserved route name'](assert) {\n var reservedNames = ['basic', 'application'];\n assert.expect(reservedNames.length);\n reservedNames.forEach(reservedName => {\n expectAssertion(() => {\n var Router = class extends this.Router {};\n Router.map(function () {\n this.route(reservedName);\n });\n\n new Router((0, _internalTestHelpers.buildOwner)())._initRouterJs();\n }, \"'\" + reservedName + \"' cannot be used as a route name.\");\n });\n }\n\n ['@test [GH#16642] better error when using a colon in a route name']() {\n expectAssertion(() => {\n this.Router.map(function () {\n this.route('resource/:id');\n });\n\n this.routerInstance._initRouterJs();\n }, \"'resource/:id' is not a valid route name. It cannot contain a ':'. You may want to use the 'path' option instead.\");\n }\n\n ['@test should retain resource namespace if nested with routes'](assert) {\n this.Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.route('blork');\n });\n });\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop.blork'], 'parent name was used as base of nested routes');\n }\n\n ['@test should add loading and error routes if _isRouterMapResult is true'](assert) {\n this.Router.map(function () {\n this.route('blork');\n });\n this.routerInstance.reopen({\n _hasModuleBasedResolver() {\n return true;\n }\n\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['blork'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blork_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blork_error'], 'error route was added');\n }\n\n ['@test should not add loading and error routes if _isRouterMapResult is false'](assert) {\n this.Router.map(function () {\n this.route('blork');\n });\n var router = this.routerInstance;\n\n router._initRouterJs(false);\n\n assert.ok(router._routerMicrolib.recognizer.names['blork'], 'main route was created');\n assert.ok(!router._routerMicrolib.recognizer.names['blork_loading'], 'loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['blork_error'], 'error route was not added');\n }\n\n ['@test should reset namespace of loading and error routes for routes with resetNamespace'](assert) {\n this.Router.map(function () {\n this.route('blork', function () {\n this.route('blorp');\n this.route('bleep', {\n resetNamespace: true\n });\n });\n });\n this.routerInstance.reopen({\n _hasModuleBasedResolver() {\n return true;\n }\n\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp'], 'nested route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp_loading'], 'nested loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blork.blorp_error'], 'nested error route was added');\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'reset route was created');\n assert.ok(router._routerMicrolib.recognizer.names['bleep_loading'], 'reset loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['bleep_error'], 'reset error route was added');\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep'], 'nested reset route was not created');\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep_loading'], 'nested reset loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['blork.bleep_error'], 'nested reset error route was not added');\n }\n\n ['@test should throw an error when defining a route serializer outside an engine'](assert) {\n this.Router.map(function () {\n assert.throws(() => {\n this.route('posts', {\n serialize: function () {}\n });\n }, /Defining a route serializer on route 'posts' outside an Engine is not allowed/);\n });\n\n this.routerInstance._initRouterJs();\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Ember Router DSL with engines', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.Router = class extends _router.default {};\n this.routerInstance = new this.Router((0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true\n }\n }));\n }\n\n teardown() {\n this.Router = null;\n this.routerInstance = null;\n }\n\n ['@test should allow mounting of engines'](assert) {\n assert.expect(3);\n this.Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat');\n });\n });\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.ok(router._routerMicrolib.recognizer.names['bleep'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop'], 'parent name was used as base of nested routes');\n assert.ok(router._routerMicrolib.recognizer.names['bleep.bloop.chat'], 'parent name was used as base of mounted engine');\n }\n\n ['@test should allow mounting of engines at a custom path'](assert) {\n assert.expect(1);\n this.Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', {\n path: 'custom-chat'\n });\n });\n });\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.deepEqual(router._routerMicrolib.recognizer.names['bleep.bloop.chat'].segments.slice(1, 4).map(s => s.value), ['bleep', 'bloop', 'custom-chat'], 'segments are properly associated with mounted engine');\n }\n\n ['@test should allow aliasing of engine names with `as`'](assert) {\n assert.expect(1);\n this.Router.map(function () {\n this.route('bleep', function () {\n this.route('bloop', function () {\n this.mount('chat', {\n as: 'blork'\n });\n });\n });\n });\n var router = this.routerInstance;\n\n router._initRouterJs();\n\n assert.deepEqual(router._routerMicrolib.recognizer.names['bleep.bloop.blork'].segments.slice(1, 4).map(s => s.value), ['bleep', 'bloop', 'blork'], 'segments are properly associated with mounted engine with aliased name');\n }\n\n ['@test should add loading and error routes to a mount if _isRouterMapResult is true'](assert) {\n this.Router.map(function () {\n this.mount('chat');\n });\n this.routerInstance.reopen({\n _hasModuleBasedResolver() {\n return true;\n }\n\n });\n\n this.routerInstance._initRouterJs();\n\n var router = this.routerInstance;\n assert.ok(router._routerMicrolib.recognizer.names['chat'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['chat_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['chat_error'], 'error route was added');\n }\n\n ['@test should add loading and error routes to a mount alias if _isRouterMapResult is true'](assert) {\n this.Router.map(function () {\n this.mount('chat', {\n as: 'shoutbox'\n });\n });\n this.routerInstance.reopen({\n _hasModuleBasedResolver() {\n return true;\n }\n\n });\n\n this.routerInstance._initRouterJs();\n\n var router = this.routerInstance;\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox'], 'main route was created');\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox_loading'], 'loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['shoutbox_error'], 'error route was added');\n }\n\n ['@test should not add loading and error routes to a mount if _isRouterMapResult is false'](assert) {\n this.Router.map(function () {\n this.mount('chat');\n });\n var router = this.routerInstance;\n\n router._initRouterJs(false);\n\n assert.ok(router._routerMicrolib.recognizer.names['chat'], 'main route was created');\n assert.ok(!router._routerMicrolib.recognizer.names['chat_loading'], 'loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['chat_error'], 'error route was not added');\n }\n\n ['@test should reset namespace of loading and error routes for mounts with resetNamespace'](assert) {\n this.Router.map(function () {\n this.route('news', function () {\n this.mount('chat');\n this.mount('blog', {\n resetNamespace: true\n });\n });\n });\n this.routerInstance.reopen({\n _hasModuleBasedResolver() {\n return true;\n }\n\n });\n\n this.routerInstance._initRouterJs();\n\n var router = this.routerInstance;\n assert.ok(router._routerMicrolib.recognizer.names['news.chat'], 'nested route was created');\n assert.ok(router._routerMicrolib.recognizer.names['news.chat_loading'], 'nested loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['news.chat_error'], 'nested error route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blog'], 'reset route was created');\n assert.ok(router._routerMicrolib.recognizer.names['blog_loading'], 'reset loading route was added');\n assert.ok(router._routerMicrolib.recognizer.names['blog_error'], 'reset error route was added');\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog'], 'nested reset route was not created');\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog_loading'], 'nested reset loading route was not added');\n assert.ok(!router._routerMicrolib.recognizer.names['news.blog_error'], 'nested reset error route was not added');\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/system/route_test\", [\"@ember/-internals/owner\", \"internal-test-helpers\", \"@ember/service\", \"@ember/-internals/runtime\", \"@ember/-internals/routing/lib/system/route\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object_proxy\"], function (_owner, _internalTestHelpers, _service, _runtime, _route, _metal, _object_proxy) {\n \"use strict\";\n\n var route, routeOne, routeTwo, lookupHash;\n (0, _internalTestHelpers.moduleFor)('Route', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n route = _route.default.create();\n }\n\n teardown() {\n super.teardown();\n (0, _internalTestHelpers.runDestroy)(route);\n route = routeOne = routeTwo = lookupHash = undefined;\n }\n\n ['@test default store utilizes the container to acquire the model factory'](assert) {\n assert.expect(4);\n\n var Post = _runtime.Object.extend();\n\n var post = {};\n Post.reopenClass({\n find() {\n return post;\n }\n\n });\n var ownerOptions = {\n ownerOptions: {\n hasRegistration() {\n return true;\n },\n\n factoryFor(fullName) {\n assert.equal(fullName, 'model:post', 'correct factory was looked up');\n return {\n class: Post,\n\n create() {\n return Post.create();\n }\n\n };\n }\n\n }\n };\n var owner = (0, _internalTestHelpers.buildOwner)(ownerOptions);\n (0, _owner.setOwner)(route, owner); // Override the computed property by redefining it\n\n (0, _metal.defineProperty)(route, '_qp', null, null);\n assert.equal(route.model({\n post_id: 1\n }), post);\n assert.equal(route.findModel('post', 1), post, '#findModel returns the correct post');\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test assert if 'store.find' method is not found\"]() {\n (0, _internalTestHelpers.runDestroy)(route);\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n var Post = _runtime.Object.extend();\n\n owner.register('route:index', _route.default);\n owner.register('model:post', Post);\n route = owner.lookup('route:index');\n expectAssertion(function () {\n route.findModel('post', 1);\n }, 'Post has no method `find`.');\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n ['@test asserts if model class is not found']() {\n (0, _internalTestHelpers.runDestroy)(route);\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('route:index', _route.default);\n route = owner.lookup('route:index');\n expectAssertion(function () {\n route.model({\n post_id: 1\n });\n }, /You used the dynamic segment post_id in your route undefined, but <.*:ember\\d+>.Post did not exist and you did not override your route's `model` hook./);\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test 'store' does not need to be injected\"](assert) {\n (0, _internalTestHelpers.runDestroy)(route);\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('route:index', _route.default);\n route = owner.lookup('route:index');\n ignoreAssertion(function () {\n route.model({\n post_id: 1\n });\n });\n assert.ok(true, 'no error was raised');\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the router\"](assert) {\n var owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n var foo = {\n name: 'foo'\n };\n\n var FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n assert.strictEqual(route.modelFor('foo'), foo);\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n [\"@test modelFor doesn't require the routerMicrolib\"](assert) {\n var route = _route.default.create({\n _router: {\n _routerMicrolib: null\n }\n });\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n (0, _owner.setOwner)(route, owner);\n var foo = {\n name: 'foo'\n };\n\n var FooRoute = _route.default.extend({\n currentModel: foo\n });\n\n owner.register('route:foo', FooRoute);\n assert.strictEqual(route.modelFor('foo'), foo);\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n ['@test .send just calls an action if the router is absent'](assert) {\n assert.expect(7);\n\n var route = _route.default.extend({\n actions: {\n returnsTrue(foo, bar) {\n assert.equal(foo, 1);\n assert.equal(bar, 2);\n assert.equal(this, route);\n return true;\n },\n\n returnsFalse() {\n assert.ok(true, 'returnsFalse was called');\n return false;\n }\n\n }\n }).create();\n\n assert.equal(route.send('returnsTrue', 1, 2), true);\n assert.equal(route.send('returnsFalse'), false);\n assert.equal(route.send('nonexistent', 1, 2, 3), undefined);\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test .send just calls an action if the routers internal router property is absent'](assert) {\n assert.expect(7);\n\n var route = _route.default.extend({\n router: {},\n actions: {\n returnsTrue(foo, bar) {\n assert.equal(foo, 1);\n assert.equal(bar, 2);\n assert.equal(this, route);\n return true;\n },\n\n returnsFalse() {\n assert.ok(true, 'returnsFalse was called');\n return false;\n }\n\n }\n }).create();\n\n assert.equal(true, route.send('returnsTrue', 1, 2));\n assert.equal(false, route.send('returnsFalse'));\n assert.equal(undefined, route.send('nonexistent', 1, 2, 3));\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test .send asserts if called on a destroyed route']() {\n route.routeName = 'rip-alley';\n (0, _internalTestHelpers.runDestroy)(route);\n expectAssertion(() => {\n route.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed route 'rip-alley'.\");\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Route serialize', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n route = _route.default.create();\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(route);\n }\n\n ['@test returns the models properties if params does not include *_id'](assert) {\n var model = {\n id: 2,\n firstName: 'Ned',\n lastName: 'Ryerson'\n };\n assert.deepEqual(route.serialize(model, ['firstName', 'lastName']), {\n firstName: 'Ned',\n lastName: 'Ryerson'\n }, 'serialized correctly');\n }\n\n ['@test returns model.id if params include *_id'](assert) {\n var model = {\n id: 2\n };\n assert.deepEqual(route.serialize(model, ['post_id']), {\n post_id: 2\n }, 'serialized correctly');\n }\n\n ['@test returns checks for existence of model.post_id before trying model.id'](assert) {\n var model = {\n post_id: 3\n };\n assert.deepEqual(route.serialize(model, ['post_id']), {\n post_id: 3\n }, 'serialized correctly');\n }\n\n ['@test returns model.id if model is a Proxy'](assert) {\n var model = _object_proxy.default.create({\n content: {\n id: 3\n }\n });\n\n assert.deepEqual(route.serialize(model, ['id']), {\n id: 3\n }, 'serialized Proxy correctly');\n }\n\n ['@test returns undefined if model is not set'](assert) {\n assert.equal(route.serialize(undefined, ['post_id']), undefined, 'serialized correctly');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Route interaction', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n var owner = {\n lookup(fullName) {\n return lookupHash[fullName];\n }\n\n };\n routeOne = _route.default.create({\n routeName: 'one'\n });\n routeTwo = _route.default.create({\n routeName: 'two'\n });\n (0, _owner.setOwner)(routeOne, owner);\n (0, _owner.setOwner)(routeTwo, owner);\n lookupHash = {\n 'route:one': routeOne,\n 'route:two': routeTwo\n };\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(routeOne);\n (0, _internalTestHelpers.runDestroy)(routeTwo);\n }\n\n ['@test route._qp does not crash if the controller has no QP, or setProperties'](assert) {\n lookupHash['controller:test'] = {};\n routeOne.controllerName = 'test';\n var qp = routeOne.get('_qp');\n assert.deepEqual(qp.map, {}, 'map should be empty');\n assert.deepEqual(qp.propertyNames, [], 'property names should be empty');\n assert.deepEqual(qp.qps, [], 'qps is should be empty');\n }\n\n [\"@test controllerFor uses route's controllerName if specified\"](assert) {\n var testController = {};\n lookupHash['controller:test'] = testController;\n routeOne.controllerName = 'test';\n assert.equal(routeTwo.controllerFor('one'), testController);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Route injected properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test services can be injected into routes'](assert) {\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('route:application', _route.default.extend({\n authService: (0, _service.service)('auth')\n }));\n owner.register('service:auth', _service.default.extend());\n var appRoute = owner.lookup('route:application');\n var authService = owner.lookup('service:auth');\n assert.equal(authService, appRoute.get('authService'), 'service.auth is injected');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Route with engines', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test paramsFor considers an engine's mountPoint\"](assert) {\n var router = {\n _deserializeQueryParams() {},\n\n _routerMicrolib: {\n state: {\n routeInfos: [{\n name: 'posts'\n }],\n params: {\n 'foo.bar': {\n a: 'b'\n },\n 'foo.bar.posts': {\n c: 'd'\n }\n }\n }\n }\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar',\n\n lookup(name) {\n if (name === 'route:posts') {\n return postsRoute;\n } else if (name === 'route:application') {\n return applicationRoute;\n }\n }\n\n }\n });\n\n var applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application',\n fullRouteName: 'foo.bar'\n });\n\n var postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts',\n fullRouteName: 'foo.bar.posts'\n });\n\n var route = _route.default.create({\n _router: router\n });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n assert.deepEqual(route.paramsFor('application'), {\n a: 'b'\n }, 'params match for root `application` route in engine');\n assert.deepEqual(route.paramsFor('posts'), {\n c: 'd'\n }, 'params match for `posts` route in engine');\n }\n\n [\"@test modelFor considers an engine's mountPoint\"](assert) {\n var applicationModel = {\n id: '1'\n };\n var postsModel = {\n id: '2'\n };\n var router = {\n _routerMicrolib: {\n activeTransition: {\n resolvedModels: {\n 'foo.bar': applicationModel,\n 'foo.bar.posts': postsModel\n }\n }\n }\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar',\n\n lookup(name) {\n if (name === 'route:posts') {\n return postsRoute;\n } else if (name === 'route:application') {\n return applicationRoute;\n }\n }\n\n }\n });\n\n var applicationRoute = _route.default.create({\n _router: router,\n routeName: 'application'\n });\n\n var postsRoute = _route.default.create({\n _router: router,\n routeName: 'posts'\n });\n\n var route = _route.default.create({\n _router: router\n });\n\n (0, _owner.setOwner)(applicationRoute, engineInstance);\n (0, _owner.setOwner)(postsRoute, engineInstance);\n (0, _owner.setOwner)(route, engineInstance);\n assert.strictEqual(route.modelFor('application'), applicationModel);\n assert.strictEqual(route.modelFor('posts'), postsModel);\n }\n\n [\"@test transitionTo considers an engine's mountPoint\"](assert) {\n var router = {\n transitionTo(route) {\n return route;\n }\n\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n var route = _route.default.create({\n _router: router\n });\n\n (0, _owner.setOwner)(route, engineInstance);\n expectDeprecation(() => {\n assert.strictEqual(route.transitionTo('application'), 'foo.bar.application', 'properly prefixes application route');\n }, /Calling transitionTo on a route is deprecated/);\n expectDeprecation(() => {\n assert.strictEqual(route.transitionTo('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n }, /Calling transitionTo on a route is deprecated/);\n expectDeprecation(() => {\n assert.throws(() => route.transitionTo('/posts'), 'throws when trying to use a url');\n }, /Calling transitionTo on a route is deprecated/);\n var queryParams = {};\n expectDeprecation(() => {\n assert.strictEqual(route.transitionTo(queryParams), queryParams, 'passes query param only transitions through');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n [\"@test intermediateTransitionTo considers an engine's mountPoint\"](assert) {\n var lastRoute;\n var router = {\n intermediateTransitionTo(route) {\n lastRoute = route;\n }\n\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n var route = _route.default.create({\n _router: router\n });\n\n (0, _owner.setOwner)(route, engineInstance);\n route.intermediateTransitionTo('application');\n assert.strictEqual(lastRoute, 'foo.bar.application', 'properly prefixes application route');\n route.intermediateTransitionTo('posts');\n assert.strictEqual(lastRoute, 'foo.bar.posts', 'properly prefixes child routes');\n assert.throws(() => route.intermediateTransitionTo('/posts'), 'throws when trying to use a url');\n var queryParams = {};\n route.intermediateTransitionTo(queryParams);\n assert.strictEqual(lastRoute, queryParams, 'passes query param only transitions through');\n }\n\n [\"@test replaceWith considers an engine's mountPoint\"](assert) {\n var router = {\n replaceWith(route) {\n return route;\n }\n\n };\n var engineInstance = (0, _internalTestHelpers.buildOwner)({\n ownerOptions: {\n routable: true,\n mountPoint: 'foo.bar'\n }\n });\n\n var route = _route.default.create({\n _router: router\n });\n\n (0, _owner.setOwner)(route, engineInstance);\n expectDeprecation(() => {\n assert.strictEqual(route.replaceWith('application'), 'foo.bar.application', 'properly prefixes application route');\n }, /Calling replaceWith on a route is deprecated/);\n expectDeprecation(() => {\n assert.strictEqual(route.replaceWith('posts'), 'foo.bar.posts', 'properly prefixes child routes');\n }, /Calling replaceWith on a route is deprecated/);\n expectDeprecation(() => {\n assert.throws(() => route.replaceWith('/posts'), 'throws when trying to use a url');\n }, /Calling replaceWith on a route is deprecated/);\n var queryParams = {};\n expectDeprecation(() => {\n assert.strictEqual(route.replaceWith(queryParams), queryParams, 'passes query param only transitions through');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/system/router_test\", [\"@ember/-internals/routing/lib/location/hash_location\", \"@ember/-internals/routing/lib/location/history_location\", \"@ember/-internals/routing/lib/location/auto_location\", \"@ember/-internals/routing/lib/location/none_location\", \"@ember/-internals/routing/lib/system/router\", \"internal-test-helpers\"], function (_hash_location, _history_location, _auto_location, _none_location, _router, _internalTestHelpers) {\n \"use strict\";\n\n var owner;\n\n function createRouter({\n settings = {},\n options = {}\n } = {}) {\n var CustomRouter = class extends _router.default {};\n var router = new CustomRouter(owner);\n\n for (var setting in settings) {\n router[setting] = settings[setting];\n }\n\n if (!options.disableSetup) {\n router.setupRouter();\n }\n\n return router;\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember Router', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n owner = (0, _internalTestHelpers.buildOwner)(); //register the HashLocation (the default)\n\n owner.register('location:hash', _hash_location.default);\n owner.register('location:history', _history_location.default);\n owner.register('location:auto', _auto_location.default);\n owner.register('location:none', _none_location.default);\n }\n\n teardown() {\n (0, _internalTestHelpers.runDestroy)(owner);\n owner = null;\n }\n\n ['@test [GH#15237] EmberError is imported correctly'](assert) {\n // If we get the right message it means Error is being imported correctly.\n assert.throws(function () {\n (0, _router.triggerEvent)(null, false, []);\n }, /because your app hasn't finished transitioning/);\n }\n\n ['@test should not create a router.js instance upon init'](assert) {\n var router = createRouter({\n options: {\n disableSetup: true\n }\n });\n assert.ok(!router._routerMicrolib);\n }\n\n ['@test should create a router.js instance after setupRouter'](assert) {\n var router = createRouter({\n options: {\n disableSetup: false\n }\n });\n assert.ok(router._didSetupRouter);\n assert.ok(router._routerMicrolib);\n }\n\n ['@test should return false if setupRouter is called multiple times'](assert) {\n var router = createRouter({\n options: {\n disableSetup: true\n }\n });\n assert.ok(router.setupRouter());\n assert.notOk(router.setupRouter());\n }\n\n ['@test should not reify location until setupRouter is called'](assert) {\n var router = createRouter({\n options: {\n disableSetup: true\n }\n });\n assert.equal(typeof router.location, 'string', 'location is specified as a string');\n router.setupRouter();\n assert.equal(typeof router.location, 'object', 'location is reified into an object');\n }\n\n ['@test should destroy its location upon destroying the routers owner.'](assert) {\n var router = createRouter();\n var location = router.get('location');\n (0, _internalTestHelpers.runDestroy)(owner);\n assert.ok(location.isDestroyed, 'location should be destroyed');\n }\n\n ['@test should instantiate its location with its `rootURL`'](assert) {\n var router = createRouter({\n settings: {\n rootURL: '/rootdir/'\n }\n });\n var location = router.get('location');\n assert.equal(location.get('rootURL'), '/rootdir/');\n }\n\n ['@test replacePath should be called with the right path'](assert) {\n assert.expect(2);\n var location = owner.lookup('location:auto');\n var browserLocation = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n\n };\n location.location = browserLocation;\n location.global = {\n onhashchange() {}\n\n };\n location.history = null;\n expectDeprecation(() => {\n createRouter({\n settings: {\n location: 'auto',\n rootURL: '/rootdir/'\n }\n });\n });\n }\n\n ['@test Router._routePath should consume identical prefixes'](assert) {\n createRouter();\n\n function routePath() {\n var routeInfos = Array.prototype.slice.call(arguments).map(function (s) {\n return {\n name: s\n };\n });\n routeInfos.unshift({\n name: 'ignored'\n });\n return _router.default._routePath(routeInfos);\n }\n\n assert.equal(routePath('foo'), 'foo');\n assert.equal(routePath('foo', 'bar', 'baz'), 'foo.bar.baz');\n assert.equal(routePath('foo', 'foo.bar'), 'foo.bar');\n assert.equal(routePath('foo', 'foo.bar', 'foo.bar.baz'), 'foo.bar.baz');\n assert.equal(routePath('foo', 'foo.bar', 'foo.bar.baz.wow'), 'foo.bar.baz.wow');\n assert.equal(routePath('foo', 'foo.bar.baz.wow'), 'foo.bar.baz.wow');\n assert.equal(routePath('foo.bar', 'bar.baz.wow'), 'foo.bar.baz.wow'); // This makes no sense, not trying to handle it, just\n // making sure it doesn't go boom.\n\n assert.equal(routePath('foo.bar.baz', 'foo'), 'foo.bar.baz.foo');\n }\n\n ['@test Router should cancel routing setup when the Location class says so via cancelRouterSetup'](assert) {\n assert.expect(0);\n var router;\n var FakeLocation = {\n cancelRouterSetup: true,\n\n create() {\n return this;\n }\n\n };\n owner.register('location:fake', FakeLocation);\n router = createRouter({\n location: 'fake',\n\n _setupRouter() {\n assert.ok(false, '_setupRouter should not be called');\n }\n\n });\n router.startRouting();\n }\n\n [\"@test AutoLocation should replace the url when it's not in the preferred format\"](assert) {\n assert.expect(2);\n var location = owner.lookup('location:auto');\n location.location = {\n href: 'http://test.com/rootdir/welcome',\n origin: 'http://test.com',\n pathname: '/rootdir/welcome',\n hash: '',\n search: '',\n\n replace(url) {\n assert.equal(url, 'http://test.com/rootdir/#/welcome');\n }\n\n };\n location.history = null;\n location.global = {\n onhashchange() {}\n\n };\n expectDeprecation(() => {\n createRouter({\n settings: {\n location: 'auto',\n rootURL: '/rootdir/'\n }\n });\n });\n }\n\n ['@test Router#handleURL should remove any #hashes before doing URL transition'](assert) {\n assert.expect(2);\n var router = createRouter({\n settings: {\n _doURLTransition(routerJsMethod, url) {\n assert.equal(routerJsMethod, 'handleURL');\n assert.equal(url, '/foo/bar?time=morphin');\n }\n\n }\n });\n router.handleURL('/foo/bar?time=morphin#pink-power-ranger');\n }\n\n ['@test Router#triggerEvent allows actions to bubble when returning true'](assert) {\n assert.expect(2);\n var routeInfos = [{\n name: 'application',\n route: {\n actions: {\n loading() {\n assert.ok(false, 'loading not handled by application route');\n }\n\n }\n }\n }, {\n name: 'about',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about route');\n return false;\n }\n\n }\n }\n }, {\n name: 'about.me',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about.me route');\n return true;\n }\n\n }\n }\n }];\n (0, _router.triggerEvent)(routeInfos, false, ['loading']);\n }\n\n ['@test Router#triggerEvent ignores handlers that have not loaded yet'](assert) {\n assert.expect(1);\n var routeInfos = [{\n name: 'about',\n route: {\n actions: {\n loading() {\n assert.ok(true, 'loading handled by about route');\n }\n\n }\n }\n }, {\n name: 'about.me',\n route: undefined\n }];\n (0, _router.triggerEvent)(routeInfos, false, ['loading']);\n }\n\n ['@test transitionTo should throw an error when called after owner is destroyed']() {\n var router = createRouter();\n (0, _internalTestHelpers.runDestroy)(router);\n router.currentRouteName = 'route-a';\n expectAssertion(function () {\n router.transitionTo('route-b');\n }, \"A transition was attempted from 'route-a' to 'route-b' but the application instance has already been destroyed.\");\n expectAssertion(function () {\n router.transitionTo('./route-b/1');\n }, \"A transition was attempted from 'route-a' to './route-b/1' but the application instance has already been destroyed.\");\n }\n\n ['@test computed url when location is a string should not crash'](assert) {\n var router = createRouter({\n options: {\n disableSetup: true\n }\n });\n assert.equal(router.url, undefined);\n }\n\n });\n});","define(\"@ember/-internals/routing/tests/utils_test\", [\"@ember/-internals/routing/lib/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Routing query parameter utils - normalizeControllerQueryParams', class extends _internalTestHelpers.AbstractTestCase {\n ['@test converts array style into verbose object style'](assert) {\n var paramName = 'foo';\n var params = [paramName];\n var normalized = (0, _utils.normalizeControllerQueryParams)(params);\n assert.ok(normalized[paramName], 'turns the query param name into key');\n assert.equal(normalized[paramName].as, null, \"includes a blank alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n\n [\"@test converts object style [{foo: 'an_alias'}]\"](assert) {\n var paramName = 'foo';\n var params = [{\n foo: 'an_alias'\n }];\n var normalized = (0, _utils.normalizeControllerQueryParams)(params);\n assert.ok(normalized[paramName], 'retains the query param name as key');\n assert.equal(normalized[paramName].as, 'an_alias', \"includes the provided alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n\n [\"@test retains maximally verbose object style [{foo: {as: 'foo'}}]\"](assert) {\n var paramName = 'foo';\n var params = [{\n foo: {\n as: 'an_alias'\n }\n }];\n var normalized = (0, _utils.normalizeControllerQueryParams)(params);\n assert.ok(normalized[paramName], 'retains the query param name as key');\n assert.equal(normalized[paramName].as, 'an_alias', \"includes the provided alias in 'as' key\");\n assert.equal(normalized[paramName].scope, 'model', 'defaults scope to model');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/array/any-test\", [\"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_array, _internalTestHelpers, _array2) {\n \"use strict\";\n\n class AnyTests extends _internalTestHelpers.AbstractTestCase {\n '@test any should should invoke callback on each item as long as you return false'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var found = [];\n var result;\n result = obj.any(function (i) {\n found.push(i);\n return false;\n });\n this.assert.equal(result, false, 'return value of obj.any');\n this.assert.deepEqual(found, ary, 'items passed during any() should match');\n }\n\n '@test any should stop invoking when you return true'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var cnt = ary.length - 2;\n var exp = cnt;\n var found = [];\n var result;\n result = obj.any(function (i) {\n found.push(i);\n return --cnt <= 0;\n });\n this.assert.equal(result, true, 'return value of obj.any');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during any() should match');\n }\n\n '@test any should return true if any object matches the callback'() {\n var obj = (0, _array.A)([0, 1, 2]);\n var result;\n result = obj.any(i => Boolean(i));\n this.assert.equal(result, true, 'return value of obj.any');\n }\n\n '@test any should produce correct results even if the matching element is undefined'(assert) {\n var obj = (0, _array.A)([undefined]);\n var result;\n result = obj.any(() => true);\n assert.equal(result, true, 'return value of obj.any');\n }\n\n }\n\n (0, _array2.runArrayTests)('any', AnyTests);\n});","define(\"@ember/-internals/runtime/tests/array/apply-test\", [\"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_array, _internalTestHelpers) {\n \"use strict\";\n\n class ArrayPrototypeExtensionSelfReferenceTests extends _internalTestHelpers.AbstractTestCase {\n '@test should not create non-Symbol, enumerable properties that refer to itself'() {\n // Don't want to pollute Array.prototype so we make a fake / simple prototype\n function ThrowAwayArray() {} // Extend our throw-away prototype (like EXTEND_PROTOTYPES.Array would)\n\n\n _array.NativeArray.apply(ThrowAwayArray.prototype); // Create an instance to test\n\n\n var obj = new ThrowAwayArray(); // Make sure that no enumerable properties refer back to the object (creating a cyclic structure)\n\n for (var p in obj) {\n this.assert.notStrictEqual(obj[p], obj, `Property \"${p}\" is an enumerable part of the prototype\n so must not refer back to the original array.\n Otherwise code that explores all properties,\n such as jQuery.extend and other \"deep cloning\" functions,\n will get stuck in an infinite loop.\n `.replace(/\\s+/g, ' '));\n }\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)(`NativeArray: apply`, ArrayPrototypeExtensionSelfReferenceTests);\n});","define(\"@ember/-internals/runtime/tests/array/compact-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class CompactTests extends _internalTestHelpers.AbstractTestCase {\n '@test removes null and undefined values from enumerable'() {\n var obj = this.newObject([null, 1, false, '', undefined, 0, null]);\n var ary = obj.compact();\n this.assert.deepEqual(ary, [1, false, '', 0]);\n }\n\n }\n\n (0, _array.runArrayTests)('compact', CompactTests);\n});","define(\"@ember/-internals/runtime/tests/array/every-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/runtime/lib/system/object\"], function (_internalTestHelpers, _array, _object) {\n \"use strict\";\n\n class EveryTest extends _internalTestHelpers.AbstractTestCase {\n '@test every should should invoke callback on each item as long as you return true'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var found = [];\n var result;\n result = obj.every(function (i) {\n found.push(i);\n return true;\n });\n this.assert.equal(result, true, 'return value of obj.every');\n this.assert.deepEqual(found, ary, 'items passed during every() should match');\n }\n\n '@test every should stop invoking when you return false'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var cnt = ary.length - 2;\n var exp = cnt;\n var found = [];\n var result;\n result = obj.every(function (i) {\n found.push(i);\n return --cnt > 0;\n });\n this.assert.equal(result, false, 'return value of obj.every');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during every() should match');\n }\n\n }\n\n class IsEveryTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return true of every property matches'() {\n var obj = this.newObject([{\n foo: 'foo',\n bar: 'BAZ'\n }, _object.default.create({\n foo: 'foo',\n bar: 'bar'\n })]);\n this.assert.equal(obj.isEvery('foo', 'foo'), true, 'isEvery(foo)');\n this.assert.equal(obj.isEvery('bar', 'bar'), false, 'isEvery(bar)');\n }\n\n '@test should return true of every property is true'() {\n var obj = this.newObject([{\n foo: 'foo',\n bar: true\n }, _object.default.create({\n foo: 'bar',\n bar: false\n })]); // different values - all eval to true\n\n this.assert.equal(obj.isEvery('foo'), true, 'isEvery(foo)');\n this.assert.equal(obj.isEvery('bar'), false, 'isEvery(bar)');\n }\n\n '@test should return true if every property matches null'() {\n var obj = this.newObject([{\n foo: null,\n bar: 'BAZ'\n }, _object.default.create({\n foo: null,\n bar: null\n })]);\n this.assert.equal(obj.isEvery('foo', null), true, \"isEvery('foo', null)\");\n this.assert.equal(obj.isEvery('bar', null), false, \"isEvery('bar', null)\");\n }\n\n '@test should return true if every property is undefined'() {\n var obj = this.newObject([{\n foo: undefined,\n bar: 'BAZ'\n }, _object.default.create({\n bar: undefined\n })]);\n this.assert.equal(obj.isEvery('foo', undefined), true, \"isEvery('foo', undefined)\");\n this.assert.equal(obj.isEvery('bar', undefined), false, \"isEvery('bar', undefined)\");\n }\n\n }\n\n (0, _array.runArrayTests)('every', EveryTest);\n (0, _array.runArrayTests)('isEvery', IsEveryTest);\n});","define(\"@ember/-internals/runtime/tests/array/filter-test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_object, _internalTestHelpers, _array) {\n \"use strict\";\n\n class FilterTest extends _internalTestHelpers.AbstractTestCase {\n '@test filter should invoke on each item'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var cnt = ary.length - 2;\n var found = [];\n var result; // return true on all but the last two\n\n result = obj.filter(function (i) {\n found.push(i);\n return --cnt >= 0;\n });\n this.assert.deepEqual(found, ary, 'should have invoked on each item');\n this.assert.deepEqual(result, ary.slice(0, -2), 'filtered array should exclude items');\n }\n\n }\n\n class FilterByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should include in result if property is true'() {\n var obj, ary;\n ary = [{\n foo: 'foo',\n bar: true\n }, _object.default.create({\n foo: 'bar',\n bar: false\n })];\n obj = this.newObject(ary); // different values - all eval to true\n\n this.assert.deepEqual(obj.filterBy('foo'), ary, 'filterBy(foo)');\n this.assert.deepEqual(obj.filterBy('bar'), [ary[0]], 'filterBy(bar)');\n }\n\n '@test should filter on second argument if provided'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 2\n }), {\n name: 'obj3',\n foo: 2\n }, _object.default.create({\n name: 'obj4',\n foo: 3\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.filterBy('foo', 3), [ary[0], ary[3]], \"filterBy('foo', 3)')\");\n }\n\n '@test should correctly filter null second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: null\n }), {\n name: 'obj3',\n foo: null\n }, _object.default.create({\n name: 'obj4',\n foo: 3\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.filterBy('foo', null), [ary[1], ary[2]], \"filterBy('foo', 3)')\");\n }\n\n '@test should correctly filter explicit undefined second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 3\n }), {\n name: 'obj3',\n foo: undefined\n }, _object.default.create({\n name: 'obj4',\n foo: undefined\n }), {\n name: 'obj5'\n }, _object.default.create({\n name: 'obj6'\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.filterBy('foo', undefined), ary.slice(2), \"filterBy('foo', 3)')\");\n }\n\n '@test should not match undefined properties without second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 3\n }), {\n name: 'obj3',\n foo: undefined\n }, _object.default.create({\n name: 'obj4',\n foo: undefined\n }), {\n name: 'obj5'\n }, _object.default.create({\n name: 'obj6'\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.filterBy('foo'), ary.slice(0, 2), \"filterBy('foo', 3)')\");\n }\n\n }\n\n (0, _array.runArrayTests)('filter', FilterTest);\n (0, _array.runArrayTests)('filter', FilterByTest);\n});","define(\"@ember/-internals/runtime/tests/array/find-test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_object, _internalTestHelpers, _array) {\n \"use strict\";\n\n class FindTests extends _internalTestHelpers.AbstractTestCase {\n '@test find should invoke callback on each item as long as you return false'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var found = [];\n var result;\n result = obj.find(function (i) {\n found.push(i);\n return false;\n });\n this.assert.equal(result, undefined, 'return value of obj.find');\n this.assert.deepEqual(found, ary, 'items passed during find() should match');\n }\n\n '@test every should stop invoking when you return true'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var cnt = ary.length - 2;\n var exp = cnt;\n var found = [];\n var result;\n result = obj.find(function (i) {\n found.push(i);\n return --cnt >= 0;\n });\n this.assert.equal(result, ary[exp - 1], 'return value of obj.find');\n this.assert.equal(found.length, exp, 'should invoke proper number of times');\n this.assert.deepEqual(found, ary.slice(0, -2), 'items passed during find() should match');\n }\n\n }\n\n class FindByTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return first object of property matches'() {\n var ary, obj;\n ary = [{\n foo: 'foo',\n bar: 'BAZ'\n }, _object.default.create({\n foo: 'foo',\n bar: 'bar'\n })];\n obj = this.newObject(ary);\n this.assert.equal(obj.findBy('foo', 'foo'), ary[0], 'findBy(foo)');\n this.assert.equal(obj.findBy('bar', 'bar'), ary[1], 'findBy(bar)');\n }\n\n '@test should return first object with truthy prop'() {\n var ary, obj;\n ary = [{\n foo: 'foo',\n bar: false\n }, _object.default.create({\n foo: 'bar',\n bar: true\n })];\n obj = this.newObject(ary); // different values - all eval to true\n\n this.assert.equal(obj.findBy('foo'), ary[0], 'findBy(foo)');\n this.assert.equal(obj.findBy('bar'), ary[1], 'findBy(bar)');\n }\n\n '@test should return first null property match'() {\n var ary, obj;\n ary = [{\n foo: null,\n bar: 'BAZ'\n }, _object.default.create({\n foo: null,\n bar: null\n })];\n obj = this.newObject(ary);\n this.assert.equal(obj.findBy('foo', null), ary[0], \"findBy('foo', null)\");\n this.assert.equal(obj.findBy('bar', null), ary[1], \"findBy('bar', null)\");\n }\n\n '@test should return first undefined property match'() {\n var ary, obj;\n ary = [{\n foo: undefined,\n bar: 'BAZ'\n }, _object.default.create({})];\n obj = this.newObject(ary);\n this.assert.equal(obj.findBy('foo', undefined), ary[0], \"findBy('foo', undefined)\");\n this.assert.equal(obj.findBy('bar', undefined), ary[1], \"findBy('bar', undefined)\");\n }\n\n }\n\n (0, _array.runArrayTests)('find', FindTests);\n (0, _array.runArrayTests)('findBy', FindByTests);\n});","define(\"@ember/-internals/runtime/tests/array/firstObject-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class FirstObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns first item in enumerable'() {\n var obj = this.newObject();\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), this.toArray(obj)[0]);\n }\n\n '@test returns undefined if enumerable is empty'() {\n var obj = this.newObject([]);\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), undefined);\n }\n\n '@test can not be set'() {\n var obj = this.newObject([]);\n this.assert.equal((0, _metal.get)(obj, 'firstObject'), this.toArray(obj)[0]);\n this.assert.throws(() => {\n (0, _metal.set)(obj, 'firstObject', 'foo!');\n }, /Cannot set read-only property \"firstObject\" on object/);\n }\n\n }\n\n (0, _array.runArrayTests)('firstObject', FirstObjectTests);\n});","define(\"@ember/-internals/runtime/tests/array/forEach-test\", [\"@ember/-internals/utils\", \"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_utils, _metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class ForEachTests extends _internalTestHelpers.AbstractTestCase {\n '@test forEach should iterate over list'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var found = [];\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test forEach should iterate over list after mutation'() {\n if ((0, _metal.get)(this, 'canTestMutation')) {\n this.assert.expect(0);\n return;\n }\n\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var found = [];\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n this.mutate(obj);\n ary = this.toArray(obj);\n found = [];\n obj.forEach(i => found.push(i));\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test 2nd target parameter'() {\n var obj = this.newObject();\n var target = this;\n obj.forEach(() => {// ES6TODO: When transpiled we will end up with \"use strict\" which disables automatically binding to the global context.\n // Therefore, the following test can never pass in strict mode unless we modify the `map` function implementation to\n // use `Ember.lookup` if target is not specified.\n //\n // equal(guidFor(this), guidFor(global), 'should pass the global object as this if no context');\n });\n obj.forEach(() => {\n this.assert.equal((0, _utils.guidFor)(this), (0, _utils.guidFor)(target), 'should pass target as this if context');\n }, target);\n }\n\n '@test callback params'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var loc = 0;\n obj.forEach((item, idx, enumerable) => {\n this.assert.equal(item, ary[loc], 'item param');\n this.assert.equal(idx, loc, 'idx param');\n this.assert.equal((0, _utils.guidFor)(enumerable), (0, _utils.guidFor)(obj), 'enumerable param');\n loc++;\n });\n }\n\n }\n\n (0, _array.runArrayTests)('forEach', ForEachTests);\n});","define(\"@ember/-internals/runtime/tests/array/includes-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class IncludesTests extends _internalTestHelpers.AbstractTestCase {\n '@test includes returns correct value if startAt is positive'() {\n var data = (0, _array.newFixture)(3);\n var obj = this.newObject(data);\n this.assert.equal(obj.includes(data[1], 1), true, 'should return true if included');\n this.assert.equal(obj.includes(data[0], 1), false, 'should return false if not included');\n }\n\n '@test includes returns correct value if startAt is negative'() {\n var data = (0, _array.newFixture)(3);\n var obj = this.newObject(data);\n this.assert.equal(obj.includes(data[1], -2), true, 'should return true if included');\n this.assert.equal(obj.includes(data[0], -2), false, 'should return false if not included');\n }\n\n '@test includes returns true if startAt + length is still negative'() {\n var data = (0, _array.newFixture)(1);\n var obj = this.newObject(data);\n this.assert.equal(obj.includes(data[0], -2), true, 'should return true if included');\n this.assert.equal(obj.includes((0, _array.newFixture)(1), -2), false, 'should return false if not included');\n }\n\n '@test includes returns false if startAt out of bounds'() {\n var data = (0, _array.newFixture)(1);\n var obj = this.newObject(data);\n this.assert.equal(obj.includes(data[0], 2), false, 'should return false if startAt >= length');\n this.assert.equal(obj.includes((0, _array.newFixture)(1), 2), false, 'should return false if startAt >= length');\n }\n\n }\n\n (0, _array.runArrayTests)('includes', IncludesTests);\n});","define(\"@ember/-internals/runtime/tests/array/indexOf-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class IndexOfTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return index of object'() {\n var expected = (0, _array.newFixture)(3);\n var obj = this.newObject(expected);\n var len = 3;\n\n for (var idx = 0; idx < len; idx++) {\n this.assert.equal(obj.indexOf(expected[idx]), idx, `obj.indexOf(${expected[idx]}) should match idx`);\n }\n }\n\n '@test should return -1 when requesting object not in index'() {\n var obj = this.newObject((0, _array.newFixture)(3));\n var foo = {};\n this.assert.equal(obj.indexOf(foo), -1, 'obj.indexOf(foo) should be < 0');\n }\n\n }\n\n (0, _array.runArrayTests)('indexOf', IndexOfTests);\n});","define(\"@ember/-internals/runtime/tests/array/invoke-test\", [\"@ember/-internals/runtime/index\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_index, _internalTestHelpers, _array) {\n \"use strict\";\n\n class InvokeTests extends _internalTestHelpers.AbstractTestCase {\n '@test invoke should call on each object that implements'() {\n var cnt, ary, obj;\n\n function F(amt) {\n cnt += amt === undefined ? 1 : amt;\n }\n\n cnt = 0;\n ary = [{\n foo: F\n }, _index.Object.create({\n foo: F\n }), // NOTE: does not impl foo - invoke should just skip\n _index.Object.create({\n bar: F\n }), {\n foo: F\n }];\n obj = this.newObject(ary);\n obj.invoke('foo');\n this.assert.equal(cnt, 3, 'should have invoked 3 times');\n cnt = 0;\n obj.invoke('foo', 2);\n this.assert.equal(cnt, 6, 'should have invoked 3 times, passing param');\n }\n\n '@test invoke should return an array containing the results of each invoked method'(assert) {\n var obj = this.newObject([{\n foo() {\n return 'one';\n }\n\n }, {}, // intentionally not including `foo` method\n {\n foo() {\n return 'two';\n }\n\n }]);\n var result = obj.invoke('foo');\n assert.deepEqual(result, ['one', undefined, 'two']);\n }\n\n '@test invoke should return an extended array (aka Ember.A)'(assert) {\n var obj = this.newObject([{\n foo() {}\n\n }, {\n foo() {}\n\n }]);\n var result = obj.invoke('foo');\n assert.ok(_index.NativeArray.detect(result), 'NativeArray has been applied');\n }\n\n }\n\n (0, _array.runArrayTests)('invoke', InvokeTests);\n});","define(\"@ember/-internals/runtime/tests/array/isAny-test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_object, _internalTestHelpers, _array) {\n \"use strict\";\n\n class IsAnyTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return true of any property matches'() {\n var obj = this.newObject([{\n foo: 'foo',\n bar: 'BAZ'\n }, _object.default.create({\n foo: 'foo',\n bar: 'bar'\n })]);\n this.assert.equal(obj.isAny('foo', 'foo'), true, 'isAny(foo)');\n this.assert.equal(obj.isAny('bar', 'bar'), true, 'isAny(bar)');\n this.assert.equal(obj.isAny('bar', 'BIFF'), false, 'isAny(BIFF)');\n }\n\n '@test should return true of any property is true'() {\n var obj = this.newObject([{\n foo: 'foo',\n bar: true\n }, _object.default.create({\n foo: 'bar',\n bar: false\n })]); // different values - all eval to true\n\n this.assert.equal(obj.isAny('foo'), true, 'isAny(foo)');\n this.assert.equal(obj.isAny('bar'), true, 'isAny(bar)');\n this.assert.equal(obj.isAny('BIFF'), false, 'isAny(biff)');\n }\n\n '@test should return true if any property matches null'() {\n var obj = this.newObject([{\n foo: null,\n bar: 'bar'\n }, _object.default.create({\n foo: 'foo',\n bar: null\n })]);\n this.assert.equal(obj.isAny('foo', null), true, \"isAny('foo', null)\");\n this.assert.equal(obj.isAny('bar', null), true, \"isAny('bar', null)\");\n }\n\n '@test should return true if any property is undefined'() {\n var obj = this.newObject([{\n foo: undefined,\n bar: 'bar'\n }, _object.default.create({\n foo: 'foo'\n })]);\n this.assert.equal(obj.isAny('foo', undefined), true, \"isAny('foo', undefined)\");\n this.assert.equal(obj.isAny('bar', undefined), true, \"isAny('bar', undefined)\");\n }\n\n '@test should not match undefined properties without second argument'() {\n var obj = this.newObject([{\n foo: undefined\n }, _object.default.create({})]);\n this.assert.equal(obj.isAny('foo'), false, \"isAny('foo', undefined)\");\n }\n\n }\n\n (0, _array.runArrayTests)('isAny', IsAnyTests);\n});","define(\"@ember/-internals/runtime/tests/array/lastIndexOf-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class LastIndexOfTests extends _internalTestHelpers.AbstractTestCase {\n \"@test should return index of object's last occurrence\"() {\n var expected = (0, _array.newFixture)(3);\n var obj = this.newObject(expected);\n var len = 3;\n\n for (var idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx]), idx, `obj.lastIndexOf(${expected[idx]}) should match idx`);\n }\n }\n\n \"@test should return index of object's last occurrence even startAt search location is equal to length\"() {\n var expected = (0, _array.newFixture)(3);\n var obj = this.newObject(expected);\n var len = 3;\n\n for (var idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx], len), idx, `obj.lastIndexOfs(${expected[idx]}) should match idx`);\n }\n }\n\n \"@test should return index of object's last occurrence even startAt search location is greater than length\"() {\n var expected = (0, _array.newFixture)(3);\n var obj = this.newObject(expected);\n var len = 3;\n\n for (var idx = 0; idx < len; idx++) {\n this.assert.equal(obj.lastIndexOf(expected[idx], len + 1), idx, `obj.lastIndexOf(${expected[idx]}) should match idx`);\n }\n }\n\n '@test should return -1 when no match is found'() {\n var obj = this.newObject((0, _array.newFixture)(3));\n var foo = {};\n this.assert.equal(obj.lastIndexOf(foo), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n\n '@test should return -1 when no match is found even startAt search location is equal to length'() {\n var obj = this.newObject((0, _array.newFixture)(3));\n var foo = {};\n this.assert.equal(obj.lastIndexOf(foo, (0, _metal.get)(obj, 'length')), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n\n '@test should return -1 when no match is found even startAt search location is greater than length'() {\n var obj = this.newObject((0, _array.newFixture)(3));\n var foo = {};\n this.assert.equal(obj.lastIndexOf(foo, (0, _metal.get)(obj, 'length') + 1), -1, 'obj.lastIndexOf(foo) should be -1');\n }\n\n }\n\n (0, _array.runArrayTests)('lastIndexOf', LastIndexOfTests);\n});","define(\"@ember/-internals/runtime/tests/array/lastObject-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _array, _metal) {\n \"use strict\";\n\n class LastObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns last item in enumerable'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n }\n\n '@test returns undefined if enumerable is empty'() {\n var obj = this.newObject([]);\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), undefined);\n }\n\n '@test can not be set'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n this.assert.equal((0, _metal.get)(obj, 'lastObject'), ary[ary.length - 1]);\n this.assert.throws(function () {\n (0, _metal.set)(obj, 'lastObject', 'foo!');\n }, /Cannot set read-only property \"lastObject\" on object/);\n }\n\n }\n\n (0, _array.runArrayTests)('lastObject', LastObjectTests);\n});","define(\"@ember/-internals/runtime/tests/array/map-test\", [\"@ember/-internals/utils\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/metal\"], function (_utils, _internalTestHelpers, _array, _metal) {\n \"use strict\";\n\n var mapFunc = item => item ? item.toString() : null;\n\n class MapTests extends _internalTestHelpers.AbstractTestCase {\n '@test map should iterate over list'() {\n var obj = this.newObject();\n var ary = this.toArray(obj).map(mapFunc);\n var found = [];\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'mapped arrays should match');\n }\n\n '@test map should iterate over list after mutation'() {\n if ((0, _metal.get)(this, 'canTestMutation')) {\n this.assert.expect(0);\n return;\n }\n\n var obj = this.newObject();\n var ary = this.toArray(obj).map(mapFunc);\n var found;\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n this.mutate(obj);\n ary = this.toArray(obj).map(mapFunc);\n found = obj.map(mapFunc);\n this.assert.deepEqual(found, ary, 'items passed during forEach should match');\n }\n\n '@test 2nd target parameter'() {\n var obj = this.newObject();\n var target = this;\n obj.map(() => {// ES6TODO: When transpiled we will end up with \"use strict\" which disables automatically binding to the global context.\n // Therefore, the following test can never pass in strict mode unless we modify the `map` function implementation to\n // use `Ember.lookup` if target is not specified.\n //\n // equal(guidFor(this), guidFor(global), 'should pass the global object as this if no context');\n });\n obj.map(() => {\n this.assert.equal((0, _utils.guidFor)(this), (0, _utils.guidFor)(target), 'should pass target as this if context');\n }, target);\n }\n\n '@test callback params'() {\n var obj = this.newObject();\n var ary = this.toArray(obj);\n var loc = 0;\n obj.map((item, idx, enumerable) => {\n this.assert.equal(item, ary[loc], 'item param');\n this.assert.equal(idx, loc, 'idx param');\n this.assert.equal((0, _utils.guidFor)(enumerable), (0, _utils.guidFor)(obj), 'enumerable param');\n loc++;\n });\n }\n\n }\n\n (0, _array.runArrayTests)('map', MapTests);\n});","define(\"@ember/-internals/runtime/tests/array/mapBy-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class MapByTests extends _internalTestHelpers.AbstractTestCase {\n '@test get value of each property'() {\n var obj = this.newObject([{\n a: 1\n }, {\n a: 2\n }]);\n this.assert.equal(obj.mapBy('a').join(''), '12');\n }\n\n '@test should work also through getEach alias'() {\n var obj = this.newObject([{\n a: 1\n }, {\n a: 2\n }]);\n this.assert.equal(obj.getEach('a').join(''), '12');\n }\n\n }\n\n (0, _array.runArrayTests)('mapBy', MapByTests);\n});","define(\"@ember/-internals/runtime/tests/array/objectAt-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class ObjectAtTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return object at specified index'() {\n var expected = (0, _array.newFixture)(3);\n var obj = this.newObject(expected);\n var len = expected.length;\n\n for (var idx = 0; idx < len; idx++) {\n this.assert.equal(obj.objectAt(idx), expected[idx], `obj.objectAt(${idx}) should match`);\n }\n }\n\n '@test should return undefined when requesting objects beyond index'() {\n var obj;\n obj = this.newObject((0, _array.newFixture)(3));\n this.assert.equal(obj.objectAt(obj, 5), undefined, 'should return undefined for obj.objectAt(5) when len = 3');\n obj = this.newObject([]);\n this.assert.equal(obj.objectAt(obj, 0), undefined, 'should return undefined for obj.objectAt(0) when len = 0');\n }\n\n }\n\n (0, _array.runArrayTests)('objectAt', ObjectAtTests);\n});","define(\"@ember/-internals/runtime/tests/array/reduce-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class ReduceTests extends _internalTestHelpers.AbstractTestCase {\n '@test collects a summary value from an enumeration'() {\n var obj = this.newObject([1, 2, 3]);\n var res = obj.reduce((previousValue, item) => previousValue + item, 0);\n this.assert.equal(res, 6);\n }\n\n '@test passes index of item to callback'() {\n var obj = this.newObject([1, 2, 3]);\n var res = obj.reduce((previousValue, item, index) => previousValue + index, 0);\n this.assert.equal(res, 3);\n }\n\n '@test passes enumerable object to callback'() {\n var obj = this.newObject([1, 2, 3]);\n var res = obj.reduce((previousValue, item, index, enumerable) => enumerable, 0);\n this.assert.equal(res, obj);\n }\n\n }\n\n (0, _array.runArrayTests)('reduce', ReduceTests);\n});","define(\"@ember/-internals/runtime/tests/array/reject-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/runtime/lib/system/object\"], function (_internalTestHelpers, _array, _object) {\n \"use strict\";\n\n class RejectTest extends _internalTestHelpers.AbstractTestCase {\n '@test should reject any item that does not meet the condition'() {\n var obj = this.newObject([1, 2, 3, 4]);\n var result;\n result = obj.reject(i => i < 3);\n this.assert.deepEqual(result, [3, 4], 'reject the correct items');\n }\n\n '@test should be the inverse of filter'() {\n var obj = this.newObject([1, 2, 3, 4]);\n\n var isEven = i => i % 2 === 0;\n\n var filtered, rejected;\n filtered = obj.filter(isEven);\n rejected = obj.reject(isEven);\n this.assert.deepEqual(filtered, [2, 4], 'filtered evens');\n this.assert.deepEqual(rejected, [1, 3], 'rejected evens');\n }\n\n }\n\n class RejectByTest extends _internalTestHelpers.AbstractTestCase {\n '@test should reject based on object'() {\n var obj, ary;\n ary = [{\n foo: 'foo',\n bar: 'BAZ'\n }, _object.default.create({\n foo: 'foo',\n bar: 'bar'\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo', 'foo'), [], 'rejectBy(foo)');\n this.assert.deepEqual(obj.rejectBy('bar', 'bar'), [ary[0]], 'rejectBy(bar)');\n }\n\n '@test should include in result if property is false'() {\n var obj, ary;\n ary = [{\n foo: false,\n bar: true\n }, _object.default.create({\n foo: false,\n bar: false\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo'), ary, 'rejectBy(foo)');\n this.assert.deepEqual(obj.rejectBy('bar'), [ary[1]], 'rejectBy(bar)');\n }\n\n '@test should reject on second argument if provided'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 2\n }), {\n name: 'obj3',\n foo: 2\n }, _object.default.create({\n name: 'obj4',\n foo: 3\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo', 3), [ary[1], ary[2]], \"rejectBy('foo', 3)')\");\n }\n\n '@test should correctly reject null second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: null\n }), {\n name: 'obj3',\n foo: null\n }, _object.default.create({\n name: 'obj4',\n foo: 3\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo', null), [ary[0], ary[3]], \"rejectBy('foo', null)')\");\n }\n\n '@test should correctly reject undefined second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 2\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('bar', undefined), [], \"rejectBy('bar', undefined)')\");\n }\n\n '@test should correctly reject explicit undefined second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 3\n }), {\n name: 'obj3',\n foo: undefined\n }, _object.default.create({\n name: 'obj4',\n foo: undefined\n }), {\n name: 'obj5'\n }, _object.default.create({\n name: 'obj6'\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo', undefined), ary.slice(0, 2), \"rejectBy('foo', undefined)')\");\n }\n\n '@test should match undefined, null, or false properties without second argument'() {\n var obj, ary;\n ary = [{\n name: 'obj1',\n foo: 3\n }, _object.default.create({\n name: 'obj2',\n foo: 3\n }), {\n name: 'obj3',\n foo: undefined\n }, _object.default.create({\n name: 'obj4',\n foo: undefined\n }), {\n name: 'obj5'\n }, _object.default.create({\n name: 'obj6'\n }), {\n name: 'obj7',\n foo: null\n }, _object.default.create({\n name: 'obj8',\n foo: null\n }), {\n name: 'obj9',\n foo: false\n }, _object.default.create({\n name: 'obj10',\n foo: false\n })];\n obj = this.newObject(ary);\n this.assert.deepEqual(obj.rejectBy('foo'), ary.slice(2), \"rejectBy('foo')')\");\n }\n\n }\n\n (0, _array.runArrayTests)('reject', RejectTest);\n (0, _array.runArrayTests)('rejectBy', RejectByTest);\n});","define(\"@ember/-internals/runtime/tests/array/sortBy-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class SortByTests extends _internalTestHelpers.AbstractTestCase {\n '@test sort by value of property'() {\n var obj = this.newObject([{\n a: 2\n }, {\n a: 1\n }]);\n var sorted = obj.sortBy('a');\n this.assert.equal((0, _metal.get)(sorted[0], 'a'), 1);\n this.assert.equal((0, _metal.get)(sorted[1], 'a'), 2);\n }\n\n '@test supports multiple propertyNames'() {\n var obj = this.newObject([{\n a: 1,\n b: 2\n }, {\n a: 1,\n b: 1\n }]);\n var sorted = obj.sortBy('a', 'b');\n this.assert.equal((0, _metal.get)(sorted[0], 'b'), 1);\n this.assert.equal((0, _metal.get)(sorted[1], 'b'), 2);\n }\n\n }\n\n (0, _array.runArrayTests)('sortBy', SortByTests);\n});","define(\"@ember/-internals/runtime/tests/array/toArray-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class ToArrayTests extends _internalTestHelpers.AbstractTestCase {\n '@test toArray should convert to an array'() {\n var obj = this.newObject();\n this.assert.deepEqual(obj.toArray(), this.toArray(obj));\n }\n\n }\n\n (0, _array.runArrayTests)('toArray', ToArrayTests);\n});","define(\"@ember/-internals/runtime/tests/array/uniq-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class UniqTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with duplicates removed'() {\n var before, after, obj, ret;\n after = (0, _array.newFixture)(3);\n before = [after[0], after[1], after[2], after[1], after[0]];\n obj = this.newObject(before);\n before = obj.toArray(); // in case of set before will be different...\n\n ret = obj.uniq();\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n this.assert.deepEqual(this.toArray(obj), before, 'should not have changed original');\n }\n\n '@test should return duplicate of same content if no duplicates found'() {\n var item, obj, ret;\n obj = this.newObject((0, _array.newFixture)(3));\n ret = obj.uniq(item);\n this.assert.ok(ret !== obj, 'should not be same object');\n this.assert.deepEqual(this.toArray(ret), this.toArray(obj), 'should be the same content');\n }\n\n }\n\n (0, _array.runArrayTests)('uniq', UniqTests);\n});","define(\"@ember/-internals/runtime/tests/array/uniqBy-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class UniqByTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with duplicates removed'() {\n var numbers = this.newObject([{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }, {\n id: 1,\n value: 'one'\n }]);\n this.assert.deepEqual(numbers.uniqBy('id'), [{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }]);\n }\n\n '@test supports function as key'() {\n var numbers = this.newObject([{\n id: 1,\n value: 'boom'\n }, {\n id: 2,\n value: 'boom'\n }, {\n id: 1,\n value: 'doom'\n }]);\n\n var keyFunction = val => {\n this.assert.equal(arguments.length, 1);\n return val.value;\n };\n\n this.assert.deepEqual(numbers.uniqBy(keyFunction), [{\n id: 1,\n value: 'boom'\n }, {\n id: 1,\n value: 'doom'\n }]);\n }\n\n }\n\n (0, _array.runArrayTests)('uniqBy', UniqByTests);\n});","define(\"@ember/-internals/runtime/tests/array/without-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class WithoutTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return new instance with item removed'() {\n var before, after, obj, ret;\n before = (0, _array.newFixture)(3);\n after = [before[0], before[2]];\n obj = this.newObject(before);\n ret = obj.without(before[1]);\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n this.assert.deepEqual(this.toArray(obj), before, 'should not have changed original');\n }\n\n '@test should remove NaN value'() {\n var before, after, obj, ret;\n before = [...(0, _array.newFixture)(2), NaN];\n after = [before[0], before[1]];\n obj = this.newObject(before);\n ret = obj.without(NaN);\n this.assert.deepEqual(this.toArray(ret), after, 'should have removed item');\n }\n\n '@test should return same instance if object not found'() {\n var item, obj, ret;\n item = (0, _array.newFixture)(1)[0];\n obj = this.newObject((0, _array.newFixture)(3));\n ret = obj.without(item);\n this.assert.equal(ret, obj, 'should be same instance');\n }\n\n }\n\n (0, _array.runArrayTests)('without', WithoutTests);\n});","define(\"@ember/-internals/runtime/tests/core/compare_test\", [\"@ember/-internals/runtime/lib/type-of\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/compare\", \"@ember/-internals/runtime/lib/mixins/comparable\", \"internal-test-helpers\"], function (_typeOf, _object, _compare, _comparable, _internalTestHelpers) {\n \"use strict\";\n\n var data = [];\n\n var Comp = _object.default.extend(_comparable.default);\n\n Comp.reopenClass({\n compare(obj) {\n return obj.get('val');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Ember.compare()', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n data[0] = null;\n data[1] = false;\n data[2] = true;\n data[3] = -12;\n data[4] = 3.5;\n data[5] = 'a string';\n data[6] = 'another string';\n data[7] = 'last string';\n data[8] = [1, 2];\n data[9] = [1, 2, 3];\n data[10] = [1, 3];\n data[11] = {\n a: 'hash'\n };\n data[12] = _object.default.create();\n\n data[13] = function (a) {\n return a;\n };\n\n data[14] = new Date('2012/01/01');\n data[15] = new Date('2012/06/06');\n }\n\n ['@test ordering should work'](assert) {\n var suspect, comparable, failureMessage, suspectIndex, comparableIndex;\n\n for (suspectIndex = 0; suspectIndex < data.length; suspectIndex++) {\n suspect = data[suspectIndex];\n assert.equal((0, _compare.default)(suspect, suspect), 0, suspectIndex + ' should equal itself');\n\n for (comparableIndex = suspectIndex + 1; comparableIndex < data.length; comparableIndex++) {\n comparable = data[comparableIndex];\n failureMessage = 'data[' + suspectIndex + '] (' + (0, _typeOf.typeOf)(suspect) + ') should be smaller than data[' + comparableIndex + '] (' + (0, _typeOf.typeOf)(comparable) + ')';\n assert.equal((0, _compare.default)(suspect, comparable), -1, failureMessage);\n }\n }\n }\n\n ['@test comparables should return values in the range of -1, 0, 1'](assert) {\n var negOne = Comp.create({\n val: -1\n });\n var zero = Comp.create({\n val: 0\n });\n var one = Comp.create({\n val: 1\n });\n assert.equal((0, _compare.default)(negOne, 'a'), -1, 'First item comparable - returns -1 (not negated)');\n assert.equal((0, _compare.default)(zero, 'b'), 0, 'First item comparable - returns 0 (not negated)');\n assert.equal((0, _compare.default)(one, 'c'), 1, 'First item comparable - returns 1 (not negated)');\n assert.equal((0, _compare.default)('a', negOne), 1, 'Second item comparable - returns -1 (negated)');\n assert.equal((0, _compare.default)('b', zero), 0, 'Second item comparable - returns 0 (negated)');\n assert.equal((0, _compare.default)('c', one), -1, 'Second item comparable - returns 1 (negated)');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/core/isEqual_test\", [\"@ember/-internals/runtime/lib/is-equal\", \"internal-test-helpers\"], function (_isEqual, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('isEqual', class extends _internalTestHelpers.AbstractTestCase {\n ['@test undefined and null'](assert) {\n assert.ok((0, _isEqual.default)(undefined, undefined), 'undefined is equal to undefined');\n assert.ok(!(0, _isEqual.default)(undefined, null), 'undefined is not equal to null');\n assert.ok((0, _isEqual.default)(null, null), 'null is equal to null');\n assert.ok(!(0, _isEqual.default)(null, undefined), 'null is not equal to undefined');\n }\n\n ['@test strings should be equal'](assert) {\n assert.ok(!(0, _isEqual.default)('Hello', 'Hi'), 'different Strings are unequal');\n assert.ok((0, _isEqual.default)('Hello', 'Hello'), 'same Strings are equal');\n }\n\n ['@test numericals should be equal'](assert) {\n assert.ok((0, _isEqual.default)(24, 24), 'same numbers are equal');\n assert.ok(!(0, _isEqual.default)(24, 21), 'different numbers are inequal');\n }\n\n ['@test dates should be equal'](assert) {\n assert.ok((0, _isEqual.default)(new Date(1985, 7, 22), new Date(1985, 7, 22)), 'same dates are equal');\n assert.ok(!(0, _isEqual.default)(new Date(2014, 7, 22), new Date(1985, 7, 22)), 'different dates are not equal');\n }\n\n ['@test array should be equal'](assert) {\n // NOTE: We don't test for array contents -- that would be too expensive.\n assert.ok(!(0, _isEqual.default)([1, 2], [1, 2]), 'two array instances with the same values should not be equal');\n assert.ok(!(0, _isEqual.default)([1, 2], [1]), 'two array instances with different values should not be equal');\n }\n\n ['@test first object implements isEqual should use it'](assert) {\n assert.ok((0, _isEqual.default)({\n isEqual() {\n return true;\n }\n\n }, null), 'should return true always');\n var obj = {\n isEqual() {\n return false;\n }\n\n };\n assert.equal((0, _isEqual.default)(obj, obj), false, 'should return false because isEqual returns false');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/core/is_array_test\", [\"@ember/-internals/runtime/lib/mixins/array\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/browser-environment\", \"internal-test-helpers\"], function (_array, _array_proxy, _object, _browserEnvironment, _internalTestHelpers) {\n \"use strict\";\n\n var global = void 0;\n (0, _internalTestHelpers.moduleFor)('Ember Type Checking', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.isArray'](assert) {\n var numarray = [1, 2, 3];\n var number = 23;\n var strarray = ['Hello', 'Hi'];\n var string = 'Hello';\n var object = {};\n var length = {\n length: 12\n };\n var strangeLength = {\n length: 'yes'\n };\n\n var fn = function () {};\n\n var asyncFn = async function () {};\n\n var arrayProxy = _array_proxy.default.create({\n content: (0, _array.A)()\n });\n\n assert.equal((0, _array.isArray)(numarray), true, '[1,2,3]');\n assert.equal((0, _array.isArray)(number), false, '23');\n assert.equal((0, _array.isArray)(strarray), true, '[\"Hello\", \"Hi\"]');\n assert.equal((0, _array.isArray)(string), false, '\"Hello\"');\n assert.equal((0, _array.isArray)(object), false, '{}');\n assert.equal((0, _array.isArray)(length), true, '{ length: 12 }');\n assert.equal((0, _array.isArray)(strangeLength), false, '{ length: \"yes\" }');\n assert.equal((0, _array.isArray)(global), false, 'global');\n assert.equal((0, _array.isArray)(fn), false, 'function() {}');\n assert.equal((0, _array.isArray)(asyncFn), false, 'async function() {}');\n assert.equal((0, _array.isArray)(arrayProxy), true, '[]');\n }\n\n '@test Ember.isArray does not trigger proxy assertion when probing for length GH#16495'(assert) {\n var instance = _object.default.extend({\n // intentionally returning non-null / non-undefined\n unknownProperty() {\n return false;\n }\n\n }).create();\n\n assert.equal((0, _array.isArray)(instance), false);\n }\n\n ['@test Ember.isArray(fileList)'](assert) {\n if (_browserEnvironment.window && typeof _browserEnvironment.window.FileList === 'function') {\n var fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n var fileList = fileListElement.files;\n assert.equal((0, _array.isArray)(fileList), false, 'fileList');\n } else {\n assert.ok(true, 'FileList is not present on window');\n }\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/core/is_empty_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_metal, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.isEmpty', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.isEmpty'](assert) {\n var arrayProxy = _array_proxy.default.create({\n content: (0, _array.A)()\n });\n\n assert.equal(true, (0, _metal.isEmpty)(arrayProxy), 'for an ArrayProxy that has empty content');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/core/type_of_test\", [\"@ember/-internals/runtime/lib/type-of\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/browser-environment\", \"internal-test-helpers\"], function (_typeOf, _object, _browserEnvironment, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember Type Checking', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.typeOf'](assert) {\n var MockedDate = function () {};\n\n MockedDate.prototype = new Date();\n var mockedDate = new MockedDate();\n var date = new Date();\n var error = new Error('boum');\n var object = {\n a: 'b'\n };\n var a = null;\n var arr = [1, 2, 3];\n var obj = {};\n\n var instance = _object.default.create({\n method() {},\n\n async asyncMethod() {}\n\n });\n\n assert.equal((0, _typeOf.typeOf)(), 'undefined', 'undefined');\n assert.equal((0, _typeOf.typeOf)(null), 'null', 'null');\n assert.equal((0, _typeOf.typeOf)('Cyril'), 'string', 'Cyril');\n assert.equal((0, _typeOf.typeOf)(101), 'number', '101');\n assert.equal((0, _typeOf.typeOf)(true), 'boolean', 'true');\n assert.equal((0, _typeOf.typeOf)([1, 2, 90]), 'array', '[1,2,90]');\n assert.equal((0, _typeOf.typeOf)(/abc/), 'regexp', '/abc/');\n assert.equal((0, _typeOf.typeOf)(date), 'date', 'new Date()');\n assert.equal((0, _typeOf.typeOf)(mockedDate), 'date', 'mocked date');\n assert.equal((0, _typeOf.typeOf)(error), 'error', 'error');\n assert.equal((0, _typeOf.typeOf)(object), 'object', 'object');\n assert.equal((0, _typeOf.typeOf)(undefined), 'undefined', 'item of type undefined');\n assert.equal((0, _typeOf.typeOf)(a), 'null', 'item of type null');\n assert.equal((0, _typeOf.typeOf)(arr), 'array', 'item of type array');\n assert.equal((0, _typeOf.typeOf)(obj), 'object', 'item of type object');\n assert.equal((0, _typeOf.typeOf)(instance), 'instance', 'item of type instance');\n assert.equal((0, _typeOf.typeOf)(instance.method), 'function', 'item of type function');\n assert.equal((0, _typeOf.typeOf)(instance.asyncMethod), 'function', 'item of type async function');\n assert.equal((0, _typeOf.typeOf)(_object.default.extend()), 'class', 'item of type class');\n assert.equal((0, _typeOf.typeOf)(new Error()), 'error', 'item of type error');\n }\n\n ['@test Ember.typeOf(fileList)'](assert) {\n if (_browserEnvironment.window && typeof _browserEnvironment.window.FileList === 'function') {\n var fileListElement = document.createElement('input');\n fileListElement.type = 'file';\n var fileList = fileListElement.files;\n assert.equal((0, _typeOf.typeOf)(fileList), 'filelist', 'item of type filelist');\n } else {\n assert.ok(true, 'FileList is not present on window');\n }\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/ext/rsvp_test\", [\"@ember/runloop\", \"@ember/-internals/error-handling\", \"@ember/-internals/runtime/lib/ext/rsvp\", \"@ember/debug\", \"internal-test-helpers\"], function (_runloop, _errorHandling, _rsvp, _debug, _internalTestHelpers) {\n \"use strict\";\n\n var ORIGINAL_ONERROR = (0, _errorHandling.getOnerror)();\n (0, _internalTestHelpers.moduleFor)('Ember.RSVP', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n (0, _errorHandling.setOnerror)(ORIGINAL_ONERROR);\n }\n\n ['@test Ensure that errors thrown from within a promise are sent to the console'](assert) {\n var error = new Error('Error thrown in a promise for testing purposes.');\n\n try {\n (0, _runloop.run)(function () {\n new _rsvp.default.Promise(function () {\n throw error;\n });\n });\n assert.ok(false, 'expected assertion to be thrown');\n } catch (e) {\n assert.equal(e, error, 'error was re-thrown');\n }\n }\n\n ['@test TransitionAborted errors are not re-thrown'](assert) {\n assert.expect(1);\n var fakeTransitionAbort = {\n name: 'TransitionAborted'\n };\n (0, _runloop.run)(_rsvp.default, 'reject', fakeTransitionAbort);\n assert.ok(true, 'did not throw an error when dealing with TransitionAborted');\n }\n\n ['@test Can reject with non-Error object'](assert) {\n var wasEmberTesting = (0, _debug.isTesting)();\n (0, _debug.setTesting)(false);\n assert.expect(1);\n\n try {\n (0, _runloop.run)(_rsvp.default, 'reject', 'foo');\n } catch (e) {\n assert.equal(e, 'foo', 'should throw with rejection message');\n } finally {\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test Can reject with no arguments'](assert) {\n var wasEmberTesting = (0, _debug.isTesting)();\n (0, _debug.setTesting)(false);\n assert.expect(1);\n\n try {\n (0, _runloop.run)(_rsvp.default, 'reject');\n } catch (e) {\n assert.ok(false, 'should not throw');\n } finally {\n (0, _debug.setTesting)(wasEmberTesting);\n }\n\n assert.ok(true);\n }\n\n ['@test rejections like jqXHR which have errorThrown property work'](assert) {\n assert.expect(2);\n var wasEmberTesting = (0, _debug.isTesting)();\n var wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error, actualError, 'expected the real error on the jqXHR');\n assert.equal(error.__reason_with_error_thrown__, jqXHR, 'also retains a helpful reference to the rejection reason');\n });\n var actualError = new Error('OMG what really happened');\n var jqXHR = {\n errorThrown: actualError\n };\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test rejections where the errorThrown is a string should wrap the sting in an error object'](assert) {\n assert.expect(2);\n var wasEmberTesting = (0, _debug.isTesting)();\n var wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error.message, actualError, 'expected the real error on the jqXHR');\n assert.equal(error.__reason_with_error_thrown__, jqXHR, 'also retains a helpful reference to the rejection reason');\n });\n var actualError = 'OMG what really happened';\n var jqXHR = {\n errorThrown: actualError\n };\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n ['@test rejections can be serialized to JSON'](assert) {\n assert.expect(2);\n var wasEmberTesting = (0, _debug.isTesting)();\n var wasOnError = (0, _errorHandling.getOnerror)();\n\n try {\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(error => {\n assert.equal(error.message, 'a fail');\n assert.ok(JSON.stringify(error), 'Error can be serialized');\n });\n var jqXHR = {\n errorThrown: new Error('a fail')\n };\n (0, _runloop.run)(_rsvp.default, 'reject', jqXHR);\n } finally {\n (0, _errorHandling.setOnerror)(wasOnError);\n (0, _debug.setTesting)(wasEmberTesting);\n }\n }\n\n });\n var reason = 'i failed';\n\n function ajax() {\n return new _rsvp.default.Promise(function (resolve) {\n setTimeout(resolve, 0); // fake true / foreign async\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.test: rejection assertions', class extends _internalTestHelpers.AbstractTestCase {\n ['@test unambigiously unhandled rejection'](assert) {\n assert.throws(function () {\n (0, _runloop.run)(function () {\n _rsvp.default.Promise.reject(reason);\n }); // something is funky, we should likely assert\n }, reason);\n }\n\n ['@test sync handled'](assert) {\n (0, _runloop.run)(function () {\n _rsvp.default.Promise.reject(reason).catch(function () {});\n }); // handled, we shouldn't need to assert.\n\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled within the same micro-task (via Ember.RVP.Promise)'](assert) {\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n _rsvp.default.Promise.resolve(1).then(() => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\n\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled within the same micro-task (via direct run-loop)'](assert) {\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n (0, _runloop.schedule)('afterRender', () => rejection.catch(function () {}));\n }); // handled, we shouldn't need to assert.\n\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled in the next microTask queue flush (next)'](assert) {\n assert.expect(2);\n var done = assert.async();\n assert.throws(function () {\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n (0, _runloop.next)(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason); // a promise rejection survived a full flush of the run-loop without being handled\n // this is very likely an issue.\n }\n\n ['@test handled in the same microTask Queue flush do to data locality'](assert) {\n // an ambiguous scenario, this may or may not assert\n // it depends on the locality of `user#1`\n var store = {\n find() {\n return _rsvp.default.Promise.resolve(1);\n }\n\n };\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n store.find('user', 1).then(() => rejection.catch(function () {}));\n });\n assert.ok(true, 'reached end of test');\n }\n\n ['@test handled in a different microTask Queue flush do to data locality'](assert) {\n var done = assert.async(); // an ambiguous scenario, this may or may not assert\n // it depends on the locality of `user#1`\n\n var store = {\n find() {\n return ajax();\n }\n\n };\n assert.throws(function () {\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n store.find('user', 1).then(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n }\n\n ['@test handled in the next microTask queue flush (ajax example)'](assert) {\n var done = assert.async();\n assert.throws(function () {\n (0, _runloop.run)(function () {\n var rejection = _rsvp.default.Promise.reject(reason);\n\n ajax().then(() => {\n rejection.catch(function () {});\n assert.ok(true, 'reached end of test');\n done();\n });\n });\n }, reason);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/helpers/array\", [\"exports\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"@ember/-internals/utils\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_exports, _array_proxy, _array, _utils, _metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.newFixture = newFixture;\n _exports.newObjectsFixture = newObjectsFixture;\n _exports.runArrayTests = runArrayTests;\n\n function newFixture(cnt) {\n var ret = [];\n\n while (--cnt >= 0) {\n ret.push((0, _utils.generateGuid)());\n }\n\n return ret;\n }\n\n function newObjectsFixture(cnt) {\n var ret = [];\n var item;\n\n while (--cnt >= 0) {\n item = {};\n (0, _utils.guidFor)(item);\n ret.push(item);\n }\n\n return ret;\n }\n\n var ArrayTestsObserverClass = _object.default.extend({\n init() {\n this._super(...arguments);\n\n this.isEnabled = true;\n this.reset();\n },\n\n reset() {\n this._keys = {};\n this._values = {};\n this._before = null;\n this._after = null;\n return this;\n },\n\n observe(obj, ...keys) {\n if (obj.addObserver) {\n var loc = keys.length;\n\n while (--loc >= 0) {\n obj.addObserver(keys[loc], this, 'propertyDidChange');\n }\n } else {\n this.isEnabled = false;\n }\n\n return this;\n },\n\n observeArray(obj) {\n (0, _metal.addArrayObserver)(obj, this);\n return this;\n },\n\n stopObserveArray(obj) {\n (0, _metal.removeArrayObserver)(obj, this);\n return this;\n },\n\n propertyDidChange(target, key, value) {\n if (this._keys[key] === undefined) {\n this._keys[key] = 0;\n }\n\n this._keys[key]++;\n this._values[key] = value;\n },\n\n arrayWillChange() {\n this.assert.equal(this._before, null, 'should only call once');\n this._before = Array.prototype.slice.call(arguments);\n },\n\n arrayDidChange() {\n this.assert.equal(this._after, null, 'should only call once');\n this._after = Array.prototype.slice.call(arguments);\n },\n\n validate(key, value) {\n if (!this.isEnabled) {\n return true;\n }\n\n if (!this._keys[key]) {\n return false;\n }\n\n if (arguments.length > 1) {\n return this._values[key] === value;\n } else {\n return true;\n }\n },\n\n timesCalled(key) {\n return this._keys[key] || 0;\n }\n\n });\n\n class AbstractArrayHelper {\n beforeEach(assert) {\n this.assert = assert;\n }\n\n newObject(ary) {\n return ary ? ary.slice() : newFixture(3);\n }\n\n toArray(obj) {\n return obj.slice();\n }\n\n newObserver() {\n var ret = ArrayTestsObserverClass.create({\n assert: this.assert\n });\n\n if (arguments.length > 0) {\n ret.observe.apply(ret, arguments);\n }\n\n return ret;\n }\n\n }\n\n class NativeArrayHelpers extends AbstractArrayHelper {\n newObject(ary) {\n return (0, _array.A)(super.newObject(ary));\n }\n\n mutate(obj) {\n obj.pushObject(obj.length + 1);\n }\n\n }\n\n class ArrayProxyHelpers extends AbstractArrayHelper {\n newObject(ary) {\n return _array_proxy.default.create({\n content: (0, _array.A)(super.newObject(ary))\n });\n }\n\n mutate(obj) {\n obj.pushObject((0, _metal.get)(obj, 'length') + 1);\n }\n\n toArray(obj) {\n return obj.toArray ? obj.toArray() : obj.slice();\n }\n\n }\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n\n\n var TestArray = _object.default.extend(_array.default, {\n _content: null,\n\n init() {\n this._content = this._content || [];\n },\n\n // some methods to modify the array so we can test changes. Note that\n // arrays can be modified even if they don't implement MutableArray. The\n // MutableArray is just a standard API for mutation but not required.\n addObject(obj) {\n var idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n\n this._content.push(obj);\n\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n\n this._content.shift();\n\n (0, _metal.arrayContentDidChange)(this, 0, 1, 0);\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n })\n });\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n\n\n var TestMutableArray = _object.default.extend(_array.MutableArray, {\n _content: null,\n\n init(ary = []) {\n this._content = (0, _array.A)(ary);\n },\n\n replace(idx, amt, objects) {\n var args = objects ? objects.slice() : [];\n var removeAmt = amt;\n var addAmt = args.length;\n (0, _metal.arrayContentWillChange)(this, idx, removeAmt, addAmt);\n args.unshift(amt);\n args.unshift(idx);\n\n this._content.splice.apply(this._content, args);\n\n (0, _metal.arrayContentDidChange)(this, idx, removeAmt, addAmt);\n return this;\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n }),\n\n slice() {\n return this._content.slice();\n }\n\n });\n\n class MutableArrayHelpers extends NativeArrayHelpers {\n newObject(ary) {\n return TestMutableArray.create(super.newObject(ary));\n } // allows for testing of the basic enumerable after an internal mutation\n\n\n mutate(obj) {\n obj.addObject(this.getFixture(1)[0]);\n }\n\n }\n\n class EmberArrayHelpers extends MutableArrayHelpers {\n newObject(ary) {\n return TestArray.create(super.newObject(ary));\n }\n\n }\n\n function runArrayTests(name, Tests, ...types) {\n if (types.length > 0) {\n types.forEach(type => {\n switch (type) {\n case 'ArrayProxy':\n (0, _internalTestHelpers.moduleFor)(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);\n break;\n\n case 'EmberArray':\n (0, _internalTestHelpers.moduleFor)(`EmberArray: ${name}`, Tests, EmberArrayHelpers);\n break;\n\n case 'MutableArray':\n (0, _internalTestHelpers.moduleFor)(`MutableArray: ${name}`, Tests, MutableArrayHelpers);\n break;\n\n case 'NativeArray':\n (0, _internalTestHelpers.moduleFor)(`NativeArray: ${name}`, Tests, NativeArrayHelpers);\n break;\n\n default:\n throw new Error(`runArrayTests passed unexpected type ${type}`);\n }\n });\n } else {\n (0, _internalTestHelpers.moduleFor)(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);\n (0, _internalTestHelpers.moduleFor)(`EmberArray: ${name}`, Tests, EmberArrayHelpers);\n (0, _internalTestHelpers.moduleFor)(`MutableArray: ${name}`, Tests, MutableArrayHelpers);\n (0, _internalTestHelpers.moduleFor)(`NativeArray: ${name}`, Tests, NativeArrayHelpers);\n }\n }\n});","define(\"@ember/-internals/runtime/tests/inject_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('inject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test attempting to inject a nonexistent container key should error']() {\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n var AnObject = _object.default.extend({\n foo: (0, _metal.inject)('bar', 'baz')\n });\n\n owner.register('foo:main', AnObject);\n expectAssertion(() => {\n owner.lookup('foo:main');\n }, /Attempting to inject an unknown injection: 'bar:baz'/);\n }\n\n ['@test factories should return a list of lazy injection full names'](assert) {\n if (true\n /* DEBUG */\n ) {\n var AnObject = _object.default.extend({\n foo: (0, _metal.inject)('foo', 'bar'),\n bar: (0, _metal.inject)('quux')\n });\n\n assert.deepEqual(AnObject._lazyInjections(), {\n foo: {\n specifier: 'foo:bar',\n source: undefined,\n namespace: undefined\n },\n bar: {\n specifier: 'quux:bar',\n source: undefined,\n namespace: undefined\n }\n }, 'should return injected container keys');\n } else {\n assert.expect(0);\n }\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/legacy_1x/mixins/observable/chained_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_metal, _object, _array, _internalTestHelpers) {\n \"use strict\";\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * changed obj.set() and obj.get() to Ember.set() and Ember.get()\n * changed obj.addObserver() to addObserver()\n */\n (0, _internalTestHelpers.moduleFor)('Ember.Observable - Observing with @each', class extends _internalTestHelpers.AbstractTestCase {\n async ['@test chained observers on enumerable properties are triggered when the observed property of any item changes'](assert) {\n var family = _object.default.create({\n momma: null\n });\n\n var momma = _object.default.create({\n children: []\n });\n\n var child1 = _object.default.create({\n name: 'Bartholomew'\n });\n\n var child2 = _object.default.create({\n name: 'Agnes'\n });\n\n var child3 = _object.default.create({\n name: 'Dan'\n });\n\n var child4 = _object.default.create({\n name: 'Nancy'\n });\n\n (0, _metal.set)(family, 'momma', momma);\n (0, _metal.set)(momma, 'children', (0, _array.A)([child1, child2, child3]));\n var observerFiredCount = 0;\n (0, _metal.addObserver)(family, 'momma.children.@each.name', this, function () {\n observerFiredCount++;\n });\n observerFiredCount = 0;\n\n for (var i = 0; i < momma.children.length; i++) {\n momma.children[i].set('name', 'Juan');\n await (0, _internalTestHelpers.runLoopSettled)();\n }\n\n assert.equal(observerFiredCount, 3, 'observer fired after changing child names');\n observerFiredCount = 0;\n (0, _metal.get)(momma, 'children').pushObject(child4);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(observerFiredCount, 1, 'observer fired after adding a new item');\n observerFiredCount = 0;\n (0, _metal.set)(child4, 'name', 'Herbert');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(observerFiredCount, 1, 'observer fired after changing property on new object');\n (0, _metal.set)(momma, 'children', []);\n await (0, _internalTestHelpers.runLoopSettled)();\n observerFiredCount = 0;\n (0, _metal.set)(child1, 'name', 'Hanna');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(observerFiredCount, 0, 'observer did not fire after removing changing property on a removed object');\n family.destroy();\n momma.destroy();\n child1.destroy();\n child2.destroy();\n child3.destroy();\n child4.destroy();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/legacy_1x/mixins/observable/observable_test\", [\"@ember/-internals/environment\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/string\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/mixins/observable\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_environment, _runloop, _metal, _string, _object, _observable, _array, _internalTestHelpers) {\n \"use strict\";\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * Added ObservableObject which applies the Ember.Observable mixin.\n * Changed reference to Ember.T_FUNCTION to 'function'\n * Changed all references to sc_super to this._super(...arguments)\n * Changed Ember.objectForPropertyPath() to Ember.getPath()\n * Removed allPropertiesDidChange test - no longer supported\n * Changed test that uses 'ObjectE' as path to 'objectE' to reflect new\n rule on using capital letters for property paths.\n * Removed test passing context to addObserver. context param is no longer\n supported.\n * removed test in observer around line 862 that expected key/value to be\n the last item in the chained path. Should be root and chained path\n \n */\n // ========================================================================\n // Ember.Observable Tests\n // ========================================================================\n var object, objectA, objectB, objectC, objectD, objectE, objectF, lookup;\n\n var ObservableObject = _object.default.extend(_observable.default);\n\n var originalLookup = _environment.context.lookup;\n\n class ObservableTestCase extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n var destroyables = [object, objectA, objectB, objectC, objectD, objectE, objectF].filter(obj => obj && obj.destroy);\n object = objectA = objectC = objectD = objectE = objectF = undefined;\n _environment.context.lookup = originalLookup;\n lookup = undefined;\n destroyables.forEach(obj => obj.destroy());\n return (0, _internalTestHelpers.runLoopSettled)();\n }\n\n } // ..........................................................\n // GET()\n //\n\n\n (0, _internalTestHelpers.moduleFor)('object.get()', class extends ObservableTestCase {\n beforeEach() {\n object = ObservableObject.extend(_observable.default, {\n computed: (0, _metal.computed)(function () {\n return 'value';\n }),\n\n method() {\n return 'value';\n },\n\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\n }\n\n }).create({\n normal: 'value',\n numberVal: 24,\n toggleVal: true,\n nullProperty: null\n });\n }\n\n ['@test should get normal properties'](assert) {\n assert.equal(object.get('normal'), 'value');\n }\n\n ['@test should call computed properties and return their result'](assert) {\n assert.equal(object.get('computed'), 'value');\n }\n\n ['@test should return the function for a non-computed property'](assert) {\n var value = object.get('method');\n assert.equal(typeof value, 'function');\n }\n\n ['@test should return null when property value is null'](assert) {\n assert.equal(object.get('nullProperty'), null);\n }\n\n ['@test should call unknownProperty when value is undefined'](assert) {\n assert.equal(object.get('unknown'), 'unknown');\n assert.equal(object.lastUnknownProperty, 'unknown');\n }\n\n }); // ..........................................................\n // Ember.GET()\n //\n\n (0, _internalTestHelpers.moduleFor)('Ember.get()', class extends ObservableTestCase {\n beforeEach() {\n objectA = ObservableObject.extend({\n computed: (0, _metal.computed)(function () {\n return 'value';\n }),\n\n method() {\n return 'value';\n },\n\n unknownProperty(key) {\n this.lastUnknownProperty = key;\n return 'unknown';\n }\n\n }).create({\n normal: 'value',\n numberVal: 24,\n toggleVal: true,\n nullProperty: null\n });\n objectB = {\n normal: 'value',\n nullProperty: null\n };\n }\n\n ['@test should get normal properties on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'normal'), 'value');\n }\n\n ['@test should call computed properties on Ember.Observable and return their result'](assert) {\n assert.equal((0, _metal.get)(objectA, 'computed'), 'value');\n }\n\n ['@test should return the function for a non-computed property on Ember.Observable'](assert) {\n var value = (0, _metal.get)(objectA, 'method');\n assert.equal(typeof value, 'function');\n }\n\n ['@test should return null when property value is null on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'nullProperty'), null);\n }\n\n ['@test should call unknownProperty when value is undefined on Ember.Observable'](assert) {\n assert.equal((0, _metal.get)(objectA, 'unknown'), 'unknown');\n assert.equal(objectA.lastUnknownProperty, 'unknown');\n }\n\n ['@test should get normal properties on standard objects'](assert) {\n assert.equal((0, _metal.get)(objectB, 'normal'), 'value');\n }\n\n ['@test should return null when property is null on standard objects'](assert) {\n assert.equal((0, _metal.get)(objectB, 'nullProperty'), null);\n }\n\n ['@test raise if the provided object is undefined']() {\n expectAssertion(function () {\n (0, _metal.get)(undefined, 'key');\n }, /Cannot call get with 'key' on an undefined object/i);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Ember.get() with paths', class extends ObservableTestCase {\n ['@test should return a property at a given path relative to the passed object'](assert) {\n var foo = ObservableObject.create({\n bar: ObservableObject.extend({\n baz: (0, _metal.computed)(function () {\n return 'blargh';\n })\n }).create()\n });\n assert.equal((0, _metal.get)(foo, 'bar.baz'), 'blargh');\n }\n\n ['@test should return a property at a given path relative to the passed object - JavaScript hash'](assert) {\n var foo = {\n bar: {\n baz: 'blargh'\n }\n };\n assert.equal((0, _metal.get)(foo, 'bar.baz'), 'blargh');\n }\n\n }); // ..........................................................\n // SET()\n //\n\n (0, _internalTestHelpers.moduleFor)('object.set()', class extends ObservableTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n return this._computed;\n },\n\n set(key, value) {\n this._computed = value;\n return this._computed;\n }\n\n }),\n\n method(key, value) {\n if (value !== undefined) {\n this._method = value;\n }\n\n return this._method;\n },\n\n unknownProperty() {\n return this._unknown;\n },\n\n setUnknownProperty(key, value) {\n this._unknown = value;\n return this._unknown;\n },\n\n // normal property\n normal: 'value',\n // computed property\n _computed: 'computed',\n // method, but not a property\n _method: 'method',\n // null property\n nullProperty: null,\n // unknown property\n _unknown: 'unknown'\n }).create();\n }\n\n ['@test should change normal properties and return the value'](assert) {\n var ret = object.set('normal', 'changed');\n assert.equal(object.get('normal'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should call computed properties passing value and return the value'](assert) {\n var ret = object.set('computed', 'changed');\n assert.equal(object.get('_computed'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should change normal properties when passing undefined'](assert) {\n var ret = object.set('normal', undefined);\n assert.equal(object.get('normal'), undefined);\n assert.equal(ret, undefined);\n }\n\n ['@test should replace the function for a non-computed property and return the value'](assert) {\n var ret = object.set('method', 'changed');\n assert.equal(object.get('_method'), 'method'); // make sure this was NOT run\n\n assert.ok(typeof object.get('method') !== 'function');\n assert.equal(ret, 'changed');\n }\n\n ['@test should replace prover when property value is null'](assert) {\n var ret = object.set('nullProperty', 'changed');\n assert.equal(object.get('nullProperty'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n ['@test should call unknownProperty with value when property is undefined'](assert) {\n var ret = object.set('unknown', 'changed');\n assert.equal(object.get('_unknown'), 'changed');\n assert.equal(ret, 'changed');\n }\n\n }); // ..........................................................\n // COMPUTED PROPERTIES\n //\n\n (0, _internalTestHelpers.moduleFor)('Computed properties', class extends ObservableTestCase {\n beforeEach() {\n lookup = _environment.context.lookup = {};\n object = ObservableObject.extend({\n computed: (0, _metal.computed)({\n get() {\n this.computedCalls.push('getter-called');\n return 'computed';\n },\n\n set(key, value) {\n this.computedCalls.push(value);\n }\n\n }),\n dependent: (0, _metal.computed)('changer', {\n get() {\n this.dependentCalls.push('getter-called');\n return 'dependent';\n },\n\n set(key, value) {\n this.dependentCalls.push(value);\n }\n\n }),\n inc: (0, _metal.computed)('changer', function () {\n return this.incCallCount++;\n }),\n nestedInc: (0, _metal.computed)('inc', function () {\n (0, _metal.get)(this, 'inc');\n return this.nestedIncCallCount++;\n }),\n isOn: (0, _metal.computed)('state', {\n get() {\n return this.get('state') === 'on';\n },\n\n set() {\n this.set('state', 'on');\n return this.get('state') === 'on';\n }\n\n }),\n isOff: (0, _metal.computed)('state', {\n get() {\n return this.get('state') === 'off';\n },\n\n set() {\n this.set('state', 'off');\n return this.get('state') === 'off';\n }\n\n })\n }).create({\n computedCalls: [],\n changer: 'foo',\n dependentCalls: [],\n incCallCount: 0,\n nestedIncCallCount: 0,\n state: 'on'\n });\n }\n\n ['@test getting values should call function return value'](assert) {\n // get each property twice. Verify return.\n var keys = (0, _string.w)('computed dependent');\n keys.forEach(function (key) {\n assert.equal(object.get(key), key, `Try #1: object.get(${key}) should run function`);\n assert.equal(object.get(key), key, `Try #2: object.get(${key}) should run function`);\n }); // verify each call count. cached should only be called once\n\n (0, _string.w)('computedCalls dependentCalls').forEach(key => {\n assert.equal(object[key].length, 1, `non-cached property ${key} should be called 1x`);\n });\n }\n\n ['@test setting values should call function return value'](assert) {\n // get each property twice. Verify return.\n var keys = (0, _string.w)('computed dependent');\n var values = (0, _string.w)('value1 value2');\n keys.forEach(key => {\n assert.equal(object.set(key, values[0]), values[0], `Try #1: object.set(${key}, ${values[0]}) should run function`);\n assert.equal(object.set(key, values[1]), values[1], `Try #2: object.set(${key}, ${values[1]}) should run function`);\n assert.equal(object.set(key, values[1]), values[1], `Try #3: object.set(${key}, ${values[1]}) should not run function since it is setting same value as before`);\n }); // verify each call count. cached should only be called once\n\n keys.forEach(key => {\n var calls = object[key + 'Calls'];\n var idx, expectedLength; // Cached properties first check their cached value before setting the\n // property. Other properties blindly call set.\n\n expectedLength = 3;\n assert.equal(calls.length, expectedLength, `set(${key}) should be called the right amount of times`);\n\n for (idx = 0; idx < 2; idx++) {\n assert.equal(calls[idx], values[idx], `call #${idx + 1} to set(${key}) should have passed value ${values[idx]}`);\n }\n });\n }\n\n ['@test notify change should clear cache'](assert) {\n // call get several times to collect call count\n object.get('computed'); // should run func\n\n object.get('computed'); // should not run func\n\n object.notifyPropertyChange('computed');\n object.get('computed'); // should run again\n\n assert.equal(object.computedCalls.length, 2, 'should have invoked method 2x');\n }\n\n ['@test change dependent should clear cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n object.set('changer', 'bar');\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test just notifying change of dependent should clear cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop');\n object.notifyPropertyChange('changer');\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test changing dependent should clear nested cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('nestedInc'); // should run func\n\n assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n object.set('changer', 'bar');\n assert.equal(object.get('nestedInc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }\n\n ['@test just notifying change of dependent should clear nested cache'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('nestedInc'); // should run func\n\n assert.equal(object.get('nestedInc'), ret1, 'multiple calls should not run cached prop');\n object.notifyPropertyChange('changer');\n assert.equal(object.get('nestedInc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n } // This verifies a specific bug encountered where observers for computed\n // properties would fire before their prop caches were cleared.\n\n\n ['@test change dependent should clear cache when observers of dependent are called'](assert) {\n // call get several times to collect call count\n var ret1 = object.get('inc'); // should run func\n\n assert.equal(object.get('inc'), ret1, 'multiple calls should not run cached prop'); // add observer to verify change...\n\n object.addObserver('inc', this, function () {\n assert.equal(object.get('inc'), ret1 + 1, 'should increment after dependent key changes'); // should run again\n }); // now run\n\n object.set('changer', 'bar');\n }\n\n ['@test setting one of two computed properties that depend on a third property should clear the kvo cache'](assert) {\n // we have to call set twice to fill up the cache\n object.set('isOff', true);\n object.set('isOn', true); // setting isOff to true should clear the kvo cache\n\n object.set('isOff', true);\n assert.equal(object.get('isOff'), true, 'object.isOff should be true');\n assert.equal(object.get('isOn'), false, 'object.isOn should be false');\n }\n\n ['@test dependent keys should be able to be specified as property paths'](assert) {\n var depObj = ObservableObject.extend({\n menuPrice: (0, _metal.computed)('menu.price', function () {\n return this.get('menu.price');\n })\n }).create({\n menu: ObservableObject.create({\n price: 5\n })\n });\n assert.equal(depObj.get('menuPrice'), 5, 'precond - initial value returns 5');\n depObj.set('menu.price', 6);\n assert.equal(depObj.get('menuPrice'), 6, 'cache is properly invalidated after nested property changes');\n }\n\n ['@test cacheable nested dependent keys should clear after their dependencies update'](assert) {\n assert.ok(true);\n var DepObj;\n (0, _runloop.run)(function () {\n lookup.DepObj = DepObj = ObservableObject.extend({\n price: (0, _metal.computed)('restaurant.menu.price', function () {\n return this.get('restaurant.menu.price');\n })\n }).create({\n restaurant: ObservableObject.create({\n menu: ObservableObject.create({\n price: 5\n })\n })\n });\n });\n assert.equal(DepObj.get('price'), 5, 'precond - computed property is correct');\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu.price', 10);\n });\n assert.equal(DepObj.get('price'), 10, 'cacheable computed properties are invalidated even if no run loop occurred');\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu.price', 20);\n });\n assert.equal(DepObj.get('price'), 20, 'cacheable computed properties are invalidated after a second get before a run loop');\n assert.equal(DepObj.get('price'), 20, 'precond - computed properties remain correct after a run loop');\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 15\n }));\n });\n assert.equal(DepObj.get('price'), 15, 'cacheable computed properties are invalidated after a middle property changes');\n (0, _runloop.run)(function () {\n DepObj.set('restaurant.menu', ObservableObject.create({\n price: 25\n }));\n });\n assert.equal(DepObj.get('price'), 25, 'cacheable computed properties are invalidated after a middle property changes again, before a run loop');\n }\n\n }); // ..........................................................\n // OBSERVABLE OBJECTS\n //\n\n (0, _internalTestHelpers.moduleFor)('Observable objects & object properties ', class extends ObservableTestCase {\n beforeEach() {\n object = ObservableObject.extend({\n getEach() {\n var keys = ['normal', 'abnormal'];\n var ret = [];\n\n for (var idx = 0; idx < keys.length; idx++) {\n ret[ret.length] = this.get(keys[idx]);\n }\n\n return ret;\n },\n\n newObserver() {\n this.abnormal = 'changedValueObserved';\n },\n\n testObserver: (0, _metal.observer)('normal', function () {\n this.abnormal = 'removedObserver';\n }),\n testArrayObserver: (0, _metal.observer)('normalArray.[]', function () {\n this.abnormal = 'notifiedObserver';\n })\n }).create({\n normal: 'value',\n abnormal: 'zeroValue',\n numberVal: 24,\n toggleVal: true,\n observedProperty: 'beingWatched',\n testRemove: 'observerToBeRemoved',\n normalArray: (0, _array.A)([1, 2, 3, 4, 5])\n });\n }\n\n ['@test incrementProperty and decrementProperty'](assert) {\n var newValue = object.incrementProperty('numberVal');\n assert.equal(25, newValue, 'numerical value incremented');\n object.numberVal = 24;\n newValue = object.decrementProperty('numberVal');\n assert.equal(23, newValue, 'numerical value decremented');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', 5);\n assert.equal(30, newValue, 'numerical value incremented by specified increment');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', -5);\n assert.equal(20, newValue, 'minus numerical value incremented by specified increment');\n object.numberVal = 25;\n newValue = object.incrementProperty('numberVal', 0);\n assert.equal(25, newValue, 'zero numerical value incremented by specified increment');\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 0 - void 0); // Increment by NaN\n }, /Must pass a numeric value to incrementProperty/i);\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 'Ember'); // Increment by non-numeric String\n }, /Must pass a numeric value to incrementProperty/i);\n expectAssertion(function () {\n newValue = object.incrementProperty('numberVal', 1 / 0); // Increment by Infinity\n }, /Must pass a numeric value to incrementProperty/i);\n assert.equal(25, newValue, 'Attempting to increment by non-numeric values should not increment value');\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', 5);\n assert.equal(20, newValue, 'numerical value decremented by specified increment');\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', -5);\n assert.equal(30, newValue, 'minus numerical value decremented by specified increment');\n object.numberVal = 25;\n newValue = object.decrementProperty('numberVal', 0);\n assert.equal(25, newValue, 'zero numerical value decremented by specified increment');\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 0 - void 0); // Decrement by NaN\n }, /Must pass a numeric value to decrementProperty/i);\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 'Ember'); // Decrement by non-numeric String\n }, /Must pass a numeric value to decrementProperty/i);\n expectAssertion(function () {\n newValue = object.decrementProperty('numberVal', 1 / 0); // Decrement by Infinity\n }, /Must pass a numeric value to decrementProperty/i);\n assert.equal(25, newValue, 'Attempting to decrement by non-numeric values should not decrement value');\n }\n\n ['@test toggle function, should be boolean'](assert) {\n assert.equal(object.toggleProperty('toggleVal', true, false), object.get('toggleVal'));\n assert.equal(object.toggleProperty('toggleVal', true, false), object.get('toggleVal'));\n assert.equal(object.toggleProperty('toggleVal', undefined, undefined), object.get('toggleVal'));\n }\n\n async ['@test should notify array observer when array changes'](assert) {\n (0, _metal.get)(object, 'normalArray').replace(0, 0, [6]);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(object.abnormal, 'notifiedObserver', 'observer should be notified');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('object.addObserver()', class extends ObservableTestCase {\n beforeEach() {\n objectE = ObservableObject.create({\n propertyVal: 'chainedProperty'\n });\n objectC = ObservableObject.create({\n objectE,\n normal: 'value',\n normal1: 'zeroValue',\n normal2: 'dependentValue',\n incrementor: 10,\n\n action() {\n this.normal1 = 'newZeroValue';\n },\n\n observeOnceAction() {\n this.incrementor = this.incrementor + 1;\n },\n\n chainedObserver() {\n this.normal2 = 'chainedPropertyObserved';\n }\n\n });\n }\n\n async ['@test should register an observer for a property'](assert) {\n objectC.addObserver('normal', objectC, 'action');\n objectC.set('normal', 'newValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(objectC.normal1, 'newZeroValue');\n }\n\n async ['@test should register an observer for a property - Special case of chained property'](assert) {\n objectC.addObserver('objectE.propertyVal', objectC, 'chainedObserver');\n objectC.objectE.set('propertyVal', 'chainedPropertyValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal('chainedPropertyObserved', objectC.normal2);\n objectC.normal2 = 'dependentValue';\n objectC.set('objectE', '');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal('chainedPropertyObserved', objectC.normal2);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('object.removeObserver()', class extends ObservableTestCase {\n beforeEach() {\n objectF = ObservableObject.create({\n propertyVal: 'chainedProperty'\n });\n objectD = ObservableObject.create({\n objectF,\n normal: 'value',\n normal1: 'zeroValue',\n normal2: 'dependentValue',\n ArrayKeys: ['normal', 'normal1'],\n\n addAction() {\n this.normal1 = 'newZeroValue';\n },\n\n removeAction() {\n this.normal2 = 'newDependentValue';\n },\n\n removeChainedObserver() {\n this.normal2 = 'chainedPropertyObserved';\n },\n\n observableValue: 'hello world',\n\n observer1() {// Just an observer\n },\n\n observer2() {\n this.removeObserver('observableValue', null, 'observer1');\n this.removeObserver('observableValue', null, 'observer2');\n this.hasObserverFor('observableValue'); // Tickle 'getMembers()'\n\n this.removeObserver('observableValue', null, 'observer3');\n },\n\n observer3() {// Just an observer\n }\n\n });\n }\n\n async ['@test should unregister an observer for a property'](assert) {\n objectD.addObserver('normal', objectD, 'addAction');\n objectD.set('normal', 'newValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(objectD.normal1, 'newZeroValue');\n objectD.set('normal1', 'zeroValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n objectD.removeObserver('normal', objectD, 'addAction');\n objectD.set('normal', 'newValue');\n assert.equal(objectD.normal1, 'zeroValue');\n }\n\n async [\"@test should unregister an observer for a property - special case when key has a '.' in it.\"](assert) {\n objectD.addObserver('objectF.propertyVal', objectD, 'removeChainedObserver');\n objectD.objectF.set('propertyVal', 'chainedPropertyValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n objectD.removeObserver('objectF.propertyVal', objectD, 'removeChainedObserver');\n objectD.normal2 = 'dependentValue';\n objectD.objectF.set('propertyVal', 'removedPropertyValue');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal('dependentValue', objectD.normal2);\n objectD.set('objectF', '');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal('dependentValue', objectD.normal2);\n }\n\n async ['@test removing an observer inside of an observer shouldn’t cause any problems'](assert) {\n // The observable system should be protected against clients removing\n // observers in the middle of observer notification.\n var encounteredError = false;\n\n try {\n objectD.addObserver('observableValue', null, 'observer1');\n objectD.addObserver('observableValue', null, 'observer2');\n objectD.addObserver('observableValue', null, 'observer3');\n objectD.set('observableValue', 'hi world');\n await (0, _internalTestHelpers.runLoopSettled)();\n } catch (e) {\n encounteredError = true;\n }\n\n assert.equal(encounteredError, false);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/legacy_1x/system/object/base_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * Changed get(obj, ) and set(obj, ) to Ember.get() and Ember.set()\n * Removed obj.instanceOf() and obj.kindOf() tests. use obj instanceof Foo\n instead\n * Removed respondsTo() and tryToPerform() tests. Can be brought back in a\n utils package.\n * Removed destroy() test. You can impl yourself but not built in\n * Changed Class.subclassOf() test to Class.detect()\n * Remove broken test for 'superclass' property.\n * Removed obj.didChangeFor()\n */\n // ========================================================================\n // EmberObject Base Tests\n // ========================================================================\n var obj, obj1; // global variables\n\n (0, _internalTestHelpers.moduleFor)('A new EmberObject instance', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _object.default.create({\n foo: 'bar',\n total: 12345,\n\n aMethodThatExists() {},\n\n aMethodThatReturnsTrue() {\n return true;\n },\n\n aMethodThatReturnsFoobar() {\n return 'Foobar';\n },\n\n aMethodThatReturnsFalse() {\n return false;\n }\n\n });\n }\n\n afterEach() {\n obj = undefined;\n }\n\n ['@test Should return its properties when requested using EmberObject#get'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n assert.equal((0, _metal.get)(obj, 'total'), 12345);\n }\n\n ['@test Should allow changing of those properties by calling EmberObject#set'](assert) {\n assert.equal((0, _metal.get)(obj, 'foo'), 'bar');\n assert.equal((0, _metal.get)(obj, 'total'), 12345);\n (0, _metal.set)(obj, 'foo', 'Chunky Bacon');\n (0, _metal.set)(obj, 'total', 12);\n assert.equal((0, _metal.get)(obj, 'foo'), 'Chunky Bacon');\n assert.equal((0, _metal.get)(obj, 'total'), 12);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('EmberObject superclass and subclasses', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _object.default.extend({\n method1() {\n return 'hello';\n }\n\n });\n obj1 = obj.extend();\n }\n\n afterEach() {\n obj = undefined;\n obj1 = undefined;\n }\n\n ['@test Checking the detect() function on an object and its subclass'](assert) {\n assert.equal(obj.detect(obj1), true);\n assert.equal(obj1.detect(obj), false);\n }\n\n ['@test Checking the detectInstance() function on an object and its subclass'](assert) {\n assert.ok(_object.default.detectInstance(obj.create()));\n assert.ok(obj.detectInstance(obj.create()));\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/legacy_1x/system/object/concatenated_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n /*\n NOTE: This test is adapted from the 1.x series of unit tests. The tests\n are the same except for places where we intend to break the API we instead\n validate that we warn the developer appropriately.\n \n CHANGES FROM 1.6:\n \n * changed get(obj, ) and set(obj, ) to Ember.get() and Ember.set()\n * converted uses of obj.isEqual() to use deepEqual() test since isEqual is not\n always defined\n */\n function K() {\n return this;\n }\n\n var klass;\n (0, _internalTestHelpers.moduleFor)('EmberObject Concatenated Properties', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n klass = _object.default.extend({\n concatenatedProperties: ['values', 'functions'],\n values: ['a', 'b', 'c'],\n functions: [K]\n });\n }\n\n ['@test concatenates instances'](assert) {\n var obj = klass.create({\n values: ['d', 'e', 'f']\n });\n var values = (0, _metal.get)(obj, 'values');\n var expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates subclasses'](assert) {\n var subKlass = klass.extend({\n values: ['d', 'e', 'f']\n });\n var obj = subKlass.create();\n var values = (0, _metal.get)(obj, 'values');\n var expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates reopen'](assert) {\n klass.reopen({\n values: ['d', 'e', 'f']\n });\n var obj = klass.create();\n var values = (0, _metal.get)(obj, 'values');\n var expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates mixin'](assert) {\n var mixin = {\n values: ['d', 'e']\n };\n var subKlass = klass.extend(mixin, {\n values: ['f']\n });\n var obj = subKlass.create();\n var values = (0, _metal.get)(obj, 'values');\n var expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates reopen, subclass, and instance'](assert) {\n klass.reopen({\n values: ['d']\n });\n var subKlass = klass.extend({\n values: ['e']\n });\n var obj = subKlass.create({\n values: ['f']\n });\n var values = (0, _metal.get)(obj, 'values');\n var expected = ['a', 'b', 'c', 'd', 'e', 'f'];\n assert.deepEqual(values, expected, `should concatenate values property (expected: ${expected}, got: ${values})`);\n }\n\n ['@test concatenates subclasses when the values are functions'](assert) {\n var subKlass = klass.extend({\n functions: K\n });\n var obj = subKlass.create();\n var values = (0, _metal.get)(obj, 'functions');\n var expected = [K, K];\n assert.deepEqual(values, expected, `should concatenate functions property (expected: ${expected}, got: ${values})`);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/array_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_metal, _object, _array, _internalTestHelpers) {\n \"use strict\";\n\n /*\n Implement a basic fake mutable array. This validates that any non-native\n enumerable can impl this API.\n */\n var TestArray = _object.default.extend(_array.default, {\n _content: null,\n\n init() {\n this._content = this._content || [];\n },\n\n // some methods to modify the array so we can test changes. Note that\n // arrays can be modified even if they don't implement MutableArray. The\n // MutableArray is just a standard API for mutation but not required.\n addObject(obj) {\n var idx = this._content.length;\n (0, _metal.arrayContentWillChange)(this, idx, 0, 1);\n\n this._content.push(obj);\n\n (0, _metal.arrayContentDidChange)(this, idx, 0, 1);\n },\n\n removeFirst() {\n (0, _metal.arrayContentWillChange)(this, 0, 1, 0);\n\n this._content.shift();\n\n (0, _metal.arrayContentDidChange)(this, 0, 1, 0);\n },\n\n objectAt(idx) {\n return this._content[idx];\n },\n\n length: (0, _metal.computed)(function () {\n return this._content.length;\n })\n });\n\n (0, _internalTestHelpers.moduleFor)('Ember.Array', class extends _internalTestHelpers.AbstractTestCase {\n ['@test the return value of slice has Ember.Array applied'](assert) {\n var x = _object.default.extend(_array.default).create({\n length: 0\n });\n\n var y = x.slice(1);\n assert.equal(_array.default.detect(y), true, 'mixin should be applied');\n }\n\n ['@test slice supports negative index arguments'](assert) {\n var testArray = TestArray.create({\n _content: [1, 2, 3, 4]\n });\n assert.deepEqual(testArray.slice(-2), [3, 4], 'slice(-2)');\n assert.deepEqual(testArray.slice(-2, -1), [3], 'slice(-2, -1');\n assert.deepEqual(testArray.slice(-2, -2), [], 'slice(-2, -2)');\n assert.deepEqual(testArray.slice(-1, -2), [], 'slice(-1, -2)');\n assert.deepEqual(testArray.slice(-4, 1), [1], 'slice(-4, 1)');\n assert.deepEqual(testArray.slice(-4, 5), [1, 2, 3, 4], 'slice(-4, 5)');\n assert.deepEqual(testArray.slice(-4), [1, 2, 3, 4], 'slice(-4)');\n assert.deepEqual(testArray.slice(0, -1), [1, 2, 3], 'slice(0, -1)');\n assert.deepEqual(testArray.slice(0, -4), [], 'slice(0, -4)');\n assert.deepEqual(testArray.slice(0, -3), [1], 'slice(0, -3)');\n }\n\n }); // ..........................................................\n // CONTENT DID CHANGE\n //\n\n var DummyArray = _object.default.extend(_array.default, {\n length: 0,\n\n objectAt(idx) {\n return 'ITEM-' + idx;\n }\n\n });\n\n var obj, observer; // ..........................................................\n // NOTIFY ARRAY OBSERVERS\n //\n\n (0, _internalTestHelpers.moduleFor)('mixins/array/arrayContent[Will|Did]Change', class extends _internalTestHelpers.AbstractTestCase {\n async ['@test should notify observers of []'](assert) {\n obj = DummyArray.extend({\n enumerablePropertyDidChange: (0, _metal.observer)('[]', function () {\n this._count++;\n })\n }).create({\n _count: 0\n });\n assert.equal(obj._count, 0, 'should not have invoked yet');\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._count, 1, 'should have invoked');\n }\n\n afterEach() {\n obj.destroy();\n obj = undefined;\n }\n\n }); // ..........................................................\n // NOTIFY CHANGES TO LENGTH\n //\n\n (0, _internalTestHelpers.moduleFor)('notify observers of length', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach(assert) {\n obj = DummyArray.extend({\n lengthDidChange: (0, _metal.observer)('length', function () {\n this._after++;\n })\n }).create({\n _after: 0\n });\n assert.equal(obj._after, 0, 'should not have fired yet');\n }\n\n afterEach() {\n obj.destroy();\n obj = undefined;\n }\n\n async ['@test should notify observers when call with no params'](assert) {\n (0, _metal.arrayContentWillChange)(obj);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 0);\n (0, _metal.arrayContentDidChange)(obj);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 1);\n } // API variation that included items only\n\n\n async ['@test should not notify when passed lengths are same'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 0);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 0);\n }\n\n async ['@test should notify when passed lengths are different'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 2);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 0);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 2);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj._after, 1);\n }\n\n }); // ..........................................................\n // NOTIFY ARRAY OBSERVER\n //\n\n (0, _internalTestHelpers.moduleFor)('notify array observers', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach(assert) {\n expectDeprecation(/Array observers have been deprecated/);\n obj = DummyArray.create();\n observer = _object.default.extend({\n arrayWillChange() {\n assert.equal(this._before, null); // should only call once\n\n this._before = Array.prototype.slice.call(arguments);\n },\n\n arrayDidChange() {\n assert.equal(this._after, null); // should only call once\n\n this._after = Array.prototype.slice.call(arguments);\n }\n\n }).create({\n _before: null,\n _after: null\n });\n (0, _metal.addArrayObserver)(obj, observer);\n }\n\n afterEach() {\n obj = observer = null;\n }\n\n ['@test should notify array observers when called with no params'](assert) {\n (0, _metal.arrayContentWillChange)(obj);\n assert.deepEqual(observer._before, [obj, 0, -1, -1]);\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, [obj, 0, -1, -1]);\n } // API variation that included items only\n\n\n ['@test should notify when called with same length items'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 1, 1);\n assert.deepEqual(observer._before, [obj, 0, 1, 1]);\n (0, _metal.arrayContentDidChange)(obj, 0, 1, 1);\n assert.deepEqual(observer._after, [obj, 0, 1, 1]);\n }\n\n ['@test should notify when called with diff length items'](assert) {\n (0, _metal.arrayContentWillChange)(obj, 0, 2, 1);\n assert.deepEqual(observer._before, [obj, 0, 2, 1]);\n (0, _metal.arrayContentDidChange)(obj, 0, 2, 1);\n assert.deepEqual(observer._after, [obj, 0, 2, 1]);\n }\n\n ['@test removing array observer should disable'](assert) {\n (0, _metal.removeArrayObserver)(obj, observer);\n (0, _metal.arrayContentWillChange)(obj);\n assert.deepEqual(observer._before, null);\n (0, _metal.arrayContentDidChange)(obj);\n assert.deepEqual(observer._after, null);\n }\n\n ['@test hasArrayObservers should work'](assert) {\n assert.equal(obj.hasArrayObservers, true, 'correctly shows it has an array observer when one exists');\n (0, _metal.removeArrayObserver)(obj, observer);\n assert.equal(obj.hasArrayObservers, false, 'correctly shows it has an array observer when one exists');\n }\n\n }); // ..........................................................\n // @each\n //\n\n var ary;\n (0, _internalTestHelpers.moduleFor)('EmberArray.@each support', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ary = TestArray.create({\n _content: [{\n isDone: true,\n desc: 'Todo 1'\n }, {\n isDone: false,\n desc: 'Todo 2'\n }, {\n isDone: true,\n desc: 'Todo 3'\n }, {\n isDone: false,\n desc: 'Todo 4'\n }]\n });\n }\n\n afterEach() {\n ary.destroy();\n ary = null;\n }\n\n async ['@test adding an object should notify (@each.isDone)'](assert) {\n var called = 0;\n\n var observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n\n });\n\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n ary.addObject(_object.default.create({\n desc: 'foo',\n isDone: false\n }));\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(called, 1, 'calls observer when object is pushed');\n }\n\n async ['@test using @each to observe arrays that does not return objects raise error'](assert) {\n var called = 0;\n\n var observerObject = _object.default.create({\n wasCalled() {\n called++;\n }\n\n });\n\n ary = TestArray.create({\n objectAt(idx) {\n return (0, _metal.get)(this._content[idx], 'desc');\n }\n\n });\n ary.addObject({\n desc: 'foo',\n isDone: false\n });\n assert.throwsAssertion(() => {\n (0, _metal.addObserver)(ary, '@each.isDone', observerObject, 'wasCalled');\n }, /When using @each to observe the array/);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(called, 0, 'not calls observer when object is pushed');\n }\n\n ['@test `objectAt` returns correct object'](assert) {\n var arr = ['first', 'second', 'third', 'fourth'];\n assert.equal((0, _metal.objectAt)(arr, 2), 'third');\n assert.equal((0, _metal.objectAt)(arr, 4), undefined);\n }\n\n ['@test should be clear caches for computed properties that have dependent keys on arrays that are changed after object initialization'](assert) {\n var obj = _object.default.extend({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'resources', (0, _array.A)());\n },\n\n common: (0, _metal.computed)('resources.@each.common', function () {\n return (0, _metal.get)((0, _metal.objectAt)((0, _metal.get)(this, 'resources'), 0), 'common');\n })\n }).create();\n\n (0, _metal.get)(obj, 'resources').pushObject(_object.default.create({\n common: 'HI!'\n }));\n assert.equal('HI!', (0, _metal.get)(obj, 'common'));\n (0, _metal.set)((0, _metal.objectAt)((0, _metal.get)(obj, 'resources'), 0), 'common', 'BYE!');\n assert.equal('BYE!', (0, _metal.get)(obj, 'common'));\n }\n\n async ['@test observers that contain @each in the path should fire only once the first time they are accessed'](assert) {\n var count = 0;\n\n var obj = _object.default.extend({\n init() {\n this._super(...arguments); // Observer does not fire on init\n\n\n (0, _metal.set)(this, 'resources', (0, _array.A)());\n },\n\n commonDidChange: (0, _metal.observer)('resources.@each.common', () => count++)\n }).create(); // Observer fires first time when new object is added\n\n\n (0, _metal.get)(obj, 'resources').pushObject(_object.default.create({\n common: 'HI!'\n }));\n await (0, _internalTestHelpers.runLoopSettled)(); // Observer fires second time when property on an object is changed\n\n (0, _metal.set)((0, _metal.objectAt)((0, _metal.get)(obj, 'resources'), 0), 'common', 'BYE!');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2, 'observers should be called twice');\n obj.destroy();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/comparable_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/compare\", \"@ember/-internals/runtime/lib/mixins/comparable\", \"internal-test-helpers\"], function (_metal, _object, _compare, _comparable, _internalTestHelpers) {\n \"use strict\";\n\n var Rectangle = _object.default.extend(_comparable.default, {\n length: 0,\n width: 0,\n\n area() {\n return (0, _metal.get)(this, 'length') * (0, _metal.get)(this, 'width');\n },\n\n compare(a, b) {\n return (0, _compare.default)(a.area(), b.area());\n }\n\n });\n\n var r1, r2;\n (0, _internalTestHelpers.moduleFor)('Comparable', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n r1 = Rectangle.create({\n length: 6,\n width: 12\n });\n r2 = Rectangle.create({\n length: 6,\n width: 13\n });\n }\n\n ['@test should be comparable and return the correct result'](assert) {\n assert.equal(_comparable.default.detect(r1), true);\n assert.equal((0, _compare.default)(r1, r1), 0);\n assert.equal((0, _compare.default)(r1, r2), -1);\n assert.equal((0, _compare.default)(r2, r1), 1);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/container_proxy_test\", [\"@ember/-internals/owner\", \"@ember/-internals/container\", \"@ember/-internals/runtime/lib/mixins/container_proxy\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/runloop\", \"internal-test-helpers\", \"@glimmer/destroyable\"], function (_owner, _container, _container_proxy, _object, _runloop, _internalTestHelpers, _destroyable) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/runtime/mixins/container_proxy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n this.Owner = _object.default.extend(_container_proxy.default);\n this.instance = this.Owner.create();\n this.registry = new _container.Registry();\n this.instance.__container__ = new _container.Container(this.registry, {\n owner: this.instance\n });\n }\n\n ['@test provides ownerInjection helper method'](assert) {\n var result = this.instance.ownerInjection();\n assert.equal((0, _owner.getOwner)(result), this.instance, 'returns an object with an associated owner');\n }\n\n ['@test actions queue completes before destruction'](assert) {\n assert.expect(1);\n this.registry.register('service:auth', _object.default.extend({\n willDestroy() {\n assert.ok((0, _owner.getOwner)(this).lookup('service:auth'), 'can still lookup');\n }\n\n }));\n var service = this.instance.lookup('service:auth');\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', service, 'destroy');\n this.instance.destroy();\n });\n }\n\n '@test being destroyed by @ember/destroyable properly destroys the container and created instances'(assert) {\n assert.expect(1);\n this.registry.register('service:foo', class FooService extends _object.default {\n willDestroy() {\n assert.ok(true, 'is properly destroyed');\n }\n\n });\n this.instance.lookup('service:foo');\n (0, _runloop.run)(() => {\n (0, _destroyable.destroy)(this.instance);\n });\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/enumerable_test\", [\"@ember/-internals/runtime/lib/mixins/enumerable\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_enumerable, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Enumerable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be mixed into A()'](assert) {\n assert.ok(_enumerable.default.detect((0, _array.A)()));\n }\n\n ['@test should be mixed into ArrayProxy'](assert) {\n assert.ok(_enumerable.default.detect(_array_proxy.default.create()));\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/evented_test\", [\"@ember/-internals/runtime/lib/mixins/evented\", \"@ember/-internals/runtime/lib/system/core_object\", \"internal-test-helpers\"], function (_evented, _core_object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.Evented', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works properly on proxy-ish objects'](assert) {\n var eventedProxyObj = _core_object.default.extend(_evented.default, {\n unknownProperty() {\n return true;\n }\n\n }).create();\n\n var noop = function () {};\n\n eventedProxyObj.on('foo', noop);\n eventedProxyObj.off('foo', noop);\n assert.ok(true, 'An assertion was triggered');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/mutable_enumerable_test\", [\"@ember/-internals/runtime/lib/mixins/mutable_enumerable\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_mutable_enumerable, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('MutableEnumerable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be mixed into A()'](assert) {\n assert.ok(_mutable_enumerable.default.detect((0, _array.A)()));\n }\n\n ['@test should be mixed into ArrayProxy'](assert) {\n assert.ok(_mutable_enumerable.default.detect(_array_proxy.default.create()));\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/observable_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('mixins/observable', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should be able to use getProperties to get a POJO of provided keys'](assert) {\n var obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n var pojo = obj.getProperties('firstName', 'lastName');\n assert.equal('Steve', pojo.firstName);\n assert.equal('Jobs', pojo.lastName);\n }\n\n ['@test should be able to use getProperties with array parameter to get a POJO of provided keys'](assert) {\n var obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n var pojo = obj.getProperties(['firstName', 'lastName']);\n assert.equal('Steve', pojo.firstName);\n assert.equal('Jobs', pojo.lastName);\n }\n\n ['@test should be able to use setProperties to set multiple properties at once'](assert) {\n var obj = _object.default.create({\n firstName: 'Steve',\n lastName: 'Jobs',\n companyName: 'Apple, Inc.'\n });\n\n obj.setProperties({\n firstName: 'Tim',\n lastName: 'Cook'\n });\n assert.equal('Tim', obj.get('firstName'));\n assert.equal('Cook', obj.get('lastName'));\n }\n\n async ['@test calling setProperties completes safely despite exceptions'](assert) {\n var exc = new Error('Something unexpected happened!');\n\n var obj = _object.default.extend({\n companyName: (0, _metal.computed)({\n get() {\n return 'Apple, Inc.';\n },\n\n set() {\n throw exc;\n }\n\n })\n }).create({\n firstName: 'Steve',\n lastName: 'Jobs'\n });\n\n var firstNameChangedCount = 0;\n (0, _metal.addObserver)(obj, 'firstName', () => firstNameChangedCount++);\n\n try {\n obj.setProperties({\n firstName: 'Tim',\n lastName: 'Cook',\n companyName: 'Fruit Co., Inc.'\n });\n } catch (err) {\n if (err !== exc) {\n throw err;\n }\n }\n\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(firstNameChangedCount, 1, 'firstName should have fired once');\n obj.destroy();\n }\n\n ['@test should be able to retrieve cached values of computed properties without invoking the computed property'](assert) {\n var obj = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'foo';\n })\n }).create({\n bar: 'bar'\n });\n\n assert.equal(obj.cacheFor('foo'), undefined, 'should return undefined if no value has been cached');\n (0, _metal.get)(obj, 'foo');\n assert.equal((0, _metal.get)(obj, 'foo'), 'foo', 'precond - should cache the value');\n assert.equal(obj.cacheFor('foo'), 'foo', 'should return the cached value after it is invoked');\n assert.equal(obj.cacheFor('bar'), undefined, 'returns undefined if the value is not a computed property');\n }\n\n ['@test incrementProperty should work even if value is number in string'](assert) {\n var obj = _object.default.create({\n age: '24'\n });\n\n obj.incrementProperty('age');\n assert.equal(25, obj.get('age'));\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/promise_proxy_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object_proxy\", \"@ember/-internals/runtime/lib/mixins/promise_proxy\", \"@ember/-internals/runtime/lib/ext/rsvp\", \"rsvp\", \"internal-test-helpers\"], function (_runloop, _metal, _object_proxy, _promise_proxy, _rsvp, RSVP, _internalTestHelpers) {\n \"use strict\";\n\n var ObjectPromiseProxy, proxy;\n (0, _internalTestHelpers.moduleFor)('Ember.PromiseProxy - ObjectProxy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n ObjectPromiseProxy = _object_proxy.default.extend(_promise_proxy.default);\n }\n\n afterEach() {\n RSVP.on('error', _rsvp.onerrorDefault);\n if (proxy) proxy.destroy();\n proxy = undefined;\n }\n\n ['@test present on ember namespace'](assert) {\n assert.ok(_promise_proxy.default, 'expected PromiseProxyMixin to exist');\n }\n\n ['@test no promise, invoking then should raise'](assert) {\n proxy = ObjectPromiseProxy.create();\n assert.throws(function () {\n proxy.then(function () {\n return this;\n }, function () {\n return this;\n });\n }, new RegExp(\"PromiseProxy's promise must be set\"));\n }\n\n ['@test fulfillment'](assert) {\n var value = {\n firstName: 'stef',\n lastName: 'penner'\n };\n var deferred = RSVP.defer();\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n var didFulfillCount = 0;\n var didRejectCount = 0;\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n (0, _runloop.run)(deferred, 'resolve', value);\n assert.equal(didFulfillCount, 1, 'should have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not have been rejected');\n assert.equal((0, _metal.get)(proxy, 'content'), value, 'expects the proxy to have content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to still have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled');\n (0, _runloop.run)(deferred, 'resolve', value);\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n (0, _runloop.run)(deferred, 'reject', value);\n assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');\n assert.equal(didRejectCount, 0, 'should still not have been rejected');\n assert.equal((0, _metal.get)(proxy, 'content'), value, 'expects the proxy to have still have same content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy still to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled'); // rest of the promise semantics are tested in directly in RSVP\n }\n\n ['@test rejection'](assert) {\n var reason = new Error('failure');\n var deferred = RSVP.defer();\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n var didFulfillCount = 0;\n var didRejectCount = 0;\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n (0, _runloop.run)(deferred, 'reject', reason);\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), reason, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n (0, _runloop.run)(deferred, 'reject', reason);\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n (0, _runloop.run)(deferred, 'resolve', 1);\n assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should still remain rejected');\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), reason, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n } // https://github.com/emberjs/ember.js/issues/15694\n\n\n ['@test rejection without specifying reason'](assert) {\n var deferred = RSVP.defer();\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n var didFulfillCount = 0;\n var didRejectCount = 0;\n proxy.then(() => didFulfillCount++, () => didRejectCount++);\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have no reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 0, 'should not yet have been rejected');\n (0, _runloop.run)(deferred, 'reject');\n assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');\n assert.equal(didRejectCount, 1, 'should have been rejected');\n assert.equal((0, _metal.get)(proxy, 'content'), undefined, 'expects the proxy to have no content');\n assert.equal((0, _metal.get)(proxy, 'reason'), undefined, 'expects the proxy to have a reason');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n }\n\n [\"@test unhandled rejects still propagate to RSVP.on('error', ...) \"](assert) {\n assert.expect(1);\n RSVP.on('error', onerror);\n RSVP.off('error', _rsvp.onerrorDefault);\n var expectedReason = new Error('failure');\n var deferred = RSVP.defer();\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.get('promise');\n\n function onerror(reason) {\n assert.equal(reason, expectedReason, 'expected reason');\n }\n\n RSVP.on('error', onerror);\n RSVP.off('error', _rsvp.onerrorDefault);\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n RSVP.on('error', _rsvp.onerrorDefault);\n RSVP.off('error', onerror);\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n RSVP.on('error', _rsvp.onerrorDefault);\n RSVP.off('error', onerror);\n }\n\n ['@test should work with promise inheritance'](assert) {\n class PromiseSubclass extends RSVP.Promise {}\n\n proxy = ObjectPromiseProxy.create({\n promise: new PromiseSubclass(() => {})\n });\n assert.ok(proxy.then() instanceof PromiseSubclass, 'promise proxy respected inheritance');\n }\n\n ['@test should reset isFulfilled and isRejected when promise is reset'](assert) {\n var deferred = _rsvp.default.defer();\n\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n (0, _runloop.run)(deferred, 'resolve');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is no longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), true, 'expects the proxy to indicate that it is fulfilled');\n\n var anotherDeferred = _rsvp.default.defer();\n\n proxy.set('promise', anotherDeferred.promise);\n assert.equal((0, _metal.get)(proxy, 'isPending'), true, 'expects the proxy to indicate that it is loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), false, 'expects the proxy to indicate that it is not settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), false, 'expects the proxy to indicate that it is not rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n (0, _runloop.run)(anotherDeferred, 'reject');\n assert.equal((0, _metal.get)(proxy, 'isPending'), false, 'expects the proxy to indicate that it is not longer loading');\n assert.equal((0, _metal.get)(proxy, 'isSettled'), true, 'expects the proxy to indicate that it is settled');\n assert.equal((0, _metal.get)(proxy, 'isRejected'), true, 'expects the proxy to indicate that it is rejected');\n assert.equal((0, _metal.get)(proxy, 'isFulfilled'), false, 'expects the proxy to indicate that it is not fulfilled');\n }\n\n ['@test should have content when isFulfilled is set'](assert) {\n var deferred = _rsvp.default.defer();\n\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.addObserver('isFulfilled', () => assert.equal((0, _metal.get)(proxy, 'content'), true));\n (0, _runloop.run)(deferred, 'resolve', true);\n }\n\n ['@test should have reason when isRejected is set'](assert) {\n var error = new Error('Y U REJECT?!?');\n\n var deferred = _rsvp.default.defer();\n\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.addObserver('isRejected', () => assert.equal((0, _metal.get)(proxy, 'reason'), error));\n\n try {\n (0, _runloop.run)(deferred, 'reject', error);\n } catch (e) {\n assert.equal(e, error);\n }\n }\n\n ['@test should not error if promise is resolved after proxy has been destroyed'](assert) {\n var deferred = _rsvp.default.defer();\n\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.then(() => {}, () => {});\n (0, _runloop.run)(proxy, 'destroy');\n (0, _runloop.run)(deferred, 'resolve', true);\n assert.ok(true, 'resolving the promise after the proxy has been destroyed does not raise an error');\n }\n\n ['@test should not error if promise is rejected after proxy has been destroyed'](assert) {\n var deferred = _rsvp.default.defer();\n\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.then(() => {}, () => {});\n (0, _runloop.run)(proxy, 'destroy');\n (0, _runloop.run)(deferred, 'reject', 'some reason');\n assert.ok(true, 'rejecting the promise after the proxy has been destroyed does not raise an error');\n }\n\n ['@test promise chain is not broken if promised is resolved after proxy has been destroyed'](assert) {\n var deferred = _rsvp.default.defer();\n\n var expectedValue = {};\n var receivedValue;\n var didResolveCount = 0;\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.then(value => {\n receivedValue = value;\n didResolveCount++;\n }, () => {});\n (0, _runloop.run)(proxy, 'destroy');\n (0, _runloop.run)(deferred, 'resolve', expectedValue);\n assert.equal(didResolveCount, 1, 'callback called');\n assert.equal(receivedValue, expectedValue, 'passed value is the value the promise was resolved with');\n }\n\n ['@test promise chain is not broken if promised is rejected after proxy has been destroyed'](assert) {\n var deferred = _rsvp.default.defer();\n\n var expectedReason = 'some reason';\n var receivedReason;\n var didRejectCount = 0;\n proxy = ObjectPromiseProxy.create({\n promise: deferred.promise\n });\n proxy.then(() => {}, reason => {\n receivedReason = reason;\n didRejectCount++;\n });\n (0, _runloop.run)(proxy, 'destroy');\n (0, _runloop.run)(deferred, 'reject', expectedReason);\n assert.equal(didRejectCount, 1, 'callback called');\n assert.equal(receivedReason, expectedReason, 'passed reason is the reason the promise was rejected for');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mixins/target_action_support_test\", [\"@ember/-internals/environment\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/mixins/target_action_support\", \"internal-test-helpers\"], function (_environment, _object, _target_action_support, _internalTestHelpers) {\n \"use strict\";\n\n var originalLookup = _environment.context.lookup;\n var lookup;\n (0, _internalTestHelpers.moduleFor)('TargetActionSupport', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n _environment.context.lookup = lookup = {};\n }\n\n afterEach() {\n _environment.context.lookup = originalLookup;\n }\n\n ['@test it should return false if no target or action are specified'](assert) {\n assert.expect(1);\n\n var obj = _object.default.extend(_target_action_support.default).create();\n\n assert.ok(false === obj.triggerAction(), 'no target or action was specified');\n }\n\n ['@test it should support actions specified as strings'](assert) {\n assert.expect(2);\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should invoke the send() method on objects that implement it'](assert) {\n assert.expect(3);\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n send(evt, context) {\n assert.equal(evt, 'anEvent', 'send() method was invoked with correct event name');\n assert.equal(context, obj, 'send() method was invoked with correct context');\n }\n\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should find targets specified using a property path'](assert) {\n assert.expect(2);\n var Test = {};\n lookup.Test = Test;\n Test.targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called on global object');\n }\n\n });\n\n var myObj = _object.default.extend(_target_action_support.default).create({\n target: 'Test.targetObj',\n action: 'anEvent'\n });\n\n assert.ok(true === myObj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should use an actionContext object specified as a property on the object'](assert) {\n assert.expect(2);\n\n var obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: {},\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(obj.actionContext === ctx, 'anEvent method was called with the expected context');\n }\n\n })\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should find an actionContext specified as a property path'](assert) {\n assert.expect(2);\n var Test = {};\n lookup.Test = Test;\n Test.aContext = {};\n\n var obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent',\n actionContext: 'Test.aContext',\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(Test.aContext === ctx, 'anEvent method was called with the expected context');\n }\n\n })\n });\n\n assert.ok(true === obj.triggerAction(), 'a valid target and action were specified');\n }\n\n ['@test it should use the target specified in the argument'](assert) {\n assert.expect(2);\n\n var targetObj = _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n\n });\n\n var obj = _object.default.extend(_target_action_support.default).create({\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({\n target: targetObj\n }), 'a valid target and action were specified');\n }\n\n ['@test it should use the action specified in the argument'](assert) {\n assert.expect(2);\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent() {\n assert.ok(true, 'anEvent method was called');\n }\n\n })\n });\n\n assert.ok(true === obj.triggerAction({\n action: 'anEvent'\n }), 'a valid target and action were specified');\n }\n\n ['@test it should use the actionContext specified in the argument'](assert) {\n assert.expect(2);\n var context = {};\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(context === ctx, 'anEvent method was called with the expected context');\n }\n\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({\n actionContext: context\n }), 'a valid target and action were specified');\n }\n\n ['@test it should allow multiple arguments from actionContext'](assert) {\n assert.expect(3);\n var param1 = 'someParam';\n var param2 = 'someOtherParam';\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(first, second) {\n assert.ok(first === param1, 'anEvent method was called with the expected first argument');\n assert.ok(second === param2, 'anEvent method was called with the expected second argument');\n }\n\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({\n actionContext: [param1, param2]\n }), 'a valid target and action were specified');\n }\n\n ['@test it should use a null value specified in the actionContext argument'](assert) {\n assert.expect(2);\n\n var obj = _object.default.extend(_target_action_support.default).create({\n target: _object.default.create({\n anEvent(ctx) {\n assert.ok(null === ctx, 'anEvent method was called with the expected context (null)');\n }\n\n }),\n action: 'anEvent'\n });\n\n assert.ok(true === obj.triggerAction({\n actionContext: null\n }), 'a valid target and action were specified');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/mutable-array/addObject-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class AddObjectTest extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n var before = (0, _array.newFixture)(3);\n var obj = this.newObject(before);\n this.assert.equal(obj.addObject(before[1]), obj, 'should return receiver');\n }\n\n async '@test [A,B].addObject(C) => [A,B,C] + notify'() {\n var before = (0, _array.newFixture)(2);\n var item = (0, _array.newFixture)(1)[0];\n var after = [before[0], before[1], item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.addObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n }\n\n obj.destroy();\n }\n\n async '@test [A,B,C].addObject(A) => [A,B,C] + NO notify'() {\n var before = (0, _array.newFixture)(3);\n var after = before;\n var item = before[0];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.addObject(item); // note: item in set\n // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('addObject', AddObjectTest, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/clear-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class ClearTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [].clear() => [] + notify'() {\n var before = [];\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified [] once');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each once');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [X].clear() => [] + notify'() {\n var obj, before, after, observer;\n before = (0, _array.newFixture)(1);\n after = [];\n obj = this.newObject(before);\n observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.clear(), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('clear', ClearTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/insertAt-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class InsertAtTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [].insertAt(0, X) => [X] + notify'() {\n var after = (0, _array.newFixture)(1);\n var obj = this.newObject([]);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.insertAt(0, after[0]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] did change once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each did change once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length did change once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject did change once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject did change once');\n obj.destroy();\n }\n\n '@test [].insertAt(200,X) => OUT_OF_RANGE_EXCEPTION exception'() {\n var obj = this.newObject([]);\n var item = (0, _array.newFixture)(1)[0];\n expectAssertion(() => obj.insertAt(200, item), /`insertAt` index provided is out of range/);\n }\n\n async '@test [A].insertAt(0, X) => [X,A] + notify'() {\n var item = (0, _array.newFixture)(1)[0];\n var before = (0, _array.newFixture)(1);\n var after = [item, before[0]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.insertAt(0, item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [A].insertAt(1, X) => [A,X] + notify'() {\n var item = (0, _array.newFixture)(1)[0];\n var before = (0, _array.newFixture)(1);\n var after = [before[0], item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.insertAt(1, item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n obj.destroy();\n }\n\n '@test [A].insertAt(200,X) => OUT_OF_RANGE exception'() {\n var obj = this.newObject((0, _array.newFixture)(1));\n var that = this;\n this.assert.throws(() => obj.insertAt(200, that.newFixture(1)[0]), Error);\n }\n\n async '@test [A,B,C].insertAt(0,X) => [X,A,B,C] + notify'() {\n var item = (0, _array.newFixture)(1)[0];\n var before = (0, _array.newFixture)(3);\n var after = [item, before[0], before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.insertAt(0, item);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [A,B,C].insertAt(1,X) => [A,X,B,C] + notify'() {\n var item = (0, _array.newFixture)(1)[0];\n var before = (0, _array.newFixture)(3);\n var after = [before[0], item, before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n var objectAtCalls = [];\n var objectAt = obj.objectAt;\n\n obj.objectAt = ix => {\n objectAtCalls.push(ix);\n return objectAt.call(obj, ix);\n };\n\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n objectAtCalls.splice(0, objectAtCalls.length);\n obj.insertAt(1, item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(objectAtCalls, [], 'objectAt is not called when only inserting items');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [A,B,C].insertAt(3,X) => [A,B,C,X] + notify'() {\n var item = (0, _array.newFixture)(1)[0];\n var before = (0, _array.newFixture)(3);\n var after = [before[0], before[1], before[2], item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.insertAt(3, item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('instertAt', InsertAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/popObject-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class PopObjectTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [].popObject() => [] + returns undefined + NO notify'() {\n var obj = this.newObject([]);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.popObject(), undefined, 'popObject results'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), [], 'post item results');\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [X].popObject() => [] + notify'() {\n var before = (0, _array.newFixture)(1);\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n var ret = obj.popObject(); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.equal(ret, before[0], 'return object');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].popObject() => [A,B] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [before[0], before[1]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n var ret = obj.popObject(); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.equal(ret, before[2], 'return object');\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('popObject', PopObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/pushObject-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class PushObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns pushed object'() {\n var exp = (0, _array.newFixture)(1)[0];\n var obj = this.newObject([]);\n this.assert.equal(obj.pushObject(exp), exp, 'should return pushed object');\n }\n\n async '@test [].pushObject(X) => [X] + notify'() {\n var before = [];\n var after = (0, _array.newFixture)(1);\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.pushObject(after[0]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].pushObject(X) => [A,B,C,X] + notify'() {\n var before = (0, _array.newFixture)(3);\n var item = (0, _array.newFixture)(1)[0];\n var after = [before[0], before[1], before[2], item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.pushObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n obj.destroy();\n }\n\n async '@test [A,B,C,C].pushObject(A) => [A,B,C,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var item = before[2]; // note same object as current tail. should end up twice\n\n var after = [before[0], before[1], before[2], item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.pushObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), true, 'should have notified lastObject');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('pushObject', PushObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/pushObjects-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class PushObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test should raise exception if not Ember.Enumerable is passed to pushObjects'() {\n var obj = this.newObject([]);\n expectAssertion(() => obj.pushObjects('string'));\n }\n\n }\n\n (0, _array.runArrayTests)('pushObjects', PushObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/removeAt-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/runtime/lib/mixins/array\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _array, _array2, _metal) {\n \"use strict\";\n\n class RemoveAtTests extends _internalTestHelpers.AbstractTestCase {\n async '@test removeAt([X], 0) => [] + notify'() {\n var before = (0, _array.newFixture)(1);\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n '@test removeAt([], 200) => OUT_OF_RANGE_EXCEPTION exception'() {\n var obj = this.newObject([]);\n expectAssertion(() => (0, _array2.removeAt)(obj, 200), /`removeAt` index provided is out of range/);\n }\n\n async '@test removeAt([A,B], 0) => [B] + notify'() {\n var before = (0, _array.newFixture)(2);\n var after = [before[1]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 0), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test removeAt([A,B], 1) => [A] + notify'() {\n var before = (0, _array.newFixture)(2);\n var after = [before[0]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n obj.destroy();\n }\n\n async '@test removeAt([A,B,C], 1) => [A,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [before[0], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test removeAt([A,B,C,D], 1,2) => [A,D] + notify'() {\n var before = (0, _array.newFixture)(4);\n var after = [before[0], before[3]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal((0, _array2.removeAt)(obj, 1, 2), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C,D].removeAt(1,2) => [A,D] + notify'() {\n var obj, before, after, observer;\n before = (0, _array.newFixture)(4);\n after = [before[0], before[3]];\n obj = this.newObject(before);\n observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.removeAt(1, 2), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('removeAt', RemoveAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/removeObject-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_metal, _internalTestHelpers, _array) {\n \"use strict\";\n\n class RemoveObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n var before = (0, _array.newFixture)(3);\n var obj = this.newObject(before);\n this.assert.equal(obj.removeObject(before[1]), obj, 'should return receiver');\n obj.destroy();\n }\n\n async '@test [A,B,C].removeObject(B) => [A,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [before[0], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.removeObject(before[1]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n obj.destroy();\n }\n\n async '@test [A,B,C].removeObject(D) => [A,B,C]'() {\n var before = (0, _array.newFixture)(3);\n var after = before;\n var item = (0, _array.newFixture)(1)[0];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.removeObject(item); // note: item not in set\n // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('@each'), false, 'should NOT have notified @each');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n }\n\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('removeObject', RemoveObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/removeObjects-test\", [\"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/runtime/lib/mixins/array\", \"@glimmer/destroyable\"], function (_metal, _internalTestHelpers, _array, _array2, _destroyable) {\n \"use strict\";\n\n class RemoveObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test should return receiver'() {\n var before = (0, _array2.A)((0, _array.newFixture)(3));\n var obj = before;\n this.assert.equal(obj.removeObjects(before[1]), obj, 'should return receiver');\n }\n\n async '@test [A,B,C].removeObjects([B]) => [A,C] + notify'() {\n var before = (0, _array2.A)((0, _array.newFixture)(3));\n var after = [before[0], before[2]];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [{A},{B},{C}].removeObjects([{B}]) => [{A},{C}] + notify'() {\n var before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n var after = [before[0], before[2]];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[1]]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [A,B,C].removeObjects([A,B]) => [C] + notify'() {\n var before = (0, _array2.A)((0, _array.newFixture)(3));\n var after = [before[2]];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [{A},{B},{C}].removeObjects([{A},{B}]) => [{C}] + notify'() {\n var before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n var after = [before[2]];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1]]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [A,B,C].removeObjects([A,B,C]) => [] + notify'() {\n var before = (0, _array2.A)((0, _array.newFixture)(3));\n var after = [];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([before[0], before[1], before[2]]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [{A},{B},{C}].removeObjects([{A},{B},{C}]) => [] + notify'() {\n var before = (0, _array2.A)((0, _array.newObjectsFixture)(3));\n var after = [];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects(before); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), 1, 'should have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n async '@test [A,B,C].removeObjects([D]) => [A,B,C]'() {\n var before = (0, _array2.A)((0, _array.newFixture)(3));\n var after = before;\n var item = (0, _array.newFixture)(1)[0];\n var obj = before;\n var observer = this.newObserver(obj, '[]', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject'); // Prime the cache\n\n obj.removeObjects([item]); // Note: item not in set\n // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n\n if (observer.isEnabled) {\n this.assert.equal(observer.validate('[]'), false, 'should NOT have notified []');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n }\n\n (0, _destroyable.destroy)(obj);\n }\n\n }\n\n (0, _array.runArrayTests)('removeObjects', RemoveObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/replace-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _array) {\n \"use strict\";\n\n class ReplaceTests extends _internalTestHelpers.AbstractTestCase {\n async \"@test [].replace(0,0,'X') => ['X'] + notify\"() {\n var exp = (0, _array.newFixture)(1);\n var obj = this.newObject([]);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(0, 0, exp); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), exp, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [].replace(0,0,\"X\") => [\"X\"] + avoid calling objectAt and notifying fistObject/lastObject when not in cache'() {\n var obj, exp, observer;\n var called = 0;\n exp = (0, _array.newFixture)(1);\n obj = this.newObject([]);\n\n obj.objectAt = function () {\n called++;\n };\n\n observer = this.newObserver(obj, 'firstObject', 'lastObject');\n obj.replace(0, 0, exp); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.equal(called, 0, 'should NOT have called objectAt upon replace when firstObject/lastObject are not cached');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject since not cached');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject since not cached');\n obj.destroy();\n }\n\n async '@test [A,B,C,D].replace(1,2,X) => [A,X,D] + notify'() {\n var before = (0, _array.newFixture)(4);\n var replace = (0, _array.newFixture)(1);\n var after = [before[0], replace[0], before[3]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(1, 2, replace); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C,D].replace(1,2,[X,Y]) => [A,X,Y,D] + notify'() {\n var before = (0, _array.newFixture)(4);\n var replace = (0, _array.newFixture)(2);\n var after = [before[0], replace[0], replace[1], before[3]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(1, 2, replace); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.validate('length'), false, 'should NOT have notified length');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B].replace(1,0,[X,Y]) => [A,X,Y,B] + notify'() {\n var before = (0, _array.newFixture)(2);\n var replace = (0, _array.newFixture)(2);\n var after = [before[0], replace[0], replace[1], before[1]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(1, 0, replace); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C,D].replace(2,2) => [A,B] + notify'() {\n var before = (0, _array.newFixture)(4);\n var after = [before[0], before[1]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(2, 2); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C,D].replace(-1,1) => [A,B,C] + notify'() {\n var before = (0, _array.newFixture)(4);\n var after = [before[0], before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.replace(-1, 1); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n obj.destroy();\n }\n\n async '@test Adding object should notify array observer'() {\n expectDeprecation(/Array observers have been deprecated/);\n var fixtures = (0, _array.newFixture)(4);\n var obj = this.newObject(fixtures);\n var observer = this.newObserver(obj).observeArray(obj);\n var item = (0, _array.newFixture)(1)[0];\n obj.replace(2, 2, [item]); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(observer._before, [obj, 2, 2, 1], 'before');\n this.assert.deepEqual(observer._after, [obj, 2, 2, 1], 'after');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('replace', ReplaceTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/reverseObjects-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _array, _metal) {\n \"use strict\";\n\n class ReverseObjectsTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [A,B,C].reverseObjects() => [] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [before[2], before[1], before[0]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.reverseObjects(), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 0, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('reverseObjects', ReverseObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/setObjects-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _array, _metal) {\n \"use strict\";\n\n class SetObjectsTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [A,B,C].setObjects([]) = > [] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].setObjects([D, E, F, G]) = > [D, E, F, G] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = (0, _array.newFixture)(4);\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.setObjects(after), obj, 'return self'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('setObjects', SetObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/shiftObject-test\", [\"internal-test-helpers\", \"@ember/-internals/runtime/tests/helpers/array\", \"@ember/-internals/metal\"], function (_internalTestHelpers, _array, _metal) {\n \"use strict\";\n\n class ShiftObjectTests extends _internalTestHelpers.AbstractTestCase {\n async '@test [].shiftObject() => [] + returns undefined + NO notify'() {\n var before = [];\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), undefined); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.validate('[]', undefined, 1), false, 'should NOT have notified [] once');\n this.assert.equal(observer.validate('@each', undefined, 1), false, 'should NOT have notified @each once');\n this.assert.equal(observer.validate('length', undefined, 1), false, 'should NOT have notified length once');\n this.assert.equal(observer.validate('firstObject'), false, 'should NOT have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [X].shiftObject() => [] + notify'() {\n var before = (0, _array.newFixture)(1);\n var after = [];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].shiftObject() => [B,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var after = [before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n this.assert.equal(obj.shiftObject(), before[0], 'should return object'); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject once');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('shiftObject', ShiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/unshiftObject-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _metal, _array) {\n \"use strict\";\n\n class UnshiftObjectTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns unshifted object'() {\n var obj = this.newObject([]);\n var item = (0, _array.newFixture)(1)[0];\n this.assert.equal(obj.unshiftObject(item), item, 'should return unshifted object');\n }\n\n async '@test [].unshiftObject(X) => [X] + notify'() {\n var before = [];\n var item = (0, _array.newFixture)(1)[0];\n var after = [item];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].unshiftObject(X) => [X,A,B,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var item = (0, _array.newFixture)(1)[0];\n var after = [item, before[0], before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [A,B,C].unshiftObject(A) => [A,A,B,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var item = before[0]; // note same object as current head. should end up twice\n\n var after = [item, before[0], before[1], before[2]];\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObject(item); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), true, 'should have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('unshiftObject', UnshiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/tests/helpers/array\"], function (_internalTestHelpers, _metal, _array) {\n \"use strict\";\n\n class UnshiftObjectsTests extends _internalTestHelpers.AbstractTestCase {\n '@test returns receiver'() {\n var obj = this.newObject([]);\n var items = (0, _array.newFixture)(3);\n this.assert.equal(obj.unshiftObjects(items), obj, 'should return receiver');\n }\n\n async '@test [].unshiftObjects([A,B,C]) => [A,B,C] + notify'() {\n var before = [];\n var items = (0, _array.newFixture)(3);\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObjects(items); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), items, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), items.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.timesCalled('lastObject'), 1, 'should have notified lastObject once');\n obj.destroy();\n }\n\n async '@test [A,B,C].unshiftObjects([X,Y]) => [X,Y,A,B,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var items = (0, _array.newFixture)(2);\n var after = items.concat(before);\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObjects(items); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.timesCalled('firstObject'), 1, 'should have notified firstObject once');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n async '@test [A,B,C].unshiftObjects([A,B]) => [A,B,A,B,C] + notify'() {\n var before = (0, _array.newFixture)(3);\n var items = [before[0], before[1]]; // note same object as current head. should end up twice\n\n var after = items.concat(before);\n var obj = this.newObject(before);\n var observer = this.newObserver(obj, '[]', '@each', 'length', 'firstObject', 'lastObject');\n obj.getProperties('firstObject', 'lastObject');\n /* Prime the cache */\n\n obj.unshiftObjects(items); // flush observers\n\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assert.deepEqual(this.toArray(obj), after, 'post item results');\n this.assert.equal((0, _metal.get)(obj, 'length'), after.length, 'length');\n this.assert.equal(observer.timesCalled('[]'), 1, 'should have notified [] once');\n this.assert.equal(observer.timesCalled('@each'), 0, 'should not have notified @each once');\n this.assert.equal(observer.timesCalled('length'), 1, 'should have notified length once');\n this.assert.equal(observer.validate('firstObject'), true, 'should NOT have notified firstObject');\n this.assert.equal(observer.validate('lastObject'), false, 'should NOT have notified lastObject');\n obj.destroy();\n }\n\n }\n\n (0, _array.runArrayTests)('unshiftObjects', UnshiftObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');\n});","define(\"@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_runloop, _metal, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n var array;\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(() => {\n array = _array_proxy.default.extend({\n arrangedContent: (0, _metal.computed)('content.[]', function () {\n var content = this.get('content');\n return content && (0, _array.A)(content.slice().sort((a, b) => {\n if (a == null) {\n a = -1;\n }\n\n if (b == null) {\n b = -1;\n }\n\n return b - a;\n }));\n })\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(() => array.destroy());\n }\n\n ['@test compact - returns arrangedContent without nulls and undefined'](assert) {\n (0, _runloop.run)(() => array.set('content', (0, _array.A)([1, 3, null, 2, undefined])));\n assert.deepEqual(array.compact(), [3, 2, 1]);\n }\n\n ['@test indexOf - returns index of object in arrangedContent'](assert) {\n assert.equal(array.indexOf(4), 1, 'returns arranged index');\n }\n\n ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {\n array.get('content').pushObject(4);\n assert.equal(array.lastIndexOf(4), 2, 'returns last arranged index');\n }\n\n ['@test objectAt - returns object at index in arrangedContent'](assert) {\n assert.equal((0, _metal.objectAt)(array, 1), 4, 'returns object at index');\n } // Not sure if we need a specific test for it, since it's internal\n\n\n ['@test objectAtContent - returns object at index in arrangedContent'](assert) {\n assert.equal(array.objectAtContent(1), 4, 'returns object at index');\n }\n\n ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {\n assert.deepEqual(array.objectsAt([0, 2, 4]), [5, 2, undefined], 'returns objects at indices');\n }\n\n ['@test replace - mutating an arranged ArrayProxy is not allowed']() {\n expectAssertion(() => {\n array.replace(0, 0, [3]);\n }, /Mutating an arranged ArrayProxy is not allowed/);\n }\n\n ['@test replaceContent - does a standard array replace on content'](assert) {\n (0, _runloop.run)(() => array.replaceContent(1, 2, [3]));\n assert.deepEqual(array.get('content'), [1, 3, 5]);\n }\n\n ['@test slice - returns a slice of the arrangedContent'](assert) {\n assert.deepEqual(array.slice(1, 3), [4, 2], 'returns sliced arrangedContent');\n }\n\n ['@test toArray - returns copy of arrangedContent'](assert) {\n assert.deepEqual(array.toArray(), [5, 4, 2, 1]);\n }\n\n ['@test without - returns arrangedContent without object'](assert) {\n assert.deepEqual(array.without(2), [5, 4, 1], 'returns arranged without object');\n }\n\n ['@test lastObject - returns last arranged object'](assert) {\n assert.equal(array.get('lastObject'), 1, 'returns last arranged object');\n }\n\n ['@test firstObject - returns first arranged object'](assert) {\n assert.equal(array.get('firstObject'), 5, 'returns first arranged object');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent matching content', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test insertAt - inserts object at specified index'](assert) {\n (0, _runloop.run)(function () {\n array.insertAt(2, 3);\n });\n assert.deepEqual(array.get('content'), [1, 2, 3, 4, 5]);\n }\n\n ['@test replace - does a standard array replace'](assert) {\n (0, _runloop.run)(function () {\n array.replace(1, 2, [3]);\n });\n assert.deepEqual(array.get('content'), [1, 3, 5]);\n }\n\n ['@test reverseObjects - reverses content'](assert) {\n (0, _runloop.run)(function () {\n array.reverseObjects();\n });\n assert.deepEqual(array.get('content'), [5, 4, 2, 1]);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - arrangedContent with transforms', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.extend({\n arrangedContent: (0, _metal.computed)('content.[]', function () {\n var content = this.get('content');\n return content && (0, _array.A)(content.slice().sort(function (a, b) {\n if (a == null) {\n a = -1;\n }\n\n if (b == null) {\n b = -1;\n }\n\n return b - a;\n }));\n }),\n\n objectAtContent(idx) {\n var obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\n }\n\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test indexOf - returns index of object in arrangedContent'](assert) {\n assert.equal(array.indexOf('4'), 1, 'returns arranged index');\n }\n\n ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {\n array.get('content').pushObject(4);\n assert.equal(array.lastIndexOf('4'), 2, 'returns last arranged index');\n }\n\n ['@test objectAt - returns object at index in arrangedContent'](assert) {\n assert.equal((0, _metal.objectAt)(array, 1), '4', 'returns object at index');\n } // Not sure if we need a specific test for it, since it's internal\n\n\n ['@test objectAtContent - returns object at index in arrangedContent'](assert) {\n assert.equal(array.objectAtContent(1), '4', 'returns object at index');\n }\n\n ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {\n assert.deepEqual(array.objectsAt([0, 2, 4]), ['5', '2', undefined], 'returns objects at indices');\n }\n\n ['@test slice - returns a slice of the arrangedContent'](assert) {\n assert.deepEqual(array.slice(1, 3), ['4', '2'], 'returns sliced arrangedContent');\n }\n\n ['@test toArray - returns copy of arrangedContent'](assert) {\n assert.deepEqual(array.toArray(), ['5', '4', '2', '1']);\n }\n\n ['@test without - returns arrangedContent without object'](assert) {\n assert.deepEqual(array.without('2'), ['5', '4', '1'], 'returns arranged without object');\n }\n\n ['@test lastObject - returns last arranged object'](assert) {\n assert.equal(array.get('lastObject'), '1', 'returns last arranged object');\n }\n\n ['@test firstObject - returns first arranged object'](assert) {\n assert.equal(array.get('firstObject'), '5', 'returns first arranged object');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - with transforms', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _runloop.run)(function () {\n array = _array_proxy.default.extend({\n objectAtContent(idx) {\n var obj = (0, _metal.objectAt)(this.get('arrangedContent'), idx);\n return obj && obj.toString();\n }\n\n }).create({\n content: (0, _array.A)([1, 2, 4, 5])\n });\n });\n }\n\n afterEach() {\n (0, _runloop.run)(function () {\n array.destroy();\n });\n }\n\n ['@test popObject - removes last object in arrangedContent'](assert) {\n var popped = array.popObject();\n assert.equal(popped, '5', 'returns last object');\n assert.deepEqual(array.toArray(), ['1', '2', '4'], 'removes from content');\n }\n\n ['@test removeObject - removes object from content'](assert) {\n array.removeObject('2');\n assert.deepEqual(array.toArray(), ['1', '4', '5']);\n }\n\n ['@test removeObjects - removes objects from content'](assert) {\n array.removeObjects(['2', '4', '6']);\n assert.deepEqual(array.toArray(), ['1', '5']);\n }\n\n ['@test shiftObject - removes from start of arrangedContent'](assert) {\n var shifted = array.shiftObject();\n assert.equal(shifted, '1', 'returns first object');\n assert.deepEqual(array.toArray(), ['2', '4', '5'], 'removes object from content');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/array_proxy/array_observer_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_metal, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - array observers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test mutating content'](assert) {\n expectDeprecation(/Array observers have been deprecated/);\n assert.expect(5);\n var content = (0, _array.A)(['x', 'y', 'z']);\n\n var proxy = _array_proxy.default.create({\n content\n });\n\n proxy.addArrayObserver({\n arrayWillChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [1, 1, 3]);\n assert.deepEqual(proxy.toArray(), ['x', 'y', 'z']);\n },\n\n arrayDidChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [1, 1, 3]);\n assert.deepEqual(proxy.toArray(), ['x', 'a', 'b', 'c', 'z']);\n }\n\n });\n proxy.toArray();\n content.replace(1, 1, ['a', 'b', 'c']);\n }\n\n ['@test assigning content'](assert) {\n expectDeprecation(/Array observers have been deprecated/);\n assert.expect(5);\n var content = (0, _array.A)(['x', 'y', 'z']);\n\n var proxy = _array_proxy.default.create({\n content\n });\n\n proxy.addArrayObserver({\n arrayWillChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [0, 3, 5]);\n assert.deepEqual(proxy.toArray(), ['x', 'y', 'z']);\n },\n\n arrayDidChange(proxy, startIndex, removeCount, addCount) {\n assert.deepEqual([startIndex, removeCount, addCount], [0, 3, 5]);\n assert.deepEqual(proxy.toArray(), ['a', 'b', 'c', 'd', 'e']);\n }\n\n });\n proxy.toArray();\n (0, _metal.set)(proxy, 'content', (0, _array.A)(['a', 'b', 'c', 'd', 'e']));\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/array_proxy/content_change_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_runloop, _metal, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - content change', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test The ArrayProxy doesn't explode when assigned a destroyed object\"](assert) {\n var proxy1 = _array_proxy.default.create();\n\n var proxy2 = _array_proxy.default.create();\n\n (0, _runloop.run)(() => proxy1.destroy());\n (0, _metal.set)(proxy2, 'content', proxy1);\n assert.ok(true, 'No exception was raised');\n }\n\n ['@test should update if content changes while change events are deferred'](assert) {\n var proxy = _array_proxy.default.create();\n\n assert.deepEqual(proxy.toArray(), []);\n (0, _metal.changeProperties)(() => {\n proxy.set('content', (0, _array.A)([1, 2, 3]));\n assert.deepEqual(proxy.toArray(), [1, 2, 3]);\n });\n }\n\n ['@test objectAt recomputes the object cache correctly'](assert) {\n var indexes = [];\n\n var proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(indexes, []);\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(indexes, [0, 1, 2, 3, 4]);\n indexes.length = 0;\n proxy.set('content', (0, _array.A)([1, 2, 3]));\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(indexes, [0, 1, 2]);\n indexes.length = 0;\n proxy.content.replace(2, 0, [4, 5]);\n assert.deepEqual(proxy.objectAt(0), 1);\n assert.deepEqual(proxy.objectAt(1), 2);\n assert.deepEqual(indexes, []);\n assert.deepEqual(proxy.objectAt(2), 4);\n assert.deepEqual(indexes, [2, 3, 4]);\n }\n\n ['@test negative indexes are handled correctly'](assert) {\n var indexes = [];\n\n var proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 5]);\n indexes.length = 0;\n proxy.content.replace(-1, 0, [7]);\n proxy.content.replace(-2, 0, [6]);\n assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 6, 7, 5]);\n assert.deepEqual(indexes, [4, 5, 6]);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/array_proxy/length_test\", [\"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/metal\", \"@ember/object/computed\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\", \"@glimmer/validator\"], function (_array_proxy, _object, _metal, _computed, _array, _internalTestHelpers, _validator) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.ArrayProxy - content change (length)', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should update length for null content'](assert) {\n var proxy = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n assert.equal(proxy.get('length'), 3, 'precond - length is 3');\n proxy.set('content', null);\n assert.equal(proxy.get('length'), 0, 'length updates');\n }\n\n ['@test should update length for null content when there is a computed property watching length'](assert) {\n var proxy = _array_proxy.default.extend({\n isEmpty: (0, _computed.not)('length')\n }).create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n assert.equal(proxy.get('length'), 3, 'precond - length is 3'); // Consume computed property that depends on length\n\n proxy.get('isEmpty'); // update content\n\n proxy.set('content', null);\n assert.equal(proxy.get('length'), 0, 'length updates');\n }\n\n ['@test getting length does not recompute the object cache'](assert) {\n var indexes = [];\n\n var proxy = _array_proxy.default.extend({\n objectAtContent(index) {\n indexes.push(index);\n return this.content[index];\n }\n\n }).create({\n content: (0, _array.A)([1, 2, 3, 4, 5])\n });\n\n assert.equal((0, _metal.get)(proxy, 'length'), 5);\n assert.deepEqual(indexes, []);\n indexes.length = 0;\n proxy.set('content', (0, _array.A)([6, 7, 8]));\n assert.equal((0, _metal.get)(proxy, 'length'), 3);\n assert.deepEqual(indexes, []);\n indexes.length = 0;\n proxy.content.replace(1, 0, [1, 2, 3]);\n assert.equal((0, _metal.get)(proxy, 'length'), 6);\n assert.deepEqual(indexes, []);\n }\n\n '@test accessing length after content set to null'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'content', null);\n assert.equal(obj.length, 0, 'length is 0 without content');\n assert.deepEqual(obj.content, null, 'content was updated');\n }\n\n '@test accessing length after content set to null in willDestroy'(assert) {\n var obj = _array_proxy.default.extend({\n willDestroy() {\n this.set('content', null);\n\n this._super(...arguments);\n }\n\n }).create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _internalTestHelpers.runTask)(() => obj.destroy());\n assert.equal(obj.length, 0, 'length is 0 without content');\n assert.deepEqual(obj.content, null, 'content was updated');\n }\n\n '@test setting length to 0'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'length', 0);\n assert.equal(obj.length, 0, 'length was updated');\n assert.deepEqual(obj.content, [], 'content length was truncated');\n }\n\n '@test setting length to smaller value'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'length', 1);\n assert.equal(obj.length, 1, 'length was updated');\n assert.deepEqual(obj.content, ['foo'], 'content length was truncated');\n }\n\n '@test setting length to larger value'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'length', 3);\n assert.equal(obj.length, 3, 'length was updated');\n assert.deepEqual(obj.content, ['foo', 'bar', undefined], 'content length was updated');\n }\n\n '@test setting length after content set to null'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'content', null);\n assert.equal(obj.length, 0, 'length was updated');\n (0, _metal.set)(obj, 'length', 0);\n assert.equal(obj.length, 0, 'length is still updated');\n }\n\n '@test setting length to greater than zero'(assert) {\n var obj = _array_proxy.default.create({\n content: ['foo', 'bar']\n });\n\n assert.equal(obj.length, 2, 'precond');\n (0, _metal.set)(obj, 'length', 1);\n assert.equal(obj.length, 1, 'length was updated');\n assert.deepEqual(obj.content, ['foo'], 'content length was truncated');\n }\n\n async ['@test array proxy + aliasedProperty complex test'](assert) {\n var aCalled, bCalled, cCalled, dCalled, eCalled;\n aCalled = bCalled = cCalled = dCalled = eCalled = 0;\n\n var obj = _object.default.extend({\n colors: (0, _computed.oneWay)('model'),\n length: (0, _computed.oneWay)('colors.length'),\n a: (0, _metal.observer)('length', () => aCalled++),\n b: (0, _metal.observer)('colors.length', () => bCalled++),\n c: (0, _metal.observer)('colors.content.length', () => cCalled++),\n d: (0, _metal.observer)('colors.[]', () => dCalled++),\n e: (0, _metal.observer)('colors.content.[]', () => eCalled++)\n }).create(); // bootstrap aliases\n\n\n obj.length;\n obj.set('model', _array_proxy.default.create({\n content: (0, _array.A)(['red', 'yellow', 'blue'])\n }));\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj.get('colors.content.length'), 3);\n assert.equal(obj.get('colors.length'), 3);\n assert.equal(obj.get('length'), 3);\n assert.equal(aCalled, 1, 'expected observer `length` to be called ONCE');\n assert.equal(bCalled, 1, 'expected observer `colors.length` to be called ONCE');\n assert.equal(cCalled, 1, 'expected observer `colors.content.length` to be called ONCE');\n assert.equal(dCalled, 1, 'expected observer `colors.[]` to be called ONCE');\n assert.equal(eCalled, 1, 'expected observer `colors.content.[]` to be called ONCE');\n obj.get('colors').pushObjects(['green', 'red']);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj.get('colors.content.length'), 5);\n assert.equal(obj.get('colors.length'), 5);\n assert.equal(obj.get('length'), 5);\n assert.equal(aCalled, 2, 'expected observer `length` to be called TWICE');\n assert.equal(bCalled, 2, 'expected observer `colors.length` to be called TWICE');\n assert.equal(cCalled, 2, 'expected observer `colors.content.length` to be called TWICE');\n assert.equal(dCalled, 2, 'expected observer `colors.[]` to be called TWICE');\n assert.equal(eCalled, 2, 'expected observer `colors.content.[]` to be called TWICE');\n obj.destroy();\n }\n\n async ['@test array proxy length is reactive when accessed normally'](assert) {\n var proxy = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n var lengthCache = (0, _validator.createCache)(() => proxy.length);\n assert.equal((0, _validator.getValue)(lengthCache), 3, 'length is correct');\n proxy.pushObject(4);\n assert.equal((0, _validator.getValue)(lengthCache), 4, 'length is correct');\n proxy.removeObject(1);\n assert.equal((0, _validator.getValue)(lengthCache), 3, 'length is correct');\n proxy.set('content', []);\n assert.equal((0, _validator.getValue)(lengthCache), 0, 'length is correct');\n }\n\n async ['@test array proxy length is reactive when accessed using get'](assert) {\n var proxy = _array_proxy.default.create({\n content: (0, _array.A)([1, 2, 3])\n });\n\n var lengthCache = (0, _validator.createCache)(() => (0, _metal.get)(proxy, 'length'));\n assert.equal((0, _validator.getValue)(lengthCache), 3, 'length is correct');\n proxy.pushObject(4);\n assert.equal((0, _validator.getValue)(lengthCache), 4, 'length is correct');\n proxy.removeObject(1);\n assert.equal((0, _validator.getValue)(lengthCache), 3, 'length is correct');\n proxy.set('content', []);\n assert.equal((0, _validator.getValue)(lengthCache), 0, 'length is correct');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test\", [\"@ember/-internals/meta\", \"@ember/-internals/runtime/lib/system/array_proxy\", \"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_meta, _array_proxy, _array, _internalTestHelpers) {\n \"use strict\";\n\n function sortedListenersFor(obj, eventName) {\n var listeners = (0, _meta.peekMeta)(obj).matchingListeners(eventName) || [];\n var keys = [];\n\n for (var i = 0; i < listeners.length; i += 3) {\n keys.push(listeners[i + 1]);\n }\n\n return keys.sort();\n }\n\n (0, _internalTestHelpers.moduleFor)('ArrayProxy - watching and listening', class extends _internalTestHelpers.AbstractTestCase {\n [`@test setting 'content' adds listeners correctly`](assert) {\n var content = (0, _array.A)();\n\n var proxy = _array_proxy.default.create();\n\n assert.deepEqual(sortedListenersFor(content, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content, '@array:change'), []);\n proxy.set('content', content);\n assert.deepEqual(sortedListenersFor(content, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content, '@array:change'), ['_arrangedContentArrayDidChange']);\n }\n\n [`@test changing 'content' adds and removes listeners correctly`](assert) {\n var content1 = (0, _array.A)();\n var content2 = (0, _array.A)();\n\n var proxy = _array_proxy.default.create({\n content: content1\n });\n\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), []); // setup proxy\n\n proxy.length;\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), ['_arrangedContentArrayDidChange']);\n proxy.set('content', content2);\n assert.deepEqual(sortedListenersFor(content1, '@array:before'), []);\n assert.deepEqual(sortedListenersFor(content1, '@array:change'), []);\n assert.deepEqual(sortedListenersFor(content2, '@array:before'), ['_arrangedContentArrayWillChange']);\n assert.deepEqual(sortedListenersFor(content2, '@array:change'), ['_arrangedContentArrayDidChange']);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/core_object_test\", [\"@ember/-internals/owner\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/core_object\", \"internal-test-helpers\", \"@glimmer/validator\", \"@glimmer/destroyable\", \"@ember/runloop\"], function (_owner, _metal, _core_object, _internalTestHelpers, _validator, _destroyable, _runloop) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.CoreObject', class extends _internalTestHelpers.AbstractTestCase {\n ['@test toString should be not be added as a property when calling toString()'](assert) {\n var obj = _core_object.default.create({\n firstName: 'Foo',\n lastName: 'Bar'\n });\n\n obj.toString();\n assert.notOk(Object.prototype.hasOwnProperty.call(obj, 'toString'), 'Calling toString() should not create a toString class property');\n }\n\n ['@test should not trigger proxy assertion when retrieving a proxy with (GH#16263)'](assert) {\n var someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n\n }).create();\n\n var obj = _core_object.default.create({\n someProxyishThing\n });\n\n var proxy = (0, _metal.get)(obj, 'someProxyishThing');\n assert.equal((0, _metal.get)(proxy, 'lolol'), true, 'should be able to get data from a proxy');\n }\n\n ['@test should not trigger proxy assertion when retrieving a re-registered proxy (GH#16610)'](assert) {\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n var someProxyishThing = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n\n }).create(); // emulates ember-engines's process of registering services provided\n // by the host app down to the engine\n\n\n owner.register('thing:one', someProxyishThing, {\n instantiate: false\n });\n assert.equal(owner.lookup('thing:one'), someProxyishThing);\n }\n\n ['@test should not trigger proxy assertion when probing for a \"symbol\"'](assert) {\n var proxy = _core_object.default.extend({\n unknownProperty() {\n return true;\n }\n\n }).create();\n\n assert.equal((0, _metal.get)(proxy, 'lolol'), true, 'should be able to get data from a proxy'); // should not trigger an assertion\n\n (0, _owner.getOwner)(proxy);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n var owner = {};\n var options = {};\n (0, _owner.setOwner)(options, owner);\n\n _core_object.default.extend({\n init() {\n this._super(...arguments);\n\n var localOwner = (0, _owner.getOwner)(this);\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n\n unknownProperty() {\n return undefined;\n }\n\n }).create(options);\n }\n\n async ['@test observed properties are enumerable when set GH#14594'](assert) {\n var callCount = 0;\n\n var Test = _core_object.default.extend({\n myProp: null,\n anotherProp: undefined,\n didChangeMyProp: (0, _metal.observer)('myProp', function () {\n callCount++;\n })\n });\n\n var test = Test.create();\n (0, _metal.set)(test, 'id', '3');\n (0, _metal.set)(test, 'myProp', {\n id: 1\n });\n assert.deepEqual(Object.keys(test).sort(), ['id', 'myProp']);\n (0, _metal.set)(test, 'anotherProp', 'nice');\n assert.deepEqual(Object.keys(test).sort(), ['anotherProp', 'id', 'myProp']);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(callCount, 1);\n test.destroy();\n }\n\n ['@test native getters/setters do not cause rendering invalidation during init'](assert) {\n var objectMeta = Object.create(null);\n\n class TestObject extends _core_object.default {\n get hiddenValue() {\n var v = (0, _metal.get)(objectMeta, 'hiddenValue');\n return v !== undefined ? v : false;\n }\n\n set hiddenValue(v) {\n (0, _metal.set)(objectMeta, 'hiddenValue', v);\n }\n\n }\n\n (0, _validator.track)(() => {\n TestObject.create({\n hiddenValue: true\n });\n assert.ok(true, 'We did not error');\n });\n }\n\n '@test destroy method is called when being destroyed by @ember/destroyable'(assert) {\n assert.expect(1);\n\n class TestObject extends _core_object.default {\n destroy() {\n assert.ok(true, 'destroy was invoked');\n }\n\n }\n\n var instance = TestObject.create();\n (0, _runloop.run)(() => {\n (0, _destroyable.destroy)(instance);\n });\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/namespace/base_test\", [\"@ember/-internals/environment\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/utils\", \"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/system/namespace\", \"internal-test-helpers\"], function (_environment, _runloop, _metal, _utils, _object, _namespace, _internalTestHelpers) {\n \"use strict\";\n\n var originalLookup = _environment.context.lookup;\n var lookup;\n (0, _internalTestHelpers.moduleFor)('Namespace', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n lookup = _environment.context.lookup = {};\n }\n\n afterEach() {\n (0, _metal.setNamespaceSearchDisabled)(false);\n\n for (var prop in lookup) {\n if (lookup[prop]) {\n (0, _runloop.run)(lookup[prop], 'destroy');\n }\n }\n\n _environment.context.lookup = originalLookup;\n }\n\n ['@test Namespace should be a subclass of EmberObject'](assert) {\n assert.ok(_object.default.detect(_namespace.default));\n }\n\n ['@test Namespace should be duck typed'](assert) {\n var namespace = _namespace.default.create();\n\n try {\n assert.ok((0, _metal.get)(namespace, 'isNamespace'), 'isNamespace property is true');\n } finally {\n (0, _runloop.run)(namespace, 'destroy');\n }\n }\n\n ['@test Namespace is found and named'](assert) {\n var nsA = lookup.NamespaceA = _namespace.default.create();\n\n assert.equal(nsA.toString(), 'NamespaceA', 'namespaces should have a name if they are on lookup');\n\n var nsB = lookup.NamespaceB = _namespace.default.create();\n\n assert.equal(nsB.toString(), 'NamespaceB', 'namespaces work if created after the first namespace processing pass');\n }\n\n ['@test Classes under an Namespace are properly named'](assert) {\n var nsA = lookup.NamespaceA = _namespace.default.create();\n\n nsA.Foo = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(nsA.Foo), 'NamespaceA.Foo', 'Classes pick up their parent namespace');\n nsA.Bar = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(nsA.Bar), 'NamespaceA.Bar', 'New Classes get the naming treatment too');\n\n var nsB = lookup.NamespaceB = _namespace.default.create();\n\n nsB.Foo = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(nsB.Foo), 'NamespaceB.Foo', 'Classes in new namespaces get the naming treatment');\n } //test(\"Classes under Ember are properly named\", function() {\n // // ES6TODO: This test does not work reliably when running independent package build with Broccoli config.\n // Ember.TestObject = EmberObject.extend({});\n // equal(Ember.TestObject.toString(), \"Ember.TestObject\", \"class under Ember is given a string representation\");\n //});\n\n\n ['@test Lowercase namespaces are no longer supported'](assert) {\n var nsC = lookup.namespaceC = _namespace.default.create();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(nsC), (0, _utils.guidFor)(nsC));\n }\n\n ['@test A namespace can be assigned a custom name'](assert) {\n var nsA = _namespace.default.create({\n name: 'NamespaceA'\n });\n\n try {\n var nsB = lookup.NamespaceB = _namespace.default.create({\n name: 'CustomNamespaceB'\n });\n\n nsA.Foo = _object.default.extend();\n nsB.Foo = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(nsA.Foo), 'NamespaceA.Foo', \"The namespace's name is used when the namespace is not in the lookup object\");\n assert.equal((0, _utils.getName)(nsB.Foo), 'CustomNamespaceB.Foo', \"The namespace's name is used when the namespace is in the lookup object\");\n } finally {\n (0, _runloop.run)(nsA, 'destroy');\n }\n }\n\n ['@test Calling namespace.nameClasses() eagerly names all classes'](assert) {\n (0, _metal.setNamespaceSearchDisabled)(true);\n\n var namespace = lookup.NS = _namespace.default.create();\n\n namespace.ClassA = _object.default.extend();\n namespace.ClassB = _object.default.extend();\n\n _namespace.default.processAll();\n\n assert.equal((0, _utils.getName)(namespace.ClassA), 'NS.ClassA');\n assert.equal((0, _utils.getName)(namespace.ClassB), 'NS.ClassB');\n }\n\n ['@test A namespace can be looked up by its name'](assert) {\n var NS = lookup.NS = _namespace.default.create();\n\n var UI = lookup.UI = _namespace.default.create();\n\n var CF = lookup.CF = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('NS'), NS);\n assert.equal(_namespace.default.byName('UI'), UI);\n assert.equal(_namespace.default.byName('CF'), CF);\n }\n\n ['@test A nested namespace can be looked up by its name'](assert) {\n var UI = lookup.UI = _namespace.default.create();\n\n UI.Nav = _namespace.default.create();\n assert.equal(_namespace.default.byName('UI.Nav'), UI.Nav);\n (0, _runloop.run)(UI.Nav, 'destroy');\n }\n\n ['@test Destroying a namespace before caching lookup removes it from the list of namespaces'](assert) {\n var CF = lookup.CF = _namespace.default.create();\n\n (0, _runloop.run)(CF, 'destroy');\n assert.equal(_namespace.default.byName('CF'), undefined, 'namespace can not be found after destroyed');\n }\n\n ['@test Destroying a namespace after looking up removes it from the list of namespaces'](assert) {\n var CF = lookup.CF = _namespace.default.create();\n\n assert.equal(_namespace.default.byName('CF'), CF, 'precondition - namespace can be looked up by name');\n (0, _runloop.run)(CF, 'destroy');\n assert.equal(_namespace.default.byName('CF'), undefined, 'namespace can not be found after destroyed');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/native_array/a_test\", [\"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.A', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Ember.A'](assert) {\n assert.deepEqual((0, _array.A)([1, 2]), [1, 2], 'array values were not be modified');\n assert.deepEqual((0, _array.A)(), [], 'returned an array with no arguments');\n assert.deepEqual((0, _array.A)(null), [], 'returned an array with a null argument');\n assert.ok(_array.default.detect((0, _array.A)()), 'returned an ember array');\n assert.ok(_array.default.detect((0, _array.A)([1, 2])), 'returned an ember array');\n }\n\n ['@test new Ember.A'](assert) {\n expectAssertion(() => {\n assert.deepEqual(new _array.A([1, 2]), [1, 2], 'array values were not be modified');\n assert.deepEqual(new _array.A(), [], 'returned an array with no arguments');\n assert.deepEqual(new _array.A(null), [], 'returned an array with a null argument');\n assert.ok(_array.default.detect(new _array.A()), 'returned an ember array');\n assert.ok(_array.default.detect(new _array.A([1, 2])), 'returned an ember array');\n });\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/native_array/replace_test\", [\"@ember/-internals/runtime/lib/mixins/array\", \"internal-test-helpers\"], function (_array, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('NativeArray.replace', class extends _internalTestHelpers.AbstractTestCase {\n ['@test raises assertion if third argument is not an array']() {\n expectAssertion(function () {\n (0, _array.A)([1, 2, 3]).replace(1, 1, '');\n }, 'The third argument to replace needs to be an array.');\n }\n\n ['@test it does not raise an assertion if third parameter is not passed'](assert) {\n assert.deepEqual((0, _array.A)([1, 2, 3]).replace(1, 2), (0, _array.A)([1]), 'no assertion raised');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/computed_test\", [\"@ember/-internals/metal\", \"@ember/object/computed\", \"@ember/-internals/runtime\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _computed, _runtime, _object, _internalTestHelpers) {\n \"use strict\";\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function K() {\n return this;\n }\n\n function testGet(assert, expect, x, y) {\n assert.equal((0, _metal.get)(x, y), expect);\n assert.equal((0, _metal.get)(x, y), expect);\n assert.equal(x.get(y), expect);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberObject computed property', class extends _internalTestHelpers.AbstractTestCase {\n ['@test computed property on instance'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n testGet(assert, 'FOO', MyClass.create(), 'foo');\n }\n\n ['@test computed property on subclass'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n var Subclass = MyClass.extend({\n foo: (0, _metal.computed)(function () {\n return 'BAR';\n })\n });\n testGet(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test replacing computed property with regular val'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n var Subclass = MyClass.extend({\n foo: 'BAR'\n });\n testGet(assert, 'BAR', Subclass.create(), 'foo');\n }\n\n ['@test complex dependent keys'](assert) {\n var MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'bar', {\n baz: 'BIFF'\n });\n },\n\n count: 0,\n foo: (0, _metal.computed)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n })\n });\n\n var Subclass = MyClass.extend({\n count: 20\n });\n var obj1 = MyClass.create();\n var obj2 = Subclass.create();\n testGet(assert, 'BIFF 1', obj1, 'foo');\n testGet(assert, 'BIFF 21', obj2, 'foo');\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BLARG');\n testGet(assert, 'BLARG 2', obj1, 'foo');\n testGet(assert, 'BIFF 21', obj2, 'foo');\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BOOM');\n testGet(assert, 'BLARG 2', obj1, 'foo');\n testGet(assert, 'BOOM 22', obj2, 'foo');\n }\n\n ['@test complex dependent keys changing complex dependent keys'](assert) {\n var MyClass = _object.default.extend({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'bar', {\n baz: 'BIFF'\n });\n },\n\n count: 0,\n foo: (0, _metal.computed)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n })\n });\n\n var Subclass = MyClass.extend({\n init() {\n this._super(...arguments);\n\n (0, _metal.set)(this, 'bar2', {\n baz: 'BIFF2'\n });\n },\n\n count: 0,\n foo: (0, _metal.computed)('bar2.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n return (0, _metal.get)((0, _metal.get)(this, 'bar2'), 'baz') + ' ' + (0, _metal.get)(this, 'count');\n })\n });\n var obj2 = Subclass.create();\n testGet(assert, 'BIFF2 1', obj2, 'foo');\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BLARG');\n testGet(assert, 'BIFF2 1', obj2, 'foo'); // should not invalidate property\n\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BLARG');\n testGet(assert, 'BLARG 2', obj2, 'foo'); // should not invalidate property\n }\n\n ['@test can retrieve metadata for a computed property'](assert) {\n var MyClass = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}).meta({\n key: 'keyValue'\n })\n });\n\n assert.equal((0, _metal.get)(MyClass.metaForProperty('computedProperty'), 'key'), 'keyValue', 'metadata saved on the computed property can be retrieved');\n\n var ClassWithNoMetadata = _object.default.extend({\n computedProperty: (0, _metal.computed)(function () {}),\n staticProperty: 12\n });\n\n assert.equal(typeof ClassWithNoMetadata.metaForProperty('computedProperty'), 'object', 'returns empty hash if no metadata has been saved');\n expectAssertion(function () {\n ClassWithNoMetadata.metaForProperty('nonexistentProperty');\n }, \"metaForProperty() could not find a computed property with key 'nonexistentProperty'.\");\n expectAssertion(function () {\n ClassWithNoMetadata.metaForProperty('staticProperty');\n }, \"metaForProperty() could not find a computed property with key 'staticProperty'.\");\n }\n\n ['@test overriding a computed property with null removes it from eachComputedProperty iteration'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n bar: (0, _metal.computed)(function () {})\n });\n\n var SubClass = MyClass.extend({\n foo: null\n });\n var list = [];\n SubClass.eachComputedProperty(name => list.push(name));\n assert.deepEqual(list.sort(), ['bar'], 'overridding with null removes from eachComputedProperty listing');\n }\n\n ['@test can iterate over a list of computed properties for a class'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {}),\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n bar: (0, _metal.computed)(function () {}),\n qux: (0, _metal.alias)('foo')\n });\n\n var SubClass = MyClass.extend({\n baz: (0, _metal.computed)(function () {})\n });\n SubClass.reopen({\n bat: (0, _metal.computed)(function () {}).meta({\n iAmBat: true\n })\n });\n var list = [];\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n assert.deepEqual(list.sort(), ['bar', 'foo', 'qux'], 'watched and unwatched computed properties are iterated');\n list = [];\n SubClass.eachComputedProperty(function (name, meta) {\n list.push(name);\n\n if (name === 'bat') {\n assert.deepEqual(meta, {\n iAmBat: true\n });\n } else {\n assert.deepEqual(meta, {});\n }\n });\n assert.deepEqual(list.sort(), ['bar', 'bat', 'baz', 'foo', 'qux'], 'all inherited properties are included');\n }\n\n ['@test list of properties updates when an additional property is added (such cache busting)'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(K),\n fooDidChange: (0, _metal.observer)('foo', function () {}),\n bar: (0, _metal.computed)(K)\n });\n\n var list = [];\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n assert.deepEqual(list.sort(), ['bar', 'foo'].sort(), 'expected two computed properties');\n MyClass.reopen({\n baz: (0, _metal.computed)(K)\n });\n MyClass.create().destroy(); // force apply mixins\n\n list = [];\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n assert.deepEqual(list.sort(), ['bar', 'foo', 'baz'].sort(), 'expected three computed properties');\n (0, _metal.defineProperty)(MyClass.prototype, 'qux', (0, _metal.computed)(K));\n list = [];\n MyClass.eachComputedProperty(function (name) {\n list.push(name);\n });\n assert.deepEqual(list.sort(), ['bar', 'foo', 'baz', 'qux'].sort(), 'expected four computed properties');\n }\n\n ['@test Calling _super in call outside the immediate function of a CP getter works'](assert) {\n function macro(callback) {\n return (0, _metal.computed)(function () {\n return callback.call(this);\n });\n }\n\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n var SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\n });\n assert.ok((0, _metal.get)(SubClass.create(), 'foo'), 'FOO', 'super value is fetched');\n }\n\n ['@test Calling _super in apply outside the immediate function of a CP getter works'](assert) {\n function macro(callback) {\n return (0, _metal.computed)(function () {\n return callback.apply(this);\n });\n }\n\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n var SubClass = MyClass.extend({\n foo: macro(function () {\n return this._super();\n })\n });\n assert.ok((0, _metal.get)(SubClass.create(), 'foo'), 'FOO', 'super value is fetched');\n }\n\n ['@test observing prop installed with computed macro reads and overriding it in create() works'](assert) {\n var Obj = _object.default.extend({\n name: (0, _computed.oneWay)('model.name'),\n nameDidChange: (0, _metal.observer)('name', function () {})\n });\n\n var obj1 = Obj.create({\n name: '1'\n });\n var obj2 = Obj.create({\n name: '2'\n });\n assert.equal(obj1.get('name'), '1');\n assert.equal(obj2.get('name'), '2');\n obj1.destroy();\n obj2.destroy();\n }\n\n ['@test native getters and setters work'](assert) {\n var MyClass = _object.default.extend({\n bar: 123,\n foo: (0, _metal.computed)({\n get() {\n return this.bar;\n },\n\n set(key, value) {\n this.bar = value;\n }\n\n })\n });\n\n var instance = MyClass.create();\n assert.equal(instance.foo, 123, 'getters work');\n instance.foo = 456;\n assert.equal(instance.bar, 456, 'setters work');\n }\n\n ['@test @each on maybe array'](assert) {\n var Normalizer = _object.default.extend({\n options: null,\n // null | undefined | { value: any } | Array<{ value: any }>\n // Normalize into Array\n normalized: (0, _metal.computed)('options', 'options.value', 'options.@each.value', function () {\n var {\n options\n } = this;\n\n if ((0, _runtime.isArray)(options)) {\n return options.map(item => item.value);\n } else if (options !== null && typeof options === 'object') {\n return [options.value];\n } else {\n return [];\n }\n })\n });\n\n var n = Normalizer.create();\n assert.deepEqual(n.normalized, []);\n n.set('options', {\n value: 'foo'\n });\n assert.deepEqual(n.normalized, ['foo']);\n n.set('options.value', 'bar');\n assert.deepEqual(n.normalized, ['bar']);\n n.set('options', {\n extra: 'wat',\n value: 'baz'\n });\n assert.deepEqual(n.normalized, ['baz']);\n n.set('options', (0, _runtime.A)([{\n value: 'foo'\n }]));\n assert.deepEqual(n.normalized, ['foo']);\n n.options.pushObject({\n value: 'bar'\n });\n assert.deepEqual(n.normalized, ['foo', 'bar']);\n n.options.pushObject({\n extra: 'wat',\n value: 'baz'\n });\n assert.deepEqual(n.normalized, ['foo', 'bar', 'baz']);\n n.options.clear();\n assert.deepEqual(n.normalized, []);\n n.set('options', [{\n value: 'foo'\n }, {\n value: 'bar'\n }]);\n assert.deepEqual(n.normalized, ['foo', 'bar']);\n (0, _metal.set)(n.options[0], 'value', 'FOO');\n assert.deepEqual(n.normalized, ['FOO', 'bar']);\n n.set('options', null);\n assert.deepEqual(n.normalized, []);\n }\n\n ['@test @each works on array with falsy values'](assert) {\n var obj = _object.default.extend({\n falsy: [null, undefined, false, '', 0, {}],\n truthy: [true, 'foo', 123],\n falsyComputed: (0, _metal.computed)('falsy.@each.foo', () => {\n assert.ok(true, 'falsy computed');\n }),\n truthyComputed: (0, _metal.computed)('truthy.@each.foo', () => {\n assert.ok(true, 'truthy computed');\n })\n }).create(); // should throw no errors\n\n\n obj.falsyComputed;\n expectAssertion(() => {\n obj.truthyComputed;\n }, /When using @each to observe the array `true,foo,123`, the items in the array must be objects/);\n }\n\n ['@test @each works with array-likes'](assert) {\n class ArrayLike {\n constructor(arr = []) {\n this.inner = arr;\n }\n\n get length() {\n return this.inner.length;\n }\n\n objectAt(index) {\n return this.inner[index];\n }\n\n map(fn) {\n return this.inner.map(fn);\n }\n\n }\n\n var Normalizer = _object.default.extend({\n options: null,\n // null | ArrayLike<{ value: any }>\n // Normalize into Array\n normalized: (0, _metal.computed)('options.@each.value', function () {\n var options = this.options || [];\n return options.map(item => item.value);\n })\n });\n\n var n = Normalizer.create();\n assert.deepEqual(n.normalized, []);\n var options = new ArrayLike([{\n value: 'foo'\n }]);\n n.set('options', options);\n assert.deepEqual(n.normalized, ['foo']);\n (0, _metal.set)(options.objectAt(0), 'value', 'bar');\n assert.deepEqual(n.normalized, ['bar']);\n }\n\n ['@test lazy computation cannot cause infinite cycles'](assert) {\n // This is based off a real world bug found in ember-cp-validations:\n // https://github.com/offirgolan/ember-cp-validations/issues/659\n var CycleObject = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return _object.default.extend({\n parent: this,\n alias: (0, _metal.alias)('parent.foo')\n }).create();\n }),\n bar: (0, _metal.computed)('foo.alias', () => {})\n });\n\n var obj = CycleObject.create();\n obj.bar;\n obj.foo;\n assert.ok(true);\n }\n\n ['@test computeds can have cycles'](assert) {\n var _dec, _dec2, _class;\n\n var CycleObject = (_dec = (0, _metal.computed)('bar'), _dec2 = (0, _metal.computed)('foo'), (_class = class CycleObject {\n // eslint-disable-next-line getter-return\n get foo() {} // eslint-disable-next-line getter-return\n\n\n get bar() {}\n\n }, (_applyDecoratedDescriptor(_class.prototype, \"foo\", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, \"foo\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"bar\", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, \"bar\"), _class.prototype)), _class));\n var obj = new CycleObject();\n obj.bar;\n obj.foo;\n (0, _metal.notifyPropertyChange)(obj, 'bar');\n obj.foo;\n assert.ok(true);\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/create_test\", [\"@ember/-internals/container\", \"@ember/-internals/owner\", \"@ember/-internals/metal\", \"@ember/service\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\", \"@glimmer/destroyable\"], function (_container, _owner, _metal, _service, _object, _internalTestHelpers, _destroyable) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberObject.create', class extends _internalTestHelpers.AbstractTestCase {\n ['@test simple properties are set'](assert) {\n expectNoDeprecation();\n\n var o = _object.default.create({\n ohai: 'there'\n });\n\n assert.equal(o.get('ohai'), 'there');\n }\n\n ['@test explicit injection does not raise deprecation'](assert) {\n var _class, _descriptor;\n\n expectNoDeprecation();\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class FooService extends _service.default {\n constructor(...args) {\n super(...args);\n this.bar = 'foo';\n }\n\n }\n\n var FooObject = (_class = class FooObject extends _object.default {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"foo\", [_service.service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class);\n owner.register('service:foo', FooService);\n owner.register('foo:main', FooObject);\n var obj = owner.lookup('foo:main');\n assert.equal(obj.foo.bar, 'foo');\n }\n\n ['@test implicit injections raises deprecation']() {\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class FooService extends _service.default {\n constructor(...args) {\n super(...args);\n this.bar = 'foo';\n }\n\n }\n\n class FooObject extends _object.default {}\n\n owner.register('service:foo', FooService);\n owner.register('foo:main', FooObject);\n expectDeprecation(() => owner.inject('foo:main', 'foo', 'service:foo'), /As of Ember 4.0.0, owner.inject no longer injects values into resolved instances, and calling the method has been deprecated. Since this method no longer does anything, it is fully safe to remove this injection. As an alternative to this API, you can refactor to explicitly inject `foo` on `foo:main`, or look it up directly using the `getOwner` API./);\n }\n\n ['@test calls computed property setters'](assert) {\n var MyClass = _object.default.extend({\n foo: (0, _metal.computed)({\n get() {\n return \"this is not the value you're looking for\";\n },\n\n set(key, value) {\n return value;\n }\n\n })\n });\n\n var o = MyClass.create({\n foo: 'bar'\n });\n assert.equal(o.get('foo'), 'bar');\n }\n\n ['@test sets up mandatory setters for simple properties watched with observers'](assert) {\n if (true\n /* DEBUG */\n ) {\n var MyClass = _object.default.extend({\n foo: null,\n bar: null,\n fooDidChange: (0, _metal.observer)('foo', function () {})\n });\n\n var o = MyClass.create({\n foo: 'bar',\n bar: 'baz'\n });\n assert.equal(o.get('foo'), 'bar');\n var descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(descriptor.set, 'Mandatory setter was setup');\n descriptor = Object.getOwnPropertyDescriptor(o, 'bar');\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n o.destroy();\n } else {\n assert.expect(0);\n }\n }\n\n ['@test sets up mandatory setters for simple properties watched with computeds'](assert) {\n if (true\n /* DEBUG */\n ) {\n var MyClass = _object.default.extend({\n foo: null,\n bar: null,\n fooAlias: (0, _metal.computed)('foo', function () {\n return this.foo;\n })\n });\n\n var o = MyClass.create({\n foo: 'bar',\n bar: 'baz'\n });\n assert.equal(o.get('fooAlias'), 'bar');\n var descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(descriptor.set, 'Mandatory setter was setup');\n descriptor = Object.getOwnPropertyDescriptor(o, 'bar');\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n o.destroy();\n } else {\n assert.expect(0);\n }\n }\n\n ['@test sets up mandatory setters for simple properties watched with aliases'](assert) {\n if (true\n /* DEBUG */\n ) {\n var MyClass = _object.default.extend({\n foo: null,\n bar: null,\n fooAlias: (0, _metal.alias)('foo')\n });\n\n var o = MyClass.create({\n foo: 'bar',\n bar: 'baz'\n });\n assert.equal(o.get('fooAlias'), 'bar');\n var descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(descriptor.set, 'Mandatory setter was setup');\n descriptor = Object.getOwnPropertyDescriptor(o, 'bar');\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n o.destroy();\n } else {\n assert.expect(0);\n }\n }\n\n ['@test does not sets up separate mandatory setters on getters'](assert) {\n if (true\n /* DEBUG */\n ) {\n var MyClass = _object.default.extend({\n get foo() {\n return 'bar';\n },\n\n fooDidChange: (0, _metal.observer)('foo', function () {})\n });\n\n var o = MyClass.create({});\n assert.equal(o.get('foo'), 'bar');\n var descriptor = Object.getOwnPropertyDescriptor(o, 'foo');\n assert.ok(!descriptor, 'Mandatory setter was not setup'); // cleanup\n\n o.destroy();\n } else {\n assert.expect(0);\n }\n }\n\n ['@test does not sets up separate mandatory setters on arrays'](assert) {\n if (true\n /* DEBUG */\n ) {\n var arr = [123];\n (0, _metal.addObserver)(arr, 0, function () {});\n var descriptor = Object.getOwnPropertyDescriptor(arr, 0);\n assert.ok(!descriptor.set, 'Mandatory setter was not setup');\n (0, _destroyable.destroy)(arr);\n } else {\n assert.expect(0);\n }\n }\n\n ['@test calls setUnknownProperty if undefined'](assert) {\n var setUnknownPropertyCalled = false;\n\n var MyClass = _object.default.extend({\n setUnknownProperty()\n /* key, value */\n {\n setUnknownPropertyCalled = true;\n }\n\n });\n\n MyClass.create({\n foo: 'bar'\n });\n assert.ok(setUnknownPropertyCalled, 'setUnknownProperty was called');\n }\n\n ['@test throws if you try to define a computed property']() {\n expectAssertion(function () {\n _object.default.create({\n foo: (0, _metal.computed)(function () {})\n });\n }, 'EmberObject.create no longer supports defining computed properties. Define computed properties using extend() or reopen() before calling create().');\n }\n\n ['@test throws if you try to call _super in a method']() {\n expectAssertion(function () {\n _object.default.create({\n foo() {\n this._super(...arguments);\n }\n\n });\n }, 'EmberObject.create no longer supports defining methods that call _super.');\n }\n\n [\"@test throws if you try to 'mixin' a definition\"]() {\n var myMixin = _metal.Mixin.create({\n adder(arg1, arg2) {\n return arg1 + arg2;\n }\n\n });\n\n expectAssertion(function () {\n _object.default.create(myMixin);\n }, 'EmberObject.create no longer supports mixing in other definitions, use .extend & .create separately instead.');\n }\n\n ['@test inherits properties from passed in EmberObject'](assert) {\n var baseObj = _object.default.create({\n foo: 'bar'\n });\n\n var secondaryObj = _object.default.create(baseObj);\n\n assert.equal(secondaryObj.foo, baseObj.foo, 'Em.O.create inherits properties from EmberObject parameter');\n }\n\n ['@test throws if you try to pass anything a string as a parameter']() {\n var expected = 'EmberObject.create only accepts objects.';\n expectAssertion(() => _object.default.create('some-string'), expected);\n }\n\n ['@test EmberObject.create can take undefined as a parameter'](assert) {\n var o = _object.default.create(undefined);\n\n assert.deepEqual(_object.default.create(), o);\n }\n\n ['@test can use getOwner in a proxy init GH#16484'](assert) {\n var owner = {};\n var options = {};\n (0, _owner.setOwner)(options, owner);\n\n _object.default.extend({\n init() {\n this._super(...arguments);\n\n var localOwner = (0, _owner.getOwner)(this);\n assert.equal(localOwner, owner, 'should be able to `getOwner` in init');\n },\n\n unknownProperty() {\n return undefined;\n }\n\n }).create(options);\n }\n\n ['@test does not create enumerable properties for owner and init factory when created by the container factory'](assert) {\n var registry = new _container.Registry();\n var container = registry.container();\n container.owner = {};\n registry.register('component:foo-bar', _object.default);\n var componentFactory = container.factoryFor('component:foo-bar');\n var instance = componentFactory.create();\n assert.deepEqual(Object.keys(instance), [], 'no enumerable properties were added');\n assert.equal((0, _owner.getOwner)(instance), container.owner, 'owner was defined on the instance');\n assert.ok((0, _container.getFactoryFor)(instance), 'factory was defined on the instance');\n }\n\n ['@test does not create enumerable properties for owner and init factory when looked up on the container'](assert) {\n var registry = new _container.Registry();\n var container = registry.container();\n container.owner = {};\n registry.register('component:foo-bar', _object.default);\n var instance = container.lookup('component:foo-bar');\n assert.deepEqual(Object.keys(instance), [], 'no enumerable properties were added');\n assert.equal((0, _owner.getOwner)(instance), container.owner, 'owner was defined on the instance');\n assert.ok((0, _container.getFactoryFor)(instance), 'factory was defined on the instance');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/destroy_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/meta\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_runloop, _metal, _meta, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/runtime/system/object/destroy_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should schedule objects to be destroyed at the end of the run loop'](assert) {\n var obj = _object.default.create();\n\n var meta;\n (0, _runloop.run)(() => {\n obj.destroy();\n meta = (0, _meta.peekMeta)(obj);\n assert.ok(meta, 'meta is not destroyed immediately');\n assert.ok((0, _metal.get)(obj, 'isDestroying'), 'object is marked as destroying immediately');\n assert.ok(!(0, _metal.get)(obj, 'isDestroyed'), 'object is not destroyed immediately');\n });\n meta = (0, _meta.peekMeta)(obj);\n assert.ok((0, _metal.get)(obj, 'isDestroyed'), 'object is destroyed after run loop finishes');\n } // MANDATORY_SETTER moves value to meta.values\n // a destroyed object removes meta but leaves the accessor\n // that looks it up\n\n\n ['@test should raise an exception when modifying watched properties on a destroyed object'](assert) {\n if (true\n /* DEBUG */\n ) {\n var obj = _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {})\n }).create({\n foo: 'bar'\n });\n\n (0, _runloop.run)(() => obj.destroy());\n assert.throws(() => (0, _metal.set)(obj, 'foo', 'baz'), Error, 'raises an exception');\n } else {\n assert.expect(0);\n }\n }\n\n async ['@test observers should not fire after an object has been destroyed'](assert) {\n var count = 0;\n\n var obj = _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n count++;\n })\n }).create();\n\n obj.set('foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'observer was fired once');\n (0, _metal.beginPropertyChanges)();\n obj.set('foo', 'quux');\n obj.destroy();\n (0, _metal.endPropertyChanges)();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1, 'observer was not called after object was destroyed');\n }\n\n async ['@test destroyed objects should not see each others changes during teardown but a long lived object should'](assert) {\n var shouldChange = 0;\n var shouldNotChange = 0;\n var objs = {};\n\n var A = _object.default.extend({\n objs: objs,\n isAlive: true,\n\n willDestroy() {\n this.set('isAlive', false);\n },\n\n bDidChange: (0, _metal.observer)('objs.b.isAlive', function () {\n shouldNotChange++;\n }),\n cDidChange: (0, _metal.observer)('objs.c.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n var B = _object.default.extend({\n objs: objs,\n isAlive: true,\n\n willDestroy() {\n this.set('isAlive', false);\n },\n\n aDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldNotChange++;\n }),\n cDidChange: (0, _metal.observer)('objs.c.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n var C = _object.default.extend({\n objs: objs,\n isAlive: true,\n\n willDestroy() {\n this.set('isAlive', false);\n },\n\n aDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldNotChange++;\n }),\n bDidChange: (0, _metal.observer)('objs.b.isAlive', function () {\n shouldNotChange++;\n })\n });\n\n var LongLivedObject = _object.default.extend({\n objs: objs,\n isAliveDidChange: (0, _metal.observer)('objs.a.isAlive', function () {\n shouldChange++;\n })\n });\n\n objs.a = A.create();\n objs.b = B.create();\n objs.c = C.create();\n var longLived = LongLivedObject.create();\n\n for (var obj in objs) {\n objs[obj].destroy();\n }\n\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(shouldNotChange, 0, 'destroyed graph objs should not see change in willDestroy');\n assert.equal(shouldChange, 1, 'long lived should see change in willDestroy');\n longLived.destroy();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/detectInstance_test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/object/detectInstance', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detectInstance detects instances correctly'](assert) {\n var A = _object.default.extend();\n\n var B = A.extend();\n var C = A.extend();\n\n var o = _object.default.create();\n\n var a = A.create();\n var b = B.create();\n var c = C.create();\n assert.ok(_object.default.detectInstance(o), 'o is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(a), 'a is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(b), 'b is an instance of EmberObject');\n assert.ok(_object.default.detectInstance(c), 'c is an instance of EmberObject');\n assert.ok(!A.detectInstance(o), 'o is not an instance of A');\n assert.ok(A.detectInstance(a), 'a is an instance of A');\n assert.ok(A.detectInstance(b), 'b is an instance of A');\n assert.ok(A.detectInstance(c), 'c is an instance of A');\n assert.ok(!B.detectInstance(o), 'o is not an instance of B');\n assert.ok(!B.detectInstance(a), 'a is not an instance of B');\n assert.ok(B.detectInstance(b), 'b is an instance of B');\n assert.ok(!B.detectInstance(c), 'c is not an instance of B');\n assert.ok(!C.detectInstance(o), 'o is not an instance of C');\n assert.ok(!C.detectInstance(a), 'a is not an instance of C');\n assert.ok(!C.detectInstance(b), 'b is not an instance of C');\n assert.ok(C.detectInstance(c), 'c is an instance of C');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/detect_test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/object/detect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test detect detects classes correctly'](assert) {\n var A = _object.default.extend();\n\n var B = A.extend();\n var C = A.extend();\n assert.ok(_object.default.detect(_object.default), 'EmberObject is an EmberObject class');\n assert.ok(_object.default.detect(A), 'A is an EmberObject class');\n assert.ok(_object.default.detect(B), 'B is an EmberObject class');\n assert.ok(_object.default.detect(C), 'C is an EmberObject class');\n assert.ok(!A.detect(_object.default), 'EmberObject is not an A class');\n assert.ok(A.detect(A), 'A is an A class');\n assert.ok(A.detect(B), 'B is an A class');\n assert.ok(A.detect(C), 'C is an A class');\n assert.ok(!B.detect(_object.default), 'EmberObject is not a B class');\n assert.ok(!B.detect(A), 'A is not a B class');\n assert.ok(B.detect(B), 'B is a B class');\n assert.ok(!B.detect(C), 'C is not a B class');\n assert.ok(!C.detect(_object.default), 'EmberObject is not a C class');\n assert.ok(!C.detect(A), 'A is not a C class');\n assert.ok(!C.detect(B), 'B is not a C class');\n assert.ok(C.detect(C), 'C is a C class');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/es-compatibility-test\", [\"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_object, _metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('EmberObject ES Compatibility', class extends _internalTestHelpers.AbstractTestCase {\n ['@test extending an Ember.Object'](assert) {\n var calls = [];\n\n class MyObject extends _object.default {\n constructor() {\n calls.push('constructor');\n super(...arguments);\n this.postInitProperty = 'post-init-property';\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n this.initProperty = 'init-property';\n }\n\n }\n\n var myObject = MyObject.create({\n passedProperty: 'passed-property'\n });\n assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)');\n assert.equal(myObject.postInitProperty, 'post-init-property', 'constructor property available on instance (create)');\n assert.equal(myObject.initProperty, 'init-property', 'init property available on instance (create)');\n assert.equal(myObject.passedProperty, 'passed-property', 'passed property available on instance (create)');\n }\n\n ['@test normal method super'](assert) {\n var calls = [];\n\n var Foo = _object.default.extend({\n method() {\n calls.push('foo');\n }\n\n });\n\n var Bar = Foo.extend({\n method() {\n this._super();\n\n calls.push('bar');\n }\n\n });\n\n class Baz extends Bar {\n method() {\n super.method();\n calls.push('baz');\n }\n\n }\n\n var Qux = Baz.extend({\n method() {\n this._super();\n\n calls.push('qux');\n }\n\n });\n var Quux = Qux.extend({\n method() {\n this._super();\n\n calls.push('quux');\n }\n\n });\n\n class Corge extends Quux {\n method() {\n super.method();\n calls.push('corge');\n }\n\n }\n\n var callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.create().method();\n assert.deepEqual(calls, callValues.slice(0, index + 1), 'chain of static methods called with super');\n });\n }\n\n ['@test static method super'](assert) {\n var calls;\n\n var Foo = _object.default.extend();\n\n Foo.reopenClass({\n method() {\n calls.push('foo');\n }\n\n });\n var Bar = Foo.extend();\n Bar.reopenClass({\n method() {\n this._super();\n\n calls.push('bar');\n }\n\n });\n\n class Baz extends Bar {\n static method() {\n super.method();\n calls.push('baz');\n }\n\n }\n\n var Qux = Baz.extend();\n Qux.reopenClass({\n method() {\n this._super();\n\n calls.push('qux');\n }\n\n });\n var Quux = Qux.extend();\n Quux.reopenClass({\n method() {\n this._super();\n\n calls.push('quux');\n }\n\n });\n\n class Corge extends Quux {\n static method() {\n super.method();\n calls.push('corge');\n }\n\n }\n\n var callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];\n [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => {\n calls = [];\n Class.method();\n assert.deepEqual(calls, callValues.slice(0, index + 1), 'chain of static methods called with super');\n });\n }\n\n ['@test using mixins'](assert) {\n var Mixin1 = _metal.Mixin.create({\n property1: 'data-1'\n });\n\n var Mixin2 = _metal.Mixin.create({\n property2: 'data-2'\n });\n\n class MyObject extends _object.default.extend(Mixin1, Mixin2) {}\n\n var myObject = MyObject.create();\n assert.equal(myObject.property1, 'data-1', 'includes the first mixin');\n assert.equal(myObject.property2, 'data-2', 'includes the second mixin');\n }\n\n ['@test using instanceof'](assert) {\n class MyObject extends _object.default {}\n\n var myObject = MyObject.create();\n assert.ok(myObject instanceof MyObject);\n assert.ok(myObject instanceof _object.default);\n }\n\n ['@test using Ember.Object#detect'](assert) {\n var Parent = _object.default.extend();\n\n class Child extends Parent {}\n\n var Grandchild = Child.extend();\n assert.ok(Parent.detect(Child), 'Parent.detect(Child)');\n assert.ok(Child.detect(Grandchild), 'Child.detect(Grandchild)');\n }\n\n ['@test extending an ES subclass of EmberObject'](assert) {\n var calls = [];\n\n class SubEmberObject extends _object.default {\n constructor() {\n calls.push('constructor');\n super(...arguments);\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n }\n\n }\n\n class MyObject extends SubEmberObject {}\n\n MyObject.create();\n assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)');\n }\n\n ['@test calling extend on an ES subclass of EmberObject'](assert) {\n var calls = [];\n\n class SubEmberObject extends _object.default {\n constructor() {\n calls.push('before constructor');\n super(...arguments);\n calls.push('after constructor');\n this.foo = 123;\n }\n\n init() {\n calls.push('init');\n super.init(...arguments);\n }\n\n }\n\n var MyObject = SubEmberObject.extend({});\n MyObject.create();\n assert.deepEqual(calls, ['before constructor', 'after constructor', 'init'], 'constructor then init called (create)');\n var obj = MyObject.create({\n foo: 456,\n bar: 789\n });\n assert.equal(obj.foo, 456, 'sets class fields on instance correctly');\n assert.equal(obj.bar, 789, 'sets passed in properties on instance correctly');\n }\n\n ['@test calling metaForProperty on a native class works'](assert) {\n assert.expect(0);\n\n class SubEmberObject extends _object.default {}\n\n (0, _metal.defineProperty)(SubEmberObject.prototype, 'foo', (0, _metal.computed)('foo', {\n get() {\n return 'bar';\n }\n\n })); // able to get meta without throwing an error\n\n SubEmberObject.metaForProperty('foo');\n }\n\n '@test observes / removeObserver on / removeListener interop'(assert) {\n var fooDidChangeBase = 0;\n var fooDidChangeA = 0;\n var fooDidChangeB = 0;\n var someEventBase = 0;\n var someEventA = 0;\n var someEventB = 0;\n\n class A extends _object.default.extend({\n fooDidChange: (0, _metal.observer)('foo', function () {\n fooDidChangeBase++;\n }),\n onSomeEvent: (0, _metal.on)('someEvent', function () {\n someEventBase++;\n })\n }) {\n init() {\n super.init();\n this.foo = 'bar';\n }\n\n fooDidChange() {\n super.fooDidChange();\n fooDidChangeA++;\n }\n\n onSomeEvent() {\n super.onSomeEvent();\n someEventA++;\n }\n\n }\n\n class B extends A {\n fooDidChange() {\n super.fooDidChange();\n fooDidChangeB++;\n }\n\n onSomeEvent() {\n super.onSomeEvent();\n someEventB++;\n }\n\n }\n\n (0, _metal.removeObserver)(B.prototype, 'foo', null, 'fooDidChange');\n (0, _metal.removeListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n assert.equal(fooDidChangeBase, 0);\n assert.equal(fooDidChangeA, 0);\n assert.equal(fooDidChangeB, 0);\n assert.equal(someEventBase, 0);\n assert.equal(someEventA, 0);\n assert.equal(someEventB, 0);\n var a = A.create();\n a.set('foo', 'something'); // TODO: Generator transpilation code doesn't play nice with class definitions/hoisting\n\n return (0, _internalTestHelpers.runLoopSettled)().then(async () => {\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n (0, _metal.sendEvent)(a, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n var b = B.create();\n b.set('foo', 'something');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(fooDidChangeBase, 1);\n assert.equal(fooDidChangeA, 1);\n assert.equal(fooDidChangeB, 0);\n (0, _metal.sendEvent)(b, 'someEvent');\n assert.equal(someEventBase, 1);\n assert.equal(someEventA, 1);\n assert.equal(someEventB, 0);\n a.destroy();\n b.destroy();\n });\n }\n\n '@test super and _super interop between old and new methods'(assert) {\n var calls = [];\n var changes = [];\n var events = [];\n var lastProps;\n\n class A extends _object.default {\n init(props) {\n calls.push('A init');\n lastProps = props;\n }\n\n }\n\n var Mixin1 = _metal.Mixin.create({\n init() {\n calls.push('Mixin1 init before _super');\n\n this._super(...arguments);\n\n calls.push('Mixin1 init after _super');\n }\n\n });\n\n var Mixin2 = _metal.Mixin.create({\n init() {\n calls.push('Mixin2 init before _super');\n\n this._super(...arguments);\n\n calls.push('Mixin2 init after _super');\n }\n\n });\n\n class B extends A.extend(Mixin1, Mixin2) {\n init() {\n calls.push('B init before super.init');\n super.init(...arguments);\n calls.push('B init after super.init');\n }\n\n onSomeEvent(evt) {\n events.push(`B onSomeEvent ${evt}`);\n }\n\n fullNameDidChange() {\n changes.push('B fullNameDidChange');\n }\n\n } // // define a CP\n\n\n (0, _metal.defineProperty)(B.prototype, 'full', (0, _metal.computed)('first', 'last', {\n get() {\n return this.first + ' ' + this.last;\n }\n\n })); // Only string observers are allowed for prototypes\n\n (0, _metal.addObserver)(B.prototype, 'full', null, 'fullNameDidChange'); // Only string listeners are allowed for prototypes\n\n (0, _metal.addListener)(B.prototype, 'someEvent', null, 'onSomeEvent');\n B.reopen({\n init() {\n calls.push('reopen init before _super');\n\n this._super(...arguments);\n\n calls.push('reopen init after _super');\n }\n\n });\n var C = B.extend({\n init() {\n calls.push('C init before _super');\n\n this._super(...arguments);\n\n calls.push('C init after _super');\n },\n\n onSomeEvent(evt) {\n calls.push('C onSomeEvent before _super');\n\n this._super(evt);\n\n calls.push('C onSomeEvent after _super');\n },\n\n fullNameDidChange() {\n calls.push('C fullNameDidChange before _super');\n\n this._super();\n\n calls.push('C fullNameDidChange after _super');\n }\n\n });\n\n class D extends C {\n init() {\n calls.push('D init before super.init');\n super.init(...arguments);\n calls.push('D init after super.init');\n }\n\n onSomeEvent(evt) {\n events.push('D onSomeEvent before super.onSomeEvent');\n super.onSomeEvent(evt);\n events.push('D onSomeEvent after super.onSomeEvent');\n }\n\n fullNameDidChange() {\n changes.push('D fullNameDidChange before super.fullNameDidChange');\n super.fullNameDidChange();\n changes.push('D fullNameDidChange after super.fullNameDidChange');\n }\n\n triggerSomeEvent(...args) {\n (0, _metal.sendEvent)(this, 'someEvent', args);\n }\n\n }\n\n assert.deepEqual(calls, [], 'nothing has been called');\n assert.deepEqual(changes, [], 'full has not changed');\n assert.deepEqual(events, [], 'onSomeEvent has not been triggered');\n var d = D.create({\n first: 'Robert',\n last: 'Jackson'\n });\n assert.deepEqual(calls, ['D init before super.init', 'C init before _super', 'reopen init before _super', 'B init before super.init', 'Mixin2 init before _super', 'Mixin1 init before _super', 'A init', 'Mixin1 init after _super', 'Mixin2 init after _super', 'B init after super.init', 'reopen init after _super', 'C init after _super', 'D init after super.init']);\n assert.deepEqual(changes, [], 'full has not changed');\n assert.deepEqual(events, [], 'onSomeEvent has not been triggered');\n assert.deepEqual(lastProps, {\n first: 'Robert',\n last: 'Jackson'\n });\n assert.equal(d.full, 'Robert Jackson');\n d.setProperties({\n first: 'Kris',\n last: 'Selden'\n }); // TODO: Generator transpilation code doesn't play nice with class definitions/hoisting\n\n return (0, _internalTestHelpers.runLoopSettled)().then(() => {\n assert.deepEqual(changes, ['D fullNameDidChange before super.fullNameDidChange', 'B fullNameDidChange', 'D fullNameDidChange after super.fullNameDidChange']);\n assert.equal(d.full, 'Kris Selden');\n d.triggerSomeEvent('event arg');\n assert.deepEqual(events, ['D onSomeEvent before super.onSomeEvent', 'B onSomeEvent event arg', 'D onSomeEvent after super.onSomeEvent']);\n d.destroy();\n });\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/events_test\", [\"@ember/-internals/runtime/lib/system/object\", \"@ember/-internals/runtime/lib/mixins/evented\", \"internal-test-helpers\"], function (_object, _evented, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Object events', class extends _internalTestHelpers.AbstractTestCase {\n ['@test a listener can be added to an object'](assert) {\n var count = 0;\n\n var F = function () {\n count++;\n };\n\n var obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', F);\n obj.trigger('event!');\n assert.equal(count, 1, 'the event was triggered');\n obj.trigger('event!');\n assert.equal(count, 2, 'the event was triggered');\n }\n\n ['@test a listener can be added and removed automatically the first time it is triggered'](assert) {\n var count = 0;\n\n var F = function () {\n count++;\n };\n\n var obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', F);\n obj.trigger('event!');\n assert.equal(count, 1, 'the event was triggered');\n obj.trigger('event!');\n assert.equal(count, 1, 'the event was not triggered again');\n }\n\n ['@test triggering an event can have arguments'](assert) {\n var self, args;\n\n var obj = _object.default.extend(_evented.default).create();\n\n obj.on('event!', function () {\n args = [].slice.call(arguments);\n self = this;\n });\n obj.trigger('event!', 'foo', 'bar');\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, obj);\n }\n\n ['@test a listener can be added and removed automatically and have arguments'](assert) {\n var self, args;\n var count = 0;\n\n var obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', function () {\n args = [].slice.call(arguments);\n self = this;\n count++;\n });\n obj.trigger('event!', 'foo', 'bar');\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, obj);\n assert.equal(count, 1, 'the event is triggered once');\n obj.trigger('event!', 'baz', 'bat');\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(count, 1, 'the event was not triggered again');\n assert.equal(self, obj);\n }\n\n ['@test binding an event can specify a different target'](assert) {\n var self, args;\n\n var obj = _object.default.extend(_evented.default).create();\n\n var target = {};\n obj.on('event!', target, function () {\n args = [].slice.call(arguments);\n self = this;\n });\n obj.trigger('event!', 'foo', 'bar');\n assert.deepEqual(args, ['foo', 'bar']);\n assert.equal(self, target);\n }\n\n ['@test a listener registered with one can take method as string and can be added with different target'](assert) {\n var count = 0;\n var target = {};\n\n target.fn = function () {\n count++;\n };\n\n var obj = _object.default.extend(_evented.default).create();\n\n obj.one('event!', target, 'fn');\n obj.trigger('event!');\n assert.equal(count, 1, 'the event was triggered');\n obj.trigger('event!');\n assert.equal(count, 1, 'the event was not triggered again');\n }\n\n ['@test a listener registered with one can be removed with off'](assert) {\n var obj = _object.default.extend(_evented.default, {\n F() {}\n\n }).create();\n\n var F = function () {};\n\n obj.one('event!', F);\n obj.one('event!', obj, 'F');\n assert.equal(obj.has('event!'), true, 'has events');\n obj.off('event!', F);\n obj.off('event!', obj, 'F');\n assert.equal(obj.has('event!'), false, 'has no more events');\n }\n\n ['@test adding and removing listeners should be chainable'](assert) {\n var obj = _object.default.extend(_evented.default).create();\n\n var F = function () {};\n\n var ret = obj.on('event!', F);\n assert.equal(ret, obj, '#on returns self');\n ret = obj.off('event!', F);\n assert.equal(ret, obj, '#off returns self');\n ret = obj.one('event!', F);\n assert.equal(ret, obj, '#one returns self');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/extend_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('EmberObject.extend', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Basic extend'](assert) {\n var SomeClass = _object.default.extend({\n foo: 'BAR'\n });\n\n assert.ok(SomeClass.isClass, 'A class has isClass of true');\n var obj = SomeClass.create();\n assert.equal(obj.foo, 'BAR');\n }\n\n ['@test Sub-subclass'](assert) {\n var SomeClass = _object.default.extend({\n foo: 'BAR'\n });\n\n var AnotherClass = SomeClass.extend({\n bar: 'FOO'\n });\n var obj = AnotherClass.create();\n assert.equal(obj.foo, 'BAR');\n assert.equal(obj.bar, 'FOO');\n }\n\n ['@test Overriding a method several layers deep'](assert) {\n var SomeClass = _object.default.extend({\n fooCnt: 0,\n\n foo() {\n this.fooCnt++;\n },\n\n barCnt: 0,\n\n bar() {\n this.barCnt++;\n }\n\n });\n\n var AnotherClass = SomeClass.extend({\n barCnt: 0,\n\n bar() {\n this.barCnt++;\n\n this._super(...arguments);\n }\n\n });\n var FinalClass = AnotherClass.extend({\n fooCnt: 0,\n\n foo() {\n this.fooCnt++;\n\n this._super(...arguments);\n }\n\n });\n var obj = FinalClass.create();\n obj.foo();\n obj.bar();\n assert.equal(obj.fooCnt, 2, 'should invoke both');\n assert.equal(obj.barCnt, 2, 'should invoke both'); // Try overriding on create also\n\n obj = FinalClass.extend({\n foo() {\n this.fooCnt++;\n\n this._super(...arguments);\n }\n\n }).create();\n obj.foo();\n obj.bar();\n assert.equal(obj.fooCnt, 3, 'should invoke final as well');\n assert.equal(obj.barCnt, 2, 'should invoke both');\n }\n\n ['@test With concatenatedProperties'](assert) {\n var SomeClass = _object.default.extend({\n things: 'foo',\n concatenatedProperties: ['things']\n });\n\n var AnotherClass = SomeClass.extend({\n things: 'bar'\n });\n var YetAnotherClass = SomeClass.extend({\n things: 'baz'\n });\n var some = SomeClass.create();\n var another = AnotherClass.create();\n var yetAnother = YetAnotherClass.create();\n assert.deepEqual(some.get('things'), ['foo'], 'base class should have just its value');\n assert.deepEqual(another.get('things'), ['foo', 'bar'], \"subclass should have base class' and its own\");\n assert.deepEqual(yetAnother.get('things'), ['foo', 'baz'], \"subclass should have base class' and its own\");\n }\n\n ['@test With concatenatedProperties class properties'](assert) {\n var SomeClass = _object.default.extend();\n\n SomeClass.reopenClass({\n concatenatedProperties: ['things'],\n things: 'foo'\n });\n var AnotherClass = SomeClass.extend();\n AnotherClass.reopenClass({\n things: 'bar'\n });\n var YetAnotherClass = SomeClass.extend();\n YetAnotherClass.reopenClass({\n things: 'baz'\n });\n var some = SomeClass.create();\n var another = AnotherClass.create();\n var yetAnother = YetAnotherClass.create();\n assert.deepEqual((0, _metal.get)(some.constructor, 'things'), ['foo'], 'base class should have just its value');\n assert.deepEqual((0, _metal.get)(another.constructor, 'things'), ['foo', 'bar'], \"subclass should have base class' and its own\");\n assert.deepEqual((0, _metal.get)(yetAnother.constructor, 'things'), ['foo', 'baz'], \"subclass should have base class' and its own\");\n }\n\n async ['@test Overriding a computed property with an observer'](assert) {\n var Parent = _object.default.extend({\n foo: (0, _metal.computed)(function () {\n return 'FOO';\n })\n });\n\n var seen = [];\n var Child = Parent.extend({\n foo: (0, _metal.observer)('bar', function () {\n seen.push(this.get('bar'));\n })\n });\n var child = Child.create({\n bar: 0\n });\n assert.deepEqual(seen, []);\n child.set('bar', 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.deepEqual(seen, [1]);\n child.set('bar', 2);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.deepEqual(seen, [1, 2]);\n child.destroy();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/framework_test\", [\"@ember/-internals/owner\", \"@ember/-internals/runtime/index\", \"internal-test-helpers\"], function (_owner, _index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('FrameworkObject', class extends _internalTestHelpers.RenderingTestCase {\n ['@test tunnels the owner through to the base constructor for framework classes'](assert) {\n assert.expect(2);\n var testContext = this;\n\n class Model extends _index.FrameworkObject {\n constructor(owner) {\n super(owner);\n assert.equal((0, _owner.getOwner)(this), testContext.owner, 'owner was assigned properly in the root constructor');\n assert.equal(owner, testContext.owner, 'owner was passed properly to the constructor');\n }\n\n }\n\n this.owner.register('model:blah', Model);\n this.owner.factoryFor('model:blah').create();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/observer_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_runloop, _metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('EmberObject observer', class extends _internalTestHelpers.AbstractTestCase {\n async ['@test observer on class'](assert) {\n var MyClass = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var obj = MyClass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n obj.destroy();\n }\n\n async ['@test setting `undefined` value on observed property behaves correctly'](assert) {\n var MyClass = _object.default.extend({\n mood: 'good',\n foo: (0, _metal.observer)('mood', function () {})\n });\n\n var obj = MyClass.create();\n assert.equal((0, _metal.get)(obj, 'mood'), 'good');\n (0, _metal.set)(obj, 'mood', 'bad');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'mood'), 'bad');\n (0, _metal.set)(obj, 'mood', undefined);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'mood'), undefined);\n (0, _metal.set)(obj, 'mood', 'awesome');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'mood'), 'awesome');\n obj.destroy();\n }\n\n async ['@test observer on subclass'](assert) {\n var MyClass = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var Subclass = MyClass.extend({\n foo: (0, _metal.observer)('baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n var obj = Subclass.create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n obj.destroy();\n }\n\n async ['@test observer on instance'](assert) {\n var obj = _object.default.extend({\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create({\n count: 0\n });\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n obj.destroy();\n await (0, _internalTestHelpers.runLoopSettled)();\n }\n\n async ['@test observer on instance overriding class'](assert) {\n var MyClass = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var obj = MyClass.extend({\n foo: (0, _metal.observer)('baz', function () {\n // <-- change property we observe\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer immediately');\n (0, _metal.set)(obj, 'bar', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n (0, _metal.set)(obj, 'baz', 'BAZ');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj, 'count'), 1, 'should invoke observer after change');\n obj.destroy();\n }\n\n async ['@test observer should not fire after being destroyed'](assert) {\n var obj = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create();\n\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'precond - should not invoke observer immediately');\n (0, _runloop.run)(() => obj.destroy());\n expectAssertion(function () {\n (0, _metal.set)(obj, 'bar', 'BAZ');\n }, `calling set on destroyed object: ${obj}.bar = BAZ`);\n assert.equal((0, _metal.get)(obj, 'count'), 0, 'should not invoke observer after change');\n obj.destroy();\n } // ..........................................................\n // COMPLEX PROPERTIES\n //\n\n\n async ['@test chain observer on class'](assert) {\n var MyClass = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var obj1 = MyClass.create({\n bar: {\n baz: 'biff'\n }\n });\n var obj2 = MyClass.create({\n bar: {\n baz: 'biff2'\n }\n });\n assert.equal((0, _metal.get)(obj1, 'count'), 0, 'should not invoke yet');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should invoke observer on obj1');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 1, 'should invoke observer on obj2');\n obj1.destroy();\n obj2.destroy();\n }\n\n async ['@test clobbering a chain observer on subclass'](assert) {\n var MyClass = _object.default.extend({\n count: 0,\n foo: (0, _metal.observer)('bar.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n });\n\n var obj1 = MyClass.extend().create({\n bar: {\n baz: 'biff'\n }\n });\n var obj2 = MyClass.extend({\n foo: (0, _metal.observer)('bar2.baz', function () {\n (0, _metal.set)(this, 'count', (0, _metal.get)(this, 'count') + 1);\n })\n }).create({\n bar: {\n baz: 'biff2'\n },\n bar2: {\n baz: 'biff3'\n }\n });\n assert.equal((0, _metal.get)(obj1, 'count'), 0, 'should not invoke yet');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n (0, _metal.set)((0, _metal.get)(obj1, 'bar'), 'baz', 'BIFF1');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should invoke observer on obj1');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n (0, _metal.set)((0, _metal.get)(obj2, 'bar'), 'baz', 'BIFF2');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 0, 'should not invoke yet');\n (0, _metal.set)((0, _metal.get)(obj2, 'bar2'), 'baz', 'BIFF3');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _metal.get)(obj1, 'count'), 1, 'should not invoke again');\n assert.equal((0, _metal.get)(obj2, 'count'), 1, 'should invoke observer on obj2');\n obj1.destroy();\n obj2.destroy();\n }\n\n async ['@test chain observer on class that has a reference to an uninitialized object will finish chains that reference it'](assert) {\n var changed = false;\n\n var ChildClass = _object.default.extend({\n parent: null,\n parentOneTwoDidChange: (0, _metal.observer)('parent.one.two', function () {\n changed = true;\n })\n });\n\n var ParentClass = _object.default.extend({\n one: {\n two: 'old'\n },\n\n init() {\n this.child = ChildClass.create({\n parent: this\n });\n }\n\n });\n\n var parent = ParentClass.create();\n assert.equal(changed, false, 'precond');\n (0, _metal.set)(parent, 'one.two', 'new');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(changed, true, 'child should have been notified of change to path');\n (0, _metal.set)(parent, 'one', {\n two: 'newer'\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(changed, true, 'child should have been notified of change to path');\n parent.child.destroy();\n parent.destroy();\n }\n\n async ['@test cannot re-enter observer while it is flushing'](assert) {\n var changed = false;\n\n var Class = _object.default.extend({\n bar: 0,\n\n get foo() {\n // side effects during creation, setting a value and running through\n // sync observers for a second time.\n return this.incrementProperty('bar');\n },\n\n // Ensures we get `foo` eagerly when attempting to observe it\n fooAlias: (0, _metal.alias)('foo'),\n parentOneTwoDidChange: (0, _metal.observer)({\n dependentKeys: ['fooAlias'],\n\n fn() {\n changed = true;\n },\n\n sync: true\n })\n });\n\n var obj = Class.create();\n obj.notifyPropertyChange('foo');\n assert.equal(changed, true, 'observer fired successfully');\n obj.destroy();\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/reopenClass_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/object/reopenClass', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adds new properties to subclass'](assert) {\n var Subclass = _object.default.extend();\n\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n\n bar: 'BAR'\n });\n assert.equal(Subclass.foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(Subclass, 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test class properties inherited by subclasses'](assert) {\n var Subclass = _object.default.extend();\n\n Subclass.reopenClass({\n foo() {\n return 'FOO';\n },\n\n bar: 'BAR'\n });\n var SubSub = Subclass.extend();\n assert.equal(SubSub.foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(SubSub, 'bar'), 'BAR', 'Adds property');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/reopen_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_metal, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/core_object/reopen', class extends _internalTestHelpers.AbstractTestCase {\n ['@test adds new properties to subclass instance'](assert) {\n var Subclass = _object.default.extend();\n\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n\n bar: 'BAR'\n });\n assert.equal(Subclass.create().foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(Subclass.create(), 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test reopened properties inherited by subclasses'](assert) {\n var Subclass = _object.default.extend();\n\n var SubSub = Subclass.extend();\n Subclass.reopen({\n foo() {\n return 'FOO';\n },\n\n bar: 'BAR'\n });\n assert.equal(SubSub.create().foo(), 'FOO', 'Adds method');\n assert.equal((0, _metal.get)(SubSub.create(), 'bar'), 'BAR', 'Adds property');\n }\n\n ['@test allows reopening already instantiated classes'](assert) {\n var Subclass = _object.default.extend();\n\n Subclass.create();\n Subclass.reopen({\n trololol: true\n });\n assert.equal(Subclass.create().get('trololol'), true, 'reopen works');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/strict-mode-test\", [\"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('strict mode tests', class extends _internalTestHelpers.AbstractTestCase {\n ['@test __superWrapper does not throw errors in strict mode'](assert) {\n var Foo = _object.default.extend({\n blah() {\n return 'foo';\n }\n\n });\n\n var Bar = Foo.extend({\n blah() {\n return 'bar';\n },\n\n callBlah() {\n var blah = this.blah;\n return blah();\n }\n\n });\n var bar = Bar.create();\n assert.equal(bar.callBlah(), 'bar', 'can call local function without call/apply');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object/toString_test\", [\"@ember/-internals/utils\", \"@ember/-internals/runtime/lib/system/object\", \"internal-test-helpers\"], function (_utils, _object, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/object/toString', class extends _internalTestHelpers.AbstractTestCase {\n ['@test toString includes toStringExtension if defined'](assert) {\n var Foo = _object.default.extend({\n toStringExtension() {\n return 'fooey';\n }\n\n });\n\n var foo = Foo.create();\n\n var Bar = _object.default.extend({});\n\n var bar = Bar.create(); // simulate these classes being defined on a Namespace\n\n (0, _utils.setName)(Foo, 'Foo');\n (0, _utils.setName)(Bar, 'Bar');\n assert.equal(bar.toString(), '<(unknown):' + (0, _utils.guidFor)(bar) + '>', 'does not include toStringExtension part');\n assert.equal(foo.toString(), '<(unknown):' + (0, _utils.guidFor)(foo) + ':fooey>', 'Includes toStringExtension result');\n }\n\n });\n});","define(\"@ember/-internals/runtime/tests/system/object_proxy_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime/lib/system/object_proxy\", \"internal-test-helpers\"], function (_metal, _object_proxy, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ObjectProxy', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should not proxy properties passed to create'](assert) {\n var Proxy = _object_proxy.default.extend({\n cp: (0, _metal.computed)({\n get() {\n return this._cp;\n },\n\n set(key, value) {\n this._cp = value;\n return this._cp;\n }\n\n })\n });\n\n var proxy = Proxy.create({\n prop: 'Foo',\n cp: 'Bar'\n });\n assert.equal((0, _metal.get)(proxy, 'prop'), 'Foo', 'should not have tried to proxy set');\n assert.equal(proxy._cp, 'Bar', 'should use CP setter');\n }\n\n ['@test should proxy properties to content'](assert) {\n var content = {\n firstName: 'Tom',\n lastName: 'Dale',\n\n unknownProperty(key) {\n return key + ' unknown';\n }\n\n };\n\n var proxy = _object_proxy.default.create();\n\n assert.equal((0, _metal.get)(proxy, 'firstName'), undefined, 'get on proxy without content should return undefined');\n expectAssertion(() => {\n (0, _metal.set)(proxy, 'firstName', 'Foo');\n }, /Cannot delegate set\\('firstName', Foo\\) to the 'content'/i);\n (0, _metal.set)(proxy, 'content', content);\n assert.equal((0, _metal.get)(proxy, 'firstName'), 'Tom', 'get on proxy with content should forward to content');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Dale', 'get on proxy with content should forward to content');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo unknown', 'get on proxy with content should forward to content');\n (0, _metal.set)(proxy, 'lastName', 'Huda');\n assert.equal((0, _metal.get)(content, 'lastName'), 'Huda', 'content should have new value from set on proxy');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Huda', 'proxy should have new value from set on proxy');\n (0, _metal.set)(proxy, 'content', {\n firstName: 'Yehuda',\n lastName: 'Katz'\n });\n assert.equal((0, _metal.get)(proxy, 'firstName'), 'Yehuda', 'proxy should reflect updated content');\n assert.equal((0, _metal.get)(proxy, 'lastName'), 'Katz', 'proxy should reflect updated content');\n }\n\n ['@test getting proxied properties with Ember.get should work'](assert) {\n var proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'FOO');\n }\n\n [`@test JSON.stringify doens't assert`](assert) {\n var proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({\n content: {\n foo: 'FOO'\n }\n }));\n }\n\n ['@test calling a function on the proxy avoids the assertion'](assert) {\n if (true\n /* DEBUG */\n ) {\n var proxy = _object_proxy.default.extend({\n init() {\n if (!this.foobar) {\n this.foobar = function () {\n var content = (0, _metal.get)(this, 'content');\n return content.foobar.apply(content, []);\n };\n }\n }\n\n }).create({\n content: {\n foobar() {\n return 'xoxo';\n }\n\n }\n });\n\n assert.equal(proxy.foobar(), 'xoxo', 'should be able to use a function from a proxy');\n } else {\n assert.expect(0);\n }\n }\n\n [`@test setting a property on the proxy avoids the assertion`](assert) {\n var proxy = _object_proxy.default.create({\n toJSON: undefined,\n content: {\n toJSON() {\n return 'hello';\n }\n\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({\n content: 'hello'\n }));\n }\n\n [`@test setting a property on the proxy's prototype avoids the assertion`](assert) {\n var proxy = _object_proxy.default.extend({\n toJSON: null\n }).create({\n content: {\n toJSON() {\n return 'hello';\n }\n\n }\n });\n\n assert.equal(JSON.stringify(proxy), JSON.stringify({\n content: 'hello'\n }));\n }\n\n ['@test getting proxied properties with [] should be an error'](assert) {\n if (true\n /* DEBUG */\n ) {\n var proxy = _object_proxy.default.create({\n content: {\n foo: 'FOO'\n }\n });\n\n expectAssertion(() => proxy.foo, /\\.get\\('foo'\\)/);\n } else {\n assert.expect(0);\n }\n }\n\n async ['@test should work with watched properties'](assert) {\n var content1 = {\n firstName: 'Tom',\n lastName: 'Dale'\n };\n var content2 = {\n firstName: 'Yehuda',\n lastName: 'Katz'\n };\n var count = 0;\n var last;\n\n var Proxy = _object_proxy.default.extend({\n fullName: (0, _metal.computed)('firstName', 'lastName', function () {\n var firstName = this.get('firstName');\n var lastName = this.get('lastName');\n\n if (firstName && lastName) {\n return firstName + ' ' + lastName;\n }\n\n return firstName || lastName;\n })\n });\n\n var proxy = Proxy.create();\n (0, _metal.addObserver)(proxy, 'fullName', () => {\n last = (0, _metal.get)(proxy, 'fullName');\n }); // We need separate observers for each property for async observers\n\n (0, _metal.addObserver)(proxy, 'firstName', function () {\n count++;\n });\n (0, _metal.addObserver)(proxy, 'lastName', function () {\n count++;\n }); // proxy without content returns undefined\n\n assert.equal((0, _metal.get)(proxy, 'fullName'), undefined); // setting content causes all watched properties to change\n\n (0, _metal.set)(proxy, 'content', content1);\n await (0, _internalTestHelpers.runLoopSettled)(); // both dependent keys changed\n\n assert.equal(count, 2);\n assert.equal(last, 'Tom Dale'); // setting property in content causes proxy property to change\n\n (0, _metal.set)(content1, 'lastName', 'Huda');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 3);\n assert.equal(last, 'Tom Huda'); // replacing content causes all watched properties to change\n\n (0, _metal.set)(proxy, 'content', content2);\n await (0, _internalTestHelpers.runLoopSettled)(); // both dependent keys changed\n\n assert.equal(count, 5);\n assert.equal(last, 'Yehuda Katz'); // setting property in new content\n\n (0, _metal.set)(content2, 'firstName', 'Tomhuda');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(last, 'Tomhuda Katz');\n assert.equal(count, 6); // setting property in proxy syncs with new content\n\n (0, _metal.set)(proxy, 'lastName', 'Katzdale');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 7);\n assert.equal(last, 'Tomhuda Katzdale');\n assert.equal((0, _metal.get)(content2, 'firstName'), 'Tomhuda');\n assert.equal((0, _metal.get)(content2, 'lastName'), 'Katzdale');\n proxy.destroy();\n }\n\n async ['@test set and get should work with paths'](assert) {\n var content = {\n foo: {\n bar: 'baz'\n }\n };\n\n var proxy = _object_proxy.default.create({\n content\n });\n\n var count = 0;\n proxy.set('foo.bar', 'hello');\n assert.equal(proxy.get('foo.bar'), 'hello');\n assert.equal(proxy.get('content.foo.bar'), 'hello');\n proxy.addObserver('foo.bar', function () {\n count++;\n });\n proxy.set('foo.bar', 'bye');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n assert.equal(proxy.get('foo.bar'), 'bye');\n assert.equal(proxy.get('content.foo.bar'), 'bye');\n proxy.destroy();\n }\n\n async ['@test should transition between watched and unwatched strategies'](assert) {\n var content = {\n foo: 'foo'\n };\n\n var proxy = _object_proxy.default.create({\n content: content\n });\n\n var count = 0;\n\n function observer() {\n count++;\n }\n\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n (0, _metal.set)(content, 'foo', 'bar');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n (0, _metal.set)(proxy, 'foo', 'foo');\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n (0, _metal.addObserver)(proxy, 'foo', observer);\n assert.equal(count, 0);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n (0, _metal.set)(content, 'foo', 'bar');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n (0, _metal.set)(proxy, 'foo', 'foo');\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 2);\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n (0, _metal.removeObserver)(proxy, 'foo', observer);\n (0, _metal.set)(content, 'foo', 'bar');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'bar');\n (0, _metal.set)(proxy, 'foo', 'foo');\n assert.equal((0, _metal.get)(content, 'foo'), 'foo');\n assert.equal((0, _metal.get)(proxy, 'foo'), 'foo');\n }\n\n ['@test setting `undefined` to a proxied content property should override its existing value'](assert) {\n var proxyObject = _object_proxy.default.create({\n content: {\n prop: 'emberjs'\n }\n });\n\n (0, _metal.set)(proxyObject, 'prop', undefined);\n assert.equal((0, _metal.get)(proxyObject, 'prop'), undefined, 'sets the `undefined` value to the proxied content');\n }\n\n ['@test should not throw or deprecate when adding an observer to an ObjectProxy based class'](assert) {\n assert.expect(0);\n\n var obj = _object_proxy.default.extend({\n observe: (0, _metal.observer)('foo', function () {})\n }).create();\n\n obj.destroy();\n }\n\n async '@test custom proxies should be able to notify property changes manually'(assert) {\n var proxy = _object_proxy.default.extend({\n locals: {\n foo: 123\n },\n\n unknownProperty(key) {\n return this.locals[key];\n },\n\n setUnknownProperty(key, value) {\n this.locals[key] = value;\n this.notifyPropertyChange(key);\n }\n\n }).create();\n\n var count = 0;\n proxy.addObserver('foo', function () {\n count++;\n });\n proxy.set('foo', 456);\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n assert.equal(proxy.get('foo'), 456);\n assert.equal(proxy.get('locals.foo'), 456);\n proxy.destroy();\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/cache_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Cache', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basic'](assert) {\n var cache = new _utils.Cache(100, key => key.toUpperCase());\n assert.equal(cache.get('foo'), 'FOO');\n assert.equal(cache.get('bar'), 'BAR');\n assert.equal(cache.get('foo'), 'FOO');\n }\n\n ['@test explicit sets'](assert) {\n var cache = new _utils.Cache(100, key => key.toUpperCase());\n assert.equal(cache.get('foo'), 'FOO');\n assert.equal(cache.set('foo', 'FOO!!!'), 'FOO!!!');\n assert.equal(cache.get('foo'), 'FOO!!!');\n assert.strictEqual(cache.set('foo', undefined), undefined);\n assert.strictEqual(cache.get('foo'), undefined);\n }\n\n ['@test caches computation correctly'](assert) {\n var count = 0;\n var cache = new _utils.Cache(100, key => {\n count++;\n return key.toUpperCase();\n });\n assert.equal(count, 0);\n cache.get('foo');\n assert.equal(count, 1);\n cache.get('bar');\n assert.equal(count, 2);\n cache.get('bar');\n assert.equal(count, 2);\n cache.get('foo');\n assert.equal(count, 2);\n }\n\n ['@test handles undefined value correctly'](assert) {\n var count = 0;\n var cache = new _utils.Cache(100, () => {\n count++;\n });\n assert.equal(count, 0);\n assert.strictEqual(cache.get('foo'), undefined);\n assert.equal(count, 1);\n assert.strictEqual(cache.get('bar'), undefined);\n assert.equal(count, 2);\n assert.strictEqual(cache.get('bar'), undefined);\n assert.equal(count, 2);\n assert.strictEqual(cache.get('foo'), undefined);\n assert.equal(count, 2);\n }\n\n ['@test continues working after reaching cache limit'](assert) {\n var cache = new _utils.Cache(3, key => key.toUpperCase());\n cache.get('a');\n cache.get('b');\n cache.get('c');\n assert.equal(cache.get('d'), 'D');\n assert.equal(cache.get('a'), 'A');\n assert.equal(cache.get('b'), 'B');\n assert.equal(cache.get('c'), 'C');\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/can_invoke_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n var obj;\n (0, _internalTestHelpers.moduleFor)('Ember.canInvoke', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n obj = {\n foobar: 'foobar',\n\n aMethodThatExists() {}\n\n };\n }\n\n teardown() {\n obj = undefined;\n }\n\n [\"@test should return false if the object doesn't exist\"](assert) {\n assert.equal((0, _utils.canInvoke)(undefined, 'aMethodThatDoesNotExist'), false);\n }\n\n ['@test should return true for falsy values that have methods'](assert) {\n assert.equal((0, _utils.canInvoke)(false, 'valueOf'), true);\n assert.equal((0, _utils.canInvoke)('', 'charAt'), true);\n assert.equal((0, _utils.canInvoke)(0, 'toFixed'), true);\n }\n\n ['@test should return true if the method exists on the object'](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'aMethodThatExists'), true);\n }\n\n [\"@test should return false if the method doesn't exist on the object\"](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'aMethodThatDoesNotExist'), false);\n }\n\n ['@test should return false if the property exists on the object but is a non-function'](assert) {\n assert.equal((0, _utils.canInvoke)(obj, 'foobar'), false);\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/checkHasSuper_test\", [\"@ember/-internals/browser-environment\", \"@ember/-internals/utils\", \"internal-test-helpers\"], function (_browserEnvironment, _utils, _internalTestHelpers) {\n \"use strict\";\n\n // Only run this test on browsers that we are certain should have function\n // source available. This allows the test suite to continue to pass on other\n // platforms that correctly (for them) fall back to the \"always wrap\" code.\n if (_browserEnvironment.isChrome || _browserEnvironment.isFirefox) {\n (0, _internalTestHelpers.moduleFor)('checkHasSuper', class extends _internalTestHelpers.AbstractTestCase {\n ['@test does not super wrap needlessly [GH #12462]'](assert) {\n assert.notOk((0, _utils.checkHasSuper)(function () {}), 'empty function does not have super');\n }\n\n });\n }\n});","define(\"@ember/-internals/utils/tests/generate_guid_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.generateGuid', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Prefix'](assert) {\n var a = {};\n assert.ok((0, _utils.generateGuid)(a, 'tyrell').indexOf('tyrell') > -1, 'guid can be prefixed');\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/get-debug-name-test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n if (true\n /* DEBUG */\n ) {\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils getDebugName', class extends _internalTestHelpers.AbstractTestCase {\n '@test basic'(assert) {\n class Person {}\n\n assert.equal((0, _utils.getDebugName)({}), '(unknown object)');\n assert.equal((0, _utils.getDebugName)(() => {}), '(unknown function)');\n assert.equal((0, _utils.getDebugName)(Person), 'Person');\n assert.equal((0, _utils.getDebugName)(new Person()), 'Person');\n assert.equal((0, _utils.getDebugName)(function foo() {}), 'foo');\n assert.equal((0, _utils.getDebugName)({\n toString() {\n return 'bar';\n }\n\n }), 'bar');\n\n class ClassWithToString {\n toString() {\n return 'baz';\n }\n\n }\n\n assert.equal((0, _utils.getDebugName)(ClassWithToString), 'ClassWithToString');\n assert.equal((0, _utils.getDebugName)(new ClassWithToString()), 'baz');\n\n class ClassWithEmberLikeToString {\n toString() {\n return '';\n }\n\n }\n\n assert.equal((0, _utils.getDebugName)(ClassWithEmberLikeToString), 'ClassWithEmberLikeToString');\n assert.equal((0, _utils.getDebugName)(new ClassWithEmberLikeToString()), '');\n assert.equal((0, _utils.getDebugName)(true), 'true');\n assert.equal((0, _utils.getDebugName)(123), '123');\n assert.equal((0, _utils.getDebugName)('string'), 'string');\n }\n\n });\n }\n});","define(\"@ember/-internals/utils/tests/guid_for_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n function sameGuid(assert, a, b, message) {\n assert.equal((0, _utils.guidFor)(a), (0, _utils.guidFor)(b), message);\n }\n\n function diffGuid(assert, a, b, message) {\n assert.ok((0, _utils.guidFor)(a) !== (0, _utils.guidFor)(b), message);\n }\n\n function nanGuid(assert, obj) {\n var type = typeof obj;\n assert.ok(isNaN(parseInt((0, _utils.guidFor)(obj), 0)), 'guids for ' + type + \"don't parse to numbers\");\n }\n\n (0, _internalTestHelpers.moduleFor)('guidFor', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Object'](assert) {\n var a = {};\n var b = {};\n sameGuid(assert, a, a, 'same object always yields same guid');\n diffGuid(assert, a, b, 'different objects yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test strings'](assert) {\n var a = 'string A';\n var aprime = 'string A';\n var b = 'String B';\n sameGuid(assert, a, a, 'same string always yields same guid');\n sameGuid(assert, a, aprime, 'identical strings always yield the same guid');\n diffGuid(assert, a, b, 'different strings yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test numbers'](assert) {\n var a = 23;\n var aprime = 23;\n var b = 34;\n sameGuid(assert, a, a, 'same numbers always yields same guid');\n sameGuid(assert, a, aprime, 'identical numbers always yield the same guid');\n diffGuid(assert, a, b, 'different numbers yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test symbols'](assert) {\n var a = Symbol('a');\n var b = Symbol('b');\n sameGuid(assert, a, a, 'same symbols always yields same guid');\n diffGuid(assert, a, b, 'different symbols yield different guids');\n nanGuid(assert, a);\n }\n\n ['@test booleans'](assert) {\n var a = true;\n var aprime = true;\n var b = false;\n sameGuid(assert, a, a, 'same booleans always yields same guid');\n sameGuid(assert, a, aprime, 'identical booleans always yield the same guid');\n diffGuid(assert, a, b, 'different boolean yield different guids');\n nanGuid(assert, a);\n nanGuid(assert, b);\n }\n\n ['@test null and undefined'](assert) {\n var a = null;\n var aprime = null;\n var b;\n sameGuid(assert, a, a, 'null always returns the same guid');\n sameGuid(assert, b, b, 'undefined always returns the same guid');\n sameGuid(assert, a, aprime, 'different nulls return the same guid');\n diffGuid(assert, a, b, 'null and undefined return different guids');\n nanGuid(assert, a);\n nanGuid(assert, b);\n }\n\n ['@test arrays'](assert) {\n var a = ['a', 'b', 'c'];\n var aprime = ['a', 'b', 'c'];\n var b = ['1', '2', '3'];\n sameGuid(assert, a, a, 'same instance always yields same guid');\n diffGuid(assert, a, aprime, 'identical arrays always yield the same guid');\n diffGuid(assert, a, b, 'different arrays yield different guids');\n nanGuid(assert, a);\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/inspect_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.inspect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test strings'](assert) {\n assert.equal((0, _utils.inspect)('foo'), '\"foo\"');\n }\n\n ['@test numbers'](assert) {\n assert.equal((0, _utils.inspect)(2.6), '2.6');\n }\n\n ['@test null'](assert) {\n assert.equal((0, _utils.inspect)(null), 'null');\n }\n\n ['@test undefined'](assert) {\n assert.equal((0, _utils.inspect)(undefined), 'undefined');\n }\n\n ['@test true'](assert) {\n assert.equal((0, _utils.inspect)(true), 'true');\n }\n\n ['@test false'](assert) {\n assert.equal((0, _utils.inspect)(false), 'false');\n }\n\n ['@test object'](assert) {\n assert.equal((0, _utils.inspect)({}), '{ }');\n assert.equal((0, _utils.inspect)({\n foo: 'bar'\n }), '{ foo: \"bar\" }');\n var obj = {\n foo() {\n return this;\n }\n\n };\n assert.equal((0, _utils.inspect)(obj), `{ foo: [Function:foo] }`);\n }\n\n ['@test objects without a prototype'](assert) {\n var prototypelessObj = Object.create(null);\n prototypelessObj.a = 1;\n prototypelessObj.b = [Object.create(null)];\n assert.equal((0, _utils.inspect)({\n foo: prototypelessObj\n }), '{ foo: { a: 1, b: [ { } ] } }');\n }\n\n ['@test array'](assert) {\n assert.equal((0, _utils.inspect)([1, 2, 3]), '[ 1, 2, 3 ]');\n }\n\n ['@test array list limit'](assert) {\n var a = [];\n\n for (var i = 0; i < 120; i++) {\n a.push(1);\n }\n\n assert.equal((0, _utils.inspect)(a), `[ ${a.slice(0, 100).join(', ')}, ... 20 more items ]`);\n }\n\n ['@test object list limit'](assert) {\n var obj = {};\n var pairs = [];\n\n for (var i = 0; i < 120; i++) {\n obj['key' + i] = i;\n pairs.push(`key${i}: ${i}`);\n }\n\n assert.equal((0, _utils.inspect)(obj), `{ ${pairs.slice(0, 100).join(', ')}, ... 20 more keys }`);\n }\n\n ['@test depth limit'](assert) {\n assert.equal((0, _utils.inspect)([[[['here', {\n a: 1\n }, [1]]]]]), '[ [ [ [ \"here\", [Object], [Array] ] ] ] ]');\n }\n\n ['@test odd key'](assert) {\n assert.equal((0, _utils.inspect)({\n [`Hello world!\nHow are you?`]: 1\n }), '{ \"Hello world!\\\\nHow are you?\": 1 }');\n }\n\n ['@test node call'](assert) {\n var obj = {\n a: 1\n };\n obj.inspect = _utils.inspect;\n var depth = 2;\n var options = {};\n assert.equal(obj.inspect(depth, options), obj);\n }\n\n ['@test cycle'](assert) {\n var obj = {};\n obj.a = obj;\n var arr = [obj];\n arr.push(arr);\n assert.equal((0, _utils.inspect)(arr), '[ { a: [Circular] }, [Circular] ]');\n }\n\n ['@test custom toString'](assert) {\n class Component {\n static toString() {\n return '@ember/component';\n }\n\n toString() {\n return `<${this.constructor}:ember234>`;\n }\n\n }\n\n assert.equal((0, _utils.inspect)([new Component(), Component]), '[ <@ember/component:ember234>, @ember/component ]');\n }\n\n ['@test regexp'](assert) {\n assert.equal((0, _utils.inspect)(/regexp/), '/regexp/');\n }\n\n ['@test date'](assert) {\n var inspected = (0, _utils.inspect)(new Date('Sat Apr 30 2011 13:24:11'));\n assert.ok(inspected.match(/Sat Apr 30/), 'The inspected date has its date');\n assert.ok(inspected.match(/2011/), 'The inspected date has its year');\n assert.ok(inspected.match(/13:24:11/), 'The inspected date has its time');\n }\n\n ['@test inspect outputs the toString() representation of Symbols'](assert) {\n var symbol = Symbol('test');\n assert.equal((0, _utils.inspect)(symbol), 'Symbol(test)');\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/is_proxy_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils isProxy', class extends _internalTestHelpers.AbstractTestCase {\n ['@test basic'](assert) {\n var proxy = {};\n (0, _utils.setProxy)(proxy);\n assert.equal((0, _utils.isProxy)(proxy), true);\n assert.equal((0, _utils.isProxy)({}), false);\n assert.equal((0, _utils.isProxy)(undefined), false);\n assert.equal((0, _utils.isProxy)(null), false);\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/make_array_test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember.makeArray', class extends _internalTestHelpers.AbstractTestCase {\n ['@test undefined'](assert) {\n assert.deepEqual((0, _utils.makeArray)(), []);\n assert.deepEqual((0, _utils.makeArray)(undefined), []);\n }\n\n ['@test null'](assert) {\n assert.deepEqual((0, _utils.makeArray)(null), []);\n }\n\n ['@test string'](assert) {\n assert.deepEqual((0, _utils.makeArray)('lindsay'), ['lindsay']);\n }\n\n ['@test number'](assert) {\n assert.deepEqual((0, _utils.makeArray)(0), [0]);\n assert.deepEqual((0, _utils.makeArray)(1), [1]);\n }\n\n ['@test array'](assert) {\n assert.deepEqual((0, _utils.makeArray)([1, 2, 42]), [1, 2, 42]);\n }\n\n ['@test true'](assert) {\n assert.deepEqual((0, _utils.makeArray)(true), [true]);\n }\n\n ['@test false'](assert) {\n assert.deepEqual((0, _utils.makeArray)(false), [false]);\n }\n\n ['@test object'](assert) {\n assert.deepEqual((0, _utils.makeArray)({}), [{}]);\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/to-string-test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils toString', class extends _internalTestHelpers.AbstractTestCase {\n [`@test toString uses an object's toString method when available`](assert) {\n var obj = {\n toString() {\n return 'bob';\n }\n\n };\n assert.strictEqual((0, _utils.toString)(obj), 'bob');\n }\n\n ['@test toString falls back to Object.prototype.toString'](assert) {\n var obj = Object.create(null);\n assert.strictEqual((0, _utils.toString)(obj), {}.toString());\n }\n\n ['@test toString does not fail when called on Arrays with objects without toString method'](assert) {\n var obj = Object.create(null);\n var arr = [obj, 2];\n assert.strictEqual((0, _utils.toString)(arr), `${{}.toString()},2`);\n }\n\n });\n});","define(\"@ember/-internals/utils/tests/trackable-object-test\", [\"@ember/-internals/utils\", \"internal-test-helpers\"], function (_utils, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('@ember/-internals/utils Trackable Object', class extends _internalTestHelpers.AbstractTestCase {\n ['@test classes'](assert) {\n class Test {\n constructor() {\n (0, _utils.setEmberArray)(this);\n }\n\n }\n\n var instance = new Test();\n assert.equal((0, _utils.isEmberArray)(instance), true);\n }\n\n });\n});","define(\"@ember/application/tests/application_instance_test\", [\"@ember/engine\", \"@ember/application\", \"@ember/application/instance\", \"@ember/runloop\", \"@ember/-internals/container\", \"internal-test-helpers\", \"@ember/-internals/runtime\", \"@ember/debug\"], function (_engine, _application, _instance, _runloop, _container, _internalTestHelpers, _runtime, _debug) {\n \"use strict\";\n\n var originalDebug = (0, _debug.getDebugFunction)('debug');\n\n var noop = function () {};\n\n var application, appInstance;\n (0, _internalTestHelpers.moduleFor)('ApplicationInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n document.getElementById('qunit-fixture').innerHTML = `\n HI
\n `;\n application = (0, _runloop.run)(() => _application.default.create({\n rootElement: '#one',\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n }));\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n\n if (appInstance) {\n (0, _runloop.run)(appInstance, 'destroy');\n appInstance = null;\n }\n\n if (application) {\n (0, _runloop.run)(application, 'destroy');\n application = null;\n }\n\n document.getElementById('qunit-fixture').innerHTML = '';\n }\n\n ['@test an application instance can be created based upon an application'](assert) {\n appInstance = (0, _runloop.run)(() => _instance.default.create({\n application\n }));\n assert.ok(appInstance, 'instance should be created');\n assert.equal(appInstance.application, application, 'application should be set to parent');\n }\n\n ['@test customEvents added to the application before setupEventDispatcher'](assert) {\n assert.expect(1);\n appInstance = (0, _runloop.run)(() => _instance.default.create({\n application\n }));\n appInstance.setupRegistry();\n application.customEvents = {\n awesome: 'sauce'\n };\n var eventDispatcher = appInstance.lookup('event_dispatcher:main');\n\n eventDispatcher.setup = function (events) {\n assert.equal(events.awesome, 'sauce');\n };\n\n appInstance.setupEventDispatcher();\n }\n\n ['@test customEvents added to the application instance before setupEventDispatcher'](assert) {\n assert.expect(1);\n appInstance = (0, _runloop.run)(() => _instance.default.create({\n application\n }));\n appInstance.setupRegistry();\n appInstance.customEvents = {\n awesome: 'sauce'\n };\n var eventDispatcher = appInstance.lookup('event_dispatcher:main');\n\n eventDispatcher.setup = function (events) {\n assert.equal(events.awesome, 'sauce');\n };\n\n appInstance.setupEventDispatcher();\n }\n\n ['@test unregistering a factory clears all cached instances of that factory'](assert) {\n assert.expect(5);\n appInstance = (0, _runloop.run)(() => _instance.default.create({\n application\n }));\n var PostController1 = (0, _internalTestHelpers.factory)();\n var PostController2 = (0, _internalTestHelpers.factory)();\n appInstance.register('controller:post', PostController1);\n var postController1 = appInstance.lookup('controller:post');\n var postController1Factory = appInstance.factoryFor('controller:post');\n assert.ok(postController1 instanceof PostController1, 'precond - lookup creates instance');\n assert.equal(PostController1, postController1Factory.class, 'precond - factoryFor().class matches');\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2);\n var postController2 = appInstance.lookup('controller:post');\n var postController2Factory = appInstance.factoryFor('controller:post');\n assert.ok(postController2 instanceof PostController2, 'lookup creates instance');\n assert.equal(PostController2, postController2Factory.class, 'factoryFor().class matches');\n assert.notStrictEqual(postController1, postController2, 'lookup creates a brand new instance, because the previous one was reset');\n }\n\n ['@skip unregistering a factory clears caches with source of that factory'](assert) {\n assert.expect(1);\n appInstance = (0, _runloop.run)(() => _instance.default.create({\n application\n }));\n var PostController1 = (0, _internalTestHelpers.factory)();\n var PostController2 = (0, _internalTestHelpers.factory)();\n appInstance.register('controller:post', PostController1);\n appInstance.lookup('controller:post');\n var postControllerLookupWithSource = appInstance.lookup('controller:post', {\n source: 'doesnt-even-matter'\n });\n appInstance.unregister('controller:post');\n appInstance.register('controller:post', PostController2); // The cache that is source-specific is not cleared\n\n assert.ok(postControllerLookupWithSource !== appInstance.lookup('controller:post', {\n source: 'doesnt-even-matter'\n }), 'lookup with source creates a new instance');\n }\n\n ['@test can build and boot a registered engine'](assert) {\n assert.expect(10);\n\n var ChatEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n var chatEngineInstance;\n application.register('engine:chat', ChatEngine);\n (0, _runloop.run)(() => {\n appInstance = _instance.default.create({\n application\n });\n appInstance.setupRegistry();\n chatEngineInstance = appInstance.buildChildEngineInstance('chat');\n });\n return chatEngineInstance.boot().then(() => {\n assert.ok(true, 'boot successful');\n var registrations = ['route:basic', 'service:-routing'];\n registrations.forEach(key => {\n assert.strictEqual(chatEngineInstance.resolveRegistration(key), appInstance.resolveRegistration(key), `Engine and parent app share registrations for '${key}'`);\n });\n var singletons = ['router:main', (0, _container.privatize)`-bucket-cache:main`, '-view-registry:main', '-environment:main', 'service:-document', 'event_dispatcher:main'];\n singletons.push('renderer:-dom');\n singletons.forEach(key => {\n assert.strictEqual(chatEngineInstance.lookup(key), appInstance.lookup(key), `Engine and parent app share singleton '${key}'`);\n });\n });\n }\n\n ['@test can build a registry via ApplicationInstance.setupRegistry() -- simulates ember-test-helpers'](assert) {\n var namespace = _runtime.Object.create({\n Resolver: {\n create: function () {}\n }\n });\n\n var registry = _application.default.buildRegistry(namespace);\n\n _instance.default.setupRegistry(registry);\n\n assert.equal(registry.resolve('service:-document'), document);\n }\n\n });\n});","define(\"@ember/application/tests/application_test\", [\"ember/version\", \"@ember/-internals/environment\", \"@ember/-internals/metal\", \"@ember/debug\", \"@ember/-internals/routing\", \"@ember/application\", \"@ember/controller\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/runloop\"], function (_version, _environment, _metal, _debug, _routing, _application, _controller, _runtime, _internalTestHelpers, _runloop) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application, autobooting multiple apps', class extends _internalTestHelpers.ApplicationTestCase {\n get fixture() {\n return `\n \n HI
\n `;\n }\n\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n rootElement: '#one',\n router: null,\n autoboot: true\n });\n }\n\n createSecondApplication(options) {\n var myOptions = Object.assign(this.applicationOptions, options);\n return this.secondApp = _application.default.create(myOptions);\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n (0, _internalTestHelpers.runTask)(() => this.secondApp.destroy());\n }\n }\n\n [`@test you can make a new application in a non-overlapping element`](assert) {\n var app = (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({\n rootElement: '#two'\n }));\n (0, _internalTestHelpers.runTask)(() => app.destroy());\n assert.ok(true, 'should not raise');\n }\n\n [`@test you cannot make a new application that is a parent of an existing application`]() {\n expectAssertion(() => {\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({\n rootElement: this.applicationOptions.rootElement\n }));\n });\n }\n\n [`@test you cannot make a new application that is a descendant of an existing application`]() {\n expectAssertion(() => {\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({\n rootElement: '#one-child'\n }));\n });\n }\n\n [`@test you cannot make a new application that is a duplicate of an existing application`]() {\n expectAssertion(() => {\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({\n rootElement: '#one'\n }));\n });\n }\n\n [`@test you cannot make two default applications without a rootElement error`]() {\n expectAssertion(() => {\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication());\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application', class extends _internalTestHelpers.ApplicationTestCase {\n [`@test builds a registry`](assert) {\n var {\n application\n } = this;\n assert.strictEqual(application.resolveRegistration('application:main'), application, `application:main is registered`);\n assert.deepEqual(application.registeredOptionsForType('component'), {\n singleton: false\n }, `optionsForType 'component'`);\n assert.deepEqual(application.registeredOptionsForType('view'), {\n singleton: false\n }, `optionsForType 'view'`);\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'controller:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, '-view-registry:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'route:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'event_dispatcher:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:auto');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:hash');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:history');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'location:none');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:link-to');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component:textarea');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'service:-routing'); // DEBUGGING\n\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'component-lookup:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'renderer:-dom');\n (0, _internalTestHelpers.verifyRegistration)(assert, application, 'template:-outlet');\n assert.deepEqual(application.registeredOptionsForType('helper'), {\n instantiate: false\n }, `optionsForType 'helper'`);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application, autobooting', class extends _internalTestHelpers.AutobootApplicationTestCase {\n constructor() {\n super(...arguments);\n this.originalLogVersion = _environment.ENV.LOG_VERSION;\n this.originalDebug = (0, _debug.getDebugFunction)('debug');\n this.originalWarn = (0, _debug.getDebugFunction)('warn');\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('warn', this.originalWarn);\n (0, _debug.setDebugFunction)('debug', this.originalDebug);\n _environment.ENV.LOG_VERSION = this.originalLogVersion;\n super.teardown();\n }\n\n [`@test initialized application goes to initial route`]() {\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', 'Hi from index ');\n });\n this.assertText('Hi from index');\n }\n\n [`@test ready hook is called before routing begins`](assert) {\n assert.expect(2);\n (0, _internalTestHelpers.runTask)(() => {\n function registerRoute(application, name, callback) {\n var route = _routing.Route.extend({\n activate: callback\n });\n\n application.register('route:' + name, route);\n }\n\n var MyApplication = _application.default.extend({\n ready() {\n registerRoute(this, 'index', () => {\n assert.ok(true, 'last-minute route is activated');\n });\n }\n\n });\n\n var app = this.createApplication({}, MyApplication);\n registerRoute(app, 'application', () => assert.ok(true, 'normal route is activated'));\n });\n }\n\n [`@test initialize application via initialize call`](assert) {\n (0, _internalTestHelpers.runTask)(() => this.createApplication()); // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(router instanceof _routing.Router, true, 'Router was set from initialize call');\n assert.equal(router.location instanceof _routing.NoneLocation, true, 'Location was set from location implementation name');\n }\n\n [`@test initialize application with stateManager via initialize call from Router class`](assert) {\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n this.addTemplate('application', 'Hello! ');\n }); // This is not a public way to access the container; we just\n // need to make some assertions about the created router\n\n var router = this.application.__deprecatedInstance__.lookup('router:main');\n\n assert.equal(router instanceof _routing.Router, true, 'Router was set from initialize call');\n this.assertText('Hello!');\n }\n\n [`@test Application Controller backs the appplication template`]() {\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n this.addTemplate('application', '{{this.greeting}} ');\n this.add('controller:application', _controller.default.extend({\n greeting: 'Hello!'\n }));\n });\n this.assertText('Hello!');\n }\n\n [`@test enable log of libraries with an ENV var`](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n var messages = [];\n _environment.ENV.LOG_VERSION = true;\n (0, _debug.setDebugFunction)('debug', message => messages.push(message));\n\n _metal.libraries.register('my-lib', '2.0.0a');\n\n (0, _internalTestHelpers.runTask)(() => this.createApplication());\n assert.equal(messages[1], 'Ember : ' + _version.default);\n assert.equal(messages[2], 'my-lib : ' + '2.0.0a');\n\n _metal.libraries.deRegister('my-lib');\n }\n\n [`@test disable log of version of libraries with an ENV var`](assert) {\n var logged = false;\n _environment.ENV.LOG_VERSION = false;\n (0, _debug.setDebugFunction)('debug', () => logged = true);\n (0, _internalTestHelpers.runTask)(() => this.createApplication());\n assert.ok(!logged, 'library version logging skipped');\n }\n\n [`@test can resolve custom router`](assert) {\n var CustomRouter = _routing.Router.extend();\n\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n this.add('router:main', CustomRouter);\n });\n assert.ok(this.application.__deprecatedInstance__.lookup('router:main') instanceof CustomRouter, 'application resolved the correct router');\n }\n\n [`@test does not leak itself in onLoad._loaded`](assert) {\n assert.equal(_application._loaded.application, undefined);\n (0, _internalTestHelpers.runTask)(() => this.createApplication());\n assert.equal(_application._loaded.application, this.application);\n (0, _internalTestHelpers.runTask)(() => this.application.destroy());\n assert.equal(_application._loaded.application, undefined);\n }\n\n [`@test can build a registry via Application.buildRegistry() --- simulates ember-test-helpers`](assert) {\n var namespace = _runtime.Object.create({\n Resolver: {\n create: function () {}\n }\n });\n\n var registry = _application.default.buildRegistry(namespace);\n\n assert.equal(registry.resolve('application:main'), namespace);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application#buildRegistry', class extends _internalTestHelpers.AbstractTestCase {\n [`@test can build a registry via Application.buildRegistry() --- simulates ember-test-helpers`](assert) {\n var namespace = _runtime.Object.create({\n Resolver: {\n create() {}\n\n }\n });\n\n var registry = _application.default.buildRegistry(namespace);\n\n assert.equal(registry.resolve('application:main'), namespace);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application - instance tracking', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test tracks built instance'](assert) {\n var instance = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n assert.ok(instance.isDestroyed, 'instance was destroyed');\n }\n\n ['@test tracks built instances'](assert) {\n var instanceA = this.application.buildInstance();\n var instanceB = this.application.buildInstance();\n (0, _runloop.run)(() => {\n this.application.destroy();\n });\n assert.ok(instanceA.isDestroyed, 'instanceA was destroyed');\n assert.ok(instanceB.isDestroyed, 'instanceB was destroyed');\n }\n\n });\n});","define(\"@ember/application/tests/dependency_injection_test\", [\"@ember/-internals/environment\", \"@ember/runloop\", \"@ember/-internals/runtime\", \"@ember/application\", \"internal-test-helpers\"], function (_environment, _runloop, _runtime, _application, _internalTestHelpers) {\n \"use strict\";\n\n var originalLookup = _environment.context.lookup;\n var registry, locator, application;\n (0, _internalTestHelpers.moduleFor)('Application Dependency Injection', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n application = (0, _runloop.run)(_application.default, 'create', {\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n application.Person = _runtime.Object.extend({});\n application.Orange = _runtime.Object.extend({});\n application.Email = _runtime.Object.extend({});\n application.User = _runtime.Object.extend({});\n application.PostIndexController = _runtime.Object.extend({});\n application.register('model:person', application.Person, {\n singleton: false\n });\n application.register('model:user', application.User, {\n singleton: false\n });\n application.register('fruit:favorite', application.Orange);\n application.register('communication:main', application.Email, {\n singleton: false\n });\n application.register('controller:postIndex', application.PostIndexController, {\n singleton: true\n });\n registry = application.__registry__;\n locator = application.__container__;\n _environment.context.lookup = {};\n }\n\n teardown() {\n super.teardown();\n (0, _runloop.run)(application, 'destroy');\n registry = application = locator = null;\n _environment.context.lookup = originalLookup;\n }\n\n ['@test registered entities can be looked up later'](assert) {\n assert.equal(registry.resolve('model:person'), application.Person);\n assert.equal(registry.resolve('model:user'), application.User);\n assert.equal(registry.resolve('fruit:favorite'), application.Orange);\n assert.equal(registry.resolve('communication:main'), application.Email);\n assert.equal(registry.resolve('controller:postIndex'), application.PostIndexController);\n assert.equal(locator.lookup('fruit:favorite'), locator.lookup('fruit:favorite'), 'singleton lookup worked');\n assert.ok(locator.lookup('model:user') !== locator.lookup('model:user'), 'non-singleton lookup worked');\n }\n\n });\n});","define(\"@ember/application/tests/initializers_test\", [\"internal-test-helpers\", \"@ember/application\"], function (_internalTestHelpers, _application) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application initializers', class extends _internalTestHelpers.AutobootApplicationTestCase {\n get fixture() {\n return `ONE
\n TWO
\n `;\n }\n\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n var myOptions = Object.assign(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n var secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n (0, _internalTestHelpers.runTask)(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n var MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.initializer({\n name: 'initializer'\n });\n });\n expectAssertion(() => {\n MyApplication.initializer({\n initialize() {}\n\n });\n });\n }\n\n [`@test initializers that throw errors cause the boot promise to reject with the error`](assert) {\n assert.expect(2);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n\n initialize() {\n throw new Error('boot failure');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication({\n autoboot: false\n }, MyApplication);\n });\n var app = this.application;\n\n try {\n (0, _internalTestHelpers.runTask)(() => {\n app.boot().then(() => {\n assert.ok(false, 'The boot promise should not resolve when there is a boot error');\n }, error => {\n assert.ok(error instanceof Error, 'The boot promise should reject with an error');\n assert.equal(error.message, 'boot failure');\n });\n });\n } catch (error) {\n assert.ok(false, 'The boot method should not throw');\n throw error;\n }\n }\n\n [`@test initializers are passed an App`](assert) {\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'initializer',\n\n initialize(App) {\n assert.ok(App instanceof _application.default, 'initialize is passed an Application');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'fourth',\n after: 'third',\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n\n initialize() {\n order.push('second');\n }\n\n });\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyApplication.initializer({\n name: 'first',\n before: 'second',\n\n initialize() {\n order.push('first');\n }\n\n });\n MyApplication.initializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyApplication.initializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can be registered in a specified order as an array`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyApplication.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n\n initialize() {\n order.push('second');\n }\n\n });\n MyApplication.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyApplication.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyApplication.initializer({\n name: 'first',\n before: ['second'],\n\n initialize() {\n order.push('first');\n }\n\n });\n MyApplication.initializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n var a = {\n name: 'a',\n before: 'b',\n\n initialize() {\n order.push('a');\n }\n\n };\n var b = {\n name: 'b',\n\n initialize() {\n order.push('b');\n }\n\n };\n var c = {\n name: 'c',\n after: 'b',\n\n initialize() {\n order.push('c');\n }\n\n };\n var afterB = {\n name: 'after b',\n after: 'b',\n\n initialize() {\n order.push('after b');\n }\n\n };\n var afterC = {\n name: 'after c',\n after: 'c',\n\n initialize() {\n order.push('after c');\n }\n\n };\n MyApplication.initializer(b);\n MyApplication.initializer(a);\n MyApplication.initializer(afterC);\n MyApplication.initializer(afterB);\n MyApplication.initializer(c);\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n [`@test initializers set on Application subclasses are not shared between apps`](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n\n var SecondApp = _application.default.extend();\n\n SecondApp.initializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, FirstApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({}, SecondApp));\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n }\n\n [`@test initializers are concatenated`](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n var SecondApp = FirstApp.extend();\n SecondApp.initializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, FirstApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run when base class created');\n firstInitializerRunCount = 0;\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({}, SecondApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n }\n\n [`@test initializers are per-app`](assert) {\n assert.expect(2);\n\n var FirstApp = _application.default.extend();\n\n FirstApp.initializer({\n name: 'abc',\n\n initialize() {}\n\n });\n expectAssertion(() => {\n FirstApp.initializer({\n name: 'abc',\n\n initialize() {}\n\n });\n });\n\n var SecondApp = _application.default.extend();\n\n SecondApp.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n assert.ok(true, 'Two apps can have initializers named the same.');\n }\n\n [`@test initializers are executed in their own context`](assert) {\n assert.expect(1);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n });\n});","define(\"@ember/application/tests/instance_initializers_test\", [\"internal-test-helpers\", \"@ember/application/instance\", \"@ember/application\"], function (_internalTestHelpers, _instance, _application) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application instance initializers', class extends _internalTestHelpers.AutobootApplicationTestCase {\n get fixture() {\n return `ONE
\n TWO
\n `;\n }\n\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n rootElement: '#one'\n });\n }\n\n createSecondApplication(options, MyApplication = _application.default) {\n var myOptions = Object.assign(this.applicationOptions, {\n rootElement: '#two'\n }, options);\n var secondApp = this.secondApp = MyApplication.create(myOptions);\n return secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n (0, _internalTestHelpers.runTask)(() => this.secondApp.destroy());\n }\n }\n\n [`@test initializers require proper 'name' and 'initialize' properties`]() {\n var MyApplication = _application.default.extend();\n\n expectAssertion(() => {\n MyApplication.instanceInitializer({\n name: 'initializer'\n });\n });\n expectAssertion(() => {\n MyApplication.instanceInitializer({\n initialize() {}\n\n });\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are passed an app instance`](assert) {\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'initializer',\n\n initialize(instance) {\n assert.ok(instance instanceof _instance.default, 'initialize is passed an application instance');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers can be registered in a specified order`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: 'third',\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n\n initialize() {\n order.push('second');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'first',\n before: 'second',\n\n initialize() {\n order.push('first');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can be registered in a specified order as an array`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n\n initialize() {\n order.push('second');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'first',\n before: ['second'],\n\n initialize() {\n order.push('first');\n }\n\n });\n MyApplication.instanceInitializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n [`@test initializers can have multiple dependencies`](assert) {\n var order = [];\n\n var MyApplication = _application.default.extend();\n\n var a = {\n name: 'a',\n before: 'b',\n\n initialize() {\n order.push('a');\n }\n\n };\n var b = {\n name: 'b',\n\n initialize() {\n order.push('b');\n }\n\n };\n var c = {\n name: 'c',\n after: 'b',\n\n initialize() {\n order.push('c');\n }\n\n };\n var afterB = {\n name: 'after b',\n after: 'b',\n\n initialize() {\n order.push('after b');\n }\n\n };\n var afterC = {\n name: 'after c',\n after: 'c',\n\n initialize() {\n order.push('after c');\n }\n\n };\n MyApplication.instanceInitializer(b);\n MyApplication.instanceInitializer(a);\n MyApplication.instanceInitializer(afterC);\n MyApplication.instanceInitializer(afterB);\n MyApplication.instanceInitializer(c);\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n [`@test initializers set on Application subclasses should not be shared between apps`](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n\n var SecondApp = _application.default.extend();\n\n SecondApp.instanceInitializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, FirstApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({}, SecondApp));\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n }\n\n [`@test initializers are concatenated`](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n var SecondApp = FirstApp.extend();\n SecondApp.instanceInitializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, FirstApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run when base class created');\n firstInitializerRunCount = 0;\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({}, SecondApp));\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n }\n\n [`@test initializers are per-app`](assert) {\n assert.expect(2);\n\n var FirstApp = _application.default.extend();\n\n FirstApp.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n expectAssertion(function () {\n FirstApp.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, FirstApp));\n\n var SecondApp = _application.default.extend();\n\n SecondApp.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createSecondApplication({}, SecondApp));\n assert.ok(true, 'Two apps can have initializers named the same.');\n }\n\n [`@test initializers are run before ready hook`](assert) {\n assert.expect(2);\n\n var MyApplication = _application.default.extend({\n ready() {\n assert.ok(true, 'ready is called');\n readyWasCalled = false;\n }\n\n });\n\n var readyWasCalled = false;\n MyApplication.instanceInitializer({\n name: 'initializer',\n\n initialize() {\n assert.ok(!readyWasCalled, 'ready is not yet called');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers are executed in their own context`](assert) {\n assert.expect(1);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n }\n\n [`@test initializers get an instance on app reset`](assert) {\n assert.expect(2);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'giveMeAnInstance',\n\n initialize(instance) {\n assert.ok(Boolean(instance), 'Initializer got an instance');\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => this.createApplication({}, MyApplication));\n (0, _internalTestHelpers.runTask)(() => this.application.reset());\n }\n\n });\n});","define(\"@ember/application/tests/lazy_load_test\", [\"@ember/runloop\", \"@ember/application\", \"internal-test-helpers\"], function (_runloop, _application, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Lazy Loading', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n var keys = Object.keys(_application._loaded);\n\n for (var i = 0; i < keys.length; i++) {\n delete _application._loaded[keys[i]];\n }\n }\n\n ['@test if a load hook is registered, it is executed when runLoadHooks are exected'](assert) {\n var count = 0;\n (0, _runloop.run)(function () {\n (0, _application.onLoad)('__test_hook__', function (object) {\n count += object;\n });\n });\n (0, _runloop.run)(function () {\n (0, _application.runLoadHooks)('__test_hook__', 1);\n });\n assert.equal(count, 1, 'the object was passed into the load hook');\n }\n\n ['@test if runLoadHooks was already run, it executes newly added hooks immediately'](assert) {\n var count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n (0, _runloop.run)(() => (0, _application.runLoadHooks)('__test_hook__', 1));\n count = 0;\n (0, _runloop.run)(() => {\n (0, _application.onLoad)('__test_hook__', object => count += object);\n });\n assert.equal(count, 1, 'the original object was passed into the load hook');\n }\n\n [\"@test hooks in EmberENV.EMBER_LOAD_HOOKS['hookName'] get executed\"](assert) {\n // Note that the necessary code to perform this test is run before\n // the Ember lib is loaded in tests/index.html\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__before_ember_test_hook__', 1);\n });\n assert.equal(window.EmberENV.__test_hook_count__, 1, 'the object was passed into the load hook');\n }\n\n ['@test load hooks trigger a custom event'](assert) {\n if (typeof window === 'object' && typeof window.dispatchEvent === 'function' && typeof CustomEvent === 'function') {\n var eventObject = 'super duper awesome events';\n window.addEventListener('__test_hook_for_events__', function (e) {\n assert.ok(true, 'custom event was fired');\n assert.equal(e.detail, eventObject, 'event details are provided properly');\n });\n (0, _runloop.run)(() => {\n (0, _application.runLoadHooks)('__test_hook_for_events__', eventObject);\n });\n } else {\n assert.expect(0);\n }\n }\n\n });\n});","define(\"@ember/application/tests/logging_test\", [\"internal-test-helpers\", \"@ember/controller\", \"@ember/-internals/routing\"], function (_internalTestHelpers, _controller, _routing) {\n \"use strict\";\n\n class LoggingApplicationTestCase extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n this.logs = {};\n /* eslint-disable no-console */\n\n this._originalLogger = console.info;\n\n console.info = (_, {\n fullName\n }) => {\n if (!Object.prototype.hasOwnProperty.call(this.logs, fullName)) {\n this.logs[fullName] = 0;\n }\n /* eslint-ensable no-console */\n\n\n this.logs[fullName]++;\n };\n\n this.router.map(function () {\n this.route('posts', {\n resetNamespace: true\n });\n });\n }\n\n teardown() {\n /* eslint-disable no-console */\n console.info = this._originalLogger;\n /* eslint-enable no-console */\n\n super.teardown();\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Application with LOG_ACTIVE_GENERATION=true', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n LOG_ACTIVE_GENERATION: true\n });\n }\n\n ['@test log class generation if logging enabled'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 4, 'expected logs');\n });\n }\n\n ['@test actively generated classes get logged'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n return this.visit('/posts').then(() => {\n assert.equal(this.logs['controller:application'], 1, 'expected: ApplicationController was generated');\n assert.equal(this.logs['controller:posts'], 1, 'expected: PostsController was generated');\n assert.equal(this.logs['route:application'], 1, 'expected: ApplicationRoute was generated');\n assert.equal(this.logs['route:posts'], 1, 'expected: PostsRoute was generated');\n });\n }\n\n ['@test predefined classes do not get logged'](assert) {\n this.add('controller:application', _controller.default.extend());\n this.add('controller:posts', _controller.default.extend());\n this.add('route:application', _routing.Route.extend());\n this.add('route:posts', _routing.Route.extend());\n return this.visit('/posts').then(() => {\n assert.ok(!this.logs['controller:application'], 'did not expect: ApplicationController was generated');\n assert.ok(!this.logs['controller:posts'], 'did not expect: PostsController was generated');\n assert.ok(!this.logs['route:application'], 'did not expect: ApplicationRoute was generated');\n assert.ok(!this.logs['route:posts'], 'did not expect: PostsRoute was generated');\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application when LOG_ACTIVE_GENERATION=false', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n LOG_ACTIVE_GENERATION: false\n });\n }\n\n [`@test do NOT log class generation if logging disabled`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected logs');\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application with LOG_VIEW_LOOKUPS=true', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n LOG_VIEW_LOOKUPS: true\n });\n }\n\n [`@test log when template and view are missing when flag is active`](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Logging does not occur in production builds');\n return;\n }\n\n this.addTemplate('application', '{{outlet}}');\n return this.visit('/').then(() => this.visit('/posts')).then(() => {\n assert.equal(this.logs['template:application'], undefined, 'expected: Should not log template:application since it exists.');\n assert.equal(this.logs['template:index'], 1, 'expected: Could not find \"index\" template or view.');\n assert.equal(this.logs['template:posts'], 1, 'expected: Could not find \"posts\" template or view.');\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application with LOG_VIEW_LOOKUPS=false', class extends LoggingApplicationTestCase {\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n LOG_VIEW_LOOKUPS: false\n });\n }\n\n [`@test do not log when template and view are missing when flag is not true`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected no logs');\n });\n }\n\n [`@test do not log which views are used with templates when flag is not true`](assert) {\n return this.visit('/posts').then(() => {\n assert.equal(Object.keys(this.logs).length, 0, 'expected no logs');\n });\n }\n\n });\n});","define(\"@ember/application/tests/readiness_test\", [\"internal-test-helpers\", \"@ember/runloop\", \"@ember/application\"], function (_internalTestHelpers, _runloop, _application) {\n \"use strict\";\n\n var application, Application, _document, callbacks;\n\n var readyWasCalled = 0;\n\n var dispatchEvent = eventName => {\n callbacks[eventName].forEach(callback => callback());\n };\n\n var removeEventListener = (eventName, callbackToRemove) => {\n callbacks[eventName] = callbacks[eventName].filter(callback => callback !== callbackToRemove);\n };\n\n var addEventListener = (eventName, callback) => {\n callbacks[eventName] ? callbacks[eventName].push(callback) : callbacks[eventName] = [callback];\n };\n\n (0, _internalTestHelpers.moduleFor)('Application readiness', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n callbacks = [];\n _document = {\n removeEventListener,\n addEventListener\n };\n Application = _application.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n _document,\n\n ready() {\n this._super();\n\n readyWasCalled++;\n }\n\n });\n }\n\n teardown() {\n if (application) {\n (0, _runloop.run)(() => application.destroy());\n Application = application = _document = callbacks = undefined;\n readyWasCalled = 0;\n }\n }\n\n [\"@test Application's ready event is called right away if DOM is already ready\"](assert) {\n _document.readyState = 'interactive';\n (0, _runloop.run)(() => {\n application = Application.create({\n router: false\n });\n assert.equal(readyWasCalled, 0, 'ready is not called until later');\n });\n assert.equal(readyWasCalled, 1, 'ready was called');\n application.domReady();\n assert.equal(callbacks['DOMContentLoaded'], undefined);\n assert.equal(readyWasCalled, 1, \"application's ready was not called again\");\n }\n\n [\"@test Application's ready event is called after the document becomes ready\"](assert) {\n _document.readyState = 'loading';\n (0, _runloop.run)(() => {\n application = Application.create({\n router: false\n });\n assert.equal(callbacks['DOMContentLoaded'].length, 1);\n });\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n dispatchEvent('DOMContentLoaded');\n assert.equal(callbacks['DOMContentLoaded'].length, 0);\n assert.equal(readyWasCalled, 1, 'ready was called now that DOM is ready');\n }\n\n [\"@test Application's ready event can be deferred by other components\"](assert) {\n _document.readyState = 'loading';\n (0, _runloop.run)(() => {\n application = Application.create({\n router: false\n });\n application.deferReadiness();\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n assert.equal(callbacks['DOMContentLoaded'].length, 1);\n });\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n application.domReady();\n assert.equal(readyWasCalled, 0, \"ready wasn't called yet\");\n (0, _runloop.run)(() => {\n application.advanceReadiness();\n assert.equal(readyWasCalled, 0);\n });\n assert.equal(readyWasCalled, 1, 'ready was called now all readiness deferrals are advanced');\n dispatchEvent('DOMContentLoaded');\n assert.equal(callbacks['DOMContentLoaded'].length, 0);\n expectAssertion(() => {\n application.deferReadiness();\n });\n }\n\n });\n});","define(\"@ember/application/tests/reset_test\", [\"@ember/runloop\", \"@ember/controller\", \"@ember/-internals/routing\", \"internal-test-helpers\", \"@ember/-internals/runtime\"], function (_runloop, _controller, _routing, _internalTestHelpers, _runtime) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application - resetting', class extends _internalTestHelpers.AutobootApplicationTestCase {\n ['@test Brings its own run-loop if not provided'](assert) {\n assert.expect(0);\n (0, _runloop.run)(() => this.createApplication());\n this.application.reset();\n }\n\n ['@test Does not bring its own run loop if one is already provided'](assert) {\n assert.expect(3);\n var didBecomeReady = false;\n (0, _runloop.run)(() => this.createApplication());\n (0, _runloop.run)(() => {\n this.application.ready = () => {\n didBecomeReady = true;\n };\n\n this.application.reset();\n this.application.deferReadiness();\n assert.ok(!didBecomeReady, 'app is not ready');\n });\n assert.ok(!didBecomeReady, 'app is not ready');\n (0, _runloop.run)(this.application, 'advanceReadiness');\n assert.ok(didBecomeReady, 'app is ready');\n }\n\n ['@test When an application is reset, new instances of controllers are generated'](assert) {\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('controller:academic', _controller.default.extend());\n });\n var firstController = this.applicationInstance.lookup('controller:academic');\n var secondController = this.applicationInstance.lookup('controller:academic');\n this.application.reset();\n var thirdController = this.applicationInstance.lookup('controller:academic');\n assert.strictEqual(firstController, secondController, 'controllers looked up in succession should be the same instance');\n assert.ok(firstController.isDestroying, 'controllers are destroyed when their application is reset');\n assert.notStrictEqual(firstController, thirdController, 'controllers looked up after the application is reset should not be the same instance');\n }\n\n ['@test When an application is reset, the eventDispatcher is destroyed and recreated'](assert) {\n var eventDispatcherWasSetup = 0;\n var eventDispatcherWasDestroyed = 0;\n\n class FakeEventDispatcher extends _runtime.CoreObject {\n setup() {\n eventDispatcherWasSetup++;\n }\n\n destroy() {\n if (this.isDestroying) {\n return;\n }\n\n super.destroy();\n eventDispatcherWasDestroyed++;\n }\n\n }\n\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('event_dispatcher:main', FakeEventDispatcher);\n assert.equal(eventDispatcherWasSetup, 0, 'not setup yet');\n assert.equal(eventDispatcherWasDestroyed, 0, 'not destroyed yet');\n });\n assert.equal(eventDispatcherWasSetup, 1, 'setup');\n assert.equal(eventDispatcherWasDestroyed, 0, 'still not destroyed');\n this.application.reset();\n assert.equal(eventDispatcherWasDestroyed, 1, 'destroyed');\n assert.equal(eventDispatcherWasSetup, 2, 'setup called after reset');\n }\n\n ['@test When an application is reset, the router URL is reset to `/`'](assert) {\n (0, _runloop.run)(() => {\n this.createApplication();\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n this.router.map(function () {\n this.route('one');\n this.route('two');\n });\n });\n var initialRouter, initialApplicationController;\n return this.visit('/one').then(() => {\n initialApplicationController = this.applicationInstance.lookup('controller:application');\n initialRouter = this.applicationInstance.lookup('router:main');\n var location = initialRouter.get('location');\n assert.equal(location.getURL(), '/one');\n assert.equal(initialRouter.currentPath, 'one');\n this.application.reset();\n return this.application._bootPromise;\n }).then(() => {\n var applicationController = this.applicationInstance.lookup('controller:application');\n assert.strictEqual(applicationController, undefined, 'application controller no longer exists');\n return this.visit('/one');\n }).then(() => {\n var applicationController = this.applicationInstance.lookup('controller:application');\n var router = this.applicationInstance.lookup('router:main');\n var location = router.get('location');\n assert.notEqual(initialRouter, router, 'a different router instance was created');\n assert.notEqual(initialApplicationController, applicationController, 'a different application controller is created');\n assert.equal(location.getURL(), '/one');\n assert.equal(router.currentPath, 'one');\n });\n }\n\n ['@test When an application with advance/deferReadiness is reset, the app does correctly become ready after reset'](assert) {\n var readyCallCount = 0;\n (0, _runloop.run)(() => {\n this.createApplication({\n ready() {\n readyCallCount++;\n }\n\n });\n this.application.deferReadiness();\n assert.equal(readyCallCount, 0, 'ready has not yet been called');\n });\n (0, _runloop.run)(this.application, 'advanceReadiness');\n assert.equal(readyCallCount, 1, 'ready was called once');\n this.application.reset();\n assert.equal(readyCallCount, 2, 'ready was called twice');\n }\n\n });\n});","define(\"@ember/application/tests/visit_test\", [\"internal-test-helpers\", \"@ember/service\", \"@ember/-internals/runtime\", \"@ember/runloop\", \"@ember/application\", \"@ember/application/instance\", \"@ember/engine\", \"@ember/-internals/routing\", \"@ember/-internals/glimmer\", \"ember-template-compiler\", \"@ember/-internals/environment\"], function (_internalTestHelpers, _service, _runtime, _runloop, _application, _instance, _engine, _routing, _glimmer, _emberTemplateCompiler, _environment) {\n \"use strict\";\n\n function expectAsyncError() {\n _runtime.RSVP.off('error');\n }\n\n (0, _internalTestHelpers.moduleFor)('Application - visit()', class extends _internalTestHelpers.ApplicationTestCase {\n teardown() {\n _runtime.RSVP.on('error', _runtime.onerrorDefault);\n\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n super.teardown();\n }\n\n createApplication(options) {\n return super.createApplication(options, _application.default.extend());\n }\n\n assertEmptyFixture(message) {\n this.assert.strictEqual(document.getElementById('qunit-fixture').children.length, 0, `there are no elements in the fixture element ${message ? message : ''}`);\n }\n\n [`@test does not add serialize-mode markers by default`](assert) {\n var templateContent = 'Hi, Mom!
';\n this.addTemplate('index', templateContent);\n var rootElement = document.createElement('div');\n var bootOptions = {\n isBrowser: false,\n rootElement\n };\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n return this.visit('/', bootOptions).then(() => {\n assert.equal(rootElement.innerHTML, templateContent, 'without serialize flag renders as expected');\n });\n }\n\n [`@test _renderMode: rehydration`](assert) {\n assert.expect(2);\n var indexTemplate = 'Hi, Mom!
';\n this.addTemplate('index', indexTemplate);\n var rootElement = document.createElement('div');\n var bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'serialize'\n };\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n return this.visit('/', bootOptions).then(instance => {\n assert.ok((0, _glimmer.isSerializationFirstNode)(instance.rootElement.firstChild), 'glimmer-vm comment node was not found');\n }).then(() => {\n return (0, _internalTestHelpers.runTask)(() => {\n this.applicationInstance.destroy();\n this.applicationInstance = null;\n });\n }).then(() => {\n bootOptions = {\n isBrowser: false,\n rootElement,\n _renderMode: 'rehydrate'\n };\n this.application.visit('/', bootOptions).then(instance => {\n assert.equal(instance.rootElement.innerHTML, indexTemplate, 'was not properly rehydrated');\n });\n });\n } // This tests whether the application is \"autobooted\" by registering an\n // instance initializer and asserting it never gets run. Since this is\n // inherently testing that async behavior *doesn't* happen, we set a\n // 500ms timeout to verify that when autoboot is set to false, the\n // instance initializer that would normally get called on DOM ready\n // does not fire.\n\n\n [`@test Applications with autoboot set to false do not autoboot`](assert) {\n function delay(time) {\n return new _runtime.RSVP.Promise(resolve => (0, _runloop.later)(resolve, time));\n }\n\n var appBooted = 0;\n var instanceBooted = 0;\n this.application.initializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n appBooted++;\n }\n\n });\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n instanceBooted++;\n }\n\n });\n assert.ok(!this.applicationInstance, 'precond - no instance');\n assert.ok(appBooted === 0, 'precond - not booted');\n assert.ok(instanceBooted === 0, 'precond - not booted'); // Continue after 500ms\n\n return delay(500).then(() => {\n assert.ok(appBooted === 0, '500ms elapsed without app being booted');\n assert.ok(instanceBooted === 0, '500ms elapsed without instances being booted');\n return (0, _internalTestHelpers.runTask)(() => this.application.boot());\n }).then(() => {\n assert.ok(appBooted === 1, 'app should boot when manually calling `app.boot()`');\n assert.ok(instanceBooted === 0, 'no instances should be booted automatically when manually calling `app.boot()');\n });\n }\n\n [`@test calling visit() on an app without first calling boot() should boot the app`](assert) {\n var appBooted = 0;\n var instanceBooted = 0;\n this.application.initializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n appBooted++;\n }\n\n });\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n instanceBooted++;\n }\n\n });\n return this.visit('/').then(() => {\n assert.ok(appBooted === 1, 'the app should be booted`');\n assert.ok(instanceBooted === 1, 'an instances should be booted');\n });\n }\n\n [`@test calling visit() on an already booted app should not boot it again`](assert) {\n var appBooted = 0;\n var instanceBooted = 0;\n this.application.initializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n appBooted++;\n }\n\n });\n this.application.instanceInitializer({\n name: 'assert-no-autoboot',\n\n initialize() {\n instanceBooted++;\n }\n\n });\n return (0, _internalTestHelpers.runTask)(() => this.application.boot()).then(() => {\n assert.ok(appBooted === 1, 'the app should be booted');\n assert.ok(instanceBooted === 0, 'no instances should be booted');\n return this.visit('/');\n }).then(() => {\n assert.ok(appBooted === 1, 'the app should not be booted again');\n assert.ok(instanceBooted === 1, 'an instance should be booted');\n /*\n * Destroy the instance.\n */\n\n return (0, _internalTestHelpers.runTask)(() => {\n this.applicationInstance.destroy();\n this.applicationInstance = null;\n });\n }).then(() => {\n /*\n * Visit on the application a second time. The application should remain\n * booted, but a new instance will be created.\n */\n return this.application.visit('/').then(instance => {\n this.applicationInstance = instance;\n });\n }).then(() => {\n assert.ok(appBooted === 1, 'the app should not be booted again');\n assert.ok(instanceBooted === 2, 'another instance should be booted');\n });\n }\n\n [`@test visit() rejects on application boot failure`](assert) {\n this.application.initializer({\n name: 'error',\n\n initialize() {\n throw new Error('boot failure');\n }\n\n });\n expectAsyncError();\n return this.visit('/').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'boot failure');\n });\n }\n\n [`@test visit() rejects on instance boot failure`](assert) {\n this.application.instanceInitializer({\n name: 'error',\n\n initialize() {\n throw new Error('boot failure');\n }\n\n });\n expectAsyncError();\n return this.visit('/').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'boot failure');\n });\n }\n\n [`@test visit() follows redirects`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b', {\n path: '/b/:b'\n });\n this.route('c', {\n path: '/c/:c'\n });\n });\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n expectDeprecation(() => {\n this.replaceWith('b', 'zomg');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n expectDeprecation(() => {\n this.transitionTo('c', params.b);\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n /*\n * First call to `visit` is `this.application.visit` and returns the\n * applicationInstance.\n */\n\n return this.visit('/a').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/c/zomg', 'It should follow all redirects');\n });\n }\n\n [`@test visit() rejects if an error occurred during a transition`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b', {\n path: '/b/:b'\n });\n this.route('c', {\n path: '/c/:c'\n });\n });\n this.add('route:a', _routing.Route.extend({\n afterModel() {\n expectDeprecation(() => {\n this.replaceWith('b', 'zomg');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add('route:b', _routing.Route.extend({\n afterModel(params) {\n expectDeprecation(() => {\n this.transitionTo('c', params.b);\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add('route:c', _routing.Route.extend({\n afterModel() {\n throw new Error('transition failure');\n }\n\n }));\n expectAsyncError();\n return this.visit('/a').then(() => {\n assert.ok(false, 'It should not resolve the promise');\n }, error => {\n assert.ok(error instanceof Error, 'It should reject the promise with the boot error');\n assert.equal(error.message, 'transition failure');\n });\n }\n\n [`@test visit() chain`](assert) {\n this.router.map(function () {\n this.route('a');\n this.route('b');\n this.route('c');\n });\n return this.visit('/').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/');\n return instance.visit('/a');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/a');\n return instance.visit('/b');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/b');\n return instance.visit('/c');\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(instance.getURL(), '/c');\n });\n }\n\n [`@test visit() returns a promise that resolves when the view has rendered`](assert) {\n this.addTemplate('application', `Hello world `);\n this.assertEmptyFixture();\n return this.visit('/').then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.equal(this.element.textContent, 'Hello world', 'the application was rendered once the promise resolves');\n });\n }\n\n [`@test visit() returns a promise that resolves without rendering when shouldRender is set to false`](assert) {\n assert.expect(3);\n this.addTemplate('application', 'Hello world ');\n this.assertEmptyFixture();\n return this.visit('/', {\n shouldRender: false\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n this.assertEmptyFixture('after visit');\n });\n }\n\n [`@test visit() renders a template when shouldRender is set to true`](assert) {\n assert.expect(3);\n this.addTemplate('application', 'Hello world ');\n this.assertEmptyFixture();\n return this.visit('/', {\n shouldRender: true\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.strictEqual(document.querySelector('#qunit-fixture').children.length, 1, 'there is 1 element in the fixture element after visit');\n });\n }\n\n [`@test visit() returns a promise that resolves without rendering when shouldRender is set to false with Engines`](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.mount('blog');\n });\n this.addTemplate('application', 'Hello world '); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var BlogMap = function () {};\n\n this.add('route-map:blog', BlogMap);\n this.assertEmptyFixture();\n return this.visit('/blog', {\n shouldRender: false\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n this.assertEmptyFixture('after visit');\n });\n }\n\n [`@test visit() does not setup the event_dispatcher:main if isInteractive is false (with Engines) GH#15615`](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.mount('blog');\n });\n this.addTemplate('application', 'Hello world {{outlet}}');\n this.add('event_dispatcher:main', {\n create() {\n throw new Error('should not happen!');\n }\n\n }); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init(...args) {\n this._super.apply(this, args);\n\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{cache-money}}'));\n this.register('template:components/cache-money', (0, _emberTemplateCompiler.compile)(`\n Dis cache money
\n `));\n this.register('component:cache-money', _glimmer.Component.extend({}));\n }\n\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var BlogMap = function () {};\n\n this.add('route-map:blog', BlogMap);\n this.assertEmptyFixture();\n return this.visit('/blog', {\n isInteractive: false\n }).then(instance => {\n assert.ok(instance instanceof _instance.default, 'promise is resolved with an ApplicationInstance');\n assert.strictEqual(this.element.querySelector('p').textContent, 'Dis cache money', 'Engine component is resolved');\n });\n }\n\n [`@test visit() on engine resolves engine component`](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.mount('blog');\n }); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init(...args) {\n this._super.apply(this, args);\n\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{cache-money}}'));\n this.register('template:components/cache-money', (0, _emberTemplateCompiler.compile)(`\n Dis cache money
\n `));\n this.register('component:cache-money', _glimmer.Component.extend({}));\n }\n\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var BlogMap = function () {};\n\n this.add('route-map:blog', BlogMap);\n this.assertEmptyFixture();\n return this.visit('/blog', {\n shouldRender: true\n }).then(() => {\n assert.strictEqual(this.element.querySelector('p').textContent, 'Dis cache money', 'Engine component is resolved');\n });\n }\n\n [`@test visit() on engine resolves engine helper`](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.mount('blog');\n }); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver,\n\n init(...args) {\n this._super.apply(this, args);\n\n this.register('template:application', (0, _emberTemplateCompiler.compile)('{{swag}}'));\n this.register('helper:swag', (0, _glimmer.helper)(function () {\n return 'turnt up';\n }));\n }\n\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var BlogMap = function () {};\n\n this.add('route-map:blog', BlogMap);\n this.assertEmptyFixture();\n return this.visit('/blog', {\n shouldRender: true\n }).then(() => {\n assert.strictEqual(this.element.textContent, 'turnt up', 'Engine component is resolved');\n });\n }\n\n [`@test Ember Islands-style setup`](assert) {\n var xFooInitCalled = false;\n var xFooDidInsertElementCalled = false;\n var xBarInitCalled = false;\n var xBarDidInsertElementCalled = false;\n this.router.map(function () {\n this.route('show', {\n path: '/:component_name'\n });\n });\n this.add('route:show', _routing.Route.extend({\n queryParams: {\n data: {\n refreshModel: true\n }\n },\n\n model(params) {\n return {\n componentName: params.component_name,\n componentData: params.data ? JSON.parse(params.data) : undefined\n };\n }\n\n }));\n\n var Counter = _runtime.Object.extend({\n value: 0,\n\n increment() {\n this.incrementProperty('value');\n }\n\n });\n\n this.add('service:isolatedCounter', Counter);\n this.add('service:sharedCounter', Counter.create());\n this.application.registerOptions('service:sharedCounter', {\n instantiate: false\n });\n this.addTemplate('show', '{{component @model.componentName model=@model.componentData}}');\n this.addTemplate('components/x-foo', `\n X-Foo \n Hello {{@model.name}}, I have been clicked {{this.isolatedCounter.value}} times ({{this.sharedCounter.value}} times combined)!
\n `);\n this.add('component:x-foo', _glimmer.Component.extend({\n tagName: 'x-foo',\n isolatedCounter: (0, _service.service)(),\n sharedCounter: (0, _service.service)(),\n\n init() {\n this._super();\n\n xFooInitCalled = true;\n },\n\n didInsertElement() {\n xFooDidInsertElementCalled = true;\n },\n\n click() {\n this.get('isolatedCounter').increment();\n this.get('sharedCounter').increment();\n }\n\n }));\n this.addTemplate('components/x-bar', `\n X-Bar \n Join {{this.counter.value}} others in clicking me! \n `);\n this.add('component:x-bar', _glimmer.Component.extend({\n counter: (0, _service.service)('sharedCounter'),\n actions: {\n incrementCounter() {\n this.get('counter').increment();\n }\n\n },\n\n init() {\n this._super();\n\n xBarInitCalled = true;\n },\n\n didInsertElement() {\n xBarDidInsertElementCalled = true;\n }\n\n }));\n var fixtureElement = document.querySelector('#qunit-fixture');\n var foo = document.createElement('div');\n var bar = document.createElement('div');\n fixtureElement.appendChild(foo);\n fixtureElement.appendChild(bar);\n var data = encodeURIComponent(JSON.stringify({\n name: 'Godfrey'\n }));\n var instances = [];\n return _runtime.RSVP.all([(0, _internalTestHelpers.runTask)(() => {\n return this.application.visit(`/x-foo?data=${data}`, {\n rootElement: foo\n });\n }), (0, _internalTestHelpers.runTask)(() => {\n return this.application.visit('/x-bar', {\n rootElement: bar\n });\n })]).then(_instances => {\n instances = _instances;\n assert.ok(xFooInitCalled);\n assert.ok(xFooDidInsertElementCalled);\n assert.ok(xBarInitCalled);\n assert.ok(xBarDidInsertElementCalled);\n assert.equal(foo.querySelector('h1').textContent, 'X-Foo');\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 0 times (0 times combined)!');\n assert.ok(foo.textContent.indexOf('X-Bar') === -1);\n assert.equal(bar.querySelector('h1').textContent, 'X-Bar');\n assert.equal(bar.querySelector('button').textContent, 'Join 0 others in clicking me!');\n assert.ok(bar.textContent.indexOf('X-Foo') === -1);\n (0, _internalTestHelpers.runTask)(() => {\n this.click(foo.querySelector('x-foo'));\n });\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 1 times (1 times combined)!');\n assert.equal(bar.querySelector('button').textContent, 'Join 1 others in clicking me!');\n (0, _internalTestHelpers.runTask)(() => {\n this.click(bar.querySelector('button'));\n this.click(bar.querySelector('button'));\n });\n assert.equal(foo.querySelector('p').textContent, 'Hello Godfrey, I have been clicked 1 times (3 times combined)!');\n assert.equal(bar.querySelector('button').textContent, 'Join 3 others in clicking me!');\n }).finally(() => {\n (0, _internalTestHelpers.runTask)(() => {\n instances.forEach(instance => {\n instance.destroy();\n });\n });\n });\n }\n\n });\n});","define(\"@ember/controller/tests/controller_test\", [\"@ember/controller\", \"@ember/service\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/-internals/owner\", \"internal-test-helpers\", \"@ember/object\"], function (_controller, _service, _runtime, _metal, _owner, _internalTestHelpers, _object) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n (0, _internalTestHelpers.moduleFor)('Controller model', class extends _internalTestHelpers.ApplicationTestCase {\n async '@test model is tracked'() {\n var _class;\n\n this.add('controller:index', (_class = class extends _controller.default {\n constructor() {\n super(...arguments);\n this.model = 0;\n }\n\n get derived() {\n return this.model + 1;\n }\n\n update() {\n this.model++;\n }\n\n }, _applyDecoratedDescriptor(_class.prototype, \"update\", [_object.action], Object.getOwnPropertyDescriptor(_class.prototype, \"update\"), _class.prototype), _class));\n this.addTemplate('index', '{{this.derived}} ');\n await this.visit('/');\n this.assertText('1');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n this.assertText('2');\n }\n\n async '@test model can be observed with sync observers'(assert) {\n var _class2;\n\n var observerRunCount = 0;\n this.add('controller:index', (_class2 = class extends _controller.default {\n constructor() {\n super(...arguments);\n this.model = 0;\n this.addObserver('model', this, () => observerRunCount++, true);\n }\n\n update() {\n this.model++;\n }\n\n }, _applyDecoratedDescriptor(_class2.prototype, \"update\", [_object.action], Object.getOwnPropertyDescriptor(_class2.prototype, \"update\"), _class2.prototype), _class2));\n this.addTemplate('index', '{{this.model}} ');\n await this.visit('/');\n (0, _internalTestHelpers.runTask)(() => this.$('button').click());\n assert.equal(observerRunCount, 1, 'observer ran exactly once');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Controller event handling', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Action can be handled by a function on actions object'](assert) {\n assert.expect(1);\n\n var TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked');\n }\n\n }\n });\n\n var controller = TestController.create();\n controller.send('poke');\n }\n\n ['@test A handled action can be bubbled to the target for continued processing'](assert) {\n assert.expect(2);\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n var TestController = _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 1');\n return true;\n }\n\n }\n });\n\n owner.register('controller:index', TestController);\n var controller = TestController.create({\n target: _controller.default.extend({\n actions: {\n poke() {\n assert.ok(true, 'poked 2');\n }\n\n }\n }).create()\n });\n (0, _owner.setOwner)(controller, owner);\n controller.send('poke');\n }\n\n [\"@test Action can be handled by a superclass' actions object\"](assert) {\n assert.expect(4);\n\n var SuperController = _controller.default.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n\n }\n });\n\n var BarControllerMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n\n this._super(msg);\n }\n\n }\n });\n\n var IndexController = SuperController.extend(BarControllerMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n\n }\n });\n var controller = IndexController.create({});\n controller.send('foo');\n controller.send('bar', 'HELLO');\n controller.send('baz');\n }\n\n ['@test .send asserts if called on a destroyed controller']() {\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('controller:application', _controller.default.extend({\n toString() {\n return 'controller:rip-alley';\n }\n\n }));\n var controller = owner.lookup('controller:application');\n (0, _internalTestHelpers.runDestroy)(owner);\n expectAssertion(() => {\n controller.send('trigger-me-dead');\n }, \"Attempted to call .send() with the action 'trigger-me-dead' on the destroyed object 'controller:rip-alley'.\");\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Controller deprecations -> Controller Content -> Model Alias', class extends _internalTestHelpers.AbstractTestCase {\n ['@test `content` is not moved to `model` when `model` is unset'](assert) {\n assert.expect(2);\n var controller;\n ignoreDeprecation(function () {\n controller = _controller.default.extend({\n content: 'foo-bar'\n }).create();\n });\n assert.notEqual(controller.get('model'), 'foo-bar', 'model is set properly');\n assert.equal(controller.get('content'), 'foo-bar', 'content is not set properly');\n }\n\n ['@test specifying `content` (without `model` specified) does not result in deprecation'](assert) {\n assert.expect(2);\n expectNoDeprecation();\n\n var controller = _controller.default.extend({\n content: 'foo-bar'\n }).create();\n\n assert.equal((0, _metal.get)(controller, 'content'), 'foo-bar');\n }\n\n ['@test specifying `content` (with `model` specified) does not result in deprecation'](assert) {\n assert.expect(3);\n expectNoDeprecation();\n\n var controller = _controller.default.create({\n content: 'foo-bar',\n model: 'blammo'\n });\n\n assert.equal((0, _metal.get)(controller, 'content'), 'foo-bar');\n assert.equal((0, _metal.get)(controller, 'model'), 'blammo');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Controller deprecations -> Controller injected properties', class extends _internalTestHelpers.AbstractTestCase {\n ['@test defining a controller on a non-controller should fail assertion']() {\n expectAssertion(function () {\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n var AnObject = _runtime.Object.extend({\n foo: (0, _controller.inject)('bar')\n });\n\n owner.register('controller:bar', _runtime.Object.extend());\n owner.register('foo:main', AnObject);\n owner.lookup('foo:main');\n }, /Defining `foo` as an injected controller property on a non-controller \\(`foo:main`\\) is not allowed/);\n }\n\n ['@test controllers can be injected into controllers'](assert) {\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('controller:post', _controller.default.extend({\n postsController: (0, _controller.inject)('posts')\n }));\n owner.register('controller:posts', _controller.default.extend());\n var postController = owner.lookup('controller:post');\n var postsController = owner.lookup('controller:posts');\n assert.equal(postsController, postController.get('postsController'), 'controller.posts is injected');\n }\n\n ['@test services can be injected into controllers'](assert) {\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('controller:application', _controller.default.extend({\n authService: (0, _service.service)('auth')\n }));\n owner.register('service:auth', _service.default.extend());\n var appController = owner.lookup('controller:application');\n var authService = owner.lookup('service:auth');\n assert.equal(authService, appController.get('authService'), 'service.auth is injected');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Controller Injections', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works with native decorators'](assert) {\n var _dec, _class3, _descriptor;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainController extends _controller.default {}\n\n var IndexController = (_dec = (0, _controller.inject)('main'), (_class3 = class IndexController extends _controller.default {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class3.prototype, \"main\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3));\n owner.register('controller:main', MainController);\n owner.register('controller:index', IndexController);\n var index = owner.lookup('controller:index');\n assert.ok(index.main instanceof _controller.default, 'controller injected correctly');\n }\n\n ['@test uses the decorated property key if not provided'](assert) {\n var _class5, _descriptor2;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainController extends _controller.default {}\n\n var IndexController = (_class5 = class IndexController extends _controller.default {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class5.prototype, \"main\", [_controller.inject], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class5);\n owner.register('controller:main', MainController);\n owner.register('controller:index', IndexController);\n var index = owner.lookup('controller:index');\n assert.ok(index.main instanceof _controller.default, 'controller injected correctly');\n }\n\n });\n});","define(\"@ember/debug/tests/handlers-test\", [\"@ember/debug/lib/handlers\", \"internal-test-helpers\"], function (_handlers, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-debug: registerHandler', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n delete _handlers.HANDLERS.blarz;\n }\n\n ['@test calls handler on `invoke` when `falsey`'](assert) {\n assert.expect(2);\n\n function handler(message) {\n assert.ok(true, 'called handler');\n assert.equal(message, 'Foo bar');\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n (0, _handlers.invoke)('blarz', 'Foo bar', false);\n }\n\n ['@test does not call handler on `invoke` when `truthy`'](assert) {\n assert.expect(0);\n\n function handler() {\n assert.ok(false, 'called handler');\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n (0, _handlers.invoke)('blarz', 'Foo bar', true);\n }\n\n ['@test calling `invoke` without handlers does not throw an error'](assert) {\n assert.expect(0);\n (0, _handlers.invoke)('blarz', 'Foo bar', false);\n }\n\n ['@test invoking `next` argument calls the next handler'](assert) {\n assert.expect(2);\n\n function handler1() {\n assert.ok(true, 'called handler1');\n }\n\n function handler2(message, options, next) {\n assert.ok(true, 'called handler2');\n next(message, options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test invoking `next` when no other handlers exists does not error'](assert) {\n assert.expect(1);\n\n function handler(message, options, next) {\n assert.ok(true, 'called handler1');\n next(message, options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler);\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test handlers are called in the proper order'](assert) {\n assert.expect(11);\n var expectedMessage = 'This is the message';\n var expectedOptions = {\n id: 'foo-bar'\n };\n var expected = ['first', 'second', 'third', 'fourth', 'fifth'];\n var actualCalls = [];\n\n function generateHandler(item) {\n return function (message, options, next) {\n assert.equal(message, expectedMessage, `message supplied to ${item} handler is correct`);\n assert.equal(options, expectedOptions, `options supplied to ${item} handler is correct`);\n actualCalls.push(item);\n next(message, options);\n };\n }\n\n expected.forEach(item => (0, _handlers.registerHandler)('blarz', generateHandler(item)));\n (0, _handlers.invoke)('blarz', expectedMessage, false, expectedOptions);\n assert.deepEqual(actualCalls, expected.reverse(), 'handlers were called in proper order');\n }\n\n ['@test not invoking `next` prevents further handlers from being called'](assert) {\n assert.expect(1);\n\n function handler1() {\n assert.ok(false, 'called handler1');\n }\n\n function handler2() {\n assert.ok(true, 'called handler2');\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n (0, _handlers.invoke)('blarz', 'Foo', false);\n }\n\n ['@test handlers can call `next` with custom message and/or options'](assert) {\n assert.expect(4);\n var initialMessage = 'initial message';\n var initialOptions = {\n id: 'initial-options'\n };\n var handler2Message = 'Handler2 Message';\n var handler2Options = {\n id: 'handler-2'\n };\n\n function handler1(message, options) {\n assert.equal(message, handler2Message, 'handler2 message provided to handler1');\n assert.equal(options, handler2Options, 'handler2 options provided to handler1');\n }\n\n function handler2(message, options, next) {\n assert.equal(message, initialMessage, 'initial message provided to handler2');\n assert.equal(options, initialOptions, 'initial options proivided to handler2');\n next(handler2Message, handler2Options);\n }\n\n (0, _handlers.registerHandler)('blarz', handler1);\n (0, _handlers.registerHandler)('blarz', handler2);\n (0, _handlers.invoke)('blarz', initialMessage, false, initialOptions);\n }\n\n });\n});","define(\"@ember/debug/tests/main_test\", [\"@ember/-internals/environment\", \"@ember/-internals/runtime\", \"@ember/debug/lib/handlers\", \"@ember/debug/lib/deprecate\", \"@ember/debug/lib/warn\", \"@ember/debug/index\", \"internal-test-helpers\"], function (_environment, _runtime, _handlers, _deprecate, _warn, _index, _internalTestHelpers) {\n \"use strict\";\n\n var originalEnvValue;\n var originalDeprecateHandler;\n var originalWarnHandler;\n var originalConsoleWarn = console.warn; // eslint-disable-line no-console\n\n var noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('ember-debug', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n originalEnvValue = _environment.ENV.RAISE_ON_DEPRECATION;\n originalDeprecateHandler = _handlers.HANDLERS.deprecate;\n originalWarnHandler = _handlers.HANDLERS.warn;\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n }\n\n teardown() {\n _handlers.HANDLERS.deprecate = originalDeprecateHandler;\n _handlers.HANDLERS.warn = originalWarnHandler;\n _environment.ENV.RAISE_ON_DEPRECATION = originalEnvValue;\n }\n\n afterEach() {\n console.warn = originalConsoleWarn; // eslint-disable-line no-console\n }\n\n ['@test deprecate does not throw if RAISE_ON_DEPRECATION is false'](assert) {\n assert.expect(1);\n console.warn = noop; // eslint-disable-line no-console\n\n _environment.ENV.RAISE_ON_DEPRECATION = false;\n\n try {\n (0, _index.deprecate)('Should not throw', false, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n assert.ok(true, 'deprecate did not throw');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n }\n\n ['@test deprecate resets deprecation level to RAISE if ENV.RAISE_ON_DEPRECATION is set'](assert) {\n assert.expect(2);\n console.warn = noop; // eslint-disable-line no-console\n\n _environment.ENV.RAISE_ON_DEPRECATION = false;\n\n try {\n (0, _index.deprecate)('Should not throw', false, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n assert.ok(true, 'deprecate did not throw');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n assert.throws(() => {\n (0, _index.deprecate)('Should throw', false, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n }, /Should throw/);\n }\n\n ['@test When ENV.RAISE_ON_DEPRECATION is true, it is still possible to silence a deprecation by id'](assert) {\n assert.expect(3);\n _environment.ENV.RAISE_ON_DEPRECATION = true;\n (0, _deprecate.registerHandler)(function (message, options, next) {\n if (!options || options.id !== 'my-deprecation') {\n next(...arguments);\n }\n });\n\n try {\n (0, _index.deprecate)('should be silenced with matching id', false, {\n id: 'my-deprecation',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n assert.ok(true, 'Did not throw when level is set by id');\n } catch (e) {\n assert.ok(false, `Expected deprecate not to throw but it did: ${e.message}`);\n }\n\n assert.throws(() => {\n (0, _index.deprecate)('Should throw with no matching id', false, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n }, /Should throw with no matching id/);\n assert.throws(() => {\n (0, _index.deprecate)('Should throw with non-matching id', false, {\n id: 'other-id',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n }, /Should throw with non-matching id/);\n }\n\n ['@test deprecate throws deprecation if second argument is falsy'](assert) {\n assert.expect(3);\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', false, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', '', {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n }));\n assert.throws(() => (0, _index.deprecate)('Deprecation is thrown', 0, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n }));\n }\n\n ['@test deprecate does not invoke a function as the second argument'](assert) {\n assert.expect(1);\n (0, _index.deprecate)('Deprecation is thrown', function () {\n assert.ok(false, 'this function should not be invoked');\n }, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n assert.ok(true, 'deprecations were not thrown');\n }\n\n ['@test deprecate does not throw deprecations if second argument is truthy'](assert) {\n assert.expect(1);\n (0, _index.deprecate)('Deprecation is thrown', true, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n (0, _index.deprecate)('Deprecation is thrown', '1', {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n (0, _index.deprecate)('Deprecation is thrown', 1, {\n id: 'test',\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n });\n assert.ok(true, 'deprecations were not thrown');\n }\n\n ['@test assert throws if second argument is falsy'](assert) {\n assert.expect(3);\n assert.throws(() => (0, _index.assert)('Assertion is thrown', false));\n assert.throws(() => (0, _index.assert)('Assertion is thrown', ''));\n assert.throws(() => (0, _index.assert)('Assertion is thrown', 0));\n }\n\n ['@test assert does not throw if second argument is a function'](assert) {\n assert.expect(1);\n (0, _index.assert)('Assertion is thrown', () => true);\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test assert does not throw if second argument is falsy'](assert) {\n assert.expect(1);\n (0, _index.assert)('Assertion is thrown', true);\n (0, _index.assert)('Assertion is thrown', '1');\n (0, _index.assert)('Assertion is thrown', 1);\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test assert does not throw if second argument is an object'](assert) {\n assert.expect(1);\n\n var Igor = _runtime.Object.extend();\n\n (0, _index.assert)('is truthy', Igor);\n (0, _index.assert)('is truthy', Igor.create());\n assert.ok(true, 'assertions were not thrown');\n }\n\n ['@test deprecate does not throw a deprecation at log and silence'](assert) {\n assert.expect(4);\n var id = 'ABC';\n var until = 'forever';\n var since = 'forever';\n var shouldThrow = false;\n (0, _deprecate.registerHandler)(function (message, options) {\n if (options && options.id === id) {\n if (shouldThrow) {\n throw new Error(message);\n }\n }\n });\n\n try {\n (0, _index.deprecate)('Deprecation for testing purposes', false, {\n id,\n until,\n since,\n for: 'namespace'\n });\n assert.ok(true, 'Deprecation did not throw');\n } catch (e) {\n assert.ok(false, 'Deprecation was thrown despite being added to blacklist');\n }\n\n try {\n (0, _index.deprecate)('Deprecation for testing purposes', false, {\n id,\n until,\n since,\n for: 'namespace'\n });\n assert.ok(true, 'Deprecation did not throw');\n } catch (e) {\n assert.ok(false, 'Deprecation was thrown despite being added to blacklist');\n }\n\n shouldThrow = true;\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, {\n id,\n until\n });\n });\n assert.throws(function () {\n (0, _index.deprecate)('Deprecation is thrown', false, {\n id,\n until\n });\n });\n }\n\n ['@test deprecate without options triggers an assertion'](assert) {\n assert.expect(2);\n assert.throws(() => (0, _index.deprecate)('foo'), new RegExp(_deprecate.missingOptionsDeprecation), 'proper assertion is triggered when options is missing');\n assert.throws(() => (0, _index.deprecate)('foo', false, {}), new RegExp(_deprecate.missingOptionsDeprecation), 'proper assertion is triggered when options is missing');\n }\n\n ['@test deprecate without options.id triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.deprecate)('foo', false, {\n until: 'forever',\n for: 'me',\n since: {\n enabled: '1.0.0'\n }\n }), new RegExp(_deprecate.missingOptionsIdDeprecation), 'proper assertion is triggered when options.id is missing');\n }\n\n ['@test deprecate without options.until triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.deprecate)('foo', false, {\n id: 'test'\n }), new RegExp((0, _deprecate.missingOptionDeprecation)('test', 'until')), 'proper assertion is triggered when options.until is missing');\n }\n\n ['@test deprecate without options.for triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.deprecate)('message1', false, {\n id: 'test',\n until: 'forever'\n }), new RegExp((0, _deprecate.missingOptionDeprecation)('test', 'for')), 'proper assertion is triggered when options.for is missing');\n }\n\n ['@test deprecate without options.since triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.deprecate)('foo', false, {\n id: 'test',\n until: 'forever',\n for: 'me'\n }), new RegExp((0, _deprecate.missingOptionDeprecation)('test', 'since')), 'proper assertion is triggered when options.since is missing');\n }\n\n ['@test warn without options triggers an assert'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.warn)('foo'), new RegExp(_warn.missingOptionsDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without options.id triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.warn)('foo', false, {}), new RegExp(_warn.missingOptionsIdDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without options.id nor test triggers an assertion'](assert) {\n assert.expect(1);\n assert.throws(() => (0, _index.warn)('foo', {}), new RegExp(_warn.missingOptionsIdDeprecation), 'deprecation is triggered when options is missing');\n }\n\n ['@test warn without test but with options does not trigger an assertion'](assert) {\n assert.expect(1);\n (0, _warn.registerHandler)(function (message) {\n assert.equal(message, 'foo', 'warning was triggered');\n });\n (0, _index.warn)('foo', {\n id: 'ember-debug.do-not-raise'\n });\n }\n\n });\n});","define(\"@ember/engine/tests/engine_initializers_test\", [\"@ember/runloop\", \"@ember/engine\", \"internal-test-helpers\"], function (_runloop, _engine, _internalTestHelpers) {\n \"use strict\";\n\n var MyEngine, myEngine, myEngineInstance;\n (0, _internalTestHelpers.moduleFor)('Engine initializers', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n (0, _runloop.run)(() => {\n if (myEngineInstance) {\n myEngineInstance.destroy();\n myEngineInstance = null;\n }\n\n if (myEngine) {\n myEngine.destroy();\n myEngine = null;\n }\n });\n }\n\n [\"@test initializers require proper 'name' and 'initialize' properties\"]() {\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({\n name: 'initializer'\n });\n });\n });\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.initializer({\n initialize() {}\n\n });\n });\n });\n }\n\n ['@test initializers are passed an Engine'](assert) {\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.initializer({\n name: 'initializer',\n\n initialize(engine) {\n assert.ok(engine instanceof _engine.default, 'initialize is passed an Engine');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n }\n\n ['@test initializers can be registered in a specified order'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.initializer({\n name: 'fourth',\n after: 'third',\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: 'third',\n\n initialize() {\n order.push('second');\n }\n\n });\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyEngine.initializer({\n name: 'first',\n before: 'second',\n\n initialize() {\n order.push('first');\n }\n\n });\n MyEngine.initializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyEngine.initializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n ['@test initializers can be registered in a specified order as an array'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.initializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyEngine.initializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n\n initialize() {\n order.push('second');\n }\n\n });\n MyEngine.initializer({\n name: 'fourth',\n after: ['second', 'third'],\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyEngine.initializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyEngine.initializer({\n name: 'first',\n before: ['second'],\n\n initialize() {\n order.push('first');\n }\n\n });\n MyEngine.initializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n }\n\n ['@test initializers can have multiple dependencies'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n var a = {\n name: 'a',\n before: 'b',\n\n initialize() {\n order.push('a');\n }\n\n };\n var b = {\n name: 'b',\n\n initialize() {\n order.push('b');\n }\n\n };\n var c = {\n name: 'c',\n after: 'b',\n\n initialize() {\n order.push('c');\n }\n\n };\n var afterB = {\n name: 'after b',\n after: 'b',\n\n initialize() {\n order.push('after b');\n }\n\n };\n var afterC = {\n name: 'after c',\n after: 'c',\n\n initialize() {\n order.push('after c');\n }\n\n };\n MyEngine.initializer(b);\n MyEngine.initializer(a);\n MyEngine.initializer(afterC);\n MyEngine.initializer(afterB);\n MyEngine.initializer(c);\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n }\n\n ['@test initializers set on Engine subclasses are not shared between engines'](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n FirstEngine.initializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n\n var SecondEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n SecondEngine.initializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n var firstEngine = FirstEngine.create();\n var firstEngineInstance = firstEngine.buildInstance();\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n var secondEngine = SecondEngine.create();\n var secondEngineInstance = secondEngine.buildInstance();\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n FirstEngine.initializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n var SecondEngine = FirstEngine.extend();\n SecondEngine.initializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n var firstEngine = FirstEngine.create();\n var firstEngineInstance = firstEngine.buildInstance();\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'second initializer was not run when first base class created');\n firstInitializerRunCount = 0;\n var secondEngine = SecondEngine.create();\n var secondEngineInstance = secondEngine.buildInstance();\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n (0, _runloop.run)(function () {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n firstEngine.destroy();\n secondEngine.destroy();\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n FirstEngine.initializer({\n name: 'abc',\n\n initialize() {}\n\n });\n expectAssertion(function () {\n FirstEngine.initializer({\n name: 'abc',\n\n initialize() {}\n\n });\n });\n\n var SecondEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n SecondEngine.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n assert.ok(true, 'Two engines can have initializers named the same.');\n }\n\n ['@test initializers are executed in their own context'](assert) {\n assert.expect(1);\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.initializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = myEngine.buildInstance();\n }\n\n });\n});","define(\"@ember/engine/tests/engine_instance_initializers_test\", [\"@ember/runloop\", \"@ember/engine\", \"@ember/engine/instance\", \"internal-test-helpers\"], function (_runloop, _engine, _instance, _internalTestHelpers) {\n \"use strict\";\n\n var MyEngine, myEngine, myEngineInstance;\n\n function buildEngineInstance(EngineClass) {\n var engineInstance = EngineClass.buildInstance();\n (0, _engine.setEngineParent)(engineInstance, {\n lookup() {\n return {};\n },\n\n resolveRegistration() {\n return {};\n }\n\n });\n return engineInstance;\n }\n\n (0, _internalTestHelpers.moduleFor)('Engine instance initializers', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n super.teardown();\n (0, _runloop.run)(() => {\n if (myEngineInstance) {\n myEngineInstance.destroy();\n }\n\n if (myEngine) {\n myEngine.destroy();\n }\n });\n MyEngine = myEngine = myEngineInstance = undefined;\n }\n\n [\"@test initializers require proper 'name' and 'initialize' properties\"]() {\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({\n name: 'initializer'\n });\n });\n });\n expectAssertion(() => {\n (0, _runloop.run)(() => {\n MyEngine.instanceInitializer({\n initialize() {}\n\n });\n });\n });\n }\n\n ['@test initializers are passed an engine instance'](assert) {\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.instanceInitializer({\n name: 'initializer',\n\n initialize(instance) {\n assert.ok(instance instanceof _instance.default, 'initialize is passed an engine instance');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot();\n }\n\n ['@test initializers can be registered in a specified order'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: 'third',\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: 'third',\n\n initialize() {\n order.push('second');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'first',\n before: 'second',\n\n initialize() {\n order.push('first');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot().then(() => {\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n });\n }\n\n ['@test initializers can be registered in a specified order as an array'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n MyEngine.instanceInitializer({\n name: 'third',\n\n initialize() {\n order.push('third');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'second',\n after: 'first',\n before: ['third', 'fourth'],\n\n initialize() {\n order.push('second');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'fourth',\n after: ['second', 'third'],\n\n initialize() {\n order.push('fourth');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'fifth',\n after: 'fourth',\n before: 'sixth',\n\n initialize() {\n order.push('fifth');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'first',\n before: ['second'],\n\n initialize() {\n order.push('first');\n }\n\n });\n MyEngine.instanceInitializer({\n name: 'sixth',\n\n initialize() {\n order.push('sixth');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot().then(() => {\n assert.deepEqual(order, ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']);\n });\n }\n\n ['@test initializers can have multiple dependencies'](assert) {\n var order = [];\n MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n var a = {\n name: 'a',\n before: 'b',\n\n initialize() {\n order.push('a');\n }\n\n };\n var b = {\n name: 'b',\n\n initialize() {\n order.push('b');\n }\n\n };\n var c = {\n name: 'c',\n after: 'b',\n\n initialize() {\n order.push('c');\n }\n\n };\n var afterB = {\n name: 'after b',\n after: 'b',\n\n initialize() {\n order.push('after b');\n }\n\n };\n var afterC = {\n name: 'after c',\n after: 'c',\n\n initialize() {\n order.push('after c');\n }\n\n };\n MyEngine.instanceInitializer(b);\n MyEngine.instanceInitializer(a);\n MyEngine.instanceInitializer(afterC);\n MyEngine.instanceInitializer(afterB);\n MyEngine.instanceInitializer(c);\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot().then(() => {\n assert.ok(order.indexOf(a.name) < order.indexOf(b.name), 'a < b');\n assert.ok(order.indexOf(b.name) < order.indexOf(c.name), 'b < c');\n assert.ok(order.indexOf(b.name) < order.indexOf(afterB.name), 'b < afterB');\n assert.ok(order.indexOf(c.name) < order.indexOf(afterC.name), 'c < afterC');\n });\n }\n\n ['@test initializers set on Engine subclasses should not be shared between engines'](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n var firstEngine, firstEngineInstance;\n FirstEngine.instanceInitializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n\n var SecondEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n var secondEngine, secondEngineInstance;\n SecondEngine.instanceInitializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n firstEngine = FirstEngine.create();\n firstEngineInstance = buildEngineInstance(firstEngine);\n return firstEngineInstance.boot().then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run');\n assert.equal(secondInitializerRunCount, 0, 'first initializer only was run');\n secondEngine = SecondEngine.create();\n secondEngineInstance = buildEngineInstance(secondEngine);\n return secondEngineInstance.boot();\n }).then(() => {\n assert.equal(firstInitializerRunCount, 1, 'second initializer only was run');\n assert.equal(secondInitializerRunCount, 1, 'second initializer only was run');\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are concatenated'](assert) {\n var firstInitializerRunCount = 0;\n var secondInitializerRunCount = 0;\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n FirstEngine.instanceInitializer({\n name: 'first',\n\n initialize() {\n firstInitializerRunCount++;\n }\n\n });\n var SecondEngine = FirstEngine.extend();\n SecondEngine.instanceInitializer({\n name: 'second',\n\n initialize() {\n secondInitializerRunCount++;\n }\n\n });\n var firstEngine = FirstEngine.create();\n var firstEngineInstance = buildEngineInstance(firstEngine);\n var secondEngine, secondEngineInstance;\n return firstEngineInstance.boot().then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer only was run when base class created');\n assert.equal(secondInitializerRunCount, 0, 'second initializer was not run when first base class created');\n firstInitializerRunCount = 0;\n secondEngine = SecondEngine.create();\n secondEngineInstance = buildEngineInstance(secondEngine);\n return secondEngineInstance.boot();\n }).then(() => {\n assert.equal(firstInitializerRunCount, 1, 'first initializer was run when subclass created');\n assert.equal(secondInitializerRunCount, 1, 'second initializers was run when subclass created');\n (0, _runloop.run)(() => {\n firstEngineInstance.destroy();\n secondEngineInstance.destroy();\n firstEngine.destroy();\n secondEngine.destroy();\n });\n });\n }\n\n ['@test initializers are per-engine'](assert) {\n assert.expect(2);\n\n var FirstEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n FirstEngine.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n expectAssertion(() => {\n FirstEngine.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n });\n\n var SecondEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n SecondEngine.instanceInitializer({\n name: 'abc',\n\n initialize() {}\n\n });\n assert.ok(true, 'Two engines can have initializers named the same.');\n }\n\n ['@test initializers are executed in their own context'](assert) {\n assert.expect(1);\n\n var MyEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n MyEngine.instanceInitializer({\n name: 'coolInitializer',\n myProperty: 'cool',\n\n initialize() {\n assert.equal(this.myProperty, 'cool', 'should have access to its own context');\n }\n\n });\n myEngine = MyEngine.create();\n myEngineInstance = buildEngineInstance(myEngine);\n return myEngineInstance.boot();\n }\n\n });\n});","define(\"@ember/engine/tests/engine_instance_test\", [\"@ember/engine\", \"@ember/engine/instance\", \"@ember/runloop\", \"internal-test-helpers\"], function (_engine, _instance, _runloop, _internalTestHelpers) {\n \"use strict\";\n\n var engine, engineInstance;\n (0, _internalTestHelpers.moduleFor)('EngineInstance', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n (0, _runloop.run)(() => {\n engine = _engine.default.create({\n router: null,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n });\n }\n\n teardown() {\n if (engineInstance) {\n (0, _runloop.run)(engineInstance, 'destroy');\n engineInstance = undefined;\n }\n\n if (engine) {\n (0, _runloop.run)(engine, 'destroy');\n engine = undefined;\n }\n }\n\n ['@test an engine instance can be created based upon a base engine'](assert) {\n (0, _runloop.run)(() => {\n engineInstance = _instance.default.create({\n base: engine\n });\n });\n assert.ok(engineInstance, 'instance should be created');\n assert.equal(engineInstance.base, engine, 'base should be set to engine');\n }\n\n ['@test unregistering a factory clears all cached instances of that factory'](assert) {\n assert.expect(3);\n engineInstance = (0, _runloop.run)(() => _instance.default.create({\n base: engine\n }));\n var PostComponent = (0, _internalTestHelpers.factory)();\n engineInstance.register('component:post', PostComponent);\n var postComponent1 = engineInstance.lookup('component:post');\n assert.ok(postComponent1, 'lookup creates instance');\n engineInstance.unregister('component:post');\n engineInstance.register('component:post', PostComponent);\n var postComponent2 = engineInstance.lookup('component:post');\n assert.ok(postComponent2, 'lookup creates instance');\n assert.notStrictEqual(postComponent1, postComponent2, 'lookup creates a brand new instance because previous one was reset');\n }\n\n ['@test can be booted when its parent has been set'](assert) {\n assert.expect(3);\n engineInstance = (0, _runloop.run)(() => _instance.default.create({\n base: engine\n }));\n expectAssertion(() => {\n engineInstance._bootSync();\n }, \"An engine instance's parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.\");\n (0, _engine.setEngineParent)(engineInstance, {}); // Stub `cloneParentDependencies`, the internals of which are tested along\n // with application instances.\n\n engineInstance.cloneParentDependencies = function () {\n assert.ok(true, 'parent dependencies are cloned');\n };\n\n return engineInstance.boot().then(() => {\n assert.ok(true, 'boot successful');\n });\n }\n\n ['@test can build a child instance of a registered engine'](assert) {\n var ChatEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n var chatEngineInstance;\n engine.register('engine:chat', ChatEngine);\n (0, _runloop.run)(() => {\n engineInstance = _instance.default.create({\n base: engine\n }); // Try to build an unregistered engine.\n\n assert.throws(() => {\n engineInstance.buildChildEngineInstance('fake');\n }, `You attempted to mount the engine 'fake', but it is not registered with its parent.`); // Build the `chat` engine, registered above.\n\n chatEngineInstance = engineInstance.buildChildEngineInstance('chat');\n });\n assert.ok(chatEngineInstance, 'child engine instance successfully created');\n assert.strictEqual((0, _engine.getEngineParent)(chatEngineInstance), engineInstance, 'child engine instance is assigned the correct parent');\n }\n\n });\n});","define(\"@ember/engine/tests/engine_parent_test\", [\"@ember/engine\", \"internal-test-helpers\"], function (_engine, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('EngineParent', class extends _internalTestHelpers.AbstractTestCase {\n [\"@test An engine's parent can be set with `setEngineParent` and retrieved with `getEngineParent`\"](assert) {\n var engine = {};\n var parent = {};\n assert.strictEqual((0, _engine.getEngineParent)(engine), undefined, 'parent has not been set');\n (0, _engine.setEngineParent)(engine, parent);\n assert.strictEqual((0, _engine.getEngineParent)(engine), parent, 'parent has been set');\n }\n\n });\n});","define(\"@ember/engine/tests/engine_test\", [\"@ember/-internals/environment\", \"@ember/runloop\", \"@ember/engine\", \"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/-internals/utils\", \"internal-test-helpers\"], function (_environment, _runloop, _engine, _runtime, _metal, _utils, _internalTestHelpers) {\n \"use strict\";\n\n var engine;\n var originalLookup = _environment.context.lookup;\n (0, _internalTestHelpers.moduleFor)('Engine', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n (0, _runloop.run)(() => {\n engine = _engine.default.create({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n _environment.context.lookup = {\n TestEngine: engine\n };\n });\n }\n\n teardown() {\n _environment.context.lookup = originalLookup;\n\n if (engine) {\n (0, _runloop.run)(engine, 'destroy');\n engine = null;\n }\n }\n\n ['@test acts like a namespace'](assert) {\n engine.Foo = _runtime.Object.extend();\n (0, _metal.processAllNamespaces)();\n assert.equal((0, _utils.getName)(engine.Foo), 'TestEngine.Foo', 'Classes pick up their parent namespace');\n }\n\n ['@test builds a registry'](assert) {\n assert.strictEqual(engine.resolveRegistration('application:main'), engine, `application:main is registered`);\n assert.deepEqual(engine.registeredOptionsForType('component'), {\n singleton: false\n }, `optionsForType 'component'`);\n assert.deepEqual(engine.registeredOptionsForType('view'), {\n singleton: false\n }, `optionsForType 'view'`);\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'controller:basic');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:link-to');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component:textarea');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'service:-routing'); // DEBUGGING\n\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'resolver-for-debugging:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'container-debug-adapter:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'component-lookup:main');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'view:-outlet');\n (0, _internalTestHelpers.verifyRegistration)(assert, engine, 'template:-outlet');\n assert.deepEqual(engine.registeredOptionsForType('helper'), {\n instantiate: false\n }, `optionsForType 'helper'`);\n }\n\n });\n});","define(\"@ember/error/tests/index_test\", [\"@ember/error\", \"internal-test-helpers\"], function (_error, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember Error Throwing', class extends _internalTestHelpers.AbstractTestCase {\n ['@test new EmberError displays provided message'](assert) {\n assert.throws(() => {\n throw new _error.default('A Message');\n }, function (e) {\n return e.message === 'A Message';\n }, 'the assigned message was displayed');\n }\n\n });\n});","define(\"@ember/instrumentation/tests/index-test\", [\"@ember/instrumentation\", \"internal-test-helpers\"], function (_instrumentation, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Ember Instrumentation', class extends _internalTestHelpers.AbstractTestCase {\n afterEach() {\n (0, _instrumentation.reset)();\n }\n\n ['@test execute block even if no listeners'](assert) {\n var result = (0, _instrumentation.instrument)('render', {}, function () {\n return 'hello';\n });\n assert.equal(result, 'hello', 'called block');\n }\n\n ['@test subscribing to a simple path receives the listener'](assert) {\n assert.expect(12);\n var sentPayload = {};\n var count = 0;\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n if (count === 0) {\n assert.strictEqual(name, 'render');\n } else {\n assert.strictEqual(name, 'render.handlebars');\n }\n\n assert.ok(typeof timestamp === 'number');\n assert.strictEqual(payload, sentPayload);\n },\n\n after(name, timestamp, payload) {\n if (count === 0) {\n assert.strictEqual(name, 'render');\n } else {\n assert.strictEqual(name, 'render.handlebars');\n }\n\n assert.ok(typeof timestamp === 'number');\n assert.strictEqual(payload, sentPayload);\n count++;\n }\n\n });\n (0, _instrumentation.instrument)('render', sentPayload, function () {});\n (0, _instrumentation.instrument)('render.handlebars', sentPayload, function () {});\n }\n\n ['@test returning a value from the before callback passes it to the after callback'](assert) {\n assert.expect(2);\n var passthru1 = {};\n var passthru2 = {};\n (0, _instrumentation.subscribe)('render', {\n before() {\n return passthru1;\n },\n\n after(name, timestamp, payload, beforeValue) {\n assert.strictEqual(beforeValue, passthru1);\n }\n\n });\n (0, _instrumentation.subscribe)('render', {\n before() {\n return passthru2;\n },\n\n after(name, timestamp, payload, beforeValue) {\n assert.strictEqual(beforeValue, passthru2);\n }\n\n });\n (0, _instrumentation.instrument)('render', null, function () {});\n }\n\n ['@test instrument with 2 args (name, callback) no payload'](assert) {\n assert.expect(1);\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\n },\n\n after() {}\n\n });\n (0, _instrumentation.instrument)('render', function () {});\n }\n\n ['@test instrument with 3 args (name, callback, binding) no payload'](assert) {\n assert.expect(2);\n var binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, {});\n },\n\n after() {}\n\n });\n (0, _instrumentation.instrument)('render', function () {\n assert.deepEqual(this, binding);\n }, binding);\n }\n\n ['@test instrument with 3 args (name, payload, callback) with payload'](assert) {\n assert.expect(1);\n var expectedPayload = {\n hi: 1\n };\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\n },\n\n after() {}\n\n });\n (0, _instrumentation.instrument)('render', expectedPayload, function () {});\n }\n\n ['@test instrument with 4 args (name, payload, callback, binding) with payload'](assert) {\n assert.expect(2);\n var expectedPayload = {\n hi: 1\n };\n var binding = {};\n (0, _instrumentation.subscribe)('render', {\n before(name, timestamp, payload) {\n assert.deepEqual(payload, expectedPayload);\n },\n\n after() {}\n\n });\n (0, _instrumentation.instrument)('render', expectedPayload, function () {\n assert.deepEqual(this, binding);\n }, binding);\n }\n\n ['@test raising an exception in the instrumentation attaches it to the payload'](assert) {\n assert.expect(3);\n var error = new Error('Instrumentation');\n (0, _instrumentation.subscribe)('render', {\n before() {},\n\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n\n });\n (0, _instrumentation.subscribe)('render', {\n before() {},\n\n after(name, timestamp, payload) {\n assert.strictEqual(payload.exception, error);\n }\n\n });\n assert.throws(() => (0, _instrumentation.instrument)('render.handlebars', null, () => {\n throw error;\n }), /Instrumentation/);\n }\n\n ['@test it is possible to add a new subscriber after the first instrument'](assert) {\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n (0, _instrumentation.subscribe)('render', {\n before() {\n assert.ok(true, 'Before callback was called');\n },\n\n after() {\n assert.ok(true, 'After callback was called');\n }\n\n });\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n }\n\n ['@test it is possible to remove a subscriber'](assert) {\n assert.expect(4);\n var count = 0;\n var subscriber = (0, _instrumentation.subscribe)('render', {\n before() {\n assert.equal(count, 0);\n assert.ok(true, 'Before callback was called');\n },\n\n after() {\n assert.equal(count, 0);\n assert.ok(true, 'After callback was called');\n count++;\n }\n\n });\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n (0, _instrumentation.unsubscribe)(subscriber);\n (0, _instrumentation.instrument)('render.handlebars', null, function () {});\n }\n\n });\n});","define(\"@ember/object/tests/action_test\", [\"@ember/-internals/glimmer\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/object/index\"], function (_glimmer, _runtime, _internalTestHelpers, _index) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n (0, _internalTestHelpers.moduleFor)('@action decorator', class extends _internalTestHelpers.RenderingTestCase {\n '@test action decorator works with ES6 class'(assert) {\n var _class;\n\n var FooComponent = (_class = class FooComponent extends _glimmer.Component {\n foo() {\n assert.ok(true, 'called!');\n }\n\n }, _applyDecoratedDescriptor(_class.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class.prototype, \"foo\"), _class.prototype), _class);\n this.registerComponent('foo-bar', {\n ComponentClass: FooComponent,\n template: \"Click Me! \"\n });\n this.render('{{foo-bar}}');\n this.$('button').click();\n }\n\n '@test action decorator does not add actions to superclass'(assert) {\n var _class2, _class3;\n\n var Foo = (_class2 = class Foo extends _runtime.Object {\n foo() {// Do nothing\n }\n\n }, _applyDecoratedDescriptor(_class2.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class2.prototype, \"foo\"), _class2.prototype), _class2);\n var Bar = (_class3 = class Bar extends Foo {\n bar() {\n assert.ok(false, 'called');\n }\n\n }, _applyDecoratedDescriptor(_class3.prototype, \"bar\", [_index.action], Object.getOwnPropertyDescriptor(_class3.prototype, \"bar\"), _class3.prototype), _class3);\n var foo = Foo.create();\n var bar = Bar.create();\n assert.equal(typeof foo.actions.foo, 'function', 'foo has foo action');\n assert.equal(typeof foo.actions.bar, 'undefined', 'foo does not have bar action');\n assert.equal(typeof bar.actions.foo, 'function', 'bar has foo action');\n assert.equal(typeof bar.actions.bar, 'function', 'bar has bar action');\n }\n\n '@test actions are properly merged through traditional and ES6 prototype hierarchy'(assert) {\n var _class4, _class5;\n\n assert.expect(4);\n\n var FooComponent = _glimmer.Component.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo called!');\n }\n\n }\n });\n\n var BarComponent = (_class4 = class BarComponent extends FooComponent {\n bar() {\n assert.ok(true, 'bar called!');\n }\n\n }, _applyDecoratedDescriptor(_class4.prototype, \"bar\", [_index.action], Object.getOwnPropertyDescriptor(_class4.prototype, \"bar\"), _class4.prototype), _class4);\n var BazComponent = BarComponent.extend({\n actions: {\n baz() {\n assert.ok(true, 'baz called!');\n }\n\n }\n });\n var QuxComponent = (_class5 = class QuxComponent extends BazComponent {\n qux() {\n assert.ok(true, 'qux called!');\n }\n\n }, _applyDecoratedDescriptor(_class5.prototype, \"qux\", [_index.action], Object.getOwnPropertyDescriptor(_class5.prototype, \"qux\"), _class5.prototype), _class5);\n this.registerComponent('qux-component', {\n ComponentClass: QuxComponent,\n template: (0, _internalTestHelpers.strip)`\n Click Foo! \n Click Bar! \n Click Baz! \n Click Qux! \n `\n });\n this.render('{{qux-component}}');\n this.$('button').click();\n }\n\n '@test action decorator super works with native class methods'(assert) {\n var _class6;\n\n class FooComponent extends _glimmer.Component {\n foo() {\n assert.ok(true, 'called!');\n }\n\n }\n\n var BarComponent = (_class6 = class BarComponent extends FooComponent {\n foo() {\n super.foo();\n }\n\n }, _applyDecoratedDescriptor(_class6.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class6.prototype, \"foo\"), _class6.prototype), _class6);\n this.registerComponent('bar-bar', {\n ComponentClass: BarComponent,\n template: \"Click Me! \"\n });\n this.render('{{bar-bar}}');\n this.$('button').click();\n }\n\n '@test action decorator super works with traditional class methods'(assert) {\n var _class7;\n\n var FooComponent = _glimmer.Component.extend({\n foo() {\n assert.ok(true, 'called!');\n }\n\n });\n\n var BarComponent = (_class7 = class BarComponent extends FooComponent {\n foo() {\n super.foo();\n }\n\n }, _applyDecoratedDescriptor(_class7.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class7.prototype, \"foo\"), _class7.prototype), _class7);\n this.registerComponent('bar-bar', {\n ComponentClass: BarComponent,\n template: \"Click Me! \"\n });\n this.render('{{bar-bar}}');\n this.$('button').click();\n } // This test fails with _classes_ compiled in loose mode\n\n\n '@skip action decorator works with parent native class actions'(assert) {\n var _class8, _class9;\n\n var FooComponent = (_class8 = class FooComponent extends _glimmer.Component {\n foo() {\n assert.ok(true, 'called!');\n }\n\n }, _applyDecoratedDescriptor(_class8.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class8.prototype, \"foo\"), _class8.prototype), _class8);\n var BarComponent = (_class9 = class BarComponent extends FooComponent {\n foo() {\n super.foo();\n }\n\n }, _applyDecoratedDescriptor(_class9.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class9.prototype, \"foo\"), _class9.prototype), _class9);\n this.registerComponent('bar-bar', {\n ComponentClass: BarComponent,\n template: \"Click Me! \"\n });\n this.render('{{bar-bar}}');\n this.$('button').click();\n }\n\n '@test action decorator binds functions'(assert) {\n var _class10;\n\n var FooComponent = (_class10 = class FooComponent extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n this.bar = 'some value';\n }\n\n foo() {\n assert.equal(this.bar, 'some value', 'context bound correctly');\n }\n\n }, _applyDecoratedDescriptor(_class10.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class10.prototype, \"foo\"), _class10.prototype), _class10);\n this.registerComponent('foo-bar', {\n ComponentClass: FooComponent,\n template: 'Click Me! '\n });\n this.render('{{foo-bar}}');\n this.$('button').click();\n } // This test fails with _classes_ compiled in loose mode\n\n\n '@skip action decorator super works correctly when bound'(assert) {\n var _class12, _class14;\n\n var FooComponent = (_class12 = class FooComponent extends _glimmer.Component {\n constructor(...args) {\n super(...args);\n this.bar = 'some value';\n }\n\n foo() {\n assert.equal(this.bar, 'some value', 'context bound correctly');\n }\n\n }, _applyDecoratedDescriptor(_class12.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class12.prototype, \"foo\"), _class12.prototype), _class12);\n var BarComponent = (_class14 = class BarComponent extends FooComponent {\n foo() {\n super.foo();\n }\n\n }, _applyDecoratedDescriptor(_class14.prototype, \"foo\", [_index.action], Object.getOwnPropertyDescriptor(_class14.prototype, \"foo\"), _class14.prototype), _class14);\n this.registerComponent('bar-bar', {\n ComponentClass: BarComponent,\n template: 'Click Me! '\n });\n this.render('{{bar-bar}}');\n this.$('button').click();\n }\n\n '@test action decorator throws an error if applied to non-methods'() {\n expectAssertion(() => {\n var _class15, _descriptor;\n\n var TestObject = (_class15 = class TestObject extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class15.prototype, \"foo\", [_index.action], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'bar';\n }\n }), _class15);\n new TestObject();\n }, /The @action decorator must be applied to methods/);\n }\n\n '@test action decorator throws an error if passed a function in native classes'() {\n expectAssertion(() => {\n var _dec, _class17, _descriptor2;\n\n var TestObject = (_dec = (0, _index.action)(function () {}), (_class17 = class TestObject extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"foo\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class17.prototype, \"foo\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'bar';\n }\n }), _class17));\n new TestObject();\n }, /The @action decorator may only be passed a method when used in classic classes/);\n }\n\n '@test action decorator can be used as a classic decorator with strings'(assert) {\n var FooComponent = _glimmer.Component.extend({\n foo: (0, _index.action)(function () {\n assert.ok(true, 'called!');\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooComponent,\n template: \"Click Me! \"\n });\n this.render('{{foo-bar}}');\n this.$('button').click();\n }\n\n '@test action decorator can be used as a classic decorator directly'(assert) {\n var FooComponent = _glimmer.Component.extend({\n foo: (0, _index.action)(function () {\n assert.ok(true, 'called!');\n })\n });\n\n this.registerComponent('foo-bar', {\n ComponentClass: FooComponent,\n template: 'Click Me! '\n });\n this.render('{{foo-bar}}');\n this.$('button').click();\n }\n\n });\n});","define(\"@ember/object/tests/computed/computed_macros_test\", [\"@ember/-internals/metal\", \"@ember/object/computed\", \"@ember/-internals/runtime\", \"internal-test-helpers\"], function (_metal, _computed, _runtime, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('CP macros', class extends _internalTestHelpers.AbstractTestCase {\n ['@test empty part 1/2'](assert) {\n var obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n bestLannisterUnspecified: (0, _computed.empty)('bestLannister'),\n noLannistersKnown: (0, _computed.empty)('lannisters')\n }).create({\n lannisters: (0, _runtime.A)()\n });\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterUnspecified'), true, 'bestLannister initially empty');\n assert.equal((0, _metal.get)(obj, 'noLannistersKnown'), true, 'lannisters initially empty');\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n assert.equal((0, _metal.get)(obj, 'bestLannisterUnspecified'), false, 'empty respects strings');\n assert.equal((0, _metal.get)(obj, 'noLannistersKnown'), false, 'empty respects array mutations');\n }\n\n ['@test notEmpty part 1/2'](assert) {\n var obj = _runtime.Object.extend({\n bestLannister: null,\n lannisters: null,\n bestLannisterSpecified: (0, _computed.notEmpty)('bestLannister'),\n LannistersKnown: (0, _computed.notEmpty)('lannisters')\n }).create({\n lannisters: (0, _runtime.A)()\n });\n\n assert.equal((0, _metal.get)(obj, 'bestLannisterSpecified'), false, 'bestLannister initially empty');\n assert.equal((0, _metal.get)(obj, 'LannistersKnown'), false, 'lannisters initially empty');\n (0, _metal.get)(obj, 'lannisters').pushObject('Tyrion');\n (0, _metal.set)(obj, 'bestLannister', 'Tyrion');\n assert.equal((0, _metal.get)(obj, 'bestLannisterSpecified'), true, 'empty respects strings');\n assert.equal((0, _metal.get)(obj, 'LannistersKnown'), true, 'empty respects array mutations');\n }\n\n ['@test not'](assert) {\n var obj = {\n foo: true\n };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n obj = {\n foo: {\n bar: true\n }\n };\n (0, _metal.defineProperty)(obj, 'notFoo', (0, _computed.not)('foo.bar'));\n assert.equal((0, _metal.get)(obj, 'notFoo'), false);\n }\n\n ['@test empty part 2/2'](assert) {\n var obj = {\n foo: [],\n bar: undefined,\n baz: null,\n quz: ''\n };\n (0, _metal.defineProperty)(obj, 'fooEmpty', (0, _computed.empty)('foo'));\n (0, _metal.defineProperty)(obj, 'barEmpty', (0, _computed.empty)('bar'));\n (0, _metal.defineProperty)(obj, 'bazEmpty', (0, _computed.empty)('baz'));\n (0, _metal.defineProperty)(obj, 'quzEmpty', (0, _computed.empty)('quz'));\n assert.equal((0, _metal.get)(obj, 'fooEmpty'), true);\n (0, _metal.set)(obj, 'foo', [1]);\n assert.equal((0, _metal.get)(obj, 'fooEmpty'), false);\n assert.equal((0, _metal.get)(obj, 'barEmpty'), true);\n assert.equal((0, _metal.get)(obj, 'bazEmpty'), true);\n assert.equal((0, _metal.get)(obj, 'quzEmpty'), true);\n (0, _metal.set)(obj, 'quz', 'asdf');\n assert.equal((0, _metal.get)(obj, 'quzEmpty'), false);\n }\n\n ['@test bool'](assert) {\n var obj = {\n foo() {},\n\n bar: 'asdf',\n baz: null,\n quz: false\n };\n (0, _metal.defineProperty)(obj, 'fooBool', (0, _computed.bool)('foo'));\n (0, _metal.defineProperty)(obj, 'barBool', (0, _computed.bool)('bar'));\n (0, _metal.defineProperty)(obj, 'bazBool', (0, _computed.bool)('baz'));\n (0, _metal.defineProperty)(obj, 'quzBool', (0, _computed.bool)('quz'));\n assert.equal((0, _metal.get)(obj, 'fooBool'), true);\n assert.equal((0, _metal.get)(obj, 'barBool'), true);\n assert.equal((0, _metal.get)(obj, 'bazBool'), false);\n assert.equal((0, _metal.get)(obj, 'quzBool'), false);\n }\n\n ['@test alias'](assert) {\n var obj = {\n bar: 'asdf',\n baz: null,\n quz: false\n };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\n (0, _metal.defineProperty)(obj, 'barAlias', (0, _metal.alias)('bar'));\n (0, _metal.defineProperty)(obj, 'bazAlias', (0, _metal.alias)('baz'));\n (0, _metal.defineProperty)(obj, 'quzAlias', (0, _metal.alias)('quz'));\n (0, _metal.defineProperty)(obj, 'bayAlias', (0, _metal.alias)('bay'));\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'asdf');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), null);\n assert.equal((0, _metal.get)(obj, 'quzAlias'), false);\n assert.equal((0, _metal.get)(obj, 'bayAlias'), 'apple');\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n (0, _metal.set)(obj, 'quzAlias', null);\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quzAlias'), null);\n assert.equal((0, _metal.get)(obj, 'bar'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'baz'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quz'), null);\n }\n\n ['@test alias set'](assert) {\n var obj = {};\n var constantValue = 'always `a`';\n (0, _metal.defineProperty)(obj, 'original', (0, _metal.computed)({\n get: function () {\n return constantValue;\n },\n set: function () {\n return constantValue;\n }\n }));\n (0, _metal.defineProperty)(obj, 'aliased', (0, _metal.alias)('original'));\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n (0, _metal.set)(obj, 'aliased', 'should not set to this value');\n assert.equal((0, _metal.get)(obj, 'original'), constantValue);\n assert.equal((0, _metal.get)(obj, 'aliased'), constantValue);\n }\n\n ['@test match'](assert) {\n var obj = {\n name: 'Paul'\n };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.match)('name', /Paul/));\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n (0, _metal.set)(obj, 'name', 'Pierre');\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test notEmpty part 2/2'](assert) {\n var obj = {\n items: [1]\n };\n (0, _metal.defineProperty)(obj, 'hasItems', (0, _computed.notEmpty)('items'));\n assert.equal((0, _metal.get)(obj, 'hasItems'), true, 'is not empty');\n (0, _metal.set)(obj, 'items', []);\n assert.equal((0, _metal.get)(obj, 'hasItems'), false, 'is empty');\n }\n\n ['@test equal'](assert) {\n var obj = {\n name: 'Paul'\n };\n (0, _metal.defineProperty)(obj, 'isPaul', (0, _computed.equal)('name', 'Paul'));\n assert.equal((0, _metal.get)(obj, 'isPaul'), true, 'is Paul');\n (0, _metal.set)(obj, 'name', 'Pierre');\n assert.equal((0, _metal.get)(obj, 'isPaul'), false, 'is not Paul anymore');\n }\n\n ['@test gt'](assert) {\n var obj = {\n number: 2\n };\n (0, _metal.defineProperty)(obj, 'isGreaterThenOne', (0, _computed.gt)('number', 1));\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), true, 'is gt');\n (0, _metal.set)(obj, 'number', 1);\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n (0, _metal.set)(obj, 'number', 0);\n assert.equal((0, _metal.get)(obj, 'isGreaterThenOne'), false, 'is not gt');\n }\n\n ['@test gte'](assert) {\n var obj = {\n number: 2\n };\n (0, _metal.defineProperty)(obj, 'isGreaterOrEqualThenOne', (0, _computed.gte)('number', 1));\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n (0, _metal.set)(obj, 'number', 1);\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), true, 'is gte');\n (0, _metal.set)(obj, 'number', 0);\n assert.equal((0, _metal.get)(obj, 'isGreaterOrEqualThenOne'), false, 'is not gte');\n }\n\n ['@test lt'](assert) {\n var obj = {\n number: 0\n };\n (0, _metal.defineProperty)(obj, 'isLesserThenOne', (0, _computed.lt)('number', 1));\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), true, 'is lt');\n (0, _metal.set)(obj, 'number', 1);\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n (0, _metal.set)(obj, 'number', 2);\n assert.equal((0, _metal.get)(obj, 'isLesserThenOne'), false, 'is not lt');\n }\n\n ['@test lte'](assert) {\n var obj = {\n number: 0\n };\n (0, _metal.defineProperty)(obj, 'isLesserOrEqualThenOne', (0, _computed.lte)('number', 1));\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n (0, _metal.set)(obj, 'number', 1);\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), true, 'is lte');\n (0, _metal.set)(obj, 'number', 2);\n assert.equal((0, _metal.get)(obj, 'isLesserOrEqualThenOne'), false, 'is not lte');\n }\n\n ['@test and, with two properties'](assert) {\n var obj = {\n one: true,\n two: true\n };\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two'));\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), true, 'one and two');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), false, 'one and not two');\n (0, _metal.set)(obj, 'one', null);\n (0, _metal.set)(obj, 'two', 'Yes');\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), null, 'returns falsy value as in &&');\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n assert.equal((0, _metal.get)(obj, 'oneAndTwo'), 2, 'returns truthy value as in &&');\n }\n\n ['@test and, with three properties'](assert) {\n var obj = {\n one: true,\n two: true,\n three: true\n };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('one', 'two', 'three'));\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test and, with expand properties'](assert) {\n var obj = {\n one: true,\n two: true,\n three: true\n };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.and)('{one,two,three}'));\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one and two and three');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one and not two and not three');\n (0, _metal.set)(obj, 'one', true);\n (0, _metal.set)(obj, 'two', 2);\n (0, _metal.set)(obj, 'three', 3);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 3, 'returns truthy value as in &&');\n }\n\n ['@test or, with two properties'](assert) {\n var obj = {\n one: true,\n two: true\n };\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two'));\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n (0, _metal.set)(obj, 'two', false);\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), false, 'nor one nor two');\n (0, _metal.set)(obj, 'two', null);\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), null, 'returns last falsy value as in ||');\n (0, _metal.set)(obj, 'two', true);\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), true, 'one or two');\n (0, _metal.set)(obj, 'one', 1);\n assert.equal((0, _metal.get)(obj, 'oneOrTwo'), 1, 'returns truthy value as in ||');\n }\n\n ['@test or, with three properties'](assert) {\n var obj = {\n one: true,\n two: true,\n three: true\n };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('one', 'two', 'three'));\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'two', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'three', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n (0, _metal.set)(obj, 'three', null);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n (0, _metal.set)(obj, 'two', true);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'one', 1);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test or, with expand properties'](assert) {\n var obj = {\n one: true,\n two: true,\n three: true\n };\n (0, _metal.defineProperty)(obj, 'oneTwoThree', (0, _computed.or)('{one,two,three}'));\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'one', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'two', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'three', false);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), false, 'one or two or three');\n (0, _metal.set)(obj, 'three', null);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), null, 'returns last falsy value as in ||');\n (0, _metal.set)(obj, 'two', true);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), true, 'one or two or three');\n (0, _metal.set)(obj, 'one', 1);\n assert.equal((0, _metal.get)(obj, 'oneTwoThree'), 1, 'returns truthy value as in ||');\n }\n\n ['@test or and and, warn about dependent keys with spaces']() {\n var obj = {\n one: true,\n two: true\n };\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneOrTwo', (0, _computed.or)('one', 'two three'));\n }, /Dependent keys passed to `or` computed macro can't have spaces\\./);\n expectAssertion(function () {\n (0, _metal.defineProperty)(obj, 'oneAndTwo', (0, _computed.and)('one', 'two three'));\n }, /Dependent keys passed to `and` computed macro can't have spaces\\./);\n }\n\n ['@test oneWay'](assert) {\n var obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.oneWay)('firstName'));\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n (0, _metal.set)(obj, 'nickName', 'TeddyBear');\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TeddyBear');\n }\n\n ['@test readOnly'](assert) {\n var obj = {\n firstName: 'Teddy',\n lastName: 'Zeenny'\n };\n (0, _metal.defineProperty)(obj, 'nickName', (0, _computed.readOnly)('firstName'));\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n assert.throws(function () {\n (0, _metal.set)(obj, 'nickName', 'TeddyBear');\n }, / /);\n assert.equal((0, _metal.get)(obj, 'firstName'), 'Teddy');\n assert.equal((0, _metal.get)(obj, 'lastName'), 'Zeenny');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'Teddy');\n (0, _metal.set)(obj, 'firstName', 'TEDDDDDDDDYYY');\n assert.equal((0, _metal.get)(obj, 'nickName'), 'TEDDDDDDDDYYY');\n }\n\n ['@test deprecatingAlias'](assert) {\n var obj = {\n bar: 'asdf',\n baz: null,\n quz: false\n };\n (0, _metal.defineProperty)(obj, 'bay', (0, _metal.computed)(function () {\n return 'apple';\n }));\n (0, _metal.defineProperty)(obj, 'barAlias', (0, _computed.deprecatingAlias)('bar', {\n id: 'bar-deprecation',\n until: 'some.version'\n }));\n (0, _metal.defineProperty)(obj, 'bazAlias', (0, _computed.deprecatingAlias)('baz', {\n id: 'baz-deprecation',\n until: 'some.version'\n }));\n (0, _metal.defineProperty)(obj, 'quzAlias', (0, _computed.deprecatingAlias)('quz', {\n id: 'quz-deprecation',\n until: 'some.version'\n }));\n (0, _metal.defineProperty)(obj, 'bayAlias', (0, _computed.deprecatingAlias)('bay', {\n id: 'bay-deprecation',\n until: 'some.version'\n }));\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'asdf');\n }, 'Usage of `barAlias` is deprecated, use `bar` instead.');\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bazAlias'), null);\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'quzAlias'), false);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n expectDeprecation(function () {\n assert.equal((0, _metal.get)(obj, 'bayAlias'), 'apple');\n }, 'Usage of `bayAlias` is deprecated, use `bay` instead.');\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'barAlias', 'newBar');\n }, 'Usage of `barAlias` is deprecated, use `bar` instead.');\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'bazAlias', 'newBaz');\n }, 'Usage of `bazAlias` is deprecated, use `baz` instead.');\n expectDeprecation(function () {\n (0, _metal.set)(obj, 'quzAlias', null);\n }, 'Usage of `quzAlias` is deprecated, use `quz` instead.');\n assert.equal((0, _metal.get)(obj, 'barAlias'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'bazAlias'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quzAlias'), null);\n assert.equal((0, _metal.get)(obj, 'bar'), 'newBar');\n assert.equal((0, _metal.get)(obj, 'baz'), 'newBaz');\n assert.equal((0, _metal.get)(obj, 'quz'), null);\n }\n\n });\n});","define(\"@ember/object/tests/computed/dependent-key-compat-test\", [\"@ember/-internals/runtime\", \"@ember/-internals/metal\", \"@ember/object/compat\", \"internal-test-helpers\"], function (_runtime, _metal, _compat, _internalTestHelpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('dependentKeyCompat', class extends _internalTestHelpers.AbstractTestCase {\n '@test it works with computed properties'(assert) {\n var _dec, _class, _descriptor, _descriptor2;\n\n var Person = (_dec = (0, _metal.computed)('givenName', 'lastName'), (_class = class Person {\n constructor() {\n _initializerDefineProperty(this, \"firstName\", _descriptor, this);\n\n _initializerDefineProperty(this, \"lastName\", _descriptor2, this);\n }\n\n get givenName() {\n return this.firstName;\n }\n\n get fullName() {\n return `${this.givenName} ${this.lastName}`;\n }\n\n }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"firstName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'Tom';\n }\n }), _descriptor2 = _applyDecoratedDescriptor(_class.prototype, \"lastName\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return 'Dale';\n }\n }), _applyDecoratedDescriptor(_class.prototype, \"givenName\", [_compat.dependentKeyCompat], Object.getOwnPropertyDescriptor(_class.prototype, \"givenName\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"fullName\", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, \"fullName\"), _class.prototype)), _class));\n var tom = new Person();\n assert.equal(tom.fullName, 'Tom Dale');\n tom.firstName = 'Thomas';\n assert.equal(tom.fullName, 'Thomas Dale');\n }\n\n '@test it works with classic classes'(assert) {\n var Person = _runtime.Object.extend({\n firstName: (0, _metal.tracked)({\n value: 'Tom'\n }),\n lastName: (0, _metal.tracked)({\n value: 'Dale'\n }),\n givenName: (0, _compat.dependentKeyCompat)({\n get() {\n return this.firstName;\n }\n\n }),\n fullName: (0, _metal.computed)('givenName', 'lastName', function () {\n return `${this.givenName} ${this.lastName}`;\n })\n });\n\n var tom = Person.create();\n assert.equal(tom.fullName, 'Tom Dale');\n tom.firstName = 'Thomas';\n assert.equal(tom.fullName, 'Thomas Dale');\n }\n\n async '@test it works with async observers'(assert) {\n var count = 0;\n\n var Person = _runtime.Object.extend({\n firstName: (0, _metal.tracked)({\n value: 'Tom'\n }),\n lastName: (0, _metal.tracked)({\n value: 'Dale'\n }),\n givenName: (0, _compat.dependentKeyCompat)({\n get() {\n return this.firstName;\n }\n\n }),\n givenNameObserver: (0, _metal.observer)({\n dependentKeys: ['givenName'],\n\n fn() {\n count++;\n },\n\n sync: false\n })\n });\n\n var tom = Person.create();\n assert.equal(count, 0); // check the alias, and bootstrap it\n\n assert.equal(tom.givenName, 'Tom', 'alias works');\n tom.firstName = 'Thomas';\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(count, 1);\n tom.destroy();\n }\n\n '@test it does not work with sync observers'(assert) {\n var count = 0;\n\n var Person = _runtime.Object.extend({\n firstName: (0, _metal.tracked)({\n value: 'Tom'\n }),\n lastName: (0, _metal.tracked)({\n value: 'Dale'\n }),\n givenName: (0, _compat.dependentKeyCompat)({\n get() {\n return this.firstName;\n }\n\n }),\n givenNameObserver: (0, _metal.observer)({\n dependentKeys: ['givenName'],\n\n fn() {\n count++;\n },\n\n sync: true\n })\n });\n\n var tom = Person.create();\n assert.equal(count, 0);\n tom.firstName = 'Thomas';\n assert.equal(count, 0);\n tom.destroy();\n }\n\n });\n});","define(\"@ember/object/tests/computed/macro_decorators_test\", [\"internal-test-helpers\", \"@ember/-internals/metal\", \"@ember/object/computed\"], function (_internalTestHelpers, _metal, _computed) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('computed macros - decorators - assertions', class extends _internalTestHelpers.AbstractTestCase {\n ['@test and throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class, _descriptor;\n\n var Foo = (_class = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"foo\", [_computed.and], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class);\n new Foo();\n }, /You attempted to use @and/);\n }\n\n ['@test alias throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class3, _descriptor2;\n\n var Foo = (_class3 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"foo\", [_metal.alias], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3);\n new Foo();\n }, /You attempted to use @alias/);\n }\n\n ['@test bool throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class5, _descriptor3;\n\n var Foo = (_class5 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor3, this);\n }\n\n }, _descriptor3 = _applyDecoratedDescriptor(_class5.prototype, \"foo\", [_computed.bool], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class5);\n new Foo();\n }, /You attempted to use @bool/);\n }\n\n ['@test collect throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class7, _descriptor4;\n\n var Foo = (_class7 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor4, this);\n }\n\n }, _descriptor4 = _applyDecoratedDescriptor(_class7.prototype, \"foo\", [_computed.collect], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class7);\n new Foo();\n }, /You attempted to use @collect/);\n }\n\n ['@test deprecatingAlias throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class9, _descriptor5;\n\n var Foo = (_class9 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor5, this);\n }\n\n }, _descriptor5 = _applyDecoratedDescriptor(_class9.prototype, \"foo\", [_computed.deprecatingAlias], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class9);\n new Foo();\n }, /You attempted to use @deprecatingAlias/);\n }\n\n ['@test empty throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class11, _descriptor6;\n\n var Foo = (_class11 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor6, this);\n }\n\n }, _descriptor6 = _applyDecoratedDescriptor(_class11.prototype, \"foo\", [_computed.empty], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class11);\n new Foo();\n }, /You attempted to use @empty/);\n }\n\n ['@test equal throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class13, _descriptor7;\n\n var Foo = (_class13 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor7, this);\n }\n\n }, _descriptor7 = _applyDecoratedDescriptor(_class13.prototype, \"foo\", [_computed.equal], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class13);\n new Foo();\n }, /You attempted to use @equal/);\n }\n\n ['@test filter throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class15, _descriptor8;\n\n var Foo = (_class15 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor8, this);\n }\n\n }, _descriptor8 = _applyDecoratedDescriptor(_class15.prototype, \"foo\", [_computed.filter], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class15);\n new Foo();\n }, /You attempted to use @filter/);\n }\n\n ['@test filterBy throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class17, _descriptor9;\n\n var Foo = (_class17 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor9, this);\n }\n\n }, _descriptor9 = _applyDecoratedDescriptor(_class17.prototype, \"foo\", [_computed.filterBy], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class17);\n new Foo();\n }, /You attempted to use @filterBy/);\n }\n\n ['@test gt throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class19, _descriptor10;\n\n var Foo = (_class19 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor10, this);\n }\n\n }, _descriptor10 = _applyDecoratedDescriptor(_class19.prototype, \"foo\", [_computed.gt], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class19);\n new Foo();\n }, /You attempted to use @gt/);\n }\n\n ['@test gte throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class21, _descriptor11;\n\n var Foo = (_class21 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor11, this);\n }\n\n }, _descriptor11 = _applyDecoratedDescriptor(_class21.prototype, \"foo\", [_computed.gte], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class21);\n new Foo();\n }, /You attempted to use @gte/);\n }\n\n ['@test intersect throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class23, _descriptor12;\n\n var Foo = (_class23 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor12, this);\n }\n\n }, _descriptor12 = _applyDecoratedDescriptor(_class23.prototype, \"foo\", [_computed.intersect], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class23);\n new Foo();\n }, /You attempted to use @intersect/);\n }\n\n ['@test lt throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class25, _descriptor13;\n\n var Foo = (_class25 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor13, this);\n }\n\n }, _descriptor13 = _applyDecoratedDescriptor(_class25.prototype, \"foo\", [_computed.lt], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class25);\n new Foo();\n }, /You attempted to use @lt/);\n }\n\n ['@test lte throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class27, _descriptor14;\n\n var Foo = (_class27 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor14, this);\n }\n\n }, _descriptor14 = _applyDecoratedDescriptor(_class27.prototype, \"foo\", [_computed.lte], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class27);\n new Foo();\n }, /You attempted to use @lte/);\n }\n\n ['@test map throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class29, _descriptor15;\n\n var Foo = (_class29 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor15, this);\n }\n\n }, _descriptor15 = _applyDecoratedDescriptor(_class29.prototype, \"foo\", [_computed.map], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class29);\n new Foo();\n }, /You attempted to use @map/);\n }\n\n ['@test mapBy throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class31, _descriptor16;\n\n var Foo = (_class31 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor16, this);\n }\n\n }, _descriptor16 = _applyDecoratedDescriptor(_class31.prototype, \"foo\", [_computed.mapBy], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class31);\n new Foo();\n }, /You attempted to use @mapBy/);\n }\n\n ['@test match throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class33, _descriptor17;\n\n var Foo = (_class33 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor17, this);\n }\n\n }, _descriptor17 = _applyDecoratedDescriptor(_class33.prototype, \"foo\", [_computed.match], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class33);\n new Foo();\n }, /You attempted to use @match/);\n }\n\n ['@test max throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class35, _descriptor18;\n\n var Foo = (_class35 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor18, this);\n }\n\n }, _descriptor18 = _applyDecoratedDescriptor(_class35.prototype, \"foo\", [_computed.max], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class35);\n new Foo();\n }, /You attempted to use @max/);\n }\n\n ['@test min throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class37, _descriptor19;\n\n var Foo = (_class37 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor19, this);\n }\n\n }, _descriptor19 = _applyDecoratedDescriptor(_class37.prototype, \"foo\", [_computed.min], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class37);\n new Foo();\n }, /You attempted to use @min/);\n }\n\n ['@test not throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class39, _descriptor20;\n\n var Foo = (_class39 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor20, this);\n }\n\n }, _descriptor20 = _applyDecoratedDescriptor(_class39.prototype, \"foo\", [_computed.not], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class39);\n new Foo();\n }, /You attempted to use @not/);\n }\n\n ['@test notEmpty throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class41, _descriptor21;\n\n var Foo = (_class41 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor21, this);\n }\n\n }, _descriptor21 = _applyDecoratedDescriptor(_class41.prototype, \"foo\", [_computed.notEmpty], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class41);\n new Foo();\n }, /You attempted to use @notEmpty/);\n }\n\n ['@test oneWay throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class43, _descriptor22;\n\n var Foo = (_class43 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor22, this);\n }\n\n }, _descriptor22 = _applyDecoratedDescriptor(_class43.prototype, \"foo\", [_computed.oneWay], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class43);\n new Foo();\n }, /You attempted to use @oneWay/);\n }\n\n ['@test or throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class45, _descriptor23;\n\n var Foo = (_class45 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor23, this);\n }\n\n }, _descriptor23 = _applyDecoratedDescriptor(_class45.prototype, \"foo\", [_computed.or], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class45);\n new Foo();\n }, /You attempted to use @or/);\n }\n\n ['@test readOnly throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class47, _descriptor24;\n\n var Foo = (_class47 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor24, this);\n }\n\n }, _descriptor24 = _applyDecoratedDescriptor(_class47.prototype, \"foo\", [_computed.readOnly], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class47);\n new Foo();\n }, /You attempted to use @readOnly/);\n }\n\n ['@test setDiff throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class49, _descriptor25;\n\n var Foo = (_class49 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor25, this);\n }\n\n }, _descriptor25 = _applyDecoratedDescriptor(_class49.prototype, \"foo\", [_computed.setDiff], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class49);\n new Foo();\n }, /You attempted to use @setDiff/);\n }\n\n ['@test sort throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class51, _descriptor26;\n\n var Foo = (_class51 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor26, this);\n }\n\n }, _descriptor26 = _applyDecoratedDescriptor(_class51.prototype, \"foo\", [_computed.sort], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class51);\n new Foo();\n }, /You attempted to use @sort/);\n }\n\n ['@test sum throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class53, _descriptor27;\n\n var Foo = (_class53 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor27, this);\n }\n\n }, _descriptor27 = _applyDecoratedDescriptor(_class53.prototype, \"foo\", [_computed.sum], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class53);\n new Foo();\n }, /You attempted to use @sum/);\n }\n\n ['@test union throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class55, _descriptor28;\n\n var Foo = (_class55 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor28, this);\n }\n\n }, _descriptor28 = _applyDecoratedDescriptor(_class55.prototype, \"foo\", [_computed.union], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class55);\n new Foo();\n }, /You attempted to use @uniq\\/@union/);\n }\n\n ['@test uniq throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class57, _descriptor29;\n\n var Foo = (_class57 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor29, this);\n }\n\n }, _descriptor29 = _applyDecoratedDescriptor(_class57.prototype, \"foo\", [_computed.uniq], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class57);\n new Foo();\n }, /You attempted to use @uniq\\/@union/);\n }\n\n ['@test uniqBy throws an error if used without parameters']() {\n expectAssertion(() => {\n var _class59, _descriptor30;\n\n var Foo = (_class59 = class Foo {\n constructor() {\n _initializerDefineProperty(this, \"foo\", _descriptor30, this);\n }\n\n }, _descriptor30 = _applyDecoratedDescriptor(_class59.prototype, \"foo\", [_computed.uniqBy], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class59);\n new Foo();\n }, /You attempted to use @uniqBy/);\n }\n\n });\n});","define(\"@ember/object/tests/computed/reduce_computed_macros_test\", [\"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/object/computed\", \"internal-test-helpers\"], function (_runloop, _metal, _runtime, _computed, _internalTestHelpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n var obj;\n (0, _internalTestHelpers.moduleFor)('map', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array.@each.v', item => item.v),\n mappedObjects: (0, _computed.map)('arrayObjects.@each.v', item => ({\n name: item.v.name\n }))\n }).create({\n arrayObjects: (0, _runtime.A)([{\n v: {\n name: 'Robert'\n }\n }, {\n v: {\n name: 'Leanna'\n }\n }]),\n array: (0, _runtime.A)([{\n v: 1\n }, {\n v: 3\n }, {\n v: 2\n }, {\n v: 1\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test map is readOnly'](assert) {\n assert.throws(function () {\n obj.set('mapped', 1);\n }, /Cannot set read-only property \"mapped\" on object:/);\n }\n\n ['@test it maps simple properties'](assert) {\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n obj.get('array').pushObject({\n v: 5\n });\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n (0, _runtime.removeAt)(obj.get('array'), 3);\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n ['@test it maps simple unshifted properties'](assert) {\n var array = (0, _runtime.A)();\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', item => item.toUpperCase())\n }).create({\n array\n });\n array.unshiftObject('c');\n array.unshiftObject('b');\n array.unshiftObject('a');\n array.popObject();\n assert.deepEqual(obj.get('mapped'), ['A', 'B'], 'properties unshifted in sequence are mapped correctly');\n }\n\n ['@test it has the correct `this`'](assert) {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', function (item) {\n assert.equal(this, obj, 'should have correct context');\n return this.upperCase(item);\n }),\n\n upperCase(string) {\n return string.toUpperCase();\n }\n\n }).create({\n array: ['a', 'b', 'c']\n });\n assert.deepEqual(obj.get('mapped'), ['A', 'B', 'C'], 'properties unshifted in sequence are mapped correctly');\n }\n\n ['@test it passes the index to the callback'](assert) {\n var array = ['a', 'b', 'c'];\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', (item, index) => index)\n }).create({\n array\n });\n assert.deepEqual(obj.get('mapped'), [0, 1, 2], 'index is passed to callback correctly');\n }\n\n ['@test it maps objects'](assert) {\n assert.deepEqual(obj.get('mappedObjects'), [{\n name: 'Robert'\n }, {\n name: 'Leanna'\n }]);\n obj.get('arrayObjects').pushObject({\n v: {\n name: 'Eddard'\n }\n });\n assert.deepEqual(obj.get('mappedObjects'), [{\n name: 'Robert'\n }, {\n name: 'Leanna'\n }, {\n name: 'Eddard'\n }]);\n (0, _runtime.removeAt)(obj.get('arrayObjects'), 1);\n assert.deepEqual(obj.get('mappedObjects'), [{\n name: 'Robert'\n }, {\n name: 'Eddard'\n }]);\n (0, _metal.set)(obj.get('arrayObjects')[0], 'v', {\n name: 'Stannis'\n });\n assert.deepEqual(obj.get('mappedObjects'), [{\n name: 'Stannis'\n }, {\n name: 'Eddard'\n }]);\n }\n\n ['@test it maps unshifted objects with property observers'](assert) {\n var array = (0, _runtime.A)();\n var cObj = {\n v: 'c'\n };\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array.@each.v', item => (0, _metal.get)(item, 'v').toUpperCase())\n }).create({\n array\n });\n array.unshiftObject(cObj);\n array.unshiftObject({\n v: 'b'\n });\n array.unshiftObject({\n v: 'a'\n });\n (0, _metal.set)(cObj, 'v', 'd');\n assert.deepEqual(array.mapBy('v'), ['a', 'b', 'd'], 'precond - unmapped array is correct');\n assert.deepEqual(obj.get('mapped'), ['A', 'B', 'D'], 'properties unshifted in sequence are mapped correctly');\n }\n\n ['@test it updates if additional dependent keys are modified'](assert) {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.map)('array', ['key'], function (item) {\n return item[this.key];\n })\n }).create({\n key: 'name',\n array: (0, _runtime.A)([{\n name: 'Cercei',\n house: 'Lannister'\n }])\n });\n assert.deepEqual(obj.get('mapped'), ['Cercei'], 'precond - mapped array is initially correct');\n obj.set('key', 'house');\n assert.deepEqual(obj.get('mapped'), ['Lannister'], 'mapped prop updates correctly when additional dependency is updated');\n }\n\n ['@test it throws on bad inputs']() {\n expectAssertion(() => {\n (0, _computed.map)('items.@each.{prop}', 'foo');\n }, /The final parameter provided to map must be a callback function/);\n expectAssertion(() => {\n (0, _computed.map)('items.@each.{prop}', 'foo', function () {});\n }, /The second parameter provided to map must either be the callback or an array of additional dependent keys/);\n expectAssertion(() => {\n (0, _computed.map)('items.@each.{prop}', function () {}, ['foo']);\n }, /The final parameter provided to map must be a callback function/);\n expectAssertion(() => {\n (0, _computed.map)('items.@each.{prop}', ['foo']);\n }, /The final parameter provided to map must be a callback function/);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('mapBy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n mapped: (0, _computed.mapBy)('array', 'v')\n }).create({\n array: (0, _runtime.A)([{\n v: 1\n }, {\n v: 3\n }, {\n v: 2\n }, {\n v: 1\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test mapBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('mapped', 1);\n }, /Cannot set read-only property \"mapped\" on object:/);\n }\n\n ['@test it maps properties'](assert) {\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n obj.get('array').pushObject({\n v: 5\n });\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1, 5]);\n (0, _runtime.removeAt)(obj.get('array'), 3);\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 5]);\n }\n\n async ['@test it is observable'](assert) {\n var calls = 0;\n assert.deepEqual(obj.get('mapped'), [1, 3, 2, 1]);\n (0, _metal.addObserver)(obj, 'mapped.@each', () => calls++);\n obj.get('array').pushObject({\n v: 5\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(calls, 1, 'mapBy is observable');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('filter', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', item => item % 2 === 0)\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7, 8])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filter is readOnly'](assert) {\n assert.throws(function () {\n obj.set('filtered', 1);\n }, /Cannot set read-only property \"filtered\" on object:/);\n }\n\n ['@test it filters according to the specified filter function'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'filter filters by the specified function');\n }\n\n ['@test it passes the index to the callback'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', (item, index) => index === 1)\n }).create({\n array: ['a', 'b', 'c']\n });\n assert.deepEqual((0, _metal.get)(obj, 'filtered'), ['b'], 'index is passed to callback correctly');\n }\n\n ['@test it has the correct `this`'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', function (item, index) {\n assert.equal(this, obj);\n return this.isOne(index);\n }),\n\n isOne(value) {\n return value === 1;\n }\n\n }).create({\n array: ['a', 'b', 'c']\n });\n assert.deepEqual((0, _metal.get)(obj, 'filtered'), ['b'], 'index is passed to callback correctly');\n }\n\n ['@test it passes the array to the callback'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', (item, index, array) => index === (0, _metal.get)(array, 'length') - 2)\n }).create({\n array: (0, _runtime.A)(['a', 'b', 'c'])\n });\n assert.deepEqual(obj.get('filtered'), ['b'], 'array is passed to callback correctly');\n }\n\n ['@test it caches properly'](assert) {\n var array = obj.get('array');\n var filtered = obj.get('filtered');\n assert.ok(filtered === obj.get('filtered'));\n array.addObject(11);\n var newFiltered = obj.get('filtered');\n assert.ok(filtered !== newFiltered);\n assert.ok(obj.get('filtered') === newFiltered);\n }\n\n ['@test it updates as the array is modified'](assert) {\n var array = obj.get('array');\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n array.addObject(11);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'objects not passing the filter are not added');\n array.addObject(12);\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8, 12], 'objects passing the filter are added');\n array.removeObject(3);\n array.removeObject(4);\n assert.deepEqual(obj.get('filtered'), [2, 6, 8, 12], 'objects removed from the dependent array are removed from the computed array');\n }\n\n ['@test the dependent array can be cleared one at a time'](assert) {\n var array = (0, _metal.get)(obj, 'array');\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct'); // clear 1-8 but in a random order\n\n array.removeObject(3);\n array.removeObject(1);\n array.removeObject(2);\n array.removeObject(4);\n array.removeObject(8);\n array.removeObject(6);\n array.removeObject(5);\n array.removeObject(7);\n assert.deepEqual(obj.get('filtered'), [], 'filtered array cleared correctly');\n }\n\n ['@test the dependent array can be `clear`ed directly (#3272)'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n obj.get('array').clear();\n assert.deepEqual(obj.get('filtered'), [], 'filtered array cleared correctly');\n }\n\n ['@test it updates as the array is replaced'](assert) {\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n obj.set('array', [20, 21, 22, 23, 24]);\n assert.deepEqual(obj.get('filtered'), [20, 22, 24], 'computed array is updated when array is changed');\n }\n\n ['@test it updates properly on @each with {} dependencies'](assert) {\n var item = _runtime.Object.create({\n prop: true\n });\n\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('items.@each.{prop}', function (item) {\n return item.get('prop') === true;\n })\n }).create({\n items: (0, _runtime.A)([item])\n });\n assert.deepEqual(obj.get('filtered'), [item]);\n item.set('prop', false);\n assert.deepEqual(obj.get('filtered'), []);\n }\n\n ['@test it updates if additional dependent keys are modified'](assert) {\n obj = _runtime.Object.extend({\n filtered: (0, _computed.filter)('array', ['modulo'], function (item) {\n return item % this.modulo === 0;\n })\n }).create({\n modulo: 2,\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7, 8])\n });\n assert.deepEqual(obj.get('filtered'), [2, 4, 6, 8], 'precond - filtered array is initially correct');\n obj.set('modulo', 3);\n assert.deepEqual(obj.get('filtered'), [3, 6], 'filtered prop updates correctly when additional dependency is updated');\n }\n\n ['@test it throws on bad inputs']() {\n expectAssertion(() => {\n (0, _computed.filter)('items.@each.{prop}', 'foo');\n }, /The final parameter provided to filter must be a callback function/);\n expectAssertion(() => {\n (0, _computed.filter)('items.@each.{prop}', 'foo', function () {});\n }, /The second parameter provided to filter must either be the callback or an array of additional dependent keys/);\n expectAssertion(() => {\n (0, _computed.filter)('items.@each.{prop}', function () {}, ['foo']);\n }, /The final parameter provided to filter must be a callback function/);\n expectAssertion(() => {\n (0, _computed.filter)('items.@each.{prop}', ['foo']);\n }, /The final parameter provided to filter must be a callback function/);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('filterBy', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n a1s: (0, _computed.filterBy)('array', 'a', 1),\n as: (0, _computed.filterBy)('array', 'a'),\n bs: (0, _computed.filterBy)('array', 'b')\n }).create({\n array: (0, _runtime.A)([{\n name: 'one',\n a: 1,\n b: false\n }, {\n name: 'two',\n a: 2,\n b: false\n }, {\n name: 'three',\n a: 1,\n b: true\n }, {\n name: 'four',\n b: true\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filterBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('as', 1);\n }, /Cannot set read-only property \"as\" on object:/);\n }\n\n ['@test properties can be filtered by truthiness'](assert) {\n assert.deepEqual(obj.get('as').mapBy('name'), ['one', 'two', 'three'], 'properties can be filtered by existence');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['three', 'four'], 'booleans can be filtered');\n (0, _metal.set)(obj.get('array')[0], 'a', undefined);\n (0, _metal.set)(obj.get('array')[3], 'a', true);\n (0, _metal.set)(obj.get('array')[0], 'b', true);\n (0, _metal.set)(obj.get('array')[3], 'b', false);\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four'], 'arrays computed by filter property respond to property changes');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three'], 'arrays computed by filtered property respond to property changes');\n obj.get('array').pushObject({\n name: 'five',\n a: 6,\n b: true\n });\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four', 'five'], 'arrays computed by filter property respond to added objects');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three', 'five'], 'arrays computed by filtered property respond to added objects');\n obj.get('array').popObject();\n assert.deepEqual(obj.get('as').mapBy('name'), ['two', 'three', 'four'], 'arrays computed by filter property respond to removed objects');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['one', 'three'], 'arrays computed by filtered property respond to removed objects');\n obj.set('array', [{\n name: 'six',\n a: 12,\n b: true\n }]);\n assert.deepEqual(obj.get('as').mapBy('name'), ['six'], 'arrays computed by filter property respond to array changes');\n assert.deepEqual(obj.get('bs').mapBy('name'), ['six'], 'arrays computed by filtered property respond to array changes');\n }\n\n ['@test properties can be filtered by values'](assert) {\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three'], 'properties can be filtered by matching value');\n obj.get('array').pushObject({\n name: 'five',\n a: 1\n });\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three', 'five'], 'arrays computed by matching value respond to added objects');\n obj.get('array').popObject();\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'three'], 'arrays computed by matching value respond to removed objects');\n (0, _metal.set)(obj.get('array')[1], 'a', 1);\n (0, _metal.set)(obj.get('array')[2], 'a', 2);\n assert.deepEqual(obj.get('a1s').mapBy('name'), ['one', 'two'], 'arrays computed by matching value respond to modified properties');\n }\n\n ['@test properties values can be replaced'](assert) {\n obj = _runtime.Object.extend({\n a1s: (0, _computed.filterBy)('array', 'a', 1),\n a1bs: (0, _computed.filterBy)('a1s', 'b')\n }).create({\n array: []\n });\n assert.deepEqual(obj.get('a1bs').mapBy('name'), [], 'properties can be filtered by matching value');\n (0, _metal.set)(obj, 'array', [{\n name: 'item1',\n a: 1,\n b: true\n }]);\n assert.deepEqual(obj.get('a1bs').mapBy('name'), ['item1'], 'properties can be filtered by matching value');\n }\n\n });\n [['uniq', _computed.uniq], ['union', _computed.union]].forEach(tuple => {\n var [name, macro] = tuple;\n (0, _internalTestHelpers.moduleFor)(`CP macro \\`${name}\\``, class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n union: macro('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6]),\n array2: (0, _runtime.A)([4, 5, 6, 7, 8, 9, 4, 5, 6, 7, 8, 9]),\n array3: (0, _runtime.A)([1, 8, 10])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n [`@test ${name} is readOnly`](assert) {\n assert.throws(function () {\n obj.set('union', 1);\n }, /Cannot set read-only property \"union\" on object:/);\n }\n\n ['@test does not include duplicates'](assert) {\n var array = obj.get('array');\n var array2 = obj.get('array2');\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' does not include duplicates');\n array.pushObject(8);\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' does not add existing items');\n array.pushObject(11);\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], name + ' adds new items');\n (0, _runtime.removeAt)(array2, 6); // remove 7\n\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], name + ' does not remove items that are still in the dependent array');\n array2.removeObject(7);\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 8, 9, 10, 11], name + ' removes items when their last instance is gone');\n }\n\n ['@test has set-union semantics'](assert) {\n var array = obj.get('array');\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], name + ' is initially correct');\n array.removeObject(6);\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'objects are not removed if they exist in other dependent arrays');\n array.clear();\n assert.deepEqual(obj.get('union').sort((x, y) => x - y), [1, 4, 5, 6, 7, 8, 9, 10], 'objects are removed when they are no longer in any dependent array');\n }\n\n });\n });\n (0, _internalTestHelpers.moduleFor)('CP Macro `uniqBy`', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n list: null,\n uniqueById: (0, _computed.uniqBy)('list', 'id')\n }).create({\n list: (0, _runtime.A)([{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }, {\n id: 1,\n value: 'one'\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test uniqBy is readOnly'](assert) {\n assert.throws(function () {\n obj.set('uniqueById', 1);\n }, /Cannot set read-only property \"uniqueById\" on object:/);\n }\n\n ['@test does not include duplicates'](assert) {\n assert.deepEqual(obj.get('uniqueById'), [{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }]);\n }\n\n ['@test it does not share state among instances'](assert) {\n var MyObject = _runtime.Object.extend({\n list: [],\n uniqueByName: (0, _computed.uniqBy)('list', 'name')\n });\n\n var a = MyObject.create({\n list: [{\n name: 'bob'\n }, {\n name: 'mitch'\n }, {\n name: 'mitch'\n }]\n });\n var b = MyObject.create({\n list: [{\n name: 'warren'\n }, {\n name: 'mitch'\n }]\n });\n assert.deepEqual(a.get('uniqueByName'), [{\n name: 'bob'\n }, {\n name: 'mitch'\n }]); // Making sure that 'mitch' appears\n\n assert.deepEqual(b.get('uniqueByName'), [{\n name: 'warren'\n }, {\n name: 'mitch'\n }]);\n }\n\n ['@test it handles changes to the dependent array'](assert) {\n obj.get('list').pushObject({\n id: 3,\n value: 'three'\n });\n assert.deepEqual(obj.get('uniqueById'), [{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }, {\n id: 3,\n value: 'three'\n }], 'The list includes three');\n obj.get('list').pushObject({\n id: 3,\n value: 'three'\n });\n assert.deepEqual(obj.get('uniqueById'), [{\n id: 1,\n value: 'one'\n }, {\n id: 2,\n value: 'two'\n }, {\n id: 3,\n value: 'three'\n }], 'The list does not include a duplicate three');\n }\n\n ['@test it returns an empty array when computed on a non-array'](assert) {\n var MyObject = _runtime.Object.extend({\n list: null,\n uniq: (0, _computed.uniqBy)('list', 'name')\n });\n\n var a = MyObject.create({\n list: 'not an array'\n });\n assert.deepEqual(a.get('uniq'), []);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('CP Macro `intersect`', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n intersection: (0, _computed.intersect)('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6]),\n array2: (0, _runtime.A)([3, 3, 3, 4, 5]),\n array3: (0, _runtime.A)([3, 5, 6, 7, 8])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test intersect is readOnly'](assert) {\n assert.throws(function () {\n obj.set('intersection', 1);\n }, /Cannot set read-only property \"intersection\" on object:/);\n }\n\n ['@test it has set-intersection semantics'](assert) {\n var array2 = obj.get('array2');\n var array3 = obj.get('array3');\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'intersection is initially correct');\n array2.shiftObject();\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'objects are not removed when they are still in all dependent arrays');\n array2.shiftObject();\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [3, 5], 'objects are not removed when they are still in all dependent arrays');\n array2.shiftObject();\n assert.deepEqual(obj.get('intersection'), [5], 'objects are removed once they are gone from all dependent arrays');\n array2.pushObject(1);\n assert.deepEqual(obj.get('intersection'), [5], 'objects are not added as long as they are missing from any dependent array');\n array3.pushObject(1);\n assert.deepEqual(obj.get('intersection').sort((x, y) => x - y), [1, 5], 'objects added once they belong to all dependent arrays');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('setDiff', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array', 'array2')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5, 10])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test setDiff is readOnly'](assert) {\n assert.throws(function () {\n obj.set('diff', 1);\n }, /Cannot set read-only property \"diff\" on object:/);\n }\n\n ['@test it asserts if given fewer or more than two dependent properties']() {\n expectAssertion(function () {\n _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5])\n });\n }, /`setDiff` computed macro requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n expectAssertion(function () {\n _runtime.Object.extend({\n diff: (0, _computed.setDiff)('array', 'array2', 'array3')\n }).create({\n array: (0, _runtime.A)([1, 2, 3, 4, 5, 6, 7]),\n array2: (0, _runtime.A)([3, 4, 5]),\n array3: (0, _runtime.A)([7])\n });\n }, /`setDiff` computed macro requires exactly two dependent arrays/, 'setDiff requires two dependent arrays');\n }\n\n ['@test it has set-diff semantics'](assert) {\n var array1 = obj.get('array');\n var array2 = obj.get('array2');\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'set-diff is initially correct');\n array2.popObject();\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'removing objects from the remove set has no effect if the object is not in the keep set');\n array2.shiftObject();\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 3, 6, 7], \"removing objects from the remove set adds them if they're in the keep set\");\n array1.removeObject(3);\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'removing objects from the keep array removes them from the computed array');\n array1.pushObject(5);\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7], 'objects added to the keep array that are in the remove array are not added to the computed array');\n array1.pushObject(22);\n assert.deepEqual(obj.get('diff').sort((x, y) => x - y), [1, 2, 6, 7, 22], 'objects added to the keep array not in the remove array are added to the computed array');\n }\n\n });\n\n class SortWithSortPropertiesTestCase extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n this.obj = this.buildObject();\n }\n\n afterEach() {\n if (this.obj) {\n this.cleanupObject();\n }\n }\n\n ['@test sort is readOnly'](assert) {\n assert.throws(() => {\n (0, _metal.set)(this.obj, 'sortedItems', 1);\n }, /Cannot set read-only property \"sortedItems\" on object:/);\n }\n\n ['@test arrays are initially sorted'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test default sort order is correct'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test changing the dependent array updates the sorted array'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(this.obj, 'items', [{\n fname: 'Roose',\n lname: 'Bolton'\n }, {\n fname: 'Theon',\n lname: 'Greyjoy'\n }, {\n fname: 'Ramsey',\n lname: 'Bolton'\n }, {\n fname: 'Stannis',\n lname: 'Baratheon'\n }]);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Stannis', 'Ramsey', 'Roose', 'Theon'], 'changing dependent array updates sorted array');\n }\n\n ['@test adding to the dependent array updates the sorted array'](assert) {\n var items = this.obj.items;\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb'], 'Adding to the dependent array updates the sorted array');\n }\n\n ['@test removing from the dependent array updates the sorted array'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n this.obj.items.popObject();\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Robb'], 'Removing from the dependent array updates the sorted array');\n }\n\n ['@test distinct items may be sort-equal, although their relative order will not be guaranteed'](assert) {\n // We recreate jaime and \"Cersei\" here only for test stability: we want\n // their guid-ordering to be deterministic\n var jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n var jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n var items = this.obj.items;\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n }\n\n ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](assert) {\n var tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n var tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n var items = this.obj.items;\n items.pushObject(tyrion);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n items.pushObject(tyrionInDisguise);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Yollo', 'Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n }\n\n ['@test updating sort properties detaches observers for old sort properties'](assert) {\n var objectToRemove = this.obj.items[3];\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(this.obj, 'itemSorting', (0, _runtime.A)(['fname:desc']));\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Robb', 'Jaime', 'Cersei', 'Bran'], 'after updating sort properties array is updated');\n this.obj.items.removeObject(objectToRemove);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Robb', 'Jaime', 'Cersei'], 'after removing item array is updated');\n (0, _metal.set)(objectToRemove, 'lname', 'Updated-Stark');\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Robb', 'Jaime', 'Cersei'], 'after changing removed item array is not updated');\n }\n\n ['@test sort works if array property is null (non array value) on first evaluation of computed prop'](assert) {\n (0, _metal.set)(this.obj, 'items', null);\n assert.deepEqual(this.obj.sortedItems, []);\n (0, _metal.set)(this.obj, 'items', (0, _runtime.A)([{\n fname: 'Cersei',\n lname: 'Lanister'\n }]));\n assert.deepEqual(this.obj.sortedItems, [{\n fname: 'Cersei',\n lname: 'Lanister'\n }]);\n }\n\n ['@test updating sort properties updates the sorted array'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(this.obj, 'itemSorting', (0, _runtime.A)(['fname:desc']));\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Robb', 'Jaime', 'Cersei', 'Bran'], 'after updating sort properties array is updated');\n }\n\n ['@test updating sort properties invalidates the sorted array'](assert) {\n var sortProps = this.obj.itemSorting;\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n sortProps.clear();\n sortProps.pushObject('fname');\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Bran', 'Cersei', 'Jaime', 'Robb'], 'after updating sort properties array is updated');\n }\n\n ['@test updating new sort properties invalidates the sorted array'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(this.obj, 'itemSorting', (0, _runtime.A)(['age:desc', 'fname:asc']));\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Robb', 'Bran'], 'precond - array is correct after item sorting is changed');\n (0, _metal.set)(this.obj.items[1], 'age', 29);\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Jaime', 'Cersei', 'Robb', 'Bran'], 'after updating sort properties array is updated');\n }\n\n ['@test sort direction defaults to ascending'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb']);\n }\n\n ['@test sort direction defaults to ascending (with sort property change)'](assert) {\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(this.obj, 'itemSorting', (0, _runtime.A)(['fname']));\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Bran', 'Cersei', 'Jaime', 'Robb'], 'sort direction defaults to ascending');\n }\n\n [\"@test updating an item's sort properties updates the sorted array\"](assert) {\n var tyrionInDisguise = this.obj.items[1];\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Jaime', 'Tyrion', 'Bran', 'Robb'], \"updating an item's sort properties updates the sorted array\");\n }\n\n [\"@test updating several of an item's sort properties updated the sorted array\"](assert) {\n var sansaInDisguise = this.obj.items[1];\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.setProperties)(sansaInDisguise, {\n fname: 'Sansa',\n lname: 'Stark'\n });\n assert.deepEqual(this.obj.sortedItems.mapBy('fname'), ['Jaime', 'Bran', 'Robb', 'Sansa'], \"updating an item's sort properties updates the sorted array\");\n }\n\n [\"@test updating an item's sort properties does not error when binary search does a self compare (#3273)\"](assert) {\n var jaime = {\n name: 'Jaime',\n status: 1\n };\n var cersei = {\n name: 'Cersei',\n status: 2\n };\n this.cleanupObject();\n this.obj = this.buildObject([jaime, cersei], ['status']);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei], 'precond - array is initially sorted');\n (0, _metal.set)(cersei, 'status', 3);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei], 'array is sorted correctly');\n (0, _metal.set)(cersei, 'status', 2);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei], 'array is sorted correctly');\n }\n\n ['@test array should not be sorted if sort properties array is empty'](assert) {\n this.cleanupObject(); // This bug only manifests when array.sort(() => 0) is not equal to array.\n // In order for this to happen, the browser must use an unstable sort and the\n // array must be sufficient large. On Chrome, 12 items is currently sufficient.\n\n this.obj = this.buildObject((0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5]), []);\n assert.deepEqual(this.obj.sortedItems, [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n }\n\n ['@test array should update if items to be sorted is replaced when sort properties array is empty'](assert) {\n this.cleanupObject();\n this.obj = this.buildObject((0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5]), (0, _runtime.A)([]));\n assert.deepEqual(this.obj.sortedItems, [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n (0, _metal.set)(this.obj, 'items', (0, _runtime.A)([5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4]));\n assert.deepEqual(this.obj.sortedItems, [5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4], 'array was updated');\n }\n\n ['@test array should update if items to be sorted is mutated when sort properties array is empty'](assert) {\n this.cleanupObject();\n this.obj = this.buildObject((0, _runtime.A)([6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5]), (0, _runtime.A)([]));\n assert.deepEqual(this.obj.sortedItems, [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5], 'array is not changed');\n this.obj.items.pushObject(12);\n assert.deepEqual(this.obj.sortedItems, [6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 12], 'array was updated');\n }\n\n ['@test array observers do not leak'](assert) {\n var daria = {\n name: 'Daria'\n };\n var jane = {\n name: 'Jane'\n };\n var sisters = [jane, daria];\n var sortProps = (0, _runtime.A)(['name']);\n this.cleanupObject();\n this.obj = this.buildObject(sisters, sortProps);\n this.obj.sortedItems;\n this.cleanupObject();\n\n try {\n sortProps.pushObject({\n name: 'Anna'\n });\n assert.ok(true);\n } catch (e) {\n assert.ok(false, e);\n }\n }\n\n ['@test property paths in sort properties update the sorted array'](assert) {\n var jaime = {\n relatedObj: {\n status: 1,\n firstName: 'Jaime',\n lastName: 'Lannister'\n }\n };\n var cersei = {\n relatedObj: {\n status: 2,\n firstName: 'Cersei',\n lastName: 'Lannister'\n }\n };\n\n var sansa = _runtime.Object.create({\n relatedObj: {\n status: 3,\n firstName: 'Sansa',\n lastName: 'Stark'\n }\n });\n\n this.cleanupObject();\n this.obj = this.buildObject([jaime, cersei, sansa], ['relatedObj.status']);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei, sansa], 'precond - array is initially sorted');\n (0, _metal.set)(cersei, 'status', 3);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei, sansa], 'array is sorted correctly');\n (0, _metal.set)(cersei, 'status', 1);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei, sansa], 'array is sorted correctly');\n sansa.set('status', 1);\n assert.deepEqual(this.obj.sortedItems, [jaime, cersei, sansa], 'array is sorted correctly');\n (0, _metal.set)(this.obj, 'itemSorting', ['relatedObj.firstName']);\n assert.deepEqual(this.obj.sortedItems, [cersei, jaime, sansa], 'array is sorted correctly');\n }\n\n ['@test if the dependentKey is neither an array nor object, it will return an empty array'](assert) {\n (0, _metal.set)(this.obj, 'items', null);\n assert.ok((0, _runtime.isArray)(this.obj.sortedItems), 'returns an empty arrays');\n (0, _metal.set)(this.obj, 'array', undefined);\n assert.ok((0, _runtime.isArray)(this.obj.sortedItems), 'returns an empty arrays');\n (0, _metal.set)(this.obj, 'array', 'not an array');\n assert.ok((0, _runtime.isArray)(this.obj.sortedItems), 'returns an empty arrays');\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('sort - sortProperties - Ember.Object', class extends SortWithSortPropertiesTestCase {\n buildObject(_items, _itemSorting) {\n var items = _items || (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }]);\n\n var itemSorting = _itemSorting || (0, _runtime.A)(['lname', 'fname']);\n\n return _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', 'itemSorting')\n }).create({\n itemSorting,\n items\n });\n }\n\n cleanupObject() {\n (0, _runloop.run)(this.obj, 'destroy');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('sort - sortProperties - Native Class', class extends SortWithSortPropertiesTestCase {\n buildObject(_items, _itemSorting) {\n var _dec, _class, _descriptor;\n\n var items = _items || (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }]);\n\n var itemSorting = _itemSorting || (0, _runtime.A)(['lname', 'fname']);\n\n return new (_dec = (0, _computed.sort)('items', 'itemSorting'), (_class = class _class {\n constructor() {\n this.items = items;\n this.itemSorting = itemSorting;\n\n _initializerDefineProperty(this, \"sortedItems\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"sortedItems\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class))();\n }\n\n cleanupObject() {}\n\n });\n\n function sortByLnameFname(a, b) {\n var lna = (0, _metal.get)(a, 'lname');\n var lnb = (0, _metal.get)(b, 'lname');\n\n if (lna !== lnb) {\n return lna > lnb ? 1 : -1;\n }\n\n return sortByFnameAsc(a, b);\n }\n\n function sortByFnameAsc(a, b) {\n var fna = (0, _metal.get)(a, 'fname');\n var fnb = (0, _metal.get)(b, 'fname');\n\n if (fna === fnb) {\n return 0;\n }\n\n return fna > fnb ? 1 : -1;\n }\n\n (0, _internalTestHelpers.moduleFor)('sort - sort function', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items.@each.fname', sortByLnameFname)\n }).create({\n items: (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sort has correct `this`'](assert) {\n var obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items.@each.fname', function (a, b) {\n assert.equal(this, obj, 'expected the object to be `this`');\n return this.sortByLastName(a, b);\n }),\n\n sortByLastName(a, b) {\n return sortByFnameAsc(a, b);\n }\n\n }).create({\n items: (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }])\n });\n\n obj.get('sortedItems');\n }\n\n ['@test sort (with function) is readOnly'](assert) {\n assert.throws(function () {\n obj.set('sortedItems', 1);\n }, /Cannot set read-only property \"sortedItems\" on object:/);\n }\n\n ['@test arrays are initially sorted'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test default sort order is correct'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n }\n\n ['@test changing the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n obj.set('items', [{\n fname: 'Roose',\n lname: 'Bolton'\n }, {\n fname: 'Theon',\n lname: 'Greyjoy'\n }, {\n fname: 'Ramsey',\n lname: 'Bolton'\n }, {\n fname: 'Stannis',\n lname: 'Baratheon'\n }]);\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Stannis', 'Ramsey', 'Roose', 'Theon'], 'changing dependent array updates sorted array');\n }\n\n ['@test adding to the dependent array updates the sorted array'](assert) {\n var items = obj.get('items');\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n items.pushObject({\n fname: 'Tyrion',\n lname: 'Lannister'\n });\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb'], 'Adding to the dependent array updates the sorted array');\n }\n\n ['@test removing from the dependent array updates the sorted array'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n obj.get('items').popObject();\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Robb'], 'Removing from the dependent array updates the sorted array');\n }\n\n ['@test distinct items may be sort-equal, although their relative order will not be guaranteed'](assert) {\n // We recreate jaime and \"Cersei\" here only for test stability: we want\n // their guid-ordering to be deterministic\n var jaimeInDisguise = {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n };\n var jaime = {\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n };\n var items = obj.get('items');\n items.replace(0, 1, [jaime]);\n items.replace(1, 1, [jaimeInDisguise]);\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Jaime');\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n (0, _metal.set)(jaimeInDisguise, 'fname', 'Cersei');\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'sorted array is updated');\n }\n\n ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](assert) {\n var tyrion = {\n fname: 'Tyrion',\n lname: 'Lannister'\n };\n\n var tyrionInDisguise = _runtime.ObjectProxy.create({\n fname: 'Yollo',\n lname: '',\n content: tyrion\n });\n\n var items = obj.get('items');\n items.pushObject(tyrion);\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n items.pushObject(tyrionInDisguise);\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Yollo', 'Cersei', 'Jaime', 'Tyrion', 'Bran', 'Robb']);\n }\n\n ['@test changing item properties specified via @each triggers a resort of the modified item'](assert) {\n var items = (0, _metal.get)(obj, 'items');\n var tyrionInDisguise = items[1];\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'precond - array is initially sorted');\n (0, _metal.set)(tyrionInDisguise, 'fname', 'Tyrion');\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Tyrion', 'Bran', 'Robb'], 'updating a specified property on an item resorts it');\n }\n\n ['@test sort updates if additional dependent keys are present'](assert) {\n obj = _runtime.Object.extend({\n sortedItems: (0, _computed.sort)('items', ['sortFunction'], function () {\n return this.sortFunction(...arguments);\n })\n }).create({\n sortFunction: sortByLnameFname,\n items: (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }])\n });\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Cersei', 'Jaime', 'Bran', 'Robb'], 'array is initially sorted');\n obj.set('sortFunction', (a, b) => {\n if (a.age > b.age) {\n return -1;\n } else if (a.age < b.age) {\n return 1;\n }\n\n return 0;\n });\n assert.deepEqual(obj.get('sortedItems').mapBy('fname'), ['Jaime', 'Cersei', 'Robb', 'Bran'], 'array is updated when dependent key changes');\n }\n\n ['@test it throws on bad inputs']() {\n expectAssertion(() => {\n (0, _computed.sort)('foo', 'bar', 'baz');\n }, /`sort` computed macro can either be used with an array of sort properties or with a sort function/);\n expectAssertion(() => {\n (0, _computed.sort)('foo', ['bar'], 'baz');\n }, /`sort` computed macro can either be used with an array of sort properties or with a sort function/);\n expectAssertion(() => {\n (0, _computed.sort)('foo', 'bar', function () {});\n }, /`sort` computed macro can either be used with an array of sort properties or with a sort function/);\n expectAssertion(() => {\n (0, _computed.sort)('foo', ['bar'], function () {}, 'baz');\n }, /`sort` computed macro can either be used with an array of sort properties or with a sort function/);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('sort - stability', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sortProps: ['count', 'name'],\n sortedItems: (0, _computed.sort)('items', 'sortProps')\n }).create({\n items: [{\n name: 'A',\n count: 1,\n thing: 4\n }, {\n name: 'B',\n count: 1,\n thing: 3\n }, {\n name: 'C',\n count: 1,\n thing: 2\n }, {\n name: 'D',\n count: 1,\n thing: 4\n }]\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sorts correctly as only one property changes'](assert) {\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n (0, _metal.set)(obj.get('items')[3], 'count', 2);\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'final');\n }\n\n });\n var klass;\n (0, _internalTestHelpers.moduleFor)('sort - concurrency', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n klass = _runtime.Object.extend({\n sortProps: ['count'],\n sortedItems: (0, _computed.sort)('items', 'sortProps'),\n customSortedItems: (0, _computed.sort)('items.@each.count', (a, b) => a.count - b.count)\n });\n obj = klass.create({\n items: (0, _runtime.A)([{\n name: 'A',\n count: 1,\n thing: 4,\n id: 1\n }, {\n name: 'B',\n count: 2,\n thing: 3,\n id: 2\n }, {\n name: 'C',\n count: 3,\n thing: 2,\n id: 3\n }, {\n name: 'D',\n count: 4,\n thing: 1,\n id: 4\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sorts correctly after mutation to the sort properties'](assert) {\n var sorted = obj.get('sortedItems');\n assert.deepEqual(sorted.mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n }\n\n ['@test sort correctly after mutation to the sort'](assert) {\n assert.deepEqual(obj.get('customSortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n assert.deepEqual(obj.get('customSortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n }\n\n ['@test sort correctly on multiple instances of the same class'](assert) {\n var obj2 = klass.create({\n items: (0, _runtime.A)([{\n name: 'W',\n count: 23,\n thing: 4\n }, {\n name: 'X',\n count: 24,\n thing: 3\n }, {\n name: 'Y',\n count: 25,\n thing: 2\n }, {\n name: 'Z',\n count: 26,\n thing: 1\n }])\n });\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['W', 'X', 'Y', 'Z'], 'initial');\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'initial');\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n (0, _metal.set)(obj2.get('items')[1], 'count', 27);\n (0, _metal.set)(obj2.get('items')[2], 'count', 28);\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'final');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['W', 'Z', 'X', 'Y'], 'final');\n obj.set('sortProps', ['thing']);\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'final');\n obj2.notifyPropertyChange('sortedItems'); // invalidate to flush, to get DK refreshed\n\n obj2.get('sortedItems'); // flush to get updated DK\n\n obj2.set('items.firstObject.count', 9999);\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['Z', 'X', 'Y', 'W'], 'final');\n }\n\n ['@test sort correctly when multiple sorts are chained on the same instance of a class'](assert) {\n var obj2 = klass.extend({\n items: (0, _metal.computed)('sibling.sortedItems.[]', function () {\n return this.get('sibling.sortedItems');\n }),\n asdf: (0, _metal.observer)('sibling.sortedItems.[]', function () {\n this.get('sibling.sortedItems');\n })\n }).create({\n sibling: obj\n });\n /*\n ┌───────────┐ ┌────────────┐\n │sortedProps│ │sortedProps2│\n └───────────┘ └────────────┘\n ▲ ▲\n │ ╔═══════════╗ │\n │─ ─ ─ ─ ─ ─ ─ ▶║ CP (sort) ║◀─ ─ ─ ─ ─ ─ ─ ┤\n │ ╚═══════════╝ │\n │ │\n ┌───────────┐ ┏━━━━━━━━━━━┓ ┏━━━━━━━━━━━━┓\n │ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃\n │ items │◀── items.@each.count │◀──┃sortedItems┃◀─── items.@each.count │◀───┃sortedItems2┃\n │ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┃ ┃\n └───────────┘ ┗━━━━━━━━━━━┛ ┗━━━━━━━━━━━━┛\n */\n\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'obj.sortedItems.name should be sorted alpha');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'obj2.sortedItems.name should be sorted alpha');\n (0, _metal.set)(obj.get('items')[1], 'count', 5);\n (0, _metal.set)(obj.get('items')[2], 'count', 6);\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj.sortedItems.name should now have changed');\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'D', 'B', 'C'], 'obj2.sortedItems.name should still mirror sortedItems2');\n obj.set('sortProps', ['thing']);\n obj2.set('sortProps', ['id']);\n assert.deepEqual(obj2.get('sortedItems').mapBy('name'), ['A', 'B', 'C', 'D'], 'we now sort obj2 by id, so we expect a b c d');\n assert.deepEqual(obj.get('sortedItems').mapBy('name'), ['D', 'C', 'B', 'A'], 'we now sort obj by thing');\n obj2.destroy();\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('max', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n max: (0, _computed.max)('items')\n }).create({\n items: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test max is readOnly'](assert) {\n assert.throws(function () {\n obj.set('max', 1);\n }, /Cannot set read-only property \"max\" on object:/);\n }\n\n ['@test max tracks the max number as objects are added'](assert) {\n assert.equal(obj.get('max'), 3, 'precond - max is initially correct');\n var items = obj.get('items');\n items.pushObject(5);\n assert.equal(obj.get('max'), 5, 'max updates when a larger number is added');\n items.pushObject(2);\n assert.equal(obj.get('max'), 5, 'max does not update when a smaller number is added');\n }\n\n ['@test max recomputes when the current max is removed'](assert) {\n assert.equal(obj.get('max'), 3, 'precond - max is initially correct');\n obj.get('items').removeObject(2);\n assert.equal(obj.get('max'), 3, 'max is unchanged when a non-max item is removed');\n obj.get('items').removeObject(3);\n assert.equal(obj.get('max'), 1, 'max is recomputed when the current max is removed');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('min', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n min: (0, _computed.min)('items')\n }).create({\n items: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test min is readOnly'](assert) {\n assert.throws(function () {\n obj.set('min', 1);\n }, /Cannot set read-only property \"min\" on object:/);\n }\n\n ['@test min tracks the min number as objects are added'](assert) {\n assert.equal(obj.get('min'), 1, 'precond - min is initially correct');\n obj.get('items').pushObject(-2);\n assert.equal(obj.get('min'), -2, 'min updates when a smaller number is added');\n obj.get('items').pushObject(2);\n assert.equal(obj.get('min'), -2, 'min does not update when a larger number is added');\n }\n\n ['@test min recomputes when the current min is removed'](assert) {\n var items = obj.get('items');\n assert.equal(obj.get('min'), 1, 'precond - min is initially correct');\n items.removeObject(2);\n assert.equal(obj.get('min'), 1, 'min is unchanged when a non-min item is removed');\n items.removeObject(1);\n assert.equal(obj.get('min'), 3, 'min is recomputed when the current min is removed');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Ember.arrayComputed - mixed sugar', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n lannisters: (0, _computed.filterBy)('items', 'lname', 'Lannister'),\n lannisterSorting: (0, _runtime.A)(['fname']),\n sortedLannisters: (0, _computed.sort)('lannisters', 'lannisterSorting'),\n starks: (0, _computed.filterBy)('items', 'lname', 'Stark'),\n starkAges: (0, _computed.mapBy)('starks', 'age'),\n oldestStarkAge: (0, _computed.max)('starkAges')\n }).create({\n items: (0, _runtime.A)([{\n fname: 'Jaime',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Cersei',\n lname: 'Lannister',\n age: 34\n }, {\n fname: 'Robb',\n lname: 'Stark',\n age: 16\n }, {\n fname: 'Bran',\n lname: 'Stark',\n age: 8\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test filtering and sorting can be combined'](assert) {\n var items = obj.get('items');\n assert.deepEqual(obj.get('sortedLannisters').mapBy('fname'), ['Cersei', 'Jaime'], 'precond - array is initially filtered and sorted');\n items.pushObject({\n fname: 'Tywin',\n lname: 'Lannister'\n });\n items.pushObject({\n fname: 'Lyanna',\n lname: 'Stark'\n });\n items.pushObject({\n fname: 'Gerion',\n lname: 'Lannister'\n });\n assert.deepEqual(obj.get('sortedLannisters').mapBy('fname'), ['Cersei', 'Gerion', 'Jaime', 'Tywin'], 'updates propagate to array');\n }\n\n ['@test filtering, sorting and reduce (max) can be combined'](assert) {\n var items = obj.get('items');\n assert.equal(16, obj.get('oldestStarkAge'), 'precond - end of chain is initially correct');\n items.pushObject({\n fname: 'Rickon',\n lname: 'Stark',\n age: 5\n });\n assert.equal(16, obj.get('oldestStarkAge'), 'chain is updated correctly');\n items.pushObject({\n fname: 'Eddard',\n lname: 'Stark',\n age: 35\n });\n assert.equal(35, obj.get('oldestStarkAge'), 'chain is updated correctly');\n }\n\n });\n\n function todo(name, priority) {\n return _runtime.Object.create({\n name: name,\n priority: priority\n });\n }\n\n function priorityComparator(todoA, todoB) {\n var pa = parseInt((0, _metal.get)(todoA, 'priority'), 10);\n var pb = parseInt((0, _metal.get)(todoB, 'priority'), 10);\n return pa - pb;\n }\n\n function evenPriorities(todo) {\n var p = parseInt((0, _metal.get)(todo, 'priority'), 10);\n return p % 2 === 0;\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.arrayComputed - chains', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n sorted: (0, _computed.sort)('todos.@each.priority', priorityComparator),\n filtered: (0, _computed.filter)('sorted.@each.priority', evenPriorities)\n }).create({\n todos: (0, _runtime.A)([todo('E', 4), todo('D', 3), todo('C', 2), todo('B', 1), todo('A', 0)])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test it can filter and sort when both depend on the same item property'](assert) {\n assert.deepEqual(obj.get('todos').mapBy('name'), ['E', 'D', 'C', 'B', 'A'], 'precond - todos initially correct');\n assert.deepEqual(obj.get('sorted').mapBy('name'), ['A', 'B', 'C', 'D', 'E'], 'precond - sorted initially correct');\n assert.deepEqual(obj.get('filtered').mapBy('name'), ['A', 'C', 'E'], 'precond - filtered initially correct');\n (0, _metal.set)(obj.get('todos')[1], 'priority', 6);\n assert.deepEqual(obj.get('todos').mapBy('name'), ['E', 'D', 'C', 'B', 'A'], 'precond - todos remain correct');\n assert.deepEqual(obj.get('sorted').mapBy('name'), ['A', 'B', 'C', 'E', 'D'], 'precond - sorted updated correctly');\n assert.deepEqual(obj.get('filtered').mapBy('name'), ['A', 'C', 'E', 'D'], 'filtered updated correctly');\n }\n\n });\n var userFnCalls;\n (0, _internalTestHelpers.moduleFor)('Chaining array and reduced CPs', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n userFnCalls = 0;\n obj = _runtime.Object.extend({\n mapped: (0, _computed.mapBy)('array', 'v'),\n max: (0, _computed.max)('mapped'),\n maxDidChange: (0, _metal.observer)('max', () => userFnCalls++)\n }).create({\n array: (0, _runtime.A)([{\n v: 1\n }, {\n v: 3\n }, {\n v: 2\n }, {\n v: 1\n }])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n async ['@test it computes interdependent array computed properties'](assert) {\n assert.equal(obj.get('max'), 3, 'sanity - it properly computes the maximum value');\n var calls = 0;\n (0, _metal.addObserver)(obj, 'max', () => calls++);\n obj.get('array').pushObject({\n v: 5\n });\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(obj.get('max'), 5, 'maximum value is updated correctly');\n assert.equal(userFnCalls, 1, 'object defined observers fire');\n assert.equal(calls, 1, 'runtime created observers fire');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('sum', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n obj = _runtime.Object.extend({\n total: (0, _computed.sum)('array')\n }).create({\n array: (0, _runtime.A)([1, 2, 3])\n });\n }\n\n afterEach() {\n (0, _runloop.run)(obj, 'destroy');\n }\n\n ['@test sum is readOnly'](assert) {\n assert.throws(function () {\n obj.set('total', 1);\n }, /Cannot set read-only property \"total\" on object:/);\n }\n\n ['@test sums the values in the dependentKey'](assert) {\n assert.equal(obj.get('total'), 6, 'sums the values');\n }\n\n ['@test if the dependentKey is neither an array nor object, it will return `0`'](assert) {\n (0, _metal.set)(obj, 'array', null);\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n (0, _metal.set)(obj, 'array', undefined);\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n (0, _metal.set)(obj, 'array', 'not an array');\n assert.equal((0, _metal.get)(obj, 'total'), 0, 'returns 0');\n }\n\n ['@test updates when array is modified'](assert) {\n obj.get('array').pushObject(1);\n assert.equal(obj.get('total'), 7, 'recomputed when elements are added');\n obj.get('array').popObject();\n assert.equal(obj.get('total'), 6, 'recomputes when elements are removed');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('collect', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works'](assert) {\n var obj = {\n one: 'foo',\n two: 'bar',\n three: null\n };\n (0, _metal.defineProperty)(obj, 'all', (0, _computed.collect)('one', 'two', 'three', 'four'));\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, null], 'have all of them');\n (0, _metal.set)(obj, 'four', true);\n assert.deepEqual((0, _metal.get)(obj, 'all'), ['foo', 'bar', null, true], 'have all of them');\n var a = [];\n (0, _metal.set)(obj, 'one', 0);\n (0, _metal.set)(obj, 'three', a);\n assert.deepEqual((0, _metal.get)(obj, 'all'), [0, 'bar', a, true], 'have all of them');\n }\n\n });\n});","define(\"@ember/polyfills/tests/assign_test\", [\"@ember/polyfills\", \"internal-test-helpers\"], function (_polyfills, _internalTestHelpers) {\n \"use strict\";\n\n class AssignTests extends _internalTestHelpers.AbstractTestCase {\n ['@test merging objects'](assert) {\n var trgt = {\n a: 1\n };\n var src1 = {\n b: 2\n };\n var src2 = {\n c: 3\n };\n this.assign(trgt, src1, src2);\n assert.deepEqual(trgt, {\n a: 1,\n b: 2,\n c: 3\n }, 'assign copies values from one or more source objects to a target object');\n assert.deepEqual(src1, {\n b: 2\n }, 'assign does not change source object 1');\n assert.deepEqual(src2, {\n c: 3\n }, 'assign does not change source object 2');\n }\n\n ['@test merging objects with same property'](assert) {\n var trgt = {\n a: 1,\n b: 1\n };\n var src1 = {\n a: 2,\n b: 2\n };\n var src2 = {\n a: 3\n };\n this.assign(trgt, src1, src2);\n assert.deepEqual(trgt, {\n a: 3,\n b: 2\n }, 'properties are overwritten by other objects that have the same properties later in the parameters order');\n }\n\n ['@test null'](assert) {\n var trgt = {\n a: 1\n };\n this.assign(trgt, null);\n assert.deepEqual(trgt, {\n a: 1\n }, 'null as a source parameter is ignored');\n }\n\n ['@test undefined'](assert) {\n var trgt = {\n a: 1\n };\n this.assign(trgt, null);\n assert.deepEqual(trgt, {\n a: 1\n }, 'undefined as a source parameter is ignored');\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Ember.assign (polyfill)', class extends AssignTests {\n assign() {\n return expectDeprecation(() => {\n (0, _polyfills.assign)(...arguments);\n }, 'Use of `assign` has been deprecated. Please use `Object.assign` or the spread operator instead.');\n }\n\n });\n});","define(\"@ember/runloop/tests/debounce_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('debounce', class extends _internalTestHelpers.AbstractTestCase {\n ['@test debounce - with target, with method, without args'](assert) {\n var done = assert.async();\n var calledWith = [];\n var target = {\n someFunc(...args) {\n calledWith.push(args);\n }\n\n };\n (0, _runloop.debounce)(target, target.someFunc, 10);\n (0, _runloop.debounce)(target, target.someFunc, 10);\n (0, _runloop.debounce)(target, target.someFunc, 10);\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - with target, with method name, without args'](assert) {\n var done = assert.async();\n var calledWith = [];\n var target = {\n someFunc(...args) {\n calledWith.push(args);\n }\n\n };\n (0, _runloop.debounce)(target, 'someFunc', 10);\n (0, _runloop.debounce)(target, 'someFunc', 10);\n (0, _runloop.debounce)(target, 'someFunc', 10);\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - without target, without args'](assert) {\n var done = assert.async();\n var calledWith = [];\n\n function someFunc(...args) {\n calledWith.push(args);\n }\n\n (0, _runloop.debounce)(someFunc, 10);\n (0, _runloop.debounce)(someFunc, 10);\n (0, _runloop.debounce)(someFunc, 10);\n setTimeout(() => {\n assert.deepEqual(calledWith, [[]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n ['@test debounce - without target, with args'](assert) {\n var done = assert.async();\n var calledWith = [];\n\n function someFunc(...args) {\n calledWith.push(args);\n }\n\n (0, _runloop.debounce)(someFunc, {\n isFoo: true\n }, 10);\n (0, _runloop.debounce)(someFunc, {\n isBar: true\n }, 10);\n (0, _runloop.debounce)(someFunc, {\n isBaz: true\n }, 10);\n setTimeout(() => {\n assert.deepEqual(calledWith, [[{\n isBaz: true\n }]], 'someFunc called once with correct arguments');\n done();\n }, 20);\n }\n\n });\n});","define(\"@ember/runloop/tests/later_test\", [\"internal-test-helpers\", \"@ember/runloop\"], function (_internalTestHelpers, _runloop) {\n \"use strict\";\n\n var originalSetTimeout = window.setTimeout;\n var originalDateValueOf = Date.prototype.valueOf;\n var originalPlatform = _runloop._backburner._platform;\n\n function wait(callback, maxWaitCount = 100) {\n originalSetTimeout(() => {\n if (maxWaitCount > 0 && ((0, _runloop._hasScheduledTimers)() || (0, _runloop._getCurrentRunLoop)())) {\n wait(callback, maxWaitCount - 1);\n return;\n }\n\n callback();\n }, 10);\n } // Synchronous \"sleep\". This simulates work being done\n // after later was called but before the run loop\n // has flushed. In previous versions, this would have\n // caused the later callback to have run from\n // within the run loop flush, since by the time the\n // run loop has to flush, it would have considered\n // the timer already expired.\n\n\n function pauseUntil(time) {\n while (Date.now() < time) {\n /* do nothing - sleeping */\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('runloop `later`', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n _runloop._backburner._platform = originalPlatform;\n window.setTimeout = originalSetTimeout;\n Date.prototype.valueOf = originalDateValueOf;\n }\n\n ['@test should invoke after specified period of time - function only'](assert) {\n var done = assert.async();\n var invoked = false;\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => invoked = true, 100);\n });\n wait(() => {\n assert.equal(invoked, true, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should invoke after specified period of time - target/method'](assert) {\n var done = assert.async();\n var obj = {\n invoked: false\n };\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function () {\n this.invoked = true;\n }, 100);\n });\n wait(() => {\n assert.equal(obj.invoked, true, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should invoke after specified period of time - target/method/args'](assert) {\n var done = assert.async();\n var obj = {\n invoked: 0\n };\n (0, _runloop.run)(() => {\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n }, 10, 100);\n });\n wait(() => {\n assert.equal(obj.invoked, 10, 'should have invoked later item');\n done();\n });\n }\n\n ['@test should always invoke within a separate runloop'](assert) {\n var done = assert.async();\n var obj = {\n invoked: 0\n };\n var firstRunLoop, secondRunLoop;\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop._getCurrentRunLoop)();\n (0, _runloop.later)(obj, function (amt) {\n this.invoked += amt;\n secondRunLoop = (0, _runloop._getCurrentRunLoop)();\n }, 10, 1);\n pauseUntil(Date.now() + 100);\n });\n assert.ok(firstRunLoop, 'first run loop captured');\n assert.ok(!(0, _runloop._getCurrentRunLoop)(), \"shouldn't be in a run loop after flush\");\n assert.equal(obj.invoked, 0, \"shouldn't have invoked later item yet\");\n wait(() => {\n assert.equal(obj.invoked, 10, 'should have invoked later item');\n assert.ok(secondRunLoop, 'second run loop took place');\n assert.ok(secondRunLoop !== firstRunLoop, 'two different run loops took place');\n done();\n });\n } // Our current implementation doesn't allow us to correctly enforce this ordering.\n // We should probably implement a queue to provide this guarantee.\n // See https://github.com/emberjs/ember.js/issues/3526 for more information.\n // asyncTest('callback order', function() {\n // let array = [];\n // function fn(val) { array.push(val); }\n // run(function() {\n // later(this, fn, 4, 5);\n // later(this, fn, 1, 1);\n // later(this, fn, 5, 10);\n // later(this, fn, 2, 3);\n // later(this, fn, 3, 3);\n // });\n // deepEqual(array, []);\n // wait(function() {\n // QUnit.start();\n // deepEqual(array, [1,2,3,4,5], 'callbacks were called in expected order');\n // });\n // });\n // Out current implementation doesn't allow us to properly enforce what is tested here.\n // We should probably fix it, but it's not technically a bug right now.\n // See https://github.com/emberjs/ember.js/issues/3522 for more information.\n // asyncTest('callbacks coalesce into same run loop if expiring at the same time', function() {\n // let array = [];\n // function fn(val) { array.push(getCurrentRunLoop()); }\n // run(function() {\n // // Force +new Date to return the same result while scheduling\n // // later timers. Otherwise: non-determinism!\n // let now = +new Date();\n // Date.prototype.valueOf = function() { return now; };\n // later(this, fn, 10);\n // later(this, fn, 200);\n // later(this, fn, 200);\n // Date.prototype.valueOf = originalDateValueOf;\n // });\n // deepEqual(array, []);\n // wait(function() {\n // QUnit.start();\n // equal(array.length, 3, 'all callbacks called');\n // ok(array[0] !== array[1], 'first two callbacks have different run loops');\n // ok(array[0], 'first runloop present');\n // ok(array[1], 'second runloop present');\n // equal(array[1], array[2], 'last two callbacks got the same run loop');\n // });\n // });\n\n\n ['@test inception calls to later should run callbacks in separate run loops'](assert) {\n var done = assert.async();\n var runLoop, finished;\n (0, _runloop.run)(() => {\n runLoop = (0, _runloop._getCurrentRunLoop)();\n assert.ok(runLoop);\n (0, _runloop.later)(() => {\n assert.ok((0, _runloop._getCurrentRunLoop)() && (0, _runloop._getCurrentRunLoop)() !== runLoop, 'first later callback has own run loop');\n runLoop = (0, _runloop._getCurrentRunLoop)();\n (0, _runloop.later)(() => {\n assert.ok((0, _runloop._getCurrentRunLoop)() && (0, _runloop._getCurrentRunLoop)() !== runLoop, 'second later callback has own run loop');\n finished = true;\n }, 40);\n }, 40);\n });\n wait(() => {\n assert.ok(finished, 'all .later callbacks run');\n done();\n });\n }\n\n ['@test setTimeout should never run with a negative wait'](assert) {\n var done = assert.async(); // Rationale: The old run loop code was susceptible to an occasional\n // bug where invokeLaterTimers would be scheduled with a setTimeout\n // with a negative wait. Modern browsers normalize this to 0, but\n // older browsers (IE <= 8) break with a negative wait, which\n // happens when an expired timer callback takes a while to run,\n // which is what we simulate here.\n\n var newSetTimeoutUsed;\n _runloop._backburner._platform = Object.assign({}, originalPlatform, {\n setTimeout() {\n var wait = arguments[arguments.length - 1];\n newSetTimeoutUsed = true;\n assert.ok(!isNaN(wait) && wait >= 0, 'wait is a non-negative number');\n return originalPlatform.setTimeout.apply(originalPlatform, arguments);\n }\n\n });\n var count = 0;\n (0, _runloop.run)(() => {\n (0, _runloop.later)(() => {\n count++; // This will get run first. Waste some time.\n // This is intended to break invokeLaterTimers code by taking a\n // long enough time that other timers should technically expire. It's\n // fine that they're not called in this run loop; just need to\n // make sure that invokeLaterTimers doesn't end up scheduling\n // a negative setTimeout.\n\n pauseUntil(Date.now() + 60);\n }, 1);\n (0, _runloop.later)(() => {\n assert.equal(count, 1, 'callbacks called in order');\n }, 50);\n });\n wait(() => {\n assert.ok(newSetTimeoutUsed, 'stub setTimeout was used');\n done();\n });\n }\n\n });\n});","define(\"@ember/runloop/tests/next_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('runloop `next`', class extends _internalTestHelpers.AbstractTestCase {\n ['@test should invoke immediately on next timeout'](assert) {\n var done = assert.async();\n var invoked = false;\n (0, _runloop.run)(() => (0, _runloop.next)(() => invoked = true));\n assert.equal(invoked, false, 'should not have invoked yet');\n setTimeout(() => {\n assert.equal(invoked, true, 'should have invoked later item');\n done();\n }, 20);\n }\n\n ['@test callback should be called from within separate loop'](assert) {\n var done = assert.async();\n var firstRunLoop, secondRunLoop;\n (0, _runloop.run)(() => {\n firstRunLoop = (0, _runloop._getCurrentRunLoop)();\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop._getCurrentRunLoop)());\n });\n setTimeout(() => {\n assert.ok(secondRunLoop, 'callback was called from within run loop');\n assert.ok(firstRunLoop && secondRunLoop !== firstRunLoop, 'two separate run loops were invoked');\n done();\n }, 20);\n }\n\n ['@test multiple calls to next share coalesce callbacks into same run loop'](assert) {\n var done = assert.async();\n var secondRunLoop, thirdRunLoop;\n (0, _runloop.run)(() => {\n (0, _runloop.next)(() => secondRunLoop = (0, _runloop._getCurrentRunLoop)());\n (0, _runloop.next)(() => thirdRunLoop = (0, _runloop._getCurrentRunLoop)());\n });\n setTimeout(() => {\n assert.ok(secondRunLoop && secondRunLoop === thirdRunLoop, 'callbacks coalesced into same run loop');\n done();\n }, 20);\n }\n\n });\n});","define(\"@ember/runloop/tests/once_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/once_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test calling invokeOnce more than once invokes only once'](assert) {\n var count = 0;\n (0, _runloop.run)(() => {\n function F() {\n count++;\n }\n\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n (0, _runloop.once)(F);\n });\n assert.equal(count, 1, 'should have invoked once');\n }\n\n ['@test should differentiate based on target'](assert) {\n var A = {\n count: 0\n };\n var B = {\n count: 0\n };\n (0, _runloop.run)(() => {\n function F() {\n this.count++;\n }\n\n (0, _runloop.once)(A, F);\n (0, _runloop.once)(B, F);\n (0, _runloop.once)(A, F);\n (0, _runloop.once)(B, F);\n });\n assert.equal(A.count, 1, 'should have invoked once on A');\n assert.equal(B.count, 1, 'should have invoked once on B');\n }\n\n ['@test should ignore other arguments - replacing previous ones'](assert) {\n var A = {\n count: 0\n };\n var B = {\n count: 0\n };\n (0, _runloop.run)(() => {\n function F(amt) {\n this.count += amt;\n }\n\n (0, _runloop.once)(A, F, 10);\n (0, _runloop.once)(B, F, 20);\n (0, _runloop.once)(A, F, 30);\n (0, _runloop.once)(B, F, 40);\n });\n assert.equal(A.count, 30, 'should have invoked once on A');\n assert.equal(B.count, 40, 'should have invoked once on B');\n }\n\n ['@test should be inside of a runloop when running'](assert) {\n (0, _runloop.run)(() => {\n (0, _runloop.once)(() => assert.ok(Boolean((0, _runloop._getCurrentRunLoop)()), 'should have a runloop'));\n });\n }\n\n });\n});","define(\"@ember/runloop/tests/onerror_test\", [\"@ember/runloop\", \"@ember/-internals/error-handling\", \"@ember/debug\", \"internal-test-helpers\"], function (_runloop, _errorHandling, _debug, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/onerror_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test With Ember.onerror undefined, errors in run are thrown'](assert) {\n var thrown = new Error('Boom!');\n var original = (0, _errorHandling.getOnerror)();\n var caught;\n (0, _errorHandling.setOnerror)(undefined);\n\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } catch (error) {\n caught = error;\n } finally {\n (0, _errorHandling.setOnerror)(original);\n }\n\n assert.deepEqual(caught, thrown);\n }\n\n ['@test With Ember.onerror set, errors in run are caught'](assert) {\n var thrown = new Error('Boom!');\n var original = (0, _errorHandling.getOnerror)();\n var originalDispatchOverride = (0, _errorHandling.getDispatchOverride)();\n var originalIsTesting = (0, _debug.isTesting)();\n var caught;\n (0, _errorHandling.setOnerror)(error => {\n caught = error;\n });\n (0, _errorHandling.setDispatchOverride)(null);\n (0, _debug.setTesting)(false);\n\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } finally {\n (0, _errorHandling.setOnerror)(original);\n (0, _errorHandling.setDispatchOverride)(originalDispatchOverride);\n (0, _debug.setTesting)(originalIsTesting);\n }\n\n assert.deepEqual(caught, thrown);\n }\n\n });\n});","define(\"@ember/runloop/tests/run_bind_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/run_bind_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test bind builds a run-loop wrapped callback handler'](assert) {\n assert.expect(3);\n var obj = {\n value: 0,\n\n increment(increment) {\n assert.ok((0, _runloop._getCurrentRunLoop)(), 'expected a run-loop');\n return this.value += increment;\n }\n\n };\n var proxiedFunction = (0, _runloop.bind)(obj, obj.increment, 1);\n assert.equal(proxiedFunction(), 1);\n assert.equal(obj.value, 1);\n }\n\n ['@test bind keeps the async callback arguments'](assert) {\n assert.expect(4);\n\n function asyncCallback(increment, increment2, increment3) {\n assert.ok((0, _runloop._getCurrentRunLoop)(), 'expected a run-loop');\n assert.equal(increment, 1);\n assert.equal(increment2, 2);\n assert.equal(increment3, 3);\n }\n\n function asyncFunction(fn) {\n fn(2, 3);\n }\n\n asyncFunction((0, _runloop.bind)(asyncCallback, asyncCallback, 1));\n }\n\n ['@test [GH#16652] bind throws an error if callback is undefined']() {\n var assertBindThrows = (msg, ...args) => {\n expectAssertion(function () {\n (0, _runloop.bind)(...args);\n }, /could not find a suitable method to bind/, msg);\n };\n\n assertBindThrows('without arguments');\n assertBindThrows('with one arguments that is not a function', 'myMethod');\n assertBindThrows('if second parameter is not a function and not a property in first parameter', Object.create(null), 'myMethod');\n }\n\n });\n});","define(\"@ember/runloop/tests/run_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/run_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test run invokes passed function, returning value'](assert) {\n var obj = {\n foo() {\n return [this.bar, 'FOO'];\n },\n\n bar: 'BAR',\n\n checkArgs(arg1, arg2) {\n return [arg1, this.bar, arg2];\n }\n\n };\n assert.equal((0, _runloop.run)(() => 'FOO'), 'FOO', 'pass function only');\n assert.deepEqual((0, _runloop.run)(obj, obj.foo), ['BAR', 'FOO'], 'pass obj and obj.method');\n assert.deepEqual((0, _runloop.run)(obj, 'foo'), ['BAR', 'FOO'], 'pass obj and \"method\"');\n assert.deepEqual((0, _runloop.run)(obj, obj.checkArgs, 'hello', 'world'), ['hello', 'BAR', 'world'], 'pass obj, obj.method, and extra arguments');\n }\n\n });\n});","define(\"@ember/runloop/tests/schedule_test\", [\"@ember/runloop\", \"internal-test-helpers\"], function (_runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/schedule_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test scheduling item in queue should defer until finished'](assert) {\n var cnt = 0;\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n (0, _runloop.schedule)('actions', () => cnt++);\n assert.equal(cnt, 0, 'should not run action yet');\n });\n assert.equal(cnt, 2, 'should flush actions now');\n }\n\n ['@test a scheduled item can be canceled'](assert) {\n var hasRan = false;\n (0, _runloop.run)(() => {\n var cancelId = (0, _runloop.schedule)('actions', () => hasRan = true);\n (0, _runloop.cancel)(cancelId);\n });\n assert.notOk(hasRan, 'should not have ran callback run');\n }\n\n ['@test nested runs should queue each phase independently'](assert) {\n var cnt = 0;\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n assert.equal(cnt, 0, 'should not run action yet');\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', () => cnt++);\n });\n assert.equal(cnt, 1, 'should not run action yet');\n });\n assert.equal(cnt, 2, 'should flush actions now');\n }\n\n ['@test prior queues should be flushed before moving on to next queue'](assert) {\n var order = [];\n (0, _runloop.run)(() => {\n var runLoop = (0, _runloop._getCurrentRunLoop)();\n assert.ok(runLoop, 'run loop present');\n (0, _runloop.schedule)('actions', () => {\n order.push('actions');\n assert.equal(runLoop, (0, _runloop._getCurrentRunLoop)(), 'same run loop used');\n });\n (0, _runloop.schedule)('afterRender', () => {\n order.push('afterRender');\n assert.equal(runLoop, (0, _runloop._getCurrentRunLoop)(), 'same run loop used');\n (0, _runloop.schedule)('afterRender', () => {\n order.push('afterRender');\n assert.equal(runLoop, (0, _runloop._getCurrentRunLoop)(), 'same run loop used');\n });\n (0, _runloop.schedule)('actions', () => {\n order.push('actions');\n assert.equal(runLoop, (0, _runloop._getCurrentRunLoop)(), 'same run loop used');\n });\n });\n (0, _runloop.schedule)('destroy', () => {\n order.push('destroy');\n assert.equal(runLoop, (0, _runloop._getCurrentRunLoop)(), 'same run loop used');\n });\n });\n assert.deepEqual(order, ['actions', 'afterRender', 'actions', 'afterRender', 'destroy']);\n }\n\n });\n});","define(\"@ember/runloop/tests/unwind_test\", [\"@ember/runloop\", \"@ember/error\", \"internal-test-helpers\"], function (_runloop, _error, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('system/run_loop/unwind_test', class extends _internalTestHelpers.AbstractTestCase {\n ['@test RunLoop unwinds despite unhandled exception'](assert) {\n var initialRunLoop = (0, _runloop._getCurrentRunLoop)();\n assert.throws(() => {\n (0, _runloop.run)(() => {\n (0, _runloop.schedule)('actions', function () {\n throw new _error.default('boom!');\n });\n });\n }, Error, 'boom!'); // The real danger at this point is that calls to autorun will stick\n // tasks into the already-dead runloop, which will never get\n // flushed. I can't easily demonstrate this in a unit test because\n // autorun explicitly doesn't work in test mode. - ef4\n\n assert.equal((0, _runloop._getCurrentRunLoop)(), initialRunLoop, 'Previous run loop should be cleaned up despite exception');\n }\n\n ['@test run unwinds despite unhandled exception'](assert) {\n var initialRunLoop = (0, _runloop._getCurrentRunLoop)();\n assert.throws(() => {\n (0, _runloop.run)(function () {\n throw new _error.default('boom!');\n });\n }, _error.default, 'boom!');\n assert.equal((0, _runloop._getCurrentRunLoop)(), initialRunLoop, 'Previous run loop should be cleaned up despite exception');\n }\n\n });\n});","define(\"@ember/service/tests/service_test\", [\"@ember/service\", \"@ember/-internals/runtime\", \"internal-test-helpers\"], function (_service, _runtime, _internalTestHelpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('inject - decorator', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works with native decorators'](assert) {\n var _dec, _class, _descriptor;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainService extends _service.default {}\n\n var Foo = (_dec = (0, _service.inject)('main'), (_class = class Foo extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor, this);\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"main\", [_dec], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class));\n owner.register('service:main', MainService);\n owner.register('foo:main', Foo);\n var foo = owner.lookup('foo:main');\n assert.ok(foo.main instanceof _service.default, 'service injected correctly');\n }\n\n ['@test uses the decorated property key if not provided'](assert) {\n var _class3, _descriptor2;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainService extends _service.default {}\n\n var Foo = (_class3 = class Foo extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor2, this);\n }\n\n }, _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"main\", [_service.inject], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class3);\n owner.register('service:main', MainService);\n owner.register('foo:main', Foo);\n var foo = owner.lookup('foo:main');\n assert.ok(foo.main instanceof _service.default, 'service injected correctly');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('service - decorator', class extends _internalTestHelpers.AbstractTestCase {\n ['@test works with native decorators'](assert) {\n var _dec2, _class5, _descriptor3;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainService extends _service.default {}\n\n var Foo = (_dec2 = (0, _service.service)('main'), (_class5 = class Foo extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor3, this);\n }\n\n }, _descriptor3 = _applyDecoratedDescriptor(_class5.prototype, \"main\", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class5));\n owner.register('service:main', MainService);\n owner.register('foo:main', Foo);\n var foo = owner.lookup('foo:main');\n assert.ok(foo.main instanceof _service.default, 'service injected correctly');\n }\n\n ['@test uses the decorated property key if not provided'](assert) {\n var _class7, _descriptor4;\n\n var owner = (0, _internalTestHelpers.buildOwner)();\n\n class MainService extends _service.default {}\n\n var Foo = (_class7 = class Foo extends _runtime.Object {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"main\", _descriptor4, this);\n }\n\n }, _descriptor4 = _applyDecoratedDescriptor(_class7.prototype, \"main\", [_service.service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class7);\n owner.register('service:main', MainService);\n owner.register('foo:main', Foo);\n var foo = owner.lookup('foo:main');\n assert.ok(foo.main instanceof _service.default, 'service injected correctly');\n }\n\n });\n});","define(\"@ember/string/tests/camelize_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.camelize)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.camelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String camelize tests'](assert) {\n test(assert, 'my favorite items', 'myFavoriteItems', 'camelize normal string');\n test(assert, 'I Love Ramen', 'iLoveRamen', 'camelize capitalized string');\n test(assert, 'css-class-name', 'cssClassName', 'camelize dasherized string');\n test(assert, 'action_name', 'actionName', 'camelize underscored string');\n test(assert, 'action.name', 'actionName', 'camelize dot notation string');\n test(assert, 'innerHTML', 'innerHTML', 'does nothing with camelcased string');\n test(assert, 'PrivateDocs/OwnerInvoice', 'privateDocs/ownerInvoice', 'camelize namespaced classified string');\n test(assert, 'private_docs/owner_invoice', 'privateDocs/ownerInvoice', 'camelize namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'privateDocs/ownerInvoice', 'camelize namespaced dasherized string');\n }\n\n });\n});","define(\"@ember/string/tests/capitalize_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.capitalize)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.capitalize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String capitalize tests'](assert) {\n test(assert, 'my favorite items', 'My favorite items', 'capitalize normal string');\n test(assert, 'css-class-name', 'Css-class-name', 'capitalize dasherized string');\n test(assert, 'action_name', 'Action_name', 'capitalize underscored string');\n test(assert, 'innerHTML', 'InnerHTML', 'capitalize camelcased string');\n test(assert, 'Capitalized string', 'Capitalized string', 'does nothing with capitalized string');\n test(assert, 'privateDocs/ownerInvoice', 'PrivateDocs/OwnerInvoice', 'capitalize namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'Private_docs/Owner_invoice', 'capitalize namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'Private-docs/Owner-invoice', 'capitalize namespaced dasherized string');\n test(assert, 'šabc', 'Šabc', 'capitalize string with accent character');\n }\n\n });\n});","define(\"@ember/string/tests/classify_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.classify)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.classify', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String classify tests'](assert) {\n test(assert, 'my favorite items', 'MyFavoriteItems', 'classify normal string');\n test(assert, 'css-class-name', 'CssClassName', 'classify dasherized string');\n test(assert, 'action_name', 'ActionName', 'classify underscored string');\n test(assert, 'privateDocs/ownerInvoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced underscored string');\n test(assert, 'private-docs/owner-invoice', 'PrivateDocs/OwnerInvoice', 'classify namespaced dasherized string');\n test(assert, '-view-registry', '_ViewRegistry', 'classify prefixed dasherized string');\n test(assert, 'components/-text-field', 'Components/_TextField', 'classify namespaced prefixed dasherized string');\n test(assert, '_Foo_Bar', '_FooBar', 'classify underscore-prefixed underscored string');\n test(assert, '_Foo-Bar', '_FooBar', 'classify underscore-prefixed dasherized string');\n test(assert, '_foo/_bar', '_Foo/_Bar', 'classify underscore-prefixed-namespaced underscore-prefixed string');\n test(assert, '-foo/_bar', '_Foo/_Bar', 'classify dash-prefixed-namespaced underscore-prefixed string');\n test(assert, '-foo/-bar', '_Foo/_Bar', 'classify dash-prefixed-namespaced dash-prefixed string');\n test(assert, 'InnerHTML', 'InnerHTML', 'does nothing with classified string');\n test(assert, '_FooBar', '_FooBar', 'does nothing with classified prefixed string');\n }\n\n });\n});","define(\"@ember/string/tests/dasherize_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.dasherize)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.dasherize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String dasherize tests'](assert) {\n test(assert, 'my favorite items', 'my-favorite-items', 'dasherize normal string');\n test(assert, 'css-class-name', 'css-class-name', 'does nothing with dasherized string');\n test(assert, 'action_name', 'action-name', 'dasherize underscored string');\n test(assert, 'innerHTML', 'inner-html', 'dasherize camelcased string');\n test(assert, 'toString', 'to-string', 'dasherize string that is the property name of Object.prototype');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private-docs/owner-invoice', 'dasherize namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private-docs/owner-invoice', 'dasherize namespaced camelized string');\n test(assert, 'private_docs/owner_invoice', 'private-docs/owner-invoice', 'dasherize namespaced underscored string');\n }\n\n });\n});","define(\"@ember/string/tests/decamelize_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.decamelize)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.decamelize', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String decamelize tests'](assert) {\n test(assert, 'my favorite items', 'my favorite items', 'does nothing with normal string');\n test(assert, 'css-class-name', 'css-class-name', 'does nothing with dasherized string');\n test(assert, 'action_name', 'action_name', 'does nothing with underscored string');\n test(assert, 'innerHTML', 'inner_html', 'converts a camelized string into all lower case separated by underscores.');\n test(assert, 'size160Url', 'size160_url', 'decamelizes strings with numbers');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private_docs/owner_invoice', 'decamelize namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private_docs/owner_invoice', 'decamelize namespaced camelized string');\n }\n\n });\n});","define(\"@ember/string/tests/underscore_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.underscore)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.underscore', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String underscore tests'](assert) {\n test(assert, 'my favorite items', 'my_favorite_items', 'with normal string');\n test(assert, 'css-class-name', 'css_class_name', 'with dasherized string');\n test(assert, 'action_name', 'action_name', 'does nothing with underscored string');\n test(assert, 'innerHTML', 'inner_html', 'with camelcased string');\n test(assert, 'PrivateDocs/OwnerInvoice', 'private_docs/owner_invoice', 'underscore namespaced classified string');\n test(assert, 'privateDocs/ownerInvoice', 'private_docs/owner_invoice', 'underscore namespaced camelized string');\n test(assert, 'private-docs/owner-invoice', 'private_docs/owner_invoice', 'underscore namespaced dasherized string');\n }\n\n });\n});","define(\"@ember/string/tests/w_test\", [\"@ember/string\", \"internal-test-helpers\"], function (_string, _internalTestHelpers) {\n \"use strict\";\n\n /* eslint-disable qunit/no-test-expect-argument */\n function test(assert, given, expected, description) {\n assert.deepEqual((0, _string.w)(given), expected, description);\n }\n\n (0, _internalTestHelpers.moduleFor)('EmberStringUtils.w', class extends _internalTestHelpers.AbstractTestCase {\n ['@test String w tests'](assert) {\n test(assert, 'one two three', ['one', 'two', 'three'], `w('one two three') => ['one','two','three']`);\n test(assert, 'one two three', ['one', 'two', 'three'], `w('one two three') with extra spaces between words => ['one','two','three']`);\n test(assert, 'one\\ttwo three', ['one', 'two', 'three'], `w('one two three') with tabs`);\n }\n\n });\n});","define(\"ember-template-compiler/index\", [\"exports\", \"@ember/-internals/environment\", \"@ember/canary-features\", \"@glimmer/syntax\", \"ember/version\", \"require\", \"ember-template-compiler/lib/system/precompile\", \"ember-template-compiler/lib/system/compile\", \"ember-template-compiler/lib/system/compile-options\", \"ember-template-compiler/lib/plugins/index\", \"@glimmer/compiler\", \"ember-template-compiler/lib/system/bootstrap\", \"ember-template-compiler/lib/system/initializer\"], function (_exports, _environment, _canaryFeatures, _GlimmerSyntax, _version, _require, _precompile, _compile, _compileOptions, _index, _compiler, _bootstrap, _initializer) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"_preprocess\", {\n enumerable: true,\n get: function () {\n return _GlimmerSyntax.preprocess;\n }\n });\n Object.defineProperty(_exports, \"_print\", {\n enumerable: true,\n get: function () {\n return _GlimmerSyntax.print;\n }\n });\n Object.defineProperty(_exports, \"VERSION\", {\n enumerable: true,\n get: function () {\n return _version.default;\n }\n });\n Object.defineProperty(_exports, \"precompile\", {\n enumerable: true,\n get: function () {\n return _precompile.default;\n }\n });\n Object.defineProperty(_exports, \"compile\", {\n enumerable: true,\n get: function () {\n return _compile.default;\n }\n });\n Object.defineProperty(_exports, \"compileOptions\", {\n enumerable: true,\n get: function () {\n return _compileOptions.default;\n }\n });\n Object.defineProperty(_exports, \"_buildCompileOptions\", {\n enumerable: true,\n get: function () {\n return _compileOptions.buildCompileOptions;\n }\n });\n Object.defineProperty(_exports, \"_transformsFor\", {\n enumerable: true,\n get: function () {\n return _compileOptions.transformsFor;\n }\n });\n Object.defineProperty(_exports, \"RESOLUTION_MODE_TRANSFORMS\", {\n enumerable: true,\n get: function () {\n return _index.RESOLUTION_MODE_TRANSFORMS;\n }\n });\n Object.defineProperty(_exports, \"STRICT_MODE_TRANSFORMS\", {\n enumerable: true,\n get: function () {\n return _index.STRICT_MODE_TRANSFORMS;\n }\n });\n Object.defineProperty(_exports, \"_precompile\", {\n enumerable: true,\n get: function () {\n return _compiler.precompile;\n }\n });\n _exports._GlimmerSyntax = _exports._Ember = void 0;\n _exports._GlimmerSyntax = _GlimmerSyntax;\n\n var _Ember;\n\n _exports._Ember = _Ember;\n\n try {\n // tslint:disable-next-line: no-require-imports\n _exports._Ember = _Ember = (0, _require.default)(\"ember\");\n } catch (e) {\n _exports._Ember = _Ember = {\n ENV: _environment.ENV,\n FEATURES: _canaryFeatures.FEATURES,\n VERSION: _version.default\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-against-attrs\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\"], function (_exports, _debug, _calculateLocationDisplay) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertAgainstAttrs;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that asserts against\n \n ```handlebars\n {{attrs.foo.bar}}\n ```\n \n ...as well as `{{#if attrs.foo}}`, `{{deeply (nested attrs.foobar.baz)}}`.\n \n @private\n @class AssertAgainstAttrs\n */\n function assertAgainstAttrs(env) {\n var _a;\n\n var {\n builders: b\n } = env.syntax;\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n var stack = [[]];\n\n function updateBlockParamsStack(blockParams) {\n var parent = stack[stack.length - 1];\n stack.push(parent.concat(blockParams));\n }\n\n return {\n name: 'assert-against-attrs',\n visitor: {\n Program: {\n enter(node) {\n updateBlockParamsStack(node.blockParams);\n },\n\n exit() {\n stack.pop();\n }\n\n },\n ElementNode: {\n enter(node) {\n updateBlockParamsStack(node.blockParams);\n },\n\n exit() {\n stack.pop();\n }\n\n },\n\n PathExpression(node) {\n if (isAttrs(node, stack[stack.length - 1])) {\n var path = b.path(node.original.substr(6));\n (true && !(node.this !== false) && (0, _debug.assert)(`Using {{attrs}} to reference named arguments is not supported. {{attrs.${path.original}}} should be updated to {{@${path.original}}}. ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`, node.this !== false));\n }\n }\n\n }\n };\n }\n\n function isAttrs(node, symbols) {\n var name = node.parts[0];\n\n if (symbols.indexOf(name) !== -1) {\n return false;\n }\n\n if (name === 'attrs') {\n if (node.this === true) {\n node.parts.shift();\n node.original = node.original.slice(5);\n }\n\n return true;\n }\n\n return false;\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-against-dynamic-helpers-modifiers\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _debug, _calculateLocationDisplay, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertAgainstDynamicHelpersModifiers;\n\n function assertAgainstDynamicHelpersModifiers(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n var {\n hasLocal,\n node\n } = (0, _utils.trackLocals)();\n return {\n name: 'assert-against-dynamic-helpers-modifiers',\n visitor: {\n Program: node,\n ElementNode: {\n keys: {\n children: node\n }\n },\n\n MustacheStatement(node) {\n if ((0, _utils.isPath)(node.path)) {\n var name = node.path.parts[0];\n (true && !(name !== 'helper' && name !== 'modifier' || isLocalVariable(node.path, hasLocal)) && (0, _debug.assert)(`${messageFor(name)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`, name !== 'helper' && name !== 'modifier' || isLocalVariable(node.path, hasLocal)));\n }\n },\n\n SubExpression(node) {\n if ((0, _utils.isPath)(node.path)) {\n var name = node.path.parts[0];\n (true && !(name !== 'helper' && name !== 'modifier' || isLocalVariable(node.path, hasLocal)) && (0, _debug.assert)(`${messageFor(name)} ${(0, _calculateLocationDisplay.default)(moduleName, node.loc)}`, name !== 'helper' && name !== 'modifier' || isLocalVariable(node.path, hasLocal)));\n }\n }\n\n }\n };\n }\n\n function isLocalVariable(node, hasLocal) {\n return !node.this && node.parts.length === 1 && hasLocal(node.parts[0]);\n }\n\n function messageFor(name) {\n return `Cannot use the (${name}) keyword yet, as it has not been implemented.`;\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-against-named-blocks\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\"], function (_exports, _debug, _calculateLocationDisplay) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertAgainstNamedBlocks;\n\n /**\n @module ember\n */\n\n /**\n Prevents usage of named blocks\n \n @private\n @class AssertAgainstNamedBlocks\n */\n function assertAgainstNamedBlocks(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n return {\n name: 'assert-against-named-blocks',\n visitor: {\n ElementNode(node) {\n if (node.tag[0] === ':') {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n (true && !(false) && (0, _debug.assert)(`Named blocks are not currently available, attempted to use the <${node.tag}> named block. ${sourceInformation}`));\n }\n },\n\n MustacheStatement(node) {\n if (node.path.type === 'PathExpression' && node.path.original === 'yield') {\n var to = node.hash.pairs.filter(pair => pair.key === 'to')[0]; // Glimmer template compiler ensures yield must receive a string literal,\n // so we only need to check if it is not \"default\" or \"inverse\"\n\n if (to && to.value.type === 'StringLiteral' && to.value.original !== 'default' && to.value.original !== 'inverse') {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n (true && !(false) && (0, _debug.assert)(`Named blocks are not currently available, attempted to yield to a named block other than \"default\" or \"inverse\": {{yield to=\"${to.value.original}\"}}. ${sourceInformation}`));\n }\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-against-named-outlets\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\"], function (_exports, _debug, _calculateLocationDisplay) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertAgainstNamedOutlets;\n\n /**\n @module ember\n */\n\n /**\n Prevents usage of named outlets, a legacy concept in Ember removed in 4.0.\n \n @private\n @class AssertAgainstNamedOutlets\n */\n function assertAgainstNamedOutlets(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n return {\n name: 'assert-against-named-outlets',\n visitor: {\n MustacheStatement(node) {\n if (node.path.type === 'PathExpression' && node.path.original === 'outlet' && node.params[0]) {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n (true && !(false) && (0, _debug.assert)(`Named outlets were removed in Ember 4.0. See https://deprecations.emberjs.com/v3.x#toc_route-render-template for guidance on alternative APIs for named outlet use cases. ${sourceInformation}`));\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-input-helper-without-block\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _debug, _calculateLocationDisplay, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = errorOnInputWithContent;\n\n function errorOnInputWithContent(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n return {\n name: 'assert-input-helper-without-block',\n visitor: {\n BlockStatement(node) {\n if ((0, _utils.isPath)(node.path) && node.path.original === 'input') {\n (true && !(false) && (0, _debug.assert)(assertMessage(moduleName, node)));\n }\n }\n\n }\n };\n }\n\n function assertMessage(moduleName, node) {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n return `The {{input}} helper cannot be used in block form. ${sourceInformation}`;\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-reserved-named-arguments\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\"], function (_exports, _debug, _calculateLocationDisplay) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertReservedNamedArguments;\n\n function assertReservedNamedArguments(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n return {\n name: 'assert-reserved-named-arguments',\n visitor: {\n // In general, we don't assert on the invocation side to avoid creating migration\n // hazards (e.g. using angle bracket to invoke a classic component that uses\n // `this.someReservedName`. However, we want to avoid leaking special internal\n // things, such as `__ARGS__`, so those would need to be asserted on both sides.\n AttrNode({\n name,\n loc\n }) {\n if (name === '@__ARGS__') {\n (true && !(false) && (0, _debug.assert)(`${assertMessage(name)} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`));\n }\n },\n\n HashPair({\n key,\n loc\n }) {\n if (key === '__ARGS__') {\n (true && !(false) && (0, _debug.assert)(`${assertMessage(key)} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`));\n }\n },\n\n PathExpression({\n original,\n loc\n }) {\n if (isReserved(original)) {\n (true && !(false) && (0, _debug.assert)(`${assertMessage(original)} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`));\n }\n }\n\n }\n };\n }\n\n var RESERVED = ['@arguments', '@args', '@block', '@else'];\n\n function isReserved(name) {\n return RESERVED.indexOf(name) !== -1 || Boolean(name.match(/^@[^a-z]/));\n }\n\n function assertMessage(name) {\n return `'${name}' is reserved.`;\n }\n});","define(\"ember-template-compiler/lib/plugins/assert-splattribute-expression\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/system/calculate-location-display\"], function (_exports, _debug, _calculateLocationDisplay) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = assertSplattributeExpressions;\n\n function assertSplattributeExpressions(env) {\n var _a;\n\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n return {\n name: 'assert-splattribute-expressions',\n visitor: {\n PathExpression({\n original,\n loc\n }) {\n if (original === '...attributes') {\n (true && !(false) && (0, _debug.assert)(`${errorMessage()} ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`));\n }\n }\n\n }\n };\n }\n\n function errorMessage() {\n return '`...attributes` can only be used in the element position e.g. `
`. It cannot be used as a path.';\n }\n});","define(\"ember-template-compiler/lib/plugins/index\", [\"exports\", \"ember-template-compiler/lib/plugins/assert-against-attrs\", \"ember-template-compiler/lib/plugins/assert-against-dynamic-helpers-modifiers\", \"ember-template-compiler/lib/plugins/assert-against-named-blocks\", \"ember-template-compiler/lib/plugins/assert-against-named-outlets\", \"ember-template-compiler/lib/plugins/assert-input-helper-without-block\", \"ember-template-compiler/lib/plugins/assert-reserved-named-arguments\", \"ember-template-compiler/lib/plugins/assert-splattribute-expression\", \"ember-template-compiler/lib/plugins/transform-action-syntax\", \"ember-template-compiler/lib/plugins/transform-each-in-into-each\", \"ember-template-compiler/lib/plugins/transform-each-track-array\", \"ember-template-compiler/lib/plugins/transform-in-element\", \"ember-template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings\", \"ember-template-compiler/lib/plugins/transform-resolutions\", \"ember-template-compiler/lib/plugins/transform-wrap-mount-and-outlet\"], function (_exports, _assertAgainstAttrs, _assertAgainstDynamicHelpersModifiers, _assertAgainstNamedBlocks, _assertAgainstNamedOutlets, _assertInputHelperWithoutBlock, _assertReservedNamedArguments, _assertSplattributeExpression, _transformActionSyntax, _transformEachInIntoEach, _transformEachTrackArray, _transformInElement, _transformQuotedBindingsIntoJustBindings, _transformResolutions, _transformWrapMountAndOutlet) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.STRICT_MODE_TRANSFORMS = _exports.RESOLUTION_MODE_TRANSFORMS = void 0;\n // order of plugins is important\n var RESOLUTION_MODE_TRANSFORMS = Object.freeze([_transformQuotedBindingsIntoJustBindings.default, _assertReservedNamedArguments.default, _transformActionSyntax.default, _assertAgainstAttrs.default, _transformEachInIntoEach.default, _assertInputHelperWithoutBlock.default, _transformInElement.default, _assertSplattributeExpression.default, _transformEachTrackArray.default, _assertAgainstNamedOutlets.default, _transformWrapMountAndOutlet.default, !true\n /* EMBER_NAMED_BLOCKS */\n ? _assertAgainstNamedBlocks.default : null, true\n /* EMBER_DYNAMIC_HELPERS_AND_MODIFIERS */\n ? _transformResolutions.default : _assertAgainstDynamicHelpersModifiers.default].filter(notNull));\n _exports.RESOLUTION_MODE_TRANSFORMS = RESOLUTION_MODE_TRANSFORMS;\n var STRICT_MODE_TRANSFORMS = Object.freeze([_transformQuotedBindingsIntoJustBindings.default, _assertReservedNamedArguments.default, _transformActionSyntax.default, _transformEachInIntoEach.default, _transformInElement.default, _assertSplattributeExpression.default, _transformEachTrackArray.default, _assertAgainstNamedOutlets.default, _transformWrapMountAndOutlet.default, !true\n /* EMBER_NAMED_BLOCKS */\n ? _assertAgainstNamedBlocks.default : null, !true\n /* EMBER_DYNAMIC_HELPERS_AND_MODIFIERS */\n ? _assertAgainstDynamicHelpersModifiers.default : null].filter(notNull));\n _exports.STRICT_MODE_TRANSFORMS = STRICT_MODE_TRANSFORMS;\n\n function notNull(value) {\n return value !== null;\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-action-syntax\", [\"exports\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformActionSyntax;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n \n \n \n ```\n \n with\n \n ```handlebars\n \n \n \n ```\n \n @private\n @class TransformActionSyntax\n */\n function transformActionSyntax({\n syntax\n }) {\n var {\n builders: b\n } = syntax;\n return {\n name: 'transform-action-syntax',\n visitor: {\n ElementModifierStatement(node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n },\n\n MustacheStatement(node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n },\n\n SubExpression(node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n }\n\n }\n };\n }\n\n function isAction(node) {\n return (0, _utils.isPath)(node.path) && node.path.original === 'action';\n }\n\n function insertThisAsFirstParam(node, builders) {\n node.params.unshift(builders.path('this'));\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-each-in-into-each\", [\"exports\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformEachInIntoEach;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{#each-in iterableThing as |key value|}}\n ```\n \n with\n \n ```handlebars\n {{#each (-each-in iterableThing) as |value key|}}\n ```\n \n @private\n @class TransformHasBlockSyntax\n */\n function transformEachInIntoEach(env) {\n var {\n builders: b\n } = env.syntax;\n return {\n name: 'transform-each-in-into-each',\n visitor: {\n BlockStatement(node) {\n if ((0, _utils.isPath)(node.path) && node.path.original === 'each-in') {\n node.params[0] = b.sexpr(b.path('-each-in'), [node.params[0]]);\n var blockParams = node.program.blockParams;\n\n if (!blockParams || blockParams.length === 0) {// who uses {{#each-in}} without block params?!\n } else if (blockParams.length === 1) {\n // insert a dummy variable for the first slot\n // pick a name that won't parse so it won't shadow any real variables\n blockParams = ['( unused value )', blockParams[0]];\n } else {\n var key = blockParams.shift();\n var value = blockParams.shift();\n blockParams = [value, key, ...blockParams];\n }\n\n node.program.blockParams = blockParams;\n return b.block(b.path('each'), node.params, node.hash, node.program, node.inverse, node.loc);\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-each-track-array\", [\"exports\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformEachTrackArray;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{#each iterableThing as |key value|}}\n ```\n \n with\n \n ```handlebars\n {{#each (-track-array iterableThing) as |key value|}}\n ```\n \n @private\n @class TransformHasBlockSyntax\n */\n function transformEachTrackArray(env) {\n var {\n builders: b\n } = env.syntax;\n return {\n name: 'transform-each-track-array',\n visitor: {\n BlockStatement(node) {\n if ((0, _utils.isPath)(node.path) && node.path.original === 'each') {\n var firstParam = node.params[0];\n\n if (firstParam.type === 'SubExpression' && firstParam.path.type === 'PathExpression' && firstParam.path.original === '-each-in') {\n return;\n }\n\n node.params[0] = b.sexpr(b.path('-track-array'), [node.params[0]]);\n return b.block(b.path('each'), node.params, node.hash, node.program, node.inverse, node.loc);\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-in-element\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _debug, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformInElement;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that handles the public `{{in-element}}` as per RFC287.\n \n Issues a build time assertion for:\n \n ```handlebars\n {{#in-element someElement insertBefore=\"some-none-null-value\"}}\n {{modal-display text=text}}\n {{/in-element}}\n ```\n \n @private\n @class TransformInElement\n */\n function transformInElement(env) {\n var {\n builders: b\n } = env.syntax;\n return {\n name: 'transform-in-element',\n visitor: {\n BlockStatement(node) {\n if (!(0, _utils.isPath)(node.path)) return;\n\n if (node.path.original === 'in-element') {\n var originalValue = node.params[0];\n\n if (originalValue && !env.isProduction) {\n var subExpr = b.sexpr('-in-el-null', [originalValue]);\n node.params.shift();\n node.params.unshift(subExpr);\n }\n\n node.hash.pairs.forEach(pair => {\n if (pair.key === 'insertBefore') {\n (true && !(pair.value.type === 'NullLiteral' || pair.value.type === 'UndefinedLiteral') && (0, _debug.assert)(`Can only pass null to insertBefore in in-element, received: ${JSON.stringify(pair.value)}`, pair.value.type === 'NullLiteral' || pair.value.type === 'UndefinedLiteral'));\n }\n });\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-quoted-bindings-into-just-bindings\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformQuotedBindingsIntoJustBindings;\n\n function transformQuotedBindingsIntoJustBindings()\n /* env */\n {\n return {\n name: 'transform-quoted-bindings-into-just-bindings',\n visitor: {\n ElementNode(node) {\n var styleAttr = getStyleAttr(node);\n\n if (!validStyleAttr(styleAttr)) {\n return;\n }\n\n styleAttr.value = styleAttr.value.parts[0];\n }\n\n }\n };\n }\n\n function validStyleAttr(attr) {\n if (!attr) {\n return false;\n }\n\n var value = attr.value;\n\n if (!value || value.type !== 'ConcatStatement' || value.parts.length !== 1) {\n return false;\n }\n\n var onlyPart = value.parts[0];\n return onlyPart.type === 'MustacheStatement';\n }\n\n function getStyleAttr(node) {\n var attributes = node.attributes;\n\n for (var i = 0; i < attributes.length; i++) {\n if (attributes[i].name === 'style') {\n return attributes[i];\n }\n }\n\n return undefined;\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-resolutions\", [\"exports\", \"@ember/debug\", \"@glimmer/syntax\", \"ember-template-compiler/lib/system/calculate-location-display\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _debug, _syntax, _calculateLocationDisplay, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformResolutions;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{helper \"...\" ...}}\n ```\n \n with\n \n ```handlebars\n {{helper (-resolve \"helper:...\") ...}}\n ```\n \n and\n \n ```handlebars\n {{helper ... ...}}\n ```\n \n with\n \n ```handlebars\n {{helper (-disallow-dynamic-resolution ...) ...}}\n ```\n \n and\n \n ```handlebars\n {{modifier \"...\" ...}}\n ```\n \n with\n \n ```handlebars\n {{modifier (-resolve \"modifier:...\") ...}}\n ```\n and\n \n ```handlebars\n {{modifier ... ...}}\n ```\n \n with\n \n ```handlebars\n {{modifier (-disallow-dynamic-resolution ...) ...}}\n ```\n \n @private\n @class TransformResolutions\n */\n var TARGETS = Object.freeze(['helper', 'modifier']);\n\n function transformResolutions(env) {\n var _a;\n\n var {\n builders: b\n } = env.syntax;\n var moduleName = (_a = env.meta) === null || _a === void 0 ? void 0 : _a.moduleName;\n var {\n hasLocal,\n node: tracker\n } = (0, _utils.trackLocals)();\n var seen;\n return {\n name: 'transform-resolutions',\n visitor: {\n Template: {\n enter() {\n seen = new Set();\n },\n\n exit() {\n seen = undefined;\n }\n\n },\n Block: tracker,\n ElementNode: {\n keys: {\n children: tracker\n }\n },\n\n MustacheStatement(node) {\n (true && !(seen) && (0, _debug.assert)('[BUG] seen set should be available', seen));\n\n if (seen.has(node)) {\n return;\n }\n\n if ((0, _utils.isPath)(node.path) && !isLocalVariable(node.path, hasLocal) && TARGETS.indexOf(node.path.original) !== -1) {\n var result = b.mustache(node.path, transformParams(b, node.params, node.path.original, moduleName, node.loc), node.hash, node.trusting, node.loc, node.strip); // Avoid double/infinite-processing\n\n seen.add(result);\n return result;\n }\n },\n\n SubExpression(node) {\n (true && !(seen) && (0, _debug.assert)('[BUG] seen set should be available', seen));\n\n if (seen.has(node)) {\n return;\n }\n\n if ((0, _utils.isPath)(node.path) && !isLocalVariable(node.path, hasLocal) && TARGETS.indexOf(node.path.original) !== -1) {\n var result = b.sexpr(node.path, transformParams(b, node.params, node.path.original, moduleName, node.loc), node.hash, node.loc); // Avoid double/infinite-processing\n\n seen.add(result);\n return result;\n }\n }\n\n }\n };\n }\n\n function isLocalVariable(node, hasLocal) {\n return !node.this && node.parts.length === 1 && hasLocal(node.parts[0]);\n }\n\n function transformParams(b, params, type, moduleName, loc) {\n var [first, ...rest] = params;\n (true && !(first) && (0, _debug.assert)(`The ${type} keyword requires at least one positional arguments ${(0, _calculateLocationDisplay.default)(moduleName, loc)}`, first));\n\n if ((0, _utils.isStringLiteral)(first)) {\n return [b.sexpr(b.path('-resolve', first.loc), [b.string(`${type}:${first.value}`)], undefined, first.loc), ...rest];\n } else if (true\n /* DEBUG */\n ) {\n return [b.sexpr(b.path('-disallow-dynamic-resolution', first.loc), [first], b.hash([b.pair('type', b.string(type), first.loc), b.pair('loc', b.string((0, _calculateLocationDisplay.default)(moduleName, loc)), first.loc), b.pair('original', b.string((0, _syntax.print)(first)))]), first.loc), ...rest];\n } else {\n return params;\n }\n }\n});","define(\"ember-template-compiler/lib/plugins/transform-wrap-mount-and-outlet\", [\"exports\", \"ember-template-compiler/lib/plugins/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = transformWrapMountAndOutlet;\n\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{mount \"engine\" model=this.model}}\n ```\n \n with\n \n ```handlebars\n {{component (-mount \"engine\" model=this.model)}}\n ```\n \n and\n \n ```handlebars\n {{outlet}}\n ```\n \n with\n \n ```handlebars\n {{component (-outlet)}}\n ```\n \n @private\n @class TransformHasBlockSyntax\n */\n function transformWrapMountAndOutlet(env) {\n var {\n builders: b\n } = env.syntax;\n var {\n hasLocal,\n node\n } = (0, _utils.trackLocals)();\n return {\n name: 'transform-wrap-mount-and-outlet',\n visitor: {\n Program: node,\n ElementNode: node,\n\n MustacheStatement(node) {\n if ((0, _utils.isPath)(node.path) && (node.path.original === 'mount' || node.path.original === 'outlet') && !hasLocal(node.path.original)) {\n var subexpression = b.sexpr(b.path(`-${node.path.original}`), node.params, node.hash, node.loc);\n return b.mustache(b.path('component'), [subexpression], b.hash(), undefined, node.loc);\n }\n }\n\n }\n };\n }\n});","define(\"ember-template-compiler/lib/plugins/utils\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.isPath = isPath;\n _exports.isSubExpression = isSubExpression;\n _exports.isStringLiteral = isStringLiteral;\n _exports.trackLocals = trackLocals;\n\n function isPath(node) {\n return node.type === 'PathExpression';\n }\n\n function isSubExpression(node) {\n return node.type === 'SubExpression';\n }\n\n function isStringLiteral(node) {\n return node.type === 'StringLiteral';\n }\n\n function trackLocals() {\n var locals = new Map();\n var node = {\n enter(node) {\n for (var param of node.blockParams) {\n var value = locals.get(param) || 0;\n locals.set(param, value + 1);\n }\n },\n\n exit(node) {\n for (var param of node.blockParams) {\n var value = locals.get(param) - 1;\n\n if (value === 0) {\n locals.delete(param);\n } else {\n locals.set(param, value);\n }\n }\n }\n\n };\n return {\n hasLocal: key => locals.has(key),\n node\n };\n }\n});","define(\"ember-template-compiler/lib/system/bootstrap\", [\"exports\", \"ember-template-compiler/lib/system/compile\"], function (_exports, _compile) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n /**\n @module ember\n */\n\n /**\n Find templates stored in the head tag as script tags and make them available\n to `Ember.CoreView` in the global `Ember.TEMPLATES` object.\n \n Script tags with `text/x-handlebars` will be compiled\n with Ember's template compiler and are suitable for use as a view's template.\n \n @private\n @method bootstrap\n @for Ember.HTMLBars\n @static\n @param ctx\n */\n function bootstrap({\n context,\n hasTemplate,\n setTemplate\n }) {\n if (!context) {\n context = document;\n }\n\n var selector = 'script[type=\"text/x-handlebars\"]';\n var elements = context.querySelectorAll(selector);\n\n for (var i = 0; i < elements.length; i++) {\n var script = elements[i]; // Get the name of the script\n // First look for data-template-name attribute, then fall back to its\n // id if no name is found.\n\n var templateName = script.getAttribute('data-template-name') || script.getAttribute('id') || 'application';\n var template = void 0;\n template = (0, _compile.default)(script.innerHTML, {\n moduleName: templateName\n }); // Check if template of same name already exists.\n\n if (hasTemplate(templateName)) {\n throw new Error(`Template named \"${templateName}\" already exists.`);\n } // For templates which have a name, we save them and then remove them from the DOM.\n\n\n setTemplate(templateName, template); // Remove script tag from DOM.\n\n script.parentNode.removeChild(script);\n }\n }\n\n var _default = bootstrap;\n _exports.default = _default;\n});","define(\"ember-template-compiler/lib/system/calculate-location-display\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = calculateLocationDisplay;\n\n function calculateLocationDisplay(moduleName, loc) {\n var moduleInfo = '';\n\n if (moduleName) {\n moduleInfo += `'${moduleName}' `;\n }\n\n if (loc) {\n var {\n column,\n line\n } = loc.start || {\n line: undefined,\n column: undefined\n };\n\n if (line !== undefined && column !== undefined) {\n if (moduleName) {\n // only prepend @ if the moduleName was present\n moduleInfo += '@ ';\n }\n\n moduleInfo += `L${line}:C${column}`;\n }\n }\n\n if (moduleInfo) {\n moduleInfo = `(${moduleInfo}) `;\n }\n\n return moduleInfo;\n }\n});","define(\"ember-template-compiler/lib/system/compile-options\", [\"exports\", \"@ember/debug\", \"ember-template-compiler/lib/plugins/index\", \"ember-template-compiler/lib/system/dasherize-component-name\"], function (_exports, _debug, _index, _dasherizeComponentName) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.buildCompileOptions = buildCompileOptions;\n _exports.transformsFor = transformsFor;\n _exports.default = compileOptions;\n var USER_PLUGINS = [];\n\n function malformedComponentLookup(string) {\n return string.indexOf('::') === -1 && string.indexOf(':') > -1;\n }\n\n function buildCompileOptions(_options) {\n var moduleName = _options.moduleName;\n var options = Object.assign({\n meta: {},\n isProduction: false,\n plugins: {\n ast: []\n }\n }, _options, {\n moduleName,\n\n customizeComponentName(tagname) {\n (true && !(!malformedComponentLookup(tagname)) && (0, _debug.assert)(`You tried to invoke a component named <${tagname} /> in \"${moduleName !== null && moduleName !== void 0 ? moduleName : '[NO MODULE]'}\", but that is not a valid name for a component. Did you mean to use the \"::\" syntax for nested components?`, !malformedComponentLookup(tagname)));\n return _dasherizeComponentName.default.get(tagname);\n }\n\n });\n\n if (!true\n /* EMBER_STRICT_MODE */\n ) {\n options.strictMode = false;\n options.locals = undefined;\n }\n\n if ('locals' in options && !options.locals) {\n // Glimmer's precompile options declare `locals` like:\n // locals?: string[]\n // but many in-use versions of babel-plugin-htmlbars-inline-precompile will\n // set locals to `null`. This used to work but only because glimmer was\n // ignoring locals for non-strict templates, and now it supports that case.\n delete options.locals;\n } // move `moduleName` into `meta` property\n\n\n if (options.moduleName) {\n var meta = options.meta;\n (true && !(meta) && (0, _debug.assert)('has meta', meta)); // We just set it\n\n meta.moduleName = options.moduleName;\n }\n\n return options;\n }\n\n function transformsFor(options) {\n return true\n /* EMBER_STRICT_MODE */\n && options.strictMode ? _index.STRICT_MODE_TRANSFORMS : _index.RESOLUTION_MODE_TRANSFORMS;\n }\n\n function compileOptions(_options = {}) {\n var options = buildCompileOptions(_options);\n var builtInPlugins = transformsFor(options);\n\n if (!_options.plugins) {\n options.plugins = {\n ast: [...USER_PLUGINS, ...builtInPlugins]\n };\n } else {\n var potententialPugins = [...USER_PLUGINS, ...builtInPlugins];\n (true && !(options.plugins) && (0, _debug.assert)('expected plugins', options.plugins));\n var pluginsToAdd = potententialPugins.filter(plugin => {\n (true && !(options.plugins) && (0, _debug.assert)('expected plugins', options.plugins));\n return options.plugins.ast.indexOf(plugin) === -1;\n });\n options.plugins.ast = options.plugins.ast.concat(pluginsToAdd);\n }\n\n return options;\n }\n});","define(\"ember-template-compiler/lib/system/compile\", [\"exports\", \"require\", \"ember-template-compiler/lib/system/precompile\"], function (_exports, _require, _precompile) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = compile;\n\n /**\n @module ember\n */\n var template;\n /**\n Uses HTMLBars `compile` function to process a string into a compiled template.\n This is not present in production builds.\n @private\n @method compile\n @param {String} templateString This is the string to be compiled by HTMLBars.\n @param {Object} options This is an options hash to augment the compiler options.\n */\n\n function compile(templateString, options = {}) {\n if (!template && (0, _require.has)('@ember/-internals/glimmer')) {\n // tslint:disable-next-line:no-require-imports\n template = (0, _require.default)(\"@ember/-internals/glimmer\").template;\n }\n\n if (!template) {\n throw new Error('Cannot call `compile` with only the template compiler loaded. Please load `ember.debug.js` or `ember.prod.js` prior to calling `compile`.');\n }\n\n return template(evaluate((0, _precompile.default)(templateString, options)));\n }\n\n function evaluate(precompiled) {\n return new Function(`return ${precompiled}`)();\n }\n});","define(\"ember-template-compiler/lib/system/dasherize-component-name\", [\"exports\", \"@ember/-internals/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n /*\n This diverges from `Ember.String.dasherize` so that` ` can resolve to `x-foo`.\n `Ember.String.dasherize` would resolve it to `xfoo`..\n */\n var SIMPLE_DASHERIZE_REGEXP = /[A-Z]|::/g;\n var ALPHA = /[A-Za-z0-9]/;\n\n var _default = new _utils.Cache(1000, key => key.replace(SIMPLE_DASHERIZE_REGEXP, (char, index) => {\n if (char === '::') {\n return '/';\n }\n\n if (index === 0 || !ALPHA.test(key[index - 1])) {\n return char.toLowerCase();\n }\n\n return `-${char.toLowerCase()}`;\n }));\n\n _exports.default = _default;\n});","define(\"ember-template-compiler/lib/system/initializer\", [\"require\", \"ember-template-compiler/lib/system/bootstrap\"], function (_require, _bootstrap) {\n \"use strict\";\n\n // Globals mode template compiler\n if ((0, _require.has)('@ember/application') && (0, _require.has)('@ember/-internals/browser-environment') && (0, _require.has)('@ember/-internals/glimmer')) {\n // tslint:disable:no-require-imports\n var emberEnv = (0, _require.default)(\"@ember/-internals/browser-environment\");\n var emberGlimmer = (0, _require.default)(\"@ember/-internals/glimmer\");\n var emberApp = (0, _require.default)(\"@ember/application\");\n var Application = emberApp.default;\n var {\n hasTemplate,\n setTemplate\n } = emberGlimmer;\n var {\n hasDOM\n } = emberEnv;\n Application.initializer({\n name: 'domTemplates',\n\n initialize() {\n if (hasDOM) {\n (0, _bootstrap.default)({\n context: document,\n hasTemplate,\n setTemplate\n });\n }\n }\n\n });\n }\n});","define(\"ember-template-compiler/lib/system/precompile\", [\"exports\", \"@glimmer/compiler\", \"ember-template-compiler/lib/system/compile-options\"], function (_exports, _compiler, _compileOptions) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = precompile;\n\n /**\n @module ember\n */\n\n /**\n Uses HTMLBars `compile` function to process a string into a compiled template string.\n The returned string must be passed through `Ember.HTMLBars.template`.\n \n This is not present in production builds.\n \n @private\n @method precompile\n @param {String} templateString This is the string to be compiled by HTMLBars.\n */\n function precompile(templateString, options = {}) {\n return (0, _compiler.precompile)(templateString, (0, _compileOptions.default)(options));\n }\n});","define(\"ember-template-compiler/tests/basic-usage-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n function removeDataTest() {\n return {\n name: 'remove-data-test',\n visitor: {\n ElementNode(node) {\n for (var i = 0; i < node.attributes.length; i++) {\n var attribute = node.attributes[i];\n\n if (attribute.name === 'data-test') {\n node.attributes.splice(i, 1);\n }\n }\n }\n\n }\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: Embroider-like compilation', class extends _internalTestHelpers.RenderingTestCase {\n '@test can process a subset of AST plugins and print'(assert) {\n var template = '
'; // build up options including strictMode default values, customizeComponentName, meta.moduleName, etc\n\n var options = (0, _index._buildCompileOptions)({\n mode: 'codemod',\n moduleName: 'components/foo',\n plugins: {\n ast: [removeDataTest]\n }\n });\n var transformedTemplateAST = (0, _index._preprocess)(template, options); // print back to a handlebars string\n\n var result = (0, _index._print)(transformedTemplateAST, {\n entityEncoding: 'raw'\n });\n assert.equal(result, '
');\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-against-attrs-test\", [\"ember-template-compiler/tests/utils/transform-test-case\", \"internal-test-helpers\"], function (_transformTestCase, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert against attrs', class extends _transformTestCase.default {\n ['@test it asserts against attrs']() {\n expectAssertion(() => {\n this.assertTransformed(`{{attrs.foo}}`, `{{attrs.foo}}`);\n }, /Using {{attrs}} to reference named arguments is not supported. {{attrs.foo}} should be updated to {{@foo}}./);\n expectAssertion(() => {\n this.assertTransformed(`{{attrs.foo.bar}}`, `{{attrs.foo.bar}}`);\n }, /Using {{attrs}} to reference named arguments is not supported. {{attrs.foo.bar}} should be updated to {{@foo.bar}}./);\n expectAssertion(() => {\n this.assertTransformed(`{{if attrs.foo \"foo\"}}`, `{{if attrs.foo \"foo\"}}`);\n }, /Using {{attrs}} to reference named arguments is not supported. {{attrs.foo}} should be updated to {{@foo}}./);\n expectAssertion(() => {\n this.assertTransformed(`{{#if attrs.foo}}{{/if}}`, `{{#if attrs.foo}}{{/if}}`);\n }, /Using {{attrs}} to reference named arguments is not supported. {{attrs.foo}} should be updated to {{@foo}}./);\n expectAssertion(() => {\n this.assertTransformed(`{{deeply (nested attrs.foo.bar)}}`, `{{deeply (nested attrs.foo.bar)}}`);\n }, /Using {{attrs}} to reference named arguments is not supported. {{attrs.foo.bar}} should be updated to {{@foo.bar}}./);\n }\n\n ['@test it does not assert against this.attrs']() {\n this.assertTransformed(`{{this.attrs.foo}}`, `{{this.attrs.foo}}`);\n this.assertTransformed(`{{if this.attrs.foo \"foo\"}}`, `{{if this.attrs.foo \"foo\"}}`);\n this.assertTransformed(`{{#if this.attrs.foo}}{{/if}}`, `{{#if this.attrs.foo}}{{/if}}`);\n this.assertTransformed(`{{deeply (nested this.attrs.foo.bar)}}`, `{{deeply (nested this.attrs.foo.bar)}}`);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: not asserting against block params named \"attrs\"', class extends _internalTestHelpers.RenderingTestCase {\n [\"@test it doesn't assert block params\"]() {\n this.registerComponent('foo', {\n template: '{{#let \"foo\" as |attrs|}}{{attrs}}{{/let}}'\n });\n this.render(' ');\n this.assertComponentElement(this.firstChild, {\n content: 'foo'\n });\n }\n\n [\"@test it doesn't assert component block params\"]() {\n this.registerComponent('foo', {\n template: '{{yield \"foo\"}}'\n });\n this.render('{{attrs}} ');\n this.assertComponentElement(this.firstChild, {\n content: 'foo'\n });\n }\n\n [\"@test it doesn't assert block params with nested keys\"]() {\n this.registerComponent('foo', {\n template: '{{yield (hash bar=\"baz\")}}'\n });\n this.render('{{attrs.bar}} ');\n this.assertComponentElement(this.firstChild, {\n content: 'baz'\n });\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-against-named-blocks-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-against-named-blocks', class extends _internalTestHelpers.AbstractTestCase {\n [`@feature(EMBER_NAMED_BLOCKS) is disabled when feature flag is enabled`](assert) {\n assert.expect(0);\n (0, _index.compile)(`<:named> `, {\n moduleName: 'baz/foo-bar'\n });\n (0, _index.compile)(`{{yield to=\"bar\"}}`, {\n moduleName: 'baz/bar-baz'\n });\n }\n\n [`@feature(!EMBER_NAMED_BLOCKS) is enabled when feature flag is disabled`]() {\n expectAssertion(() => {\n (0, _index.compile)(`<:named> `, {\n moduleName: 'baz/foo-bar'\n });\n }, `Named blocks are not currently available, attempted to use the <:named> named block. ('baz/foo-bar' @ L1:C5) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{yield to=\"bar\"}}`, {\n moduleName: 'baz/bar-baz'\n });\n }, `Named blocks are not currently available, attempted to yield to a named block other than \"default\" or \"inverse\": {{yield to=\"bar\"}}. ('baz/bar-baz' @ L1:C0) `);\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-against-named-outlets-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-against-named-outlets', class extends _internalTestHelpers.AbstractTestCase {\n [`named outlets are asserted against`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{outlet 'foo'}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `Named outlets were removed in Ember 4.0. See https://deprecations.emberjs.com/v3.x#toc_route-render-template for guidance on alternative APIs for named outlet use cases. ('baz/foo-bar' @ L1:C5) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{outlet foo}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `Named outlets were removed in Ember 4.0. See https://deprecations.emberjs.com/v3.x#toc_route-render-template for guidance on alternative APIs for named outlet use cases. ('baz/foo-bar' @ L1:C5) `); // No assertion\n\n (0, _index.compile)(`{{outlet}}`, {\n moduleName: 'baz/foo-bar'\n });\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-input-helper-without-block-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-input-helper-without-block', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Using {{#input}}{{/input}} is not valid']() {\n var expectedMessage = `The {{input}} helper cannot be used in block form. ('baz/foo-bar' @ L1:C0) `;\n expectAssertion(() => {\n (0, _index.compile)('{{#input value=\"123\"}}Completely invalid{{/input}}', {\n moduleName: 'baz/foo-bar'\n });\n }, expectedMessage);\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-reserved-named-arguments-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-reserved-named-arguments', class extends _internalTestHelpers.AbstractTestCase {\n [`@test '@arguments' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@arguments}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @arguments}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @arguments \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@arguments' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@args' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@args}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @args}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @args \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@args' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@block' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@block}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @block}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @block \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@block' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@else' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@else}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @else}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @else \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@else' is reserved. ('baz/foo-bar' @ L1:C17) `);\n } // anything else that doesn't start with a lower case letter\n\n\n [`@test '@Arguments' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Arguments}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Arguments}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Arguments \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Arguments' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@Args' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Args}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Args}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Args \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Args' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@FOO' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@FOO}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @FOO}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @FOO \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@FOO' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@Foo' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@Foo}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @Foo}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @Foo \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@Foo' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@.' is reserved`](assert) {\n assert.throws(() => {\n (0, _index.compile)(`{{@.}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, /Attempted to parse a path expression, but it was not valid. Paths beginning with @ must start with a-z/);\n assert.throws(() => {\n (0, _index.compile)(`{{#if @.}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, /Attempted to parse a path expression, but it was not valid. Paths beginning with @ must start with a-z/);\n assert.throws(() => {\n (0, _index.compile)(`{{input type=(if @. \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, /Attempted to parse a path expression, but it was not valid. Paths beginning with @ must start with a-z/);\n }\n\n [`@test '@_' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@_}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @_}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @_ \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@_' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@-' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@-}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @-}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @- \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@-' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@$' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(`{{@$}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @$}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @$ \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@$' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@__ARGS__' is reserved`]() {\n expectAssertion(() => {\n (0, _index.compile)(` `, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@__ARGS__' is reserved. ('baz/foo-bar' @ L1:C5) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{foo __ARGS__=\"bar\"}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'__ARGS__' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#let (component \"foo\" __ARGS__=\"bar\") as |c|}}{{c}}{{/let}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'__ARGS__' is reserved. ('baz/foo-bar' @ L1:C24) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{@__ARGS__}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@__ARGS__' is reserved. ('baz/foo-bar' @ L1:C2) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{#if @__ARGS__}}Yup{{/if}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@__ARGS__' is reserved. ('baz/foo-bar' @ L1:C6) `);\n expectAssertion(() => {\n (0, _index.compile)(`{{input type=(if @__ARGS__ \"bar\" \"baz\")}}`, {\n moduleName: 'baz/foo-bar'\n });\n }, `'@__ARGS__' is reserved. ('baz/foo-bar' @ L1:C17) `);\n }\n\n [`@test '@' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @ \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@0' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@0}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @0}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @0 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@1' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@1}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @1}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @1 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@2' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@2}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @2}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @2 \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@@' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@@}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @@}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @@ \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@=' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@=}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @=}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @= \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n [`@test '@!' is de facto reserved (parse error)`](assert) {\n assert.throws(() => {\n (0, _index.compile)('{{@!}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{#if @!}}Yup{{/if}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n assert.throws(() => {\n (0, _index.compile)('{{input type=(if @! \"bar\" \"baz\")}}', {\n moduleName: 'baz/foo-bar'\n });\n }, /Expecting 'ID'/);\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/assert-splattribute-expression-test\", [\"internal-test-helpers\", \"ember-template-compiler/index\"], function (_internalTestHelpers, _index) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: assert-splattribute-expression', class extends _internalTestHelpers.AbstractTestCase {\n expectedMessage(locInfo) {\n return `\\`...attributes\\` can only be used in the element position e.g. \\`
\\`. It cannot be used as a path. (${locInfo}) `;\n }\n\n '@test ...attributes is in element space'(assert) {\n assert.expect(0);\n (0, _index.compile)('Foo
');\n }\n\n '@test {{...attributes}} is not valid'() {\n expectAssertion(() => {\n (0, _index.compile)('{{...attributes}}
', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n\n '@test {{...attributes}} is not valid path expression'() {\n expectAssertion(() => {\n (0, _index.compile)('{{...attributes}}
', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n\n '@test {{...attributes}} is not valid modifier'() {\n expectAssertion(() => {\n (0, _index.compile)('Wat
', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C7`));\n }\n\n '@test {{...attributes}} is not valid attribute'() {\n expectAssertion(() => {\n (0, _index.compile)('Wat
', {\n moduleName: 'foo-bar'\n });\n }, this.expectedMessage(`'foo-bar' @ L1:C13`));\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/transform-component-invocation-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: transforms component invocation', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Does not throw a compiler error for component invocations'](assert) {\n assert.expect(0);\n ['{{this.modal open}}', '{{this.modal isOpen=true}}', '{{#this.modal}}Woot{{/this.modal}}', '{{@modal open}}', // RFC#311\n '{{@modal isOpen=true}}', // RFC#311\n '{{#@modal}}Woot{{/@modal}}', // RFC#311\n '{{c.modal open}}', '{{c.modal isOpen=true}}', '{{#c.modal}}Woot{{/c.modal}}', '{{#my-component as |c|}}{{c name=\"Chad\"}}{{/my-component}}', // RFC#311\n '{{#my-component as |c|}}{{c \"Chad\"}}{{/my-component}}', // RFC#311\n '{{#my-component as |c|}}{{#c}}{{/c}}{{/my-component}}', // RFC#311\n ' ', // GH#15740\n ' ' // GH#15217\n ].forEach((layout, i) => {\n (0, _index.compile)(layout, {\n moduleName: `example-${i}`\n });\n });\n }\n\n });\n});","define(\"ember-template-compiler/tests/plugins/transform-input-type-syntax-test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: input type syntax', class extends _internalTestHelpers.AbstractTestCase {\n ['@test Can compile an {{input}} helper that has a sub-expression value as its type'](assert) {\n assert.expect(0);\n (0, _index.compile)(`{{input type=(if true 'password' 'text')}}`);\n }\n\n ['@test Can compile an {{input}} helper with a string literal type'](assert) {\n assert.expect(0);\n (0, _index.compile)(`{{input type='text'}}`);\n }\n\n ['@test Can compile an {{input}} helper with a type stored in a var'](assert) {\n assert.expect(0);\n (0, _index.compile)(`{{input type=_type}}`);\n }\n\n });\n});","define(\"ember-template-compiler/tests/system/bootstrap-test\", [\"@ember/runloop\", \"@ember/-internals/glimmer\", \"ember-template-compiler/lib/system/bootstrap\", \"internal-test-helpers\"], function (_runloop, _glimmer, _bootstrap, _internalTestHelpers) {\n \"use strict\";\n\n var component, fixture;\n\n function checkTemplate(templateName, assert) {\n (0, _runloop.run)(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }));\n var template = (0, _glimmer.getTemplate)(templateName);\n var qunitFixture = document.querySelector('#qunit-fixture');\n assert.ok(template, 'template is available on Ember.TEMPLATES');\n assert.notOk(qunitFixture.querySelector('script'), 'script removed');\n var owner = (0, _internalTestHelpers.buildOwner)();\n owner.register('template:-top-level', template);\n owner.register('component:-top-level', _glimmer.Component.extend({\n layoutName: '-top-level',\n firstName: 'Tobias',\n drug: 'teamocil'\n }));\n component = owner.lookup('component:-top-level');\n (0, _internalTestHelpers.runAppend)(component);\n assert.equal(qunitFixture.textContent.trim(), 'Tobias takes teamocil', 'template works');\n (0, _internalTestHelpers.runDestroy)(owner);\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-templates: bootstrap', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n fixture = document.getElementById('qunit-fixture');\n }\n\n teardown() {\n (0, _glimmer.setTemplates)({});\n fixture = component = null;\n }\n\n ['@test template with data-template-name should add a new template to Ember.TEMPLATES'](assert) {\n fixture.innerHTML = '';\n checkTemplate('funkyTemplate', assert);\n }\n\n ['@test template with id instead of data-template-name should add a new template to Ember.TEMPLATES'](assert) {\n fixture.innerHTML = '';\n checkTemplate('funkyTemplate', assert);\n }\n\n ['@test template without data-template-name or id should default to application'](assert) {\n fixture.innerHTML = '';\n checkTemplate('application', assert);\n } // Add this test case, only for typeof Handlebars === 'object';\n\n\n [`${typeof Handlebars === 'object' ? '@test' : '@skip'} template with type text/x-raw-handlebars should be parsed`](assert) {\n fixture.innerHTML = '';\n (0, _runloop.run)(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }));\n var template = (0, _glimmer.getTemplate)('funkyTemplate');\n assert.ok(template, 'template with name funkyTemplate available'); // This won't even work with Ember templates\n\n assert.equal(template({\n name: 'Tobias'\n }).trim(), 'Tobias');\n }\n\n ['@test duplicated default application templates should throw exception'](assert) {\n fixture.innerHTML = '';\n assert.throws(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test default default application template and id application template present should throw exception'](assert) {\n fixture.innerHTML = '';\n assert.throws(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test default application template and data-template-name application template present should throw exception'](assert) {\n fixture.innerHTML = '';\n assert.throws(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test duplicated template id should throw exception'](assert) {\n fixture.innerHTML = '';\n assert.throws(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n ['@test duplicated template data-template-name should throw exception'](assert) {\n fixture.innerHTML = '';\n assert.throws(() => (0, _bootstrap.default)({\n context: fixture,\n hasTemplate: _glimmer.hasTemplate,\n setTemplate: _glimmer.setTemplate\n }), /Template named \"[^\"]+\" already exists\\./, 'duplicate templates should not be allowed');\n }\n\n });\n});","define(\"ember-template-compiler/tests/system/compile_options_test\", [\"ember-template-compiler/index\", \"internal-test-helpers\"], function (_index, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: default compile options', class extends _internalTestHelpers.AbstractTestCase {\n ['@test default options are a new copy'](assert) {\n assert.notEqual((0, _index.compileOptions)(), (0, _index.compileOptions)());\n }\n\n ['@test customizeComponentName asserts name is well formed'](assert) {\n var options = (0, _index.compileOptions)({\n moduleName: 'test.js'\n });\n expectAssertion(() => {\n options.customizeComponentName('Foo:Bar');\n }, /You tried to invoke a component named in \"test.js\", but that is not a valid name for a component. Did you mean to use the \"::\" syntax for nested components\\?/);\n assert.ok(options.customizeComponentName('Foo::Bar'));\n }\n\n ['@test has default AST plugins in resolution mode'](assert) {\n assert.expect(_index.RESOLUTION_MODE_TRANSFORMS.length);\n var plugins = (0, _index.compileOptions)().plugins.ast;\n\n for (var i = 0; i < _index.RESOLUTION_MODE_TRANSFORMS.length; i++) {\n var plugin = _index.RESOLUTION_MODE_TRANSFORMS[i];\n assert.ok(plugins.indexOf(plugin) > -1, `includes ${plugin}`);\n }\n }\n\n ['@test has default AST plugins in strict mode'](assert) {\n assert.expect(_index.STRICT_MODE_TRANSFORMS.length);\n var plugins = (0, _index.compileOptions)({\n strictMode: true\n }).plugins.ast;\n\n for (var i = 0; i < _index.STRICT_MODE_TRANSFORMS.length; i++) {\n var plugin = _index.STRICT_MODE_TRANSFORMS[i];\n assert.ok(plugins.indexOf(plugin) > -1, `includes ${plugin}`);\n }\n }\n\n });\n\n function customTransform() {\n return {\n name: 'remove-data-test',\n visitor: {\n ElementNode(node) {\n for (var i = 0; i < node.attributes.length; i++) {\n var attribute = node.attributes[i];\n\n if (attribute.name === 'data-test') {\n node.attributes.splice(i, 1);\n }\n }\n }\n\n }\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-template-compiler: custom plugins passed to compile', class extends _internalTestHelpers.RenderingTestCase {\n // override so that we can provide custom AST plugins to compile\n compile(templateString) {\n return (0, _index.compile)(templateString, {\n plugins: {\n ast: [customTransform]\n }\n });\n }\n\n });\n});","define(\"ember-template-compiler/tests/system/dasherize-component-name-test\", [\"ember-template-compiler/lib/system/dasherize-component-name\", \"internal-test-helpers\"], function (_dasherizeComponentName, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('dasherize-component-name', class extends _internalTestHelpers.AbstractTestCase {\n ['@test names are correctly dasherized'](assert) {\n assert.equal(_dasherizeComponentName.default.get('Foo'), 'foo');\n assert.equal(_dasherizeComponentName.default.get('foo-bar'), 'foo-bar');\n assert.equal(_dasherizeComponentName.default.get('FooBar'), 'foo-bar');\n assert.equal(_dasherizeComponentName.default.get('F3Bar'), 'f3-bar');\n assert.equal(_dasherizeComponentName.default.get('Foo3Bar'), 'foo3-bar');\n assert.equal(_dasherizeComponentName.default.get('Foo3barBaz'), 'foo3bar-baz');\n assert.equal(_dasherizeComponentName.default.get('FooB3ar'), 'foo-b3ar');\n assert.equal(_dasherizeComponentName.default.get('XBlah'), 'x-blah');\n assert.equal(_dasherizeComponentName.default.get('X-Blah'), 'x-blah');\n assert.equal(_dasherizeComponentName.default.get('Foo@BarBaz'), 'foo@bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo@Bar-Baz'), 'foo@bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo::BarBaz'), 'foo/bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo::Bar-Baz'), 'foo/bar-baz');\n assert.equal(_dasherizeComponentName.default.get('Foo::BarBaz::Bang'), 'foo/bar-baz/bang');\n }\n\n });\n});","define(\"ember-template-compiler/tests/utils/transform-test-case\", [\"exports\", \"@glimmer/compiler\", \"internal-test-helpers\", \"ember-template-compiler/index\"], function (_exports, _compiler, _internalTestHelpers, _index) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class _default extends _internalTestHelpers.AbstractTestCase {\n assertTransformed(before, after) {\n this.assert.deepEqual(deloc(ast(before)), deloc(ast(after)));\n }\n\n }\n\n _exports.default = _default;\n\n function ast(template) {\n var _a;\n\n var program = null;\n\n function extractProgram() {\n return {\n name: 'extract-program',\n visitor: {\n Program: {\n exit(node) {\n program = clone(node);\n }\n\n }\n }\n };\n }\n\n var options = (0, _index.compileOptions)({\n moduleName: '-top-level'\n });\n\n if ((_a = options.plugins) === null || _a === void 0 ? void 0 : _a.ast) {\n options.plugins.ast.push(extractProgram);\n }\n\n (0, _compiler.precompile)(template, options);\n return program;\n }\n\n function clone(node) {\n var out = Object.create(null);\n var keys = Object.keys(node);\n keys.forEach(key => {\n var value = node[key];\n\n if (value !== null && typeof value === 'object') {\n out[key] = clone(value);\n } else {\n out[key] = value;\n }\n });\n return out;\n }\n\n function deloc(node) {\n var out = Object.create(null);\n var keys = Object.keys(node);\n keys.forEach(key => {\n var value = node[key];\n\n if (key === 'loc') {\n return;\n } else if (value !== null && typeof value === 'object') {\n out[key] = deloc(value);\n } else {\n out[key] = value;\n }\n });\n return out;\n }\n});","define(\"ember-testing/tests/adapters/adapter_test\", [\"@ember/runloop\", \"ember-testing/lib/adapters/adapter\", \"internal-test-helpers\"], function (_runloop, _adapter, _internalTestHelpers) {\n \"use strict\";\n\n var adapter;\n (0, _internalTestHelpers.moduleFor)('ember-testing Adapter', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n adapter = _adapter.default.create();\n }\n\n teardown() {\n (0, _runloop.run)(adapter, adapter.destroy);\n }\n\n ['@test exception throws'](assert) {\n var error = 'Hai';\n var thrown;\n\n try {\n adapter.exception(error);\n } catch (e) {\n thrown = e;\n }\n\n assert.equal(thrown, error);\n }\n\n });\n});","define(\"ember-testing/tests/adapters/qunit_test\", [\"@ember/runloop\", \"ember-testing/lib/adapters/qunit\", \"internal-test-helpers\"], function (_runloop, _qunit, _internalTestHelpers) {\n \"use strict\";\n\n var adapter;\n (0, _internalTestHelpers.moduleFor)('ember-testing QUnitAdapter: QUnit 2.x', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.originalStart = QUnit.start;\n this.originalStop = QUnit.stop;\n delete QUnit.start;\n delete QUnit.stop;\n adapter = _qunit.default.create();\n }\n\n teardown() {\n (0, _runloop.run)(adapter, adapter.destroy);\n QUnit.start = this.originalStart;\n QUnit.stop = this.originalStop;\n }\n\n ['@test asyncStart waits for asyncEnd to finish a test'](assert) {\n adapter.asyncStart();\n setTimeout(function () {\n assert.ok(true);\n adapter.asyncEnd();\n }, 50);\n }\n\n ['@test asyncStart waits for equal numbers of asyncEnd to finish a test'](assert) {\n var adapter = _qunit.default.create();\n\n adapter.asyncStart();\n adapter.asyncStart();\n adapter.asyncEnd();\n setTimeout(function () {\n assert.ok(true);\n adapter.asyncEnd();\n }, 50);\n }\n\n });\n});","define(\"ember-testing/tests/adapters_test\", [\"@ember/runloop\", \"@ember/-internals/error-handling\", \"ember-testing/lib/test\", \"ember-testing/lib/adapters/adapter\", \"ember-testing/lib/adapters/qunit\", \"@ember/application\", \"internal-test-helpers\", \"@ember/-internals/runtime\", \"@ember/debug\"], function (_runloop, _errorHandling, _test, _adapter, _qunit, _application, _internalTestHelpers, _runtime, _debug) {\n \"use strict\";\n\n var HAS_UNHANDLED_REJECTION_HANDLER = ('onunhandledrejection' in window);\n var originalDebug = (0, _debug.getDebugFunction)('debug');\n\n var noop = function () {};\n\n var App, originalAdapter, originalQUnit, originalWindowOnerror, originalQUnitUnhandledRejection;\n var originalConsoleError = console.error; // eslint-disable-line no-console\n\n function runThatThrowsSync(message = 'Error for testing error handling') {\n return (0, _runloop.run)(() => {\n throw new Error(message);\n });\n }\n\n function runThatThrowsAsync(message = 'Error for testing error handling') {\n return (0, _runloop.next)(() => {\n throw new Error(message);\n });\n }\n\n class AdapterSetupAndTearDown extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n originalAdapter = _test.default.adapter;\n originalQUnit = QUnit;\n originalWindowOnerror = window.onerror;\n originalQUnitUnhandledRejection = QUnit.onUnhandledRejection;\n }\n\n afterEach() {\n super.afterEach();\n (0, _debug.setDebugFunction)('debug', originalDebug);\n\n if (App) {\n (0, _runloop.run)(App, App.destroy);\n App.removeTestHelpers();\n App = null;\n }\n\n _test.default.adapter = originalAdapter;\n window.QUnit = originalQUnit;\n window.onerror = originalWindowOnerror;\n (0, _errorHandling.setOnerror)(undefined);\n console.error = originalConsoleError; // eslint-disable-line no-console\n\n QUnit.onUnhandledRejection = originalQUnitUnhandledRejection;\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-testing Adapters', class extends AdapterSetupAndTearDown {\n ['@test Setting a test adapter manually'](assert) {\n assert.expect(1);\n var CustomAdapter;\n CustomAdapter = _adapter.default.extend({\n asyncStart() {\n assert.ok(true, 'Correct adapter was used');\n }\n\n });\n (0, _runloop.run)(function () {\n App = _application.default.create({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n _test.default.adapter = CustomAdapter.create();\n App.setupForTesting();\n });\n\n _test.default.adapter.asyncStart();\n }\n\n ['@test QUnitAdapter is used by default (if QUnit is available)'](assert) {\n assert.expect(1);\n _test.default.adapter = null;\n (0, _runloop.run)(function () {\n App = _application.default.create({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n App.setupForTesting();\n });\n assert.ok(_test.default.adapter instanceof _qunit.default);\n }\n\n ['@test Adapter is used by default (if QUnit is not available)'](assert) {\n assert.expect(2);\n delete window.QUnit;\n _test.default.adapter = null;\n (0, _runloop.run)(function () {\n App = _application.default.create({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n App.setupForTesting();\n });\n assert.ok(_test.default.adapter instanceof _adapter.default);\n assert.ok(!(_test.default.adapter instanceof _qunit.default));\n }\n\n ['@test With Ember.Test.adapter set, errors in synchronous Ember.run are bubbled out'](assert) {\n var thrown = new Error('Boom!');\n var caughtInAdapter, caughtInCatch;\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n caughtInAdapter = error;\n }\n\n });\n\n try {\n (0, _runloop.run)(() => {\n throw thrown;\n });\n } catch (e) {\n caughtInCatch = e;\n }\n\n assert.equal(caughtInAdapter, undefined, 'test adapter should never receive synchronous errors');\n assert.equal(caughtInCatch, thrown, 'a \"normal\" try/catch should catch errors in sync run');\n }\n\n ['@test when both Ember.onerror (which rethrows) and TestAdapter are registered - sync run'](assert) {\n assert.expect(2);\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'adapter is not called for errors thrown in sync run loops');\n }\n\n };\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'onerror is called for sync errors even if TestAdapter is setup');\n throw error;\n });\n assert.throws(runThatThrowsSync, Error, 'error is thrown');\n }\n\n ['@test when both Ember.onerror (which does not rethrow) and TestAdapter are registered - sync run'](assert) {\n assert.expect(2);\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'adapter is not called for errors thrown in sync run loops');\n }\n\n };\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror is called for sync errors even if TestAdapter is setup');\n });\n runThatThrowsSync();\n assert.ok(true, 'no error was thrown, Ember.onerror can intercept errors');\n }\n\n ['@test when TestAdapter is registered and error is thrown - async run'](assert) {\n assert.expect(3);\n var done = assert.async();\n var caughtInAdapter, caughtInCatch, caughtByWindowOnerror;\n _test.default.adapter = {\n exception(error) {\n caughtInAdapter = error;\n }\n\n };\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message; // prevent \"bubbling\" and therefore failing the test\n\n return true;\n };\n\n try {\n runThatThrowsAsync();\n } catch (e) {\n caughtInCatch = e;\n }\n\n setTimeout(() => {\n assert.equal(caughtInAdapter, undefined, 'test adapter should never catch errors in run loops');\n assert.equal(caughtInCatch, undefined, 'a \"normal\" try/catch should never catch errors in an async run');\n assert.pushResult({\n result: /Error for testing error handling/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `Error for testing error handling`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n done();\n }, 20);\n }\n\n ['@test when both Ember.onerror and TestAdapter are registered - async run'](assert) {\n assert.expect(1);\n var done = assert.async();\n _test.default.adapter = {\n exception() {\n assert.notOk(true, 'Adapter.exception is not called for errors thrown in next');\n }\n\n };\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror is invoked for errors thrown in next/later');\n });\n runThatThrowsAsync();\n setTimeout(done, 10);\n }\n\n });\n\n function testAdapter(message, generatePromise, timeout = 10) {\n return class PromiseFailureTests extends AdapterSetupAndTearDown {\n [`@test ${message} when TestAdapter without \\`exception\\` method is present - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(1);\n var thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception: undefined\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (rejection) {\n assert.pushResult({\n result: /the error/.test(rejection.reason),\n actual: rejection.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n }); // prevent \"bubbling\" and therefore failing the test\n\n return true;\n };\n\n generatePromise(thrown); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter without \\`exception\\` method are present - rsvp`](assert) {\n assert.expect(1);\n var thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception: undefined\n });\n (0, _errorHandling.setOnerror)(function (error) {\n assert.pushResult({\n result: /the error/.test(error.message),\n actual: error.message,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n });\n generatePromise(thrown); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when TestAdapter is present - rsvp`](assert) {\n assert.expect(1);\n\n console.error = () => {}; // eslint-disable-line no-console\n\n\n var thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n }\n\n });\n generatePromise(thrown); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter are present - rsvp`](assert) {\n assert.expect(1);\n var thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n }\n\n });\n (0, _errorHandling.setOnerror)(function () {\n assert.notOk(true, 'Ember.onerror is not called if Test.adapter does not rethrow');\n });\n generatePromise(thrown); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n [`@test ${message} when both Ember.onerror and TestAdapter are present - rsvp`](assert) {\n assert.expect(2);\n var thrown = new Error('the error');\n _test.default.adapter = _qunit.default.create({\n exception(error) {\n assert.strictEqual(error, thrown, 'Adapter.exception is called for errors thrown in RSVP promises');\n throw error;\n }\n\n });\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises if Test.adapter rethrows');\n });\n generatePromise(thrown); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _runtime.RSVP.Promise(resolve => setTimeout(resolve, timeout));\n }\n\n };\n }\n\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: .then callback', testAdapter('errors in promise constructor', error => {\n new _runtime.RSVP.Promise(() => {\n throw error;\n });\n }));\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: Promise Contructor', testAdapter('errors in promise constructor', error => {\n _runtime.RSVP.resolve().then(() => {\n throw error;\n });\n }));\n (0, _internalTestHelpers.moduleFor)('Adapter Errors: Promise chain .then callback', testAdapter('errors in promise constructor', error => {\n new _runtime.RSVP.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw error;\n });\n }, 20));\n});","define(\"ember-testing/tests/ext/rsvp_test\", [\"ember-testing/lib/ext/rsvp\", \"ember-testing/lib/test/adapter\", \"ember-testing/lib/test/promise\", \"@ember/runloop\", \"@ember/debug\", \"internal-test-helpers\"], function (_rsvp, _adapter, _promise, _runloop, _debug, _internalTestHelpers) {\n \"use strict\";\n\n var originalTestAdapter = (0, _adapter.getAdapter)();\n var originalTestingFlag = (0, _debug.isTesting)();\n var asyncStarted = 0;\n var asyncEnded = 0;\n (0, _internalTestHelpers.moduleFor)('ember-testing RSVP', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n (0, _debug.setTesting)(true);\n (0, _adapter.setAdapter)({\n asyncStart() {\n asyncStarted++;\n },\n\n asyncEnd() {\n asyncEnded++;\n }\n\n });\n }\n\n teardown() {\n asyncStarted = 0;\n asyncEnded = 0;\n (0, _adapter.setAdapter)(originalTestAdapter);\n (0, _debug.setTesting)(originalTestingFlag);\n }\n\n ['@test given `Ember.testing = true`, correctly informs the test suite about async steps'](assert) {\n var done = assert.async();\n assert.expect(19);\n assert.ok(!(0, _runloop._getCurrentRunLoop)(), 'expect no run-loop');\n (0, _debug.setTesting)(true);\n assert.equal(asyncStarted, 0);\n assert.equal(asyncEnded, 0);\n\n var user = _rsvp.default.Promise.resolve({\n name: 'tomster'\n });\n\n assert.equal(asyncStarted, 0);\n assert.equal(asyncEnded, 0);\n user.then(function (user) {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n assert.equal(user.name, 'tomster');\n return _rsvp.default.Promise.resolve(1).then(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n });\n }).then(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n return new _rsvp.default.Promise(function (resolve) {\n setTimeout(function () {\n assert.equal(asyncStarted, 1);\n assert.equal(asyncEnded, 1);\n resolve({\n name: 'async tomster'\n });\n assert.equal(asyncStarted, 2);\n assert.equal(asyncEnded, 1);\n }, 0);\n });\n }).then(function (user) {\n assert.equal(user.name, 'async tomster');\n assert.equal(asyncStarted, 2);\n assert.equal(asyncEnded, 2);\n done();\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('TestPromise', class extends _internalTestHelpers.AbstractTestCase {\n ['does not throw error when falsy value passed to then'](assert) {\n assert.expect(1);\n return new _promise.default(function (resolve) {\n resolve();\n }).then(null).then(function () {\n assert.ok(true);\n });\n }\n\n ['able to get last Promise'](assert) {\n assert.expect(2);\n var p1 = new _promise.default(function (resolve) {\n resolve();\n }).then(function () {\n assert.ok(true);\n });\n var p2 = new _promise.default(function (resolve) {\n resolve();\n });\n assert.deepEqual((0, _promise.getLastPromise)(), p2);\n return p1;\n }\n\n });\n});","define(\"ember-testing/tests/helper_registration_test\", [\"@ember/runloop\", \"ember-testing/lib/test\", \"@ember/application\", \"internal-test-helpers\"], function (_runloop, _test, _application, _internalTestHelpers) {\n \"use strict\";\n\n var App, appBooted, helperContainer;\n\n function registerHelper() {\n _test.default.registerHelper('boot', function (app) {\n (0, _runloop.run)(app, app.advanceReadiness);\n appBooted = true;\n return app.testHelpers.wait();\n });\n }\n\n function unregisterHelper() {\n _test.default.unregisterHelper('boot');\n }\n\n var originalAdapter = _test.default.adapter;\n\n function setupApp() {\n appBooted = false;\n helperContainer = {};\n (0, _runloop.run)(function () {\n App = _application.default.create({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n App.setupForTesting();\n App.injectTestHelpers(helperContainer);\n });\n }\n\n function destroyApp() {\n if (App) {\n (0, _runloop.run)(App, 'destroy');\n App = null;\n helperContainer = null;\n }\n }\n\n (0, _internalTestHelpers.moduleFor)('Test - registerHelper/unregisterHelper', class extends _internalTestHelpers.AbstractTestCase {\n teardown() {\n _test.default.adapter = originalAdapter;\n destroyApp();\n }\n\n ['@test Helper gets registered'](assert) {\n assert.expect(2);\n registerHelper();\n setupApp();\n assert.ok(App.testHelpers.boot);\n assert.ok(helperContainer.boot);\n }\n\n ['@test Helper is ran when called'](assert) {\n var done = assert.async();\n assert.expect(1);\n registerHelper();\n setupApp();\n App.testHelpers.boot().then(function () {\n assert.ok(appBooted);\n }).finally(done);\n }\n\n ['@test Helper can be unregistered'](assert) {\n assert.expect(4);\n registerHelper();\n setupApp();\n assert.ok(App.testHelpers.boot);\n assert.ok(helperContainer.boot);\n unregisterHelper();\n (0, _runloop.run)(App, 'destroy');\n setupApp();\n assert.ok(!App.testHelpers.boot, 'once unregistered the helper is not added to App.testHelpers');\n assert.ok(!helperContainer.boot, 'once unregistered the helper is not added to the helperContainer');\n }\n\n });\n});","define(\"ember-testing/tests/reexports_test\", [\"ember\", \"internal-test-helpers\"], function (_ember, _internalTestHelpers) {\n \"use strict\";\n\n class ReexportsTestCase extends _internalTestHelpers.AbstractTestCase {}\n\n [// ember-testing\n ['Test', 'ember-testing'], ['Test.Adapter', 'ember-testing', 'Adapter'], ['Test.QUnitAdapter', 'ember-testing', 'QUnitAdapter'], ['setupForTesting', 'ember-testing']].forEach(reexport => {\n var [path, moduleId, exportName] = reexport; // default path === exportName if none present\n\n if (!exportName) {\n exportName = path;\n }\n\n ReexportsTestCase.prototype[`@test Ember.${path} exports correctly`] = function (assert) {\n (0, _internalTestHelpers.confirmExport)(_ember.default, assert, path, moduleId, exportName);\n };\n });\n (0, _internalTestHelpers.moduleFor)('ember-testing reexports', ReexportsTestCase);\n});","define(\"ember-testing/tests/test/waiters-test\", [\"ember-testing/lib/test/waiters\", \"internal-test-helpers\"], function (_waiters, _internalTestHelpers) {\n \"use strict\";\n\n class Waiters {\n constructor() {\n this._waiters = [];\n }\n\n add() {\n this._waiters.push([...arguments]);\n }\n\n register() {\n this.forEach((...args) => {\n (0, _waiters.registerWaiter)(...args);\n });\n }\n\n unregister() {\n this.forEach((...args) => {\n (0, _waiters.unregisterWaiter)(...args);\n });\n }\n\n forEach(callback) {\n for (var i = 0; i < this._waiters.length; i++) {\n var args = this._waiters[i];\n callback(...args);\n }\n }\n\n check() {\n this.register();\n var result = (0, _waiters.checkWaiters)();\n this.unregister();\n return result;\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('ember-testing: waiters', class extends _internalTestHelpers.AbstractTestCase {\n constructor() {\n super();\n this.waiters = new Waiters();\n }\n\n teardown() {\n this.waiters.unregister();\n }\n\n ['@test registering a waiter'](assert) {\n assert.expect(2);\n var obj = {\n foo: true\n };\n this.waiters.add(obj, function () {\n assert.ok(this.foo, 'has proper `this` context');\n return true;\n });\n this.waiters.add(function () {\n assert.ok(true, 'is called');\n return true;\n });\n this.waiters.check();\n }\n\n ['@test unregistering a waiter'](assert) {\n assert.expect(2);\n var obj = {\n foo: true\n };\n this.waiters.add(obj, function () {\n assert.ok(true, 'precond - waiter with context is registered');\n return true;\n });\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter without context is registered');\n return true;\n });\n this.waiters.check();\n this.waiters.unregister();\n (0, _waiters.checkWaiters)();\n }\n\n ['@test checkWaiters returns false if all waiters return true'](assert) {\n assert.expect(3);\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n return true;\n });\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n return true;\n });\n assert.notOk(this.waiters.check(), 'checkWaiters returns true if all waiters return true');\n }\n\n ['@test checkWaiters returns true if any waiters return false'](assert) {\n assert.expect(3);\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n return true;\n });\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n return false;\n });\n assert.ok(this.waiters.check(), 'checkWaiters returns false if any waiters return false');\n }\n\n ['@test checkWaiters short circuits after first falsey waiter'](assert) {\n assert.expect(2);\n this.waiters.add(function () {\n assert.ok(true, 'precond - waiter is registered');\n return false;\n });\n this.waiters.add(function () {\n assert.notOk(true, 'waiter should not be called');\n });\n assert.ok(this.waiters.check(), 'checkWaiters returns false if any waiters return false');\n }\n\n });\n});","define(\"ember/tests/application_lifecycle_test\", [\"internal-test-helpers\", \"@ember/application\", \"@ember/-internals/routing\", \"@ember/-internals/glimmer\", \"@ember/debug\"], function (_internalTestHelpers, _application, _routing, _glimmer, _debug) {\n \"use strict\";\n\n var originalDebug = (0, _debug.getDebugFunction)('debug');\n\n var noop = function () {};\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - route hooks', class extends _internalTestHelpers.AutobootApplicationTestCase {\n createApplication() {\n var application = super.createApplication(...arguments);\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n return application;\n }\n\n constructor() {\n (0, _debug.setDebugFunction)('debug', noop);\n super();\n var menuItem = this.menuItem = {};\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n\n var SettingRoute = _routing.Route.extend({\n setupController() {\n this.controller.set('selectedMenuItem', menuItem);\n },\n\n deactivate() {\n this.controller.set('selectedMenuItem', null);\n }\n\n });\n\n this.add('route:index', SettingRoute);\n this.add('route:application', SettingRoute);\n });\n }\n\n teardown() {\n (0, _debug.setDebugFunction)('debug', originalDebug);\n }\n\n get indexController() {\n return this.applicationInstance.lookup('controller:index');\n }\n\n get applicationController() {\n return this.applicationInstance.lookup('controller:application');\n }\n\n [`@test Resetting the application allows controller properties to be set when a route deactivates`](assert) {\n var {\n indexController,\n applicationController\n } = this;\n assert.equal(indexController.get('selectedMenuItem'), this.menuItem);\n assert.equal(applicationController.get('selectedMenuItem'), this.menuItem);\n this.application.reset();\n assert.equal(indexController.get('selectedMenuItem'), null);\n assert.equal(applicationController.get('selectedMenuItem'), null);\n }\n\n [`@test Destroying the application resets the router before the appInstance is destroyed`](assert) {\n var {\n indexController,\n applicationController\n } = this;\n assert.equal(indexController.get('selectedMenuItem'), this.menuItem);\n assert.equal(applicationController.get('selectedMenuItem'), this.menuItem);\n (0, _internalTestHelpers.runTask)(() => {\n this.application.destroy();\n });\n assert.equal(indexController.get('selectedMenuItem'), null);\n assert.equal(applicationController.get('selectedMenuItem'), null);\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle', class extends _internalTestHelpers.AutobootApplicationTestCase {\n createApplication() {\n var application = super.createApplication(...arguments);\n this.add('router:main', _routing.Router.extend({\n location: 'none'\n }));\n return application;\n }\n\n [`@test Destroying a route after the router does create an undestroyed 'toplevelView'`](assert) {\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication();\n this.addTemplate('index', `Index!`);\n this.addTemplate('application', `Application! {{outlet}}`);\n });\n var router = this.applicationInstance.lookup('router:main');\n var route = this.applicationInstance.lookup('route:index');\n (0, _internalTestHelpers.runTask)(() => router.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was cleared');\n (0, _internalTestHelpers.runTask)(() => route.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n (0, _internalTestHelpers.runTask)(() => this.application.destroy());\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n }\n\n [`@test initializers can augment an applications customEvents hash`](assert) {\n assert.expect(1);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.initializer({\n name: 'customize-things',\n\n initialize(application) {\n application.customEvents = {\n wowza: 'wowza'\n };\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication({}, MyApplication);\n this.add('component:foo-bar', _glimmer.Component.extend({\n wowza() {\n assert.ok(true, 'fired the event!');\n }\n\n }));\n this.addTemplate('application', `{{foo-bar}}`);\n this.addTemplate('components/foo-bar', `
`);\n });\n this.$('#wowza-thingy').trigger('wowza');\n }\n\n [`@test instanceInitializers can augment an the customEvents hash`](assert) {\n assert.expect(1);\n\n var MyApplication = _application.default.extend();\n\n MyApplication.instanceInitializer({\n name: 'customize-things',\n\n initialize(application) {\n application.customEvents = {\n herky: 'jerky'\n };\n }\n\n });\n (0, _internalTestHelpers.runTask)(() => {\n this.createApplication({}, MyApplication);\n this.add('component:foo-bar', _glimmer.Component.extend({\n jerky() {\n assert.ok(true, 'fired the event!');\n }\n\n }));\n this.addTemplate('application', `{{foo-bar}}`);\n this.addTemplate('components/foo-bar', `
`);\n });\n this.$('#herky-thingy').trigger('herky');\n }\n\n });\n});","define(\"ember/tests/component_context_test\", [\"@ember/controller\", \"@ember/-internals/glimmer\", \"internal-test-helpers\"], function (_controller, _glimmer, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - Component Context', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Components with a block should have the proper content when a template is provided'](assert) {\n this.addTemplate('application', `\n \n {{#my-component}}{{this.text}}{{/my-component}}\n
\n `);\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n }),\n template: `{{this.text}}-{{yield}}`\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n ['@test Components with a block should yield the proper content without a template provided'](assert) {\n this.addTemplate('application', `\n \n {{#my-component}}{{this.text}}{{/my-component}}\n
\n `);\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n })\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'outer', 'The component is composed correctly');\n });\n }\n\n ['@test Components without a block should have the proper content when a template is provided'](assert) {\n this.addTemplate('application', `\n {{my-component}}
\n `);\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n text: 'inner'\n }),\n template: '{{this.text}}'\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'inner', 'The component is composed correctly');\n });\n }\n\n ['@test Components without a block should have the proper content'](assert) {\n this.addTemplate('application', `\n {{my-component}}
\n `);\n this.add('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = 'Some text inserted';\n }\n\n })\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test properties of a component without a template should not collide with internal structures [DEPRECATED]'](assert) {\n this.addTemplate('application', `\n {{my-component data=this.foo}}
`);\n this.add('controller:application', _controller.default.extend({\n text: 'outer',\n foo: 'Some text inserted'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = this.get('data');\n }\n\n })\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test attrs property of a component without a template should not collide with internal structures'](assert) {\n this.addTemplate('application', `\n {{my-component attrs=this.foo}}
\n `);\n this.add('controller:application', _controller.default.extend({\n text: 'outer',\n foo: 'Some text inserted'\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n didInsertElement() {\n this.element.innerHTML = this.get('attrs.attrs.value');\n }\n\n })\n });\n return this.visit('/').then(() => {\n var text = (0, _internalTestHelpers.getTextOf)(this.element.querySelector('#wrapper'));\n assert.equal(text, 'Some text inserted', 'The component is composed correctly');\n });\n }\n\n ['@test Components trigger actions in the parents context when called from within a block'](assert) {\n this.addTemplate('application', `\n \n {{#my-component}}\n
Fizzbuzz \n {{/my-component}}\n
\n `);\n this.add('controller:application', _controller.default.extend({\n actions: {\n fizzbuzz() {\n assert.ok(true, 'action triggered on parent');\n }\n\n }\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({})\n });\n return this.visit('/').then(() => {\n this.$('#fizzbuzz', '#wrapper').click();\n });\n }\n\n ['@test Components trigger actions in the components context when called from within its template'](assert) {\n this.addTemplate('application', `\n {{#my-component}}{{text}}{{/my-component}}
\n `);\n this.add('controller:application', _controller.default.extend({\n actions: {\n fizzbuzz() {\n assert.ok(false, 'action on the wrong context');\n }\n\n }\n }));\n this.addComponent('my-component', {\n ComponentClass: _glimmer.Component.extend({\n actions: {\n fizzbuzz() {\n assert.ok(true, 'action triggered on component');\n }\n\n }\n }),\n template: `Fizzbuzz `\n });\n return this.visit('/').then(() => {\n this.$('#fizzbuzz', '#wrapper').click();\n });\n }\n\n });\n});","define(\"ember/tests/component_registration_test\", [\"@ember/application\", \"@ember/controller\", \"@ember/-internals/glimmer\", \"ember-template-compiler\", \"internal-test-helpers\", \"@ember/-internals/environment\"], function (_application, _controller, _glimmer, _emberTemplateCompiler, _internalTestHelpers, _environment) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Application Lifecycle - Component Registration', class extends _internalTestHelpers.ApplicationTestCase {\n // This is necessary for this.application.instanceInitializer to not leak between tests\n createApplication(options) {\n return super.createApplication(options, _application.default.extend());\n }\n\n ['@test The helper becomes the body of the component'](assert) {\n if (_environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n assert.expect(0);\n return;\n }\n\n this.addTemplate('components/expand-it', 'hello {{yield}}
');\n this.addTemplate('application', 'Hello world {{#expand-it}}world{{/expand-it}}');\n return this.visit('/').then(() => {\n this.assertText('Hello world hello world');\n this.assertComponentElement(this.element.firstElementChild, {\n tagName: 'div',\n content: 'hello world
'\n });\n });\n }\n\n ['@test The helper becomes the body of the component (ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = true;)'](assert) {\n if (!_environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS) {\n assert.expect(0);\n return;\n }\n\n this.addTemplate('components/expand-it', 'hello {{yield}}
');\n this.addTemplate('application', 'Hello world {{#expand-it}}world{{/expand-it}}');\n return this.visit('/').then(() => {\n this.assertInnerHTML('Hello world hello world
');\n _environment.ENV._TEMPLATE_ONLY_GLIMMER_COMPONENTS = false;\n });\n }\n\n ['@test If a component is registered, it is used'](assert) {\n this.addTemplate('components/expand-it', 'hello {{yield}}
');\n this.addTemplate('application', `Hello world {{#expand-it}}world{{/expand-it}}`);\n this.application.instanceInitializer({\n name: 'expand-it-component',\n\n initialize(applicationInstance) {\n applicationInstance.register('component:expand-it', _glimmer.Component.extend({\n classNames: 'testing123'\n }));\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('div.testing123').text().trim();\n assert.equal(text, 'hello world', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with custom `layout` property'](assert) {\n this.addTemplate('application', `there goes {{my-hero}}
`);\n this.application.instanceInitializer({\n name: 'my-hero-component',\n\n initialize(applicationInstance) {\n applicationInstance.register('component:my-hero', _glimmer.Component.extend({\n classNames: 'testing123',\n layout: (0, _emberTemplateCompiler.compile)('watch him as he GOES')\n }));\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('#wrapper').text().trim();\n assert.equal(text, 'there goes watch him as he GOES', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with template registered on the container'](assert) {\n this.addTemplate('application', `hello world {{sally-rutherford}}-{{#sally-rutherford}}!!!{{/sally-rutherford}}
`);\n this.application.instanceInitializer({\n name: 'sally-rutherford-component-template',\n\n initialize(applicationInstance) {\n applicationInstance.register('template:components/sally-rutherford', (0, _emberTemplateCompiler.compile)('funkytowny{{yield}}'));\n }\n\n });\n this.application.instanceInitializer({\n name: 'sally-rutherford-component',\n\n initialize(applicationInstance) {\n applicationInstance.register('component:sally-rutherford', _glimmer.Component);\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('#wrapper').text().trim();\n assert.equal(text, 'hello world funkytowny-funkytowny!!!', 'The component is composed correctly');\n });\n }\n\n ['@test Late-registered components can be rendered with ONLY the template registered on the container'](assert) {\n this.addTemplate('application', `hello world {{borf-snorlax}}-{{#borf-snorlax}}!!!{{/borf-snorlax}}
`);\n this.application.instanceInitializer({\n name: 'borf-snorlax-component-template',\n\n initialize(applicationInstance) {\n applicationInstance.register('template:components/borf-snorlax', (0, _emberTemplateCompiler.compile)('goodfreakingTIMES{{yield}}'));\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('#wrapper').text().trim();\n assert.equal(text, 'hello world goodfreakingTIMES-goodfreakingTIMES!!!', 'The component is composed correctly');\n });\n }\n\n ['@test Assigning layoutName to a component should setup the template as a layout'](assert) {\n assert.expect(1);\n this.addTemplate('application', `{{#my-component}}{{this.text}}{{/my-component}}
`);\n this.addTemplate('foo-bar-baz', '{{this.text}}-{{yield}}');\n this.application.instanceInitializer({\n name: 'application-controller',\n\n initialize(applicationInstance) {\n applicationInstance.register('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n }\n\n });\n this.application.instanceInitializer({\n name: 'my-component-component',\n\n initialize(applicationInstance) {\n applicationInstance.register('component:my-component', _glimmer.Component.extend({\n text: 'inner',\n layoutName: 'foo-bar-baz'\n }));\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('#wrapper').text().trim();\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n ['@test Assigning layoutName and layout to a component should use the `layout` value'](assert) {\n assert.expect(1);\n this.addTemplate('application', `{{#my-component}}{{this.text}}{{/my-component}}
`);\n this.addTemplate('foo-bar-baz', 'No way!');\n this.application.instanceInitializer({\n name: 'application-controller-layout',\n\n initialize(applicationInstance) {\n applicationInstance.register('controller:application', _controller.default.extend({\n text: 'outer'\n }));\n }\n\n });\n this.application.instanceInitializer({\n name: 'my-component-component-layout',\n\n initialize(applicationInstance) {\n applicationInstance.register('component:my-component', _glimmer.Component.extend({\n text: 'inner',\n layoutName: 'foo-bar-baz',\n layout: (0, _emberTemplateCompiler.compile)('{{this.text}}-{{yield}}')\n }));\n }\n\n });\n return this.visit('/').then(() => {\n var text = this.$('#wrapper').text().trim();\n assert.equal(text, 'inner-outer', 'The component is composed correctly');\n });\n }\n\n async ['@test Using name of component that does not exist'](assert) {\n this.addTemplate('application', `{{#no-good}} {{/no-good}}
`);\n\n if (true\n /* DEBUG */\n ) {\n await assert.rejectsAssertion(this.visit('/'), /Attempted to resolve `no-good`/);\n } else {\n // Rejects with a worse error message in production\n await assert.rejects(this.visit('/'));\n }\n }\n\n });\n});","define(\"ember/tests/controller_test\", [\"@ember/controller\", \"internal-test-helpers\", \"@ember/-internals/glimmer\"], function (_controller, _internalTestHelpers, _glimmer) {\n \"use strict\";\n\n /*\n In Ember 1.x, controllers subtly affect things like template scope\n and action targets in exciting and often inscrutable ways. This test\n file contains integration tests that verify the correct behavior of\n the many parts of the system that change and rely upon controller scope,\n from the runtime up to the templating layer.\n */\n (0, _internalTestHelpers.moduleFor)('Template scoping examples', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Actions inside an outlet go to the associated controller'](assert) {\n this.add('controller:index', _controller.default.extend({\n actions: {\n componentAction() {\n assert.ok(true, 'controller received the action');\n }\n\n }\n }));\n this.addComponent('component-with-action', {\n ComponentClass: _glimmer.Component.extend({\n classNames: ['component-with-action'],\n\n click() {\n this.action();\n }\n\n })\n });\n this.addTemplate('index', '{{component-with-action action=(action \"componentAction\")}}');\n return this.visit('/').then(() => {\n (0, _internalTestHelpers.runTask)(() => this.$('.component-with-action').click());\n });\n }\n\n });\n});","define(\"ember/tests/ember-test-helpers-test\", [\"rsvp\", \"@ember/application\", \"@ember/runloop\", \"ember-template-compiler\", \"internal-test-helpers\"], function (_rsvp, _application, _runloop, _emberTemplateCompiler, _internalTestHelpers) {\n \"use strict\";\n\n var {\n module,\n test\n } = QUnit;\n /*\n This test file is intended to emulate what @ember/test-helpers does, and\n should be considered a \"smoke test\" of when a given change will break\n existing versions of @ember/test-helpers.\n \n This generally means that we will have to represent multiple versions of\n `@ember/test-helpers` here (will make a nested module for each significant\n revision).\n */\n\n module('@ember/test-helpers emulation test', function () {\n module('v1.6.0', function () {\n var EMPTY_TEMPLATE = (0, _emberTemplateCompiler.compile)('');\n\n function settled() {\n return new _rsvp.Promise(function (resolve) {\n var watcher = setInterval(() => {\n if ((0, _runloop._getCurrentRunLoop)() || (0, _runloop._hasScheduledTimers)()) {\n return;\n } // Stop polling\n\n\n clearInterval(watcher); // Synchronously resolve the promise\n\n (0, _runloop.run)(null, resolve);\n }, 10);\n });\n }\n\n async function setupContext(context) {\n // condensed version of https://github.com/emberjs/ember-test-helpers/blob/v1.6.0/addon-test-support/%40ember/test-helpers/build-owner.ts#L38\n // without support for \"custom resolver\"\n await context.application.boot();\n context.owner = await context.application.buildInstance().boot();\n }\n\n function setupRenderingContext(context) {\n var {\n owner\n } = context;\n var OutletView = owner.factoryFor('view:-outlet');\n var environment = owner.lookup('-environment:main');\n var outletTemplateFactory = owner.lookup('template:-outlet');\n var toplevelView = OutletView.create({\n environment,\n template: outletTemplateFactory\n });\n owner.register('-top-level-view:main', {\n create() {\n return toplevelView;\n }\n\n }); // initially render a simple empty template\n\n return render(EMPTY_TEMPLATE, context).then(() => {\n var rootElement = document.querySelector(owner.rootElement);\n (0, _runloop.run)(toplevelView, 'appendTo', rootElement);\n context.element = rootElement;\n return settled();\n });\n }\n\n var templateId = 0;\n\n function render(template, context) {\n var {\n owner\n } = context;\n var toplevelView = owner.lookup('-top-level-view:main');\n var OutletTemplate = owner.lookup('template:-outlet');\n templateId += 1;\n var templateFullName = `template:-undertest-${templateId}`;\n owner.register(templateFullName, template);\n var outletState = {\n render: {\n owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n ViewClass: undefined,\n template: OutletTemplate\n },\n outlets: {\n main: {\n render: {\n owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: context,\n ViewClass: undefined,\n template: owner.lookup(templateFullName),\n outlets: {}\n },\n outlets: {}\n }\n }\n };\n toplevelView.setOutletState(outletState);\n return settled();\n }\n\n module('setupRenderingContext', function (hooks) {\n hooks.beforeEach(async function () {\n this.application = _application.default.create({\n rootElement: '#qunit-fixture',\n autoboot: false,\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n await setupContext(this);\n await setupRenderingContext(this);\n });\n hooks.afterEach(function () {\n (0, _runloop.run)(this.owner, 'destroy');\n (0, _runloop.run)(this.application, 'destroy');\n });\n test('it basically works', async function (assert) {\n await render((0, _emberTemplateCompiler.compile)('Hi!'), this);\n assert.equal(this.element.textContent, 'Hi!');\n });\n });\n });\n });\n});","define(\"ember/tests/error_handler_test\", [\"@ember/debug\", \"@ember/runloop\", \"@ember/-internals/error-handling\", \"rsvp\", \"internal-test-helpers\"], function (_debug, _runloop, _errorHandling, _rsvp, _internalTestHelpers) {\n \"use strict\";\n\n var HAS_UNHANDLED_REJECTION_HANDLER = ('onunhandledrejection' in window);\n var QUNIT_ON_UNHANDLED_REJECTION = QUnit.onUnhandledRejection;\n var WINDOW_ONERROR;\n\n function runThatThrowsSync(message = 'Error for testing error handling') {\n return (0, _runloop.run)(() => {\n throw new Error(message);\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('error_handler', class extends _internalTestHelpers.AbstractTestCase {\n beforeEach() {\n // capturing this outside of module scope to ensure we grab\n // the test frameworks own window.onerror to reset it\n WINDOW_ONERROR = window.onerror;\n }\n\n afterEach() {\n (0, _debug.setTesting)(_debug.isTesting);\n window.onerror = WINDOW_ONERROR;\n (0, _errorHandling.setOnerror)(undefined);\n QUnit.onUnhandledRejection = QUNIT_ON_UNHANDLED_REJECTION;\n }\n\n ['@test by default there is no onerror - sync run'](assert) {\n assert.strictEqual((0, _errorHandling.getOnerror)(), undefined, 'precond - there should be no Ember.onerror set by default');\n assert.throws(runThatThrowsSync, Error, 'errors thrown sync are catchable');\n }\n\n ['@test when Ember.onerror (which rethrows) is registered - sync run'](assert) {\n assert.expect(2);\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'onerror called');\n throw error;\n });\n assert.throws(runThatThrowsSync, Error, 'error is thrown');\n }\n\n ['@test when Ember.onerror (which does not rethrow) is registered - sync run'](assert) {\n assert.expect(2);\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'onerror called');\n });\n runThatThrowsSync();\n assert.ok(true, 'no error was thrown, Ember.onerror can intercept errors');\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = true, no Ember.onerror) - sync run'](assert) {\n (0, _debug.setTesting)(true);\n var error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = false, no Ember.onerror) - sync run'](assert) {\n (0, _debug.setTesting)(false);\n var error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test does not swallow exceptions (Ember.testing = false, Ember.onerror which rethrows) - sync run'](assert) {\n assert.expect(2);\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(function (error) {\n assert.ok(true, 'Ember.onerror was called');\n throw error;\n });\n var error = new Error('the error');\n assert.throws(() => {\n (0, _runloop.run)(() => {\n throw error;\n });\n }, error);\n }\n\n ['@test Ember.onerror can intercept errors (aka swallow) by not rethrowing (Ember.testing = false) - sync run'](assert) {\n assert.expect(1);\n (0, _debug.setTesting)(false);\n (0, _errorHandling.setOnerror)(function () {\n assert.ok(true, 'Ember.onerror was called');\n });\n var error = new Error('the error');\n\n try {\n (0, _runloop.run)(() => {\n throw error;\n });\n } catch (e) {\n assert.notOk(true, 'Ember.onerror that does not rethrow is intentionally swallowing errors, try / catch wrapping does not see error');\n }\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = true, no Ember.onerror) - async run'](assert) {\n var done = assert.async();\n var caughtByWindowOnerror;\n (0, _debug.setTesting)(true);\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message; // prevent \"bubbling\" and therefore failing the test\n\n return true;\n };\n\n (0, _runloop.later)(() => {\n throw new Error('the error');\n }, 10);\n setTimeout(() => {\n assert.pushResult({\n result: /the error/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n done();\n }, 20);\n }\n\n ['@test does not swallow exceptions by default (Ember.testing = false, no Ember.onerror) - async run'](assert) {\n var done = assert.async();\n var caughtByWindowOnerror;\n (0, _debug.setTesting)(false);\n\n window.onerror = function (message) {\n caughtByWindowOnerror = message; // prevent \"bubbling\" and therefore failing the test\n\n return true;\n };\n\n (0, _runloop.later)(() => {\n throw new Error('the error');\n }, 10);\n setTimeout(() => {\n assert.pushResult({\n result: /the error/.test(caughtByWindowOnerror),\n actual: caughtByWindowOnerror,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onerror, and therefore fail tests (due to QUnit implementing window.onerror)'\n });\n done();\n }, 20);\n }\n\n ['@test Ember.onerror can intercept errors (aka swallow) by not rethrowing (Ember.testing = false) - async run'](assert) {\n var done = assert.async();\n (0, _debug.setTesting)(false);\n\n window.onerror = function () {\n assert.notOk(true, 'window.onerror is never invoked when Ember.onerror intentionally swallows errors'); // prevent \"bubbling\" and therefore failing the test\n\n return true;\n };\n\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called with the error');\n });\n (0, _runloop.later)(() => {\n throw thrown;\n }, 10);\n setTimeout(done, 20);\n }\n\n [`@test errors in promise constructor when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n new _rsvp.default.Promise(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does rethrow is present - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n new _rsvp.default.Promise(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise constructor when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n new _rsvp.default.Promise(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does rethrow is present - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in promise .then callback when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n _rsvp.default.resolve().then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 10));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does not rethrow is present - rsvp`](assert) {\n assert.expect(1);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does rethrow is present - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does not rethrow is present (Ember.testing = false) - rsvp`](assert) {\n assert.expect(1);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n });\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n [`@test errors in async promise .then callback when Ember.onerror which does rethrow is present (Ember.testing = false) - rsvp`](assert) {\n if (!HAS_UNHANDLED_REJECTION_HANDLER) {\n assert.expect(0);\n return;\n }\n\n assert.expect(2);\n (0, _debug.setTesting)(false);\n var thrown = new Error('the error');\n (0, _errorHandling.setOnerror)(function (error) {\n assert.strictEqual(error, thrown, 'Ember.onerror is called for errors thrown in RSVP promises');\n throw error;\n }); // prevent QUnit handler from failing test\n\n QUnit.onUnhandledRejection = () => {};\n\n window.onunhandledrejection = function (event) {\n assert.pushResult({\n result: /the error/.test(event.reason),\n actual: event.reason,\n expected: 'to include `the error`',\n message: 'error should bubble out to window.onunhandledrejection, and therefore fail tests (due to QUnit implementing window.onunhandledrejection)'\n });\n };\n\n new _rsvp.default.Promise(resolve => setTimeout(resolve, 10)).then(() => {\n throw thrown;\n }); // RSVP.Promise's are configured to settle within the run loop, this\n // ensures that run loop has completed\n\n return new _rsvp.default.Promise(resolve => setTimeout(resolve, 20));\n }\n\n });\n});","define(\"ember/tests/homepage_example_test\", [\"@ember/-internals/routing\", \"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"internal-test-helpers\"], function (_routing, _metal, _runtime, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('The example renders correctly', class extends _internalTestHelpers.ApplicationTestCase {\n async ['@test Render index template into application outlet'](assert) {\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', 'People {{#each @model as |person|}}Hello, {{person.fullName}} ! {{/each}} ');\n\n var Person = _runtime.Object.extend({\n firstName: null,\n lastName: null,\n fullName: (0, _metal.computed)('firstName', 'lastName', function () {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n })\n });\n\n this.add('route:index', _routing.Route.extend({\n model() {\n return (0, _runtime.A)([Person.create({\n firstName: 'Tom',\n lastName: 'Dale'\n }), Person.create({\n firstName: 'Yehuda',\n lastName: 'Katz'\n })]);\n }\n\n }));\n await this.visit('/');\n var $ = this.$();\n assert.equal($.findAll('h1').text(), 'People');\n assert.equal($.findAll('li').length, 2);\n assert.equal($.findAll('li:nth-of-type(1)').text(), 'Hello, Tom Dale!');\n assert.equal($.findAll('li:nth-of-type(2)').text(), 'Hello, Yehuda Katz!');\n }\n\n });\n});","define(\"ember/tests/integration/multiple-app-test\", [\"internal-test-helpers\", \"@ember/application\", \"@ember/-internals/glimmer\", \"@ember/-internals/owner\", \"rsvp\"], function (_internalTestHelpers, _application, _glimmer, _owner, _rsvp) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('View Integration', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n document.getElementById('qunit-fixture').innerHTML = `\n
\n
\n `;\n super();\n (0, _internalTestHelpers.runTask)(() => {\n this.createSecondApplication();\n });\n }\n\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n rootElement: '#one',\n router: null\n });\n }\n\n createSecondApplication(options) {\n var {\n applicationOptions\n } = this;\n var secondApplicationOptions = {\n rootElement: '#two'\n };\n var myOptions = Object.assign(applicationOptions, secondApplicationOptions, options);\n this.secondApp = _application.default.create(myOptions);\n this.secondResolver = this.secondApp.__registry__.resolver;\n return this.secondApp;\n }\n\n teardown() {\n super.teardown();\n\n if (this.secondApp) {\n (0, _internalTestHelpers.runTask)(() => {\n this.secondApp.destroy();\n });\n }\n }\n\n addFactoriesToResolver(actions, resolver) {\n resolver.add('component:special-button', _glimmer.Component.extend({\n actions: {\n doStuff() {\n var rootElement = (0, _owner.getOwner)(this).application.rootElement;\n actions.push(rootElement);\n }\n\n }\n }));\n resolver.add('template:index', this.compile(`\n Node 1 {{special-button}}\n `, {\n moduleName: 'my-app/templates/index.hbs'\n }));\n resolver.add('template:components/special-button', this.compile(`\n Button \n `, {\n moduleName: 'my-app/templates/components/special-button.hbs'\n }));\n }\n\n [`@test booting multiple applications can properly handle events`](assert) {\n var actions = [];\n this.addFactoriesToResolver(actions, this.resolver);\n this.addFactoriesToResolver(actions, this.secondResolver);\n return (0, _rsvp.resolve)().then(() => this.application.visit('/')).then(() => this.secondApp.visit('/')).then(() => {\n document.querySelector('#two .do-stuff').click();\n document.querySelector('#one .do-stuff').click();\n assert.deepEqual(actions, ['#two', '#one']);\n });\n }\n\n });\n});","define(\"ember/tests/production_build_test\", [\"@ember/debug\", \"internal-test-helpers\"], function (_debug, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('production builds', class extends _internalTestHelpers.AbstractTestCase {\n ['@test assert does not throw in production builds'](assert) {\n if (!true\n /* DEBUG */\n ) {\n assert.expect(1);\n\n try {\n (true && !(false) && (0, _debug.assert)('Should not throw'));\n assert.ok(true, 'Ember.assert did not throw');\n } catch (e) {\n assert.ok(false, `Expected assert not to throw but it did: ${e.message}`);\n }\n } else {\n assert.expect(0);\n }\n }\n\n ['@test runInDebug does not run the callback in production builds'](assert) {\n if (!true\n /* DEBUG */\n ) {\n var fired = false;\n (0, _debug.runInDebug)(() => fired = true);\n assert.equal(fired, false, 'runInDebug callback should not be ran');\n } else {\n assert.expect(0);\n }\n }\n\n });\n});","define(\"ember/tests/reexports_test\", [\"ember/index\", \"require\", \"@ember/canary-features\", \"internal-test-helpers\"], function (_index, _require, _canaryFeatures, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('ember reexports', class extends _internalTestHelpers.AbstractTestCase {\n [`@test Ember exports correctly`](assert) {\n allExports.forEach(reexport => {\n var [path, moduleId, exportName] = reexport; // default path === exportName if none present\n\n if (!exportName) {\n exportName = path;\n }\n\n (0, _internalTestHelpers.confirmExport)(_index.default, assert, path, moduleId, exportName);\n });\n }\n\n ['@skip Ember.String.htmlSafe exports correctly (but deprecated)'](assert) {\n var glimmer = (0, _require.default)(\"@ember/-internals/glimmer\");\n expectDeprecation(() => {\n assert.equal(_index.default.String.htmlSafe, glimmer.htmlSafe, 'Ember.String.htmlSafe is exported correctly');\n }, /Importing htmlSafe from '@ember\\/string' is deprecated/);\n assert.notEqual(glimmer.htmlSafe, undefined, 'Ember.String.htmlSafe is not `undefined`');\n }\n\n ['@skip Ember.String.isHTMLSafe exports correctly (but deprecated)'](assert) {\n var glimmer = (0, _require.default)(\"@ember/-internals/glimmer\");\n expectDeprecation(() => {\n assert.equal(_index.default.String.isHTMLSafe, glimmer.isHTMLSafe, 'Ember.String.isHTMLSafe is exported correctly');\n }, /Importing isHTMLSafe from '@ember\\/string' is deprecated/);\n assert.notEqual(glimmer.isHTMLSafe, undefined, 'Ember.String.isHTMLSafe is not `undefined`');\n }\n\n '@test Ember.FEATURES is exported'(assert) {\n for (var feature in _canaryFeatures.FEATURES) {\n assert.equal(_index.default.FEATURES[feature], _canaryFeatures.FEATURES[feature], 'Ember.FEATURES contains ${feature} with correct value');\n }\n }\n\n });\n var allExports = [// @ember/application\n ['Application', '@ember/application', 'default'], ['getOwner', '@ember/application', 'getOwner'], ['onLoad', '@ember/application', 'onLoad'], ['runLoadHooks', '@ember/application', 'runLoadHooks'], ['setOwner', '@ember/application', 'setOwner'], // @ember/application/instance\n ['ApplicationInstance', '@ember/application/instance', 'default'], // @ember/application/namespace\n ['Namespace', '@ember/application/namespace', 'default'], // @ember/array\n ['Array', '@ember/array', 'default'], ['A', '@ember/array', 'A'], ['isArray', '@ember/array', 'isArray'], ['makeArray', '@ember/array', 'makeArray'], // @ember/array/mutable\n ['MutableArray', '@ember/array/mutable', 'default'], // @ember/array/proxy\n ['ArrayProxy', '@ember/array/proxy', 'default'], // @ember/canary-features\n ['FEATURES.isEnabled', '@ember/canary-features', 'isEnabled'], // @ember/component\n ['Component', '@ember/component', 'default'], ['_componentManagerCapabilities', '@ember/component', 'capabilities'], ['_getComponentTemplate', '@ember/component', 'getComponentTemplate'], ['_setComponentManager', '@ember/component', 'setComponentManager'], ['_setComponentTemplate', '@ember/component', 'setComponentTemplate'], // @ember/component/helper\n ['Helper', '@ember/component/helper', 'default'], ['Helper.helper', '@ember/component/helper', 'helper'], // @ember/component/template-only\n ['_templateOnlyComponent', '@ember/component/template-only', 'default'], // @ember/controller\n ['Controller', '@ember/controller', 'default'], ['inject.controller', '@ember/controller', 'inject'], // @ember/debug\n ['deprecateFunc', '@ember/debug', 'deprecateFunc'], ['deprecate', '@ember/debug', 'deprecate'], ['assert', '@ember/debug', 'assert'], ['debug', '@ember/debug', 'debug'], ['inspect', '@ember/debug', 'inspect'], ['Debug.registerDeprecationHandler', '@ember/debug', 'registerDeprecationHandler'], ['Debug.registerWarnHandler', '@ember/debug', 'registerWarnHandler'], ['runInDebug', '@ember/debug', 'runInDebug'], ['warn', '@ember/debug', 'warn'], ['testing', '@ember/debug', {\n get: 'isTesting',\n set: 'setTesting'\n }], ['_captureRenderTree', '@ember/debug', 'captureRenderTree'], // @ember/debug/container-debug-adapter\n ['ContainerDebugAdapter', '@ember/debug/container-debug-adapter', 'default'], // @ember/debug/data-adapter\n ['DataAdapter', '@ember/debug/data-adapter', 'default'], // @ember/destroyable\n true\n /* DEBUG */\n ? ['_assertDestroyablesDestroyed', '@ember/destroyable', 'assertDestroyablesDestroyed'] : null, ['_associateDestroyableChild', '@ember/destroyable', 'associateDestroyableChild'], ['destroy', '@ember/destroyable', 'destroy'], true\n /* DEBUG */\n ? ['_enableDestroyableTracking', '@ember/destroyable', 'enableDestroyableTracking'] : null, ['_isDestroyed', '@ember/destroyable', 'isDestroyed'], ['_isDestroying', '@ember/destroyable', 'isDestroying'], ['_registerDestructor', '@ember/destroyable', 'registerDestructor'], ['_unregisterDestructor', '@ember/destroyable', 'unregisterDestructor'], // @ember/engine\n ['Engine', '@ember/engine', 'default'], // @ember/engine/instance\n ['EngineInstance', '@ember/engine/instance', 'default'], // @ember/enumerable\n ['Enumerable', '@ember/enumerable', 'default'], // @ember/error\n ['Error', '@ember/error', 'default'], // @ember/instrumentation\n ['instrument', '@ember/instrumentation', 'instrument'], ['subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.instrument', '@ember/instrumentation', 'instrument'], ['Instrumentation.reset', '@ember/instrumentation', 'reset'], ['Instrumentation.subscribe', '@ember/instrumentation', 'subscribe'], ['Instrumentation.unsubscribe', '@ember/instrumentation', 'unsubscribe'], // @ember/modifier\n ['_modifierManagerCapabilities', '@ember/modifier', 'capabilities'], ['_setModifierManager', '@ember/modifier', 'setModifierManager'], ['_on', '@ember/modifier', 'on'], // @ember/helper\n ['_helperManagerCapabilities', '@ember/helper', 'capabilities'], ['_setHelperManager', '@ember/helper', 'setHelperManager'], ['_invokeHelper', '@ember/helper', 'invokeHelper'], ['_fn', '@ember/helper', 'fn'], ['_array', '@ember/helper', 'array'], ['_hash', '@ember/helper', 'hash'], ['_get', '@ember/helper', 'get'], ['_concat', '@ember/helper', 'concat'], // @ember/object\n ['Object', '@ember/object', 'default'], ['_action', '@ember/object', 'action'], ['computed', '@ember/object', 'computed'], ['defineProperty', '@ember/object', 'defineProperty'], ['get', '@ember/object', 'get'], ['getProperties', '@ember/object', 'getProperties'], ['notifyPropertyChange', '@ember/object', 'notifyPropertyChange'], ['observer', '@ember/object', 'observer'], ['set', '@ember/object', 'set'], ['setProperties', '@ember/object', 'setProperties'], ['trySet', '@ember/object', 'trySet'], // @ember/object/compat\n ['_dependentKeyCompat', '@ember/object/compat', 'dependentKeyCompat'], // @ember/object/computed\n ['ComputedProperty', '@ember/object/computed', 'default'], ['expandProperties', '@ember/object/computed', 'expandProperties'], // @ember/object/core\n ['CoreObject', '@ember/object/core', 'default'], // @ember/object/evented\n ['Evented', '@ember/object/evented', 'default'], ['on', '@ember/object/evented', 'on'], // @ember/object/events\n ['addListener', '@ember/object/events', 'addListener'], ['removeListener', '@ember/object/events', 'removeListener'], ['sendEvent', '@ember/object/events', 'sendEvent'], // @ember/object/internals\n ['cacheFor', '@ember/object/internals', 'cacheFor'], ['guidFor', '@ember/object/internals', 'guidFor'], // @ember/object/mixin\n ['Mixin', '@ember/object/mixin', 'default'], // @ember/object/observable\n ['Observable', '@ember/object/observable', 'default'], // @ember/object/observers\n ['addObserver', '@ember/object/observers', 'addObserver'], ['removeObserver', '@ember/object/observers', 'removeObserver'], // @ember/object/promise-proxy-mixin\n ['PromiseProxyMixin', '@ember/object/promise-proxy-mixin', 'default'], // @ember/object/proxy\n ['ObjectProxy', '@ember/object/proxy', 'default'], // @ember/polyfills\n ['assign', '@ember/polyfills', 'assign'], ['platform.hasPropertyAccessors', '@ember/polyfills', 'hasPropertyAccessors'], // @ember/routing/auto-location\n ['AutoLocation', '@ember/routing/auto-location', 'default'], // @ember/routing/hash-location\n ['HashLocation', '@ember/routing/hash-location', 'default'], // @ember/routing/history-location\n ['HistoryLocation', '@ember/routing/history-location', 'default'], // @ember/routing/location\n ['Location', '@ember/routing/location', 'default'], // @ember/routing/none-location\n ['NoneLocation', '@ember/routing/none-location', 'default'], // @ember/routing/route\n ['Route', '@ember/routing/route', 'default'], // @ember/routing/router\n ['Router', '@ember/routing/router', 'default'], // @ember/runloop\n ['run', '@ember/runloop', 'run'], // @ember/service\n ['Service', '@ember/service', 'default'], ['inject.service', '@ember/service', 'service'], // @ember/string\n ['String.camelize', '@ember/string', 'camelize'], ['String.capitalize', '@ember/string', 'capitalize'], ['String.classify', '@ember/string', 'classify'], ['String.dasherize', '@ember/string', 'dasherize'], ['String.decamelize', '@ember/string', 'decamelize'], ['String.htmlSafe', '@ember/-internals/glimmer', 'htmlSafe'], ['String.isHTMLSafe', '@ember/-internals/glimmer', 'isHTMLSafe'], ['String.underscore', '@ember/string', 'underscore'], ['String.w', '@ember/string', 'w'], ['STRINGS', '@ember/string', {\n get: '_getStrings',\n set: '_setStrings'\n }], // @ember/template\n ['String.htmlSafe', '@ember/template', 'htmlSafe'], ['String.isHTMLSafe', '@ember/template', 'isHTMLSafe'], // @ember/template-compilation\n ['HTMLBars.compile', '@ember/template-compilation', 'compileTemplate'], // @ember/template-factory\n ['Handlebars.template', '@ember/template-factory', 'createTemplateFactory'], ['HTMLBars.template', '@ember/template-factory', 'createTemplateFactory'], // @ember/test\n ['Test.registerAsyncHelper', '@ember/test', 'registerAsyncHelper'], ['Test.registerHelper', '@ember/test', 'registerHelper'], ['Test.registerWaiter', '@ember/test', 'registerWaiter'], ['Test.unregisterHelper', '@ember/test', 'unregisterHelper'], ['Test.unregisterWaiter', '@ember/test', 'unregisterWaiter'], // @ember/test/adapter\n ['Test.Adapter', '@ember/test/adapter', 'default'], // @ember/utils\n ['compare', '@ember/utils', 'compare'], ['isBlank', '@ember/utils', 'isBlank'], ['isEmpty', '@ember/utils', 'isEmpty'], ['isEqual', '@ember/utils', 'isEqual'], ['isNone', '@ember/utils', 'isNone'], ['isPresent', '@ember/utils', 'isPresent'], ['typeOf', '@ember/utils', 'typeOf'], // @ember/version\n ['VERSION', '@ember/version', 'VERSION'], // @glimmer/tracking\n ['_tracked', '@glimmer/tracking', 'tracked'], // @glimmer/tracking/primitives/cache\n ['_createCache', '@glimmer/tracking/primitives/cache', 'createCache'], ['_cacheGetValue', '@glimmer/tracking/primitives/cache', 'getValue'], ['_cacheIsConst', '@glimmer/tracking/primitives/cache', 'isConst'], // @ember/-internals/environment\n ['ENV', '@ember/-internals/environment', {\n get: 'getENV'\n }], ['lookup', '@ember/-internals/environment', {\n get: 'getLookup',\n set: 'setLookup'\n }], // @ember/-internals/utils\n ['GUID_KEY', '@ember/-internals/utils'], ['uuid', '@ember/-internals/utils'], ['generateGuid', '@ember/-internals/utils'], ['canInvoke', '@ember/-internals/utils'], ['wrap', '@ember/-internals/utils'], ['_Cache', '@ember/-internals/utils', 'Cache'], // @ember/-internals/container\n ['Registry', '@ember/-internals/container', 'Registry'], ['Container', '@ember/-internals/container', 'Container'], // @ember/-internals/metal\n ['_descriptor', '@ember/-internals/metal', 'nativeDescDecorator'], ['_setClassicDecorator', '@ember/-internals/metal', 'setClassicDecorator'], ['_getPath', '@ember/-internals/metal'], ['hasListeners', '@ember/-internals/metal'], ['beginPropertyChanges', '@ember/-internals/metal'], ['endPropertyChanges', '@ember/-internals/metal'], ['changeProperties', '@ember/-internals/metal'], ['libraries', '@ember/-internals/metal'], ['BOOTED', '@ember/-internals/metal', {\n get: 'isNamespaceSearchDisabled',\n set: 'setNamespaceSearchDisabled'\n }], // @ember/-internals/error-handling\n ['onerror', '@ember/-internals/error-handling', {\n get: 'getOnerror',\n set: 'setOnerror'\n }], // @ember/-internals/meta\n ['meta', '@ember/-internals/meta'], // @ember/-internals/views\n ['ViewUtils.isSimpleClick', '@ember/-internals/views', 'isSimpleClick'], ['ViewUtils.getElementView', '@ember/-internals/views', 'getElementView'], ['ViewUtils.getViewElement', '@ember/-internals/views', 'getViewElement'], ['ViewUtils.getViewBounds', '@ember/-internals/views', 'getViewBounds'], ['ViewUtils.getViewClientRects', '@ember/-internals/views', 'getViewClientRects'], ['ViewUtils.getViewBoundingClientRect', '@ember/-internals/views', 'getViewBoundingClientRect'], ['ViewUtils.getRootViews', '@ember/-internals/views', 'getRootViews'], ['ViewUtils.getChildViews', '@ember/-internals/views', 'getChildViews'], ['ViewUtils.isSerializationFirstNode', '@ember/-internals/glimmer', 'isSerializationFirstNode'], ['ComponentLookup', '@ember/-internals/views'], ['EventDispatcher', '@ember/-internals/views'], // @ember/-internals/glimmer\n ['TEMPLATES', '@ember/-internals/glimmer', {\n get: 'getTemplates',\n set: 'setTemplates'\n }], ['Handlebars.Utils.escapeExpression', '@ember/-internals/glimmer', 'escapeExpression'], ['_Input', '@ember/-internals/glimmer', 'Input'], // @ember/-internals/runtime\n ['_RegistryProxyMixin', '@ember/-internals/runtime', 'RegistryProxyMixin'], ['_ContainerProxyMixin', '@ember/-internals/runtime', 'ContainerProxyMixin'], ['Comparable', '@ember/-internals/runtime'], ['ActionHandler', '@ember/-internals/runtime'], ['NativeArray', '@ember/-internals/runtime'], ['MutableEnumerable', '@ember/-internals/runtime'], ['ControllerMixin', '@ember/controller/lib/controller_mixin', 'default'], ['_ProxyMixin', '@ember/-internals/runtime'], // @ember/-internals/routing\n ['controllerFor', '@ember/-internals/routing'], ['generateControllerFactory', '@ember/-internals/routing'], ['generateController', '@ember/-internals/routing'], ['RouterDSL', '@ember/-internals/routing'], // backburner\n ['_Backburner', 'backburner', 'default'], // rsvp\n [null, 'rsvp', 'default'], [null, 'rsvp', 'Promise'], [null, 'rsvp', 'all'], [null, 'rsvp', 'allSettled'], [null, 'rsvp', 'defer'], [null, 'rsvp', 'denodeify'], [null, 'rsvp', 'filter'], [null, 'rsvp', 'hash'], [null, 'rsvp', 'hashSettled'], [null, 'rsvp', 'map'], [null, 'rsvp', 'off'], [null, 'rsvp', 'on'], [null, 'rsvp', 'race'], [null, 'rsvp', 'reject'], [null, 'rsvp', 'resolve'], // misc.\n ['platform.defineProperty', null, {\n value: true\n }]].filter(Boolean);\n});","define(\"ember/tests/routing/decoupled_basic_test\", [\"@ember/-internals/owner\", \"rsvp\", \"ember-template-compiler\", \"@ember/-internals/routing\", \"@ember/controller\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/runloop\", \"@ember/-internals/metal\", \"@ember/engine\", \"router_js\"], function (_owner, _rsvp, _emberTemplateCompiler, _routing, _controller, _runtime, _internalTestHelpers, _runloop, _metal, _engine, _router_js) {\n \"use strict\";\n\n /* eslint-disable no-console */\n var originalConsoleError;\n\n function handleURLRejectsWith(context, assert, path, expectedReason) {\n return context.visit(path).then(() => {\n assert.ok(false, 'expected handleURLing: `' + path + '` to fail');\n }).catch(reason => {\n assert.equal(reason.message, expectedReason);\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Basic Routing - Decoupled from global resolver', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.addTemplate('home', 'Hours ');\n this.addTemplate('camelot', '');\n this.addTemplate('homepage', 'Megatroll {{this.name}}
');\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n originalConsoleError = console.error;\n }\n\n teardown() {\n super.teardown();\n console.error = originalConsoleError;\n }\n\n handleURLAborts(assert, path) {\n (0, _runloop.run)(() => {\n var router = this.applicationInstance.lookup('router:main');\n router.handleURL(path).then(function () {\n assert.ok(false, 'url: `' + path + '` was NOT to be handled');\n }, function (reason) {\n assert.ok(reason && reason.message === 'TransitionAborted', 'url: `' + path + '` was to be aborted');\n });\n });\n }\n\n async ['@test warn on URLs not included in the route set'](assert) {\n await this.visit('/');\n await assert.rejects(this.visit('/what-is-this-i-dont-even'), /\\/what-is-this-i-dont-even/);\n }\n\n ['@test The Homepage'](assert) {\n return this.visit('/').then(() => {\n assert.equal(this.appRouter.currentPath, 'home', 'currently on the home route');\n var text = this.$('.hours').text();\n assert.equal(text, 'Hours', 'the home template was rendered');\n });\n }\n\n [`@test The Homepage and the Camelot page with multiple Router.map calls`](assert) {\n this.router.map(function () {\n this.route('camelot', {\n path: '/camelot'\n });\n });\n return this.visit('/camelot').then(() => {\n assert.equal(this.appRouter.currentPath, 'camelot');\n var text = this.$('#camelot').text();\n assert.equal(text, 'Is a silly place', 'the camelot template was rendered');\n return this.visit('/');\n }).then(() => {\n assert.equal(this.appRouter.currentPath, 'home');\n var text = this.$('.hours').text();\n assert.equal(text, 'Hours', 'the home template was rendered');\n });\n }\n\n ['@test The Special Page returning a promise puts the app into a loading state until the promise is resolved']() {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n var menuItem, resolve;\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({\n id: id\n });\n return new _rsvp.default.Promise(function (res) {\n resolve = res;\n });\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.addTemplate('special', '{{@model.id}}
');\n this.addTemplate('loading', 'LOADING!
');\n var visited = (0, _internalTestHelpers.runTask)(() => this.visit('/specials/1'));\n this.assertText('LOADING!', 'The app is in the loading state');\n resolve(menuItem);\n return visited.then(() => {\n this.assertText('1', 'The app is now in the specials state');\n });\n }\n\n [`@test The loading state doesn't get entered for promises that resolve on the same run loop`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n return {\n id: id\n };\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.add('route:loading', _routing.Route.extend({\n enter() {\n assert.ok(false, \"LoadingRoute shouldn't have been entered.\");\n }\n\n }));\n this.addTemplate('special', '{{@model.id}}
');\n this.addTemplate('loading', 'LOADING!
');\n return this.visit('/specials/1').then(() => {\n var text = this.$('p').text();\n assert.equal(text, '1', 'The app is now in the specials state');\n });\n }\n\n [\"@test The Special page returning an error invokes SpecialRoute's error handler\"](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n var menuItem, promise, resolve;\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({\n id: id\n });\n promise = new _rsvp.default.Promise(res => resolve = res);\n return promise;\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.add('route:special', _routing.Route.extend({\n setup() {\n throw new Error('Setup error');\n },\n\n actions: {\n error(reason) {\n assert.equal(reason.message, 'Setup error', 'SpecialRoute#error received the error thrown from setup');\n return true;\n }\n\n }\n }));\n (0, _internalTestHelpers.runTask)(() => handleURLRejectsWith(this, assert, 'specials/1', 'Setup error'));\n resolve(menuItem);\n }\n\n [\"@test ApplicationRoute's default error handler can be overridden\"](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n var menuItem, resolve;\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({\n id: id\n });\n return new _rsvp.default.Promise(res => resolve = res);\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.add('route:application', _routing.Route.extend({\n actions: {\n error(reason) {\n assert.equal(reason.message, 'Setup error', 'error was correctly passed to custom ApplicationRoute handler');\n return true;\n }\n\n }\n }));\n this.add('route:special', _routing.Route.extend({\n setup() {\n throw new Error('Setup error');\n }\n\n }));\n var promise = (0, _internalTestHelpers.runTask)(() => handleURLRejectsWith(this, assert, '/specials/1', 'Setup error'));\n resolve(menuItem);\n return promise;\n }\n\n async ['@test Events are triggered on the controller if a matching action name is implemented'](assert) {\n var done = assert.async();\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n var model = {\n name: 'Tom Dale'\n };\n var stateIsNotCalled = true;\n this.add('route:home', _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff() {\n stateIsNotCalled = false;\n }\n\n }\n }));\n this.addTemplate('home', '{{this.name}} ');\n this.add('controller:home', _controller.default.extend({\n actions: {\n showStuff(context) {\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n assert.deepEqual(context, {\n name: 'Tom Dale'\n }, 'an event with context is passed');\n done();\n }\n\n }\n }));\n await this.visit('/');\n document.getElementById('qunit-fixture').querySelector('a').click();\n }\n\n async ['@test Events are triggered on the current state when defined in `actions` object'](assert) {\n var done = assert.async();\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n var model = {\n name: 'Tom Dale'\n };\n\n var HomeRoute = _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff(obj) {\n assert.ok(this instanceof HomeRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj), {\n name: 'Tom Dale'\n }, 'the context is correct');\n done();\n }\n\n }\n });\n\n this.add('route:home', HomeRoute);\n this.addTemplate('home', '{{@model.name}} ');\n await this.visit('/');\n document.getElementById('qunit-fixture').querySelector('a').click();\n }\n\n async ['@test Events defined in `actions` object are triggered on the current state when routes are nested'](assert) {\n var done = assert.async();\n this.router.map(function () {\n this.route('root', {\n path: '/'\n }, function () {\n this.route('index', {\n path: '/'\n });\n });\n });\n var model = {\n name: 'Tom Dale'\n };\n\n var RootRoute = _routing.Route.extend({\n actions: {\n showStuff(obj) {\n assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj), {\n name: 'Tom Dale'\n }, 'the context is correct');\n done();\n }\n\n }\n });\n\n this.add('route:root', RootRoute);\n this.add('route:root.index', _routing.Route.extend({\n model() {\n return model;\n }\n\n }));\n this.addTemplate('root.index', '{{@model.name}} ');\n await this.visit('/');\n document.getElementById('qunit-fixture').querySelector('a').click();\n }\n\n ['@test Events can be handled by inherited event handlers'](assert) {\n assert.expect(4);\n\n var SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar hander in super route');\n }\n\n }\n });\n\n var RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO', 'bar handler in mixin');\n\n this._super(msg);\n }\n\n }\n });\n\n this.add('route:home', SuperRoute.extend(RouteMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz', 'baz hander in route');\n }\n\n }\n }));\n this.addTemplate('home', `\n Do foo \n Do bar with arg \n Do bar \n `);\n return this.visit('/').then(() => {\n var rootElement = document.getElementById('qunit-fixture');\n rootElement.querySelector('.do-foo').click();\n rootElement.querySelector('.do-bar-with-arg').click();\n rootElement.querySelector('.do-baz').click();\n });\n }\n\n async ['@test Actions are not triggered on the controller if a matching action name is implemented as a method'](assert) {\n var done = assert.async();\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n var model = {\n name: 'Tom Dale'\n };\n var stateIsNotCalled = true;\n this.add('route:home', _routing.Route.extend({\n model() {\n return model;\n },\n\n actions: {\n showStuff(context) {\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n assert.deepEqual(context, {\n name: 'Tom Dale'\n }, 'an event with context is passed');\n done();\n }\n\n }\n }));\n this.addTemplate('home', '{{this.name}} ');\n this.add('controller:home', _controller.default.extend({\n showStuff() {\n stateIsNotCalled = false;\n assert.ok(stateIsNotCalled, 'an event on the state is not triggered');\n }\n\n }));\n await this.visit('/');\n document.getElementById('qunit-fixture').querySelector('a').click();\n }\n\n async ['@test actions can be triggered with multiple arguments'](assert) {\n var done = assert.async();\n this.router.map(function () {\n this.route('root', {\n path: '/'\n }, function () {\n this.route('index', {\n path: '/'\n });\n });\n });\n var model1 = {\n name: 'Tilde'\n };\n var model2 = {\n name: 'Tom Dale'\n };\n\n var RootRoute = _routing.Route.extend({\n actions: {\n showStuff(obj1, obj2) {\n assert.ok(this instanceof RootRoute, 'the handler is an App.HomeRoute');\n assert.deepEqual(Object.assign({}, obj1), {\n name: 'Tilde'\n }, 'the first context is correct');\n assert.deepEqual(Object.assign({}, obj2), {\n name: 'Tom Dale'\n }, 'the second context is correct');\n done();\n }\n\n }\n });\n\n this.add('route:root', RootRoute);\n this.add('controller:root.index', _controller.default.extend({\n model1: model1,\n model2: model2\n }));\n this.addTemplate('root.index', '{{this.model1.name}} ');\n await this.visit('/');\n document.getElementById('qunit-fixture').querySelector('a').click();\n }\n\n ['@test transitioning multiple times in a single run loop only sets the URL once'](assert) {\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('foo');\n this.route('bar');\n });\n return this.visit('/').then(() => {\n var urlSetCount = 0;\n var router = this.applicationInstance.lookup('router:main');\n\n router.get('location').setURL = function (path) {\n urlSetCount++;\n (0, _metal.set)(this, 'path', path);\n };\n\n assert.equal(urlSetCount, 0);\n (0, _runloop.run)(function () {\n router.transitionTo('foo');\n router.transitionTo('bar');\n });\n assert.equal(urlSetCount, 1);\n assert.equal(router.get('location').getURL(), '/bar');\n });\n }\n\n ['@test navigating away triggers a url property change'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('foo', {\n path: '/foo'\n });\n this.route('bar', {\n path: '/bar'\n });\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n (0, _metal.addObserver)(router, 'url', function () {\n assert.ok(true, 'url change event was fired');\n });\n ['foo', 'bar', '/foo'].forEach(destination => (0, _runloop.run)(router, 'transitionTo', destination));\n });\n }\n\n ['@test using replaceWith calls location.replaceURL if available'](assert) {\n var setCount = 0;\n var replaceCount = 0;\n this.router.reopen({\n location: _routing.NoneLocation.create({\n setURL(path) {\n setCount++;\n (0, _metal.set)(this, 'path', path);\n },\n\n replaceURL(path) {\n replaceCount++;\n (0, _metal.set)(this, 'path', path);\n }\n\n })\n });\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('foo');\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(setCount, 1);\n assert.equal(replaceCount, 0);\n (0, _runloop.run)(() => router.replaceWith('foo'));\n assert.equal(setCount, 1, 'should not call setURL');\n assert.equal(replaceCount, 1, 'should call replaceURL once');\n assert.equal(router.get('location').getURL(), '/foo');\n });\n }\n\n ['@test using replaceWith calls setURL if location.replaceURL is not defined'](assert) {\n var setCount = 0;\n this.router.reopen({\n location: _routing.NoneLocation.create({\n setURL(path) {\n setCount++;\n (0, _metal.set)(this, 'path', path);\n }\n\n })\n });\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('foo');\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(setCount, 1);\n (0, _runloop.run)(() => router.replaceWith('foo'));\n assert.equal(setCount, 2, 'should call setURL once');\n assert.equal(router.get('location').getURL(), '/foo');\n });\n }\n\n ['@test A redirection hook is provided'](assert) {\n this.router.map(function () {\n this.route('choose', {\n path: '/'\n });\n this.route('home');\n });\n var chooseFollowed = 0;\n var destination = 'home';\n this.add('route:choose', _routing.Route.extend({\n redirect() {\n if (destination) {\n expectDeprecation(() => {\n this.transitionTo(destination);\n }, /Calling transitionTo on a route is deprecated/);\n }\n },\n\n setupController() {\n chooseFollowed++;\n }\n\n }));\n return this.visit('/').then(() => {\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal(chooseFollowed, 0, \"The choose route wasn't entered since a transition occurred\");\n assert.equal(rootElement.querySelectorAll('h3.hours').length, 1, 'The home template was rendered');\n assert.equal(this.appRouter.currentPath, 'home');\n });\n }\n\n ['@test Redirecting from the middle of a route aborts the remainder of the routes'](assert) {\n assert.expect(4);\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', {\n resetNamespace: true\n }, function () {\n this.route('baz');\n });\n });\n });\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n expectDeprecation(() => {\n this.transitionTo('home');\n }, /Calling transitionTo on a route is deprecated/);\n },\n\n setupController() {\n assert.ok(false, 'Should transition before setupController');\n }\n\n }));\n this.add('route:bar-baz', _routing.Route.extend({\n enter() {\n assert.ok(false, 'Should abort transition getting to next route');\n }\n\n }));\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n this.handleURLAborts(assert, '/foo/bar/baz');\n assert.equal(router.currentPath, 'home');\n assert.equal(router.get('location').getURL(), '/home');\n });\n }\n\n ['@test Redirecting to the current target in the middle of a route does not abort initial routing'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', {\n resetNamespace: true\n }, function () {\n this.route('baz');\n });\n });\n });\n var successCount = 0;\n this.add('route:bar', _routing.Route.extend({\n redirect() {\n return expectDeprecation(() => {\n return this.transitionTo('bar.baz').then(function () {\n successCount++;\n });\n }, /Calling transitionTo on a route is deprecated/);\n },\n\n setupController() {\n assert.ok(true, \"Should still invoke bar's setupController\");\n }\n\n }));\n this.add('route:bar.baz', _routing.Route.extend({\n setupController() {\n assert.ok(true, \"Should still invoke bar.baz's setupController\");\n }\n\n }));\n return this.visit('/foo/bar/baz').then(() => {\n assert.ok(true, '/foo/bar/baz has been handled');\n assert.equal(this.appRouter.currentPath, 'foo.bar.baz');\n assert.equal(successCount, 1, 'transitionTo success handler was called once');\n });\n }\n\n ['@test Redirecting to the current target with a different context aborts the remainder of the routes'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('home');\n this.route('foo', function () {\n this.route('bar', {\n path: 'bar/:id',\n resetNamespace: true\n }, function () {\n this.route('baz');\n });\n });\n });\n var model = {\n id: 2\n };\n var count = 0;\n this.add('route:bar', _routing.Route.extend({\n afterModel() {\n if (count++ > 10) {\n assert.ok(false, 'infinite loop');\n } else {\n expectDeprecation(() => {\n this.transitionTo('bar.baz', model);\n }, /Calling transitionTo on a route is deprecated/);\n }\n }\n\n }));\n this.add('route:bar.baz', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'Should still invoke setupController');\n }\n\n }));\n return this.visit('/').then(() => {\n this.handleURLAborts(assert, '/foo/bar/1/baz');\n assert.equal(this.appRouter.currentPath, 'foo.bar.baz');\n assert.equal(this.applicationInstance.lookup('router:main').get('location').getURL(), '/foo/bar/2/baz');\n });\n }\n\n ['@test Transitioning from a parent event does not prevent currentPath from being set'](assert) {\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', {\n resetNamespace: true\n }, function () {\n this.route('baz');\n });\n this.route('qux');\n });\n });\n this.add('route:foo', _routing.Route.extend({\n actions: {\n goToQux() {\n expectDeprecation(() => {\n this.transitionTo('foo.qux');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }\n }));\n return this.visit('/foo/bar/baz').then(() => {\n assert.ok(true, '/foo/bar/baz has been handled');\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(router.currentPath, 'foo.bar.baz');\n (0, _runloop.run)(() => router.send('goToQux'));\n assert.equal(router.currentPath, 'foo.qux');\n assert.equal(router.get('location').getURL(), '/foo/qux');\n });\n }\n\n ['@test Router accounts for rootURL on page load when using history location'](assert) {\n var rootURL = window.location.pathname + '/app';\n var postsTemplateRendered = false;\n var setHistory;\n\n setHistory = function (obj, path) {\n obj.set('history', {\n state: {\n path: path\n }\n });\n };\n\n var location = _routing.HistoryLocation.create({\n initState() {\n var path = rootURL + '/posts';\n setHistory(this, path);\n this.set('location', {\n pathname: path,\n href: 'http://localhost/' + path\n });\n },\n\n replaceState(path) {\n setHistory(this, path);\n },\n\n pushState(path) {\n setHistory(this, path);\n }\n\n });\n\n this.router.reopen({\n // location: 'historyTest',\n location,\n rootURL: rootURL\n });\n this.router.map(function () {\n this.route('posts', {\n path: '/posts'\n });\n });\n this.add('route:posts', _routing.Route.extend({\n model() {},\n\n setupController() {\n postsTemplateRendered = true;\n\n this._super(...arguments);\n }\n\n }));\n return this.visit('/').then(() => {\n assert.ok(postsTemplateRendered, 'Posts route successfully stripped from rootURL');\n (0, _internalTestHelpers.runDestroy)(location);\n location = null;\n });\n }\n\n ['@test The rootURL is passed properly to the location implementation'](assert) {\n assert.expect(1);\n var rootURL = '/blahzorz';\n this.add('location:history-test', _routing.HistoryLocation.extend({\n rootURL: 'this is not the URL you are looking for',\n history: {\n pushState() {}\n\n },\n\n initState() {\n assert.equal(this.get('rootURL'), rootURL);\n }\n\n }));\n this.router.reopen({\n location: 'history-test',\n rootURL: rootURL,\n\n // if we transition in this test we will receive failures\n // if the tests are run from a static file\n _doURLTransition() {\n return _rsvp.default.resolve('');\n }\n\n });\n return this.visit('/');\n }\n\n ['@test Generating a URL should not affect currentModel'](assert) {\n this.router.map(function () {\n this.route('post', {\n path: '/posts/:post_id'\n });\n });\n var posts = {\n 1: {\n id: 1\n },\n 2: {\n id: 2\n }\n };\n this.add('route:post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n\n }));\n return this.visit('/posts/1').then(() => {\n assert.ok(true, '/posts/1 has been handled');\n var route = this.applicationInstance.lookup('route:post');\n assert.equal(route.modelFor('post'), posts[1]);\n var url = this.applicationInstance.lookup('router:main').generate('post', posts[2]);\n assert.equal(url, '/posts/2');\n assert.equal(route.modelFor('post'), posts[1]);\n });\n }\n\n [\"@test Nested index route is not overridden by parent's implicit index route\"](assert) {\n this.router.map(function () {\n this.route('posts', function () {\n this.route('index', {\n path: ':category'\n });\n });\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n return router.transitionTo('posts', {\n category: 'emberjs'\n });\n }).then(() => {\n var router = this.applicationInstance.lookup('router:main');\n assert.deepEqual(router.location.path, '/posts/emberjs');\n });\n }\n\n ['@test Promises encountered on app load put app into loading state until resolved'](assert) {\n assert.expect(2);\n\n var deferred = _rsvp.default.defer();\n\n this.router.map(function () {\n this.route('index', {\n path: '/'\n });\n });\n this.add('route:index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n this.addTemplate('index', 'INDEX
');\n this.addTemplate('loading', 'LOADING
');\n (0, _runloop.run)(() => this.visit('/'));\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'LOADING', 'The loading state is displaying.');\n (0, _runloop.run)(deferred.resolve);\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'INDEX', 'The index route is display.');\n }\n\n ['@test Aborting/redirecting the transition in `willTransition` prevents LoadingRoute from being entered'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('index');\n this.route('nork');\n this.route('about');\n });\n var redirect = false;\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition(transition) {\n assert.ok(true, 'willTransition was called');\n\n if (redirect) {\n // router.js won't refire `willTransition` for this redirect\n expectDeprecation(() => {\n this.transitionTo('about');\n }, /Calling transitionTo on a route is deprecated/);\n } else {\n transition.abort();\n }\n }\n\n }\n }));\n var deferred = null;\n this.add('route:loading', _routing.Route.extend({\n activate() {\n assert.ok(deferred, 'LoadingRoute should be entered at this time');\n },\n\n deactivate() {\n assert.ok(true, 'LoadingRoute was exited');\n }\n\n }));\n this.add('route:nork', _routing.Route.extend({\n activate() {\n assert.ok(true, 'NorkRoute was entered');\n }\n\n }));\n this.add('route:about', _routing.Route.extend({\n activate() {\n assert.ok(true, 'AboutRoute was entered');\n },\n\n model() {\n if (deferred) {\n return deferred.promise;\n }\n }\n\n }));\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main'); // Attempted transitions out of index should abort.\n\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'handleURL', '/nork'); // Attempted transitions out of index should redirect to about\n\n redirect = true;\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(router, 'transitionTo', 'index'); // Redirected transitions out of index to a route with a\n // promise model should pause the transition and\n // activate LoadingRoute\n\n deferred = _rsvp.default.defer();\n (0, _runloop.run)(router, 'transitionTo', 'nork');\n (0, _runloop.run)(deferred.resolve);\n });\n }\n\n ['@test `activate` event fires on the route'](assert) {\n assert.expect(4);\n var eventFired = 0;\n this.router.map(function () {\n this.route('nork');\n });\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('activate', function (transition) {\n assert.equal(++eventFired, 1, 'activate event is fired once');\n assert.ok(transition, 'transition is passed to activate event');\n });\n },\n\n activate(transition) {\n assert.ok(true, 'activate hook is called');\n assert.ok(transition, 'transition is passed to activate hook');\n }\n\n }));\n return this.visit('/nork');\n }\n\n ['@test `deactivate` event fires on the route'](assert) {\n assert.expect(4);\n var eventFired = 0;\n this.router.map(function () {\n this.route('nork');\n this.route('dork');\n });\n this.add('route:nork', _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n this.on('deactivate', function (transition) {\n assert.equal(++eventFired, 1, 'deactivate event is fired once');\n assert.ok(transition, 'transition is passed');\n });\n },\n\n deactivate(transition) {\n assert.ok(true, 'deactivate hook is called');\n assert.ok(transition, 'transition is passed');\n }\n\n }));\n return this.visit('/nork').then(() => this.visit('/dork'));\n }\n\n ['@test Actions can be handled by inherited action handlers'](assert) {\n assert.expect(4);\n\n var SuperRoute = _routing.Route.extend({\n actions: {\n foo() {\n assert.ok(true, 'foo');\n },\n\n bar(msg) {\n assert.equal(msg, 'HELLO');\n }\n\n }\n });\n\n var RouteMixin = _metal.Mixin.create({\n actions: {\n bar(msg) {\n assert.equal(msg, 'HELLO');\n\n this._super(msg);\n }\n\n }\n });\n\n this.add('route:home', SuperRoute.extend(RouteMixin, {\n actions: {\n baz() {\n assert.ok(true, 'baz');\n }\n\n }\n }));\n this.addTemplate('home', `\n Do foo \n Do bar with arg \n Do bar \n `);\n return this.visit('/').then(() => {\n var rootElement = document.getElementById('qunit-fixture');\n rootElement.querySelector('.do-foo').click();\n rootElement.querySelector('.do-bar-with-arg').click();\n rootElement.querySelector('.do-baz').click();\n });\n }\n\n ['@test transitionTo returns Transition when passed a route name'](assert) {\n assert.expect(1);\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('bar');\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n var transition = (0, _runloop.run)(() => router.transitionTo('bar'));\n assert.equal(transition instanceof _router_js.InternalTransition, true);\n });\n }\n\n ['@test transitionTo returns Transition when passed a url'](assert) {\n assert.expect(1);\n this.router.map(function () {\n this.route('root', {\n path: '/'\n });\n this.route('bar', function () {\n this.route('baz');\n });\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n var transition = (0, _runloop.run)(() => router.transitionTo('/bar/baz'));\n assert.equal(transition instanceof _router_js.InternalTransition, true);\n });\n }\n\n ['@test currentRouteName is a property installed on Router that can be used in transitionTo'](assert) {\n assert.expect(24);\n this.router.map(function () {\n this.route('index', {\n path: '/'\n });\n this.route('be', function () {\n this.route('excellent', {\n resetNamespace: true\n }, function () {\n this.route('to', {\n resetNamespace: true\n }, function () {\n this.route('each', {\n resetNamespace: true\n }, function () {\n this.route('other');\n });\n });\n });\n });\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n\n function transitionAndCheck(path, expectedPath, expectedRouteName) {\n if (path) {\n (0, _runloop.run)(router, 'transitionTo', path);\n }\n\n assert.equal(router.currentPath, expectedPath);\n assert.equal(router.currentRouteName, expectedRouteName);\n }\n\n transitionAndCheck(null, 'index', 'index');\n transitionAndCheck('/be', 'be.index', 'be.index');\n transitionAndCheck('/be/excellent', 'be.excellent.index', 'excellent.index');\n transitionAndCheck('/be/excellent/to', 'be.excellent.to.index', 'to.index');\n transitionAndCheck('/be/excellent/to/each', 'be.excellent.to.each.index', 'each.index');\n transitionAndCheck('/be/excellent/to/each/other', 'be.excellent.to.each.other', 'each.other');\n transitionAndCheck('index', 'index', 'index');\n transitionAndCheck('be', 'be.index', 'be.index');\n transitionAndCheck('excellent', 'be.excellent.index', 'excellent.index');\n transitionAndCheck('to.index', 'be.excellent.to.index', 'to.index');\n transitionAndCheck('each', 'be.excellent.to.each.index', 'each.index');\n transitionAndCheck('each.other', 'be.excellent.to.each.other', 'each.other');\n });\n }\n\n [\"@test Redirecting with null model doesn't error out\"](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('about', {\n path: '/about/:hurhurhur'\n });\n });\n this.add('route:about', _routing.Route.extend({\n serialize: function (model) {\n if (model === null) {\n return {\n hurhurhur: 'TreeklesMcGeekles'\n };\n }\n }\n }));\n this.add('route:home', _routing.Route.extend({\n beforeModel() {\n expectDeprecation(() => {\n this.transitionTo('about', null);\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(router.get('location.path'), '/about/TreeklesMcGeekles');\n });\n }\n\n async ['@test rejecting the model hooks promise with a non-error prints the `message` property'](assert) {\n assert.expect(5);\n var rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n var rejectedStack = 'Yeah, buddy: stack gets printed too.';\n this.router.map(function () {\n this.route('yippie', {\n path: '/'\n });\n });\n\n console.error = function (initialMessage, errorMessage, errorStack) {\n assert.equal(initialMessage, 'Error while processing route: yippie', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n assert.equal(errorStack, rejectedStack, \"the rejected reason's stack property is logged\");\n };\n\n this.add('route:yippie', _routing.Route.extend({\n model() {\n return _rsvp.default.reject({\n message: rejectedMessage,\n stack: rejectedStack\n });\n }\n\n }));\n await assert.rejects(this.visit('/'), function (err) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n async ['@test rejecting the model hooks promise with an error with `errorThrown` property prints `errorThrown.message` property'](assert) {\n assert.expect(5);\n var rejectedMessage = 'OMG!! SOOOOOO BAD!!!!';\n var rejectedStack = 'Yeah, buddy: stack gets printed too.';\n this.router.map(function () {\n this.route('yippie', {\n path: '/'\n });\n });\n\n console.error = function (initialMessage, errorMessage, errorStack) {\n assert.equal(initialMessage, 'Error while processing route: yippie', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n assert.equal(errorStack, rejectedStack, \"the rejected reason's stack property is logged\");\n };\n\n this.add('route:yippie', _routing.Route.extend({\n model() {\n return _rsvp.default.reject({\n errorThrown: {\n message: rejectedMessage,\n stack: rejectedStack\n }\n });\n }\n\n }));\n await assert.rejects(this.visit('/'), function ({\n errorThrown: err\n }) {\n assert.equal(err.message, rejectedMessage);\n return true;\n }, 'expected an exception');\n }\n\n async ['@test rejecting the model hooks promise with no reason still logs error'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('wowzers', {\n path: '/'\n });\n });\n\n console.error = function (initialMessage) {\n assert.equal(initialMessage, 'Error while processing route: wowzers', 'a message with the current route name is printed');\n };\n\n this.add('route:wowzers', _routing.Route.extend({\n model() {\n return _rsvp.default.reject();\n }\n\n }));\n await assert.rejects(this.visit('/'));\n }\n\n async ['@test rejecting the model hooks promise with a string shows a good error'](assert) {\n assert.expect(3);\n var rejectedMessage = 'Supercalifragilisticexpialidocious';\n this.router.map(function () {\n this.route('yondo', {\n path: '/'\n });\n });\n\n console.error = function (initialMessage, errorMessage) {\n assert.equal(initialMessage, 'Error while processing route: yondo', 'a message with the current route name is printed');\n assert.equal(errorMessage, rejectedMessage, \"the rejected reason's message property is logged\");\n };\n\n this.add('route:yondo', _routing.Route.extend({\n model() {\n return _rsvp.default.reject(rejectedMessage);\n }\n\n }));\n await assert.rejects(this.visit('/'), new RegExp(rejectedMessage), 'expected an exception');\n }\n\n [\"@test willLeave, willChangeContext, willChangeModel actions don't fire unless feature flag enabled\"](assert) {\n assert.expect(1);\n this.router.map(function () {\n this.route('about');\n });\n\n function shouldNotFire() {\n assert.ok(false, \"this action shouldn't have been received\");\n }\n\n this.add('route:index', _routing.Route.extend({\n actions: {\n willChangeModel: shouldNotFire,\n willChangeContext: shouldNotFire,\n willLeave: shouldNotFire\n }\n }));\n this.add('route:about', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'about route was entered');\n }\n\n }));\n return this.visit('/about');\n }\n\n async ['@test Errors in transitionTo within redirect hook are logged'](assert) {\n assert.expect(5);\n var actual = [];\n this.router.map(function () {\n this.route('yondo', {\n path: '/'\n });\n this.route('stink-bomb');\n });\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n expectDeprecation(() => {\n this.transitionTo('stink-bomb', {\n something: 'goes boom'\n });\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n\n console.error = function () {\n // push the arguments onto an array so we can detect if the error gets logged twice\n actual.push(arguments);\n };\n\n await assert.rejects(this.visit('/'), /More context objects were passed/);\n assert.equal(actual.length, 1, 'the error is only logged once');\n assert.equal(actual[0][0], 'Error while processing route: yondo', 'source route is printed');\n assert.ok(actual[0][1].match(/More context objects were passed than there are dynamic segments for the route: stink-bomb/), 'the error is printed');\n }\n\n ['@test Errors in transition show error template if available'](assert) {\n this.addTemplate('error', \"Error!
\");\n this.router.map(function () {\n this.route('yondo', {\n path: '/'\n });\n this.route('stink-bomb');\n });\n this.add('route:yondo', _routing.Route.extend({\n redirect() {\n expectDeprecation(() => {\n this.transitionTo('stink-bomb', {\n something: 'goes boom'\n });\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n\n console.error = () => {};\n\n return this.visit('/').then(() => {\n var rootElement = document.querySelector('#qunit-fixture');\n assert.equal(rootElement.querySelectorAll('#error').length, 1, 'Error template was rendered.');\n });\n }\n\n ['@test Route#resetController gets fired when changing models and exiting routes'](assert) {\n assert.expect(4);\n this.router.map(function () {\n this.route('a', function () {\n this.route('b', {\n path: '/b/:id',\n resetNamespace: true\n }, function () {});\n this.route('c', {\n path: '/c/:id',\n resetNamespace: true\n }, function () {});\n });\n this.route('out');\n });\n var calls = [];\n\n var SpyRoute = _routing.Route.extend({\n setupController()\n /* controller, model, transition */\n {\n calls.push(['setup', this.routeName]);\n },\n\n resetController()\n /* controller */\n {\n calls.push(['reset', this.routeName]);\n }\n\n });\n\n this.add('route:a', SpyRoute.extend());\n this.add('route:b', SpyRoute.extend());\n this.add('route:c', SpyRoute.extend());\n this.add('route:out', SpyRoute.extend());\n var router;\n return this.visit('/').then(() => {\n router = this.applicationInstance.lookup('router:main');\n assert.deepEqual(calls, []);\n return (0, _runloop.run)(router, 'transitionTo', 'b', 'b-1');\n }).then(() => {\n assert.deepEqual(calls, [['setup', 'a'], ['setup', 'b']]);\n calls.length = 0;\n return (0, _runloop.run)(router, 'transitionTo', 'c', 'c-1');\n }).then(() => {\n assert.deepEqual(calls, [['reset', 'b'], ['setup', 'c']]);\n calls.length = 0;\n return (0, _runloop.run)(router, 'transitionTo', 'out');\n }).then(() => {\n assert.deepEqual(calls, [['reset', 'c'], ['reset', 'a'], ['setup', 'out']]);\n });\n }\n\n async ['@test Exception during initialization of non-initial route is not swallowed'](assert) {\n this.router.map(function () {\n this.route('boom');\n });\n this.add('route:boom', _routing.Route.extend({\n init() {\n throw new Error('boom!');\n }\n\n }));\n await assert.rejects(this.visit('/boom'), /\\bboom\\b/);\n }\n\n async ['@test Exception during initialization of initial route is not swallowed'](assert) {\n this.router.map(function () {\n this.route('boom', {\n path: '/'\n });\n });\n this.add('route:boom', _routing.Route.extend({\n init() {\n throw new Error('boom!');\n }\n\n }));\n await assert.rejects(this.visit('/'), /\\bboom\\b/);\n }\n\n async ['@test Doesnt swallow exception thrown from willTransition'](assert) {\n assert.expect(1);\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('index', 'index');\n this.addTemplate('other', 'other');\n this.router.map(function () {\n this.route('index', {\n path: '/'\n });\n this.route('other', function () {});\n });\n this.add('route:index', _routing.Route.extend({\n actions: {\n willTransition() {\n throw new Error('boom');\n }\n\n }\n }));\n await this.visit('/');\n await assert.rejects(this.visit('/other'), /boom/, 'expected an exception but none was thrown');\n }\n\n ['@test Route serializers work for Engines'](assert) {\n assert.expect(2); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var postSerialize = function (params) {\n assert.ok(true, 'serialize hook runs');\n return {\n post_id: params.id\n };\n };\n\n var BlogMap = function () {\n this.route('post', {\n path: '/post/:post_id',\n serialize: postSerialize\n });\n };\n\n this.add('route-map:blog', BlogMap);\n this.router.map(function () {\n this.mount('blog');\n });\n return this.visit('/').then(() => {\n var router = this.applicationInstance.lookup('router:main');\n assert.equal(router._routerMicrolib.generate('blog.post', {\n id: '13'\n }), '/blog/post/13', 'url is generated properly');\n });\n }\n\n async ['@test Defining a Route#serialize method in an Engine throws an error'](assert) {\n assert.expect(1); // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n this.add('engine:blog', BlogEngine); // Register engine route map\n\n var BlogMap = function () {\n this.route('post');\n };\n\n this.add('route-map:blog', BlogMap);\n this.router.map(function () {\n this.mount('blog');\n });\n await this.visit('/');\n var router = this.applicationInstance.lookup('router:main');\n\n var PostRoute = _routing.Route.extend({\n serialize() {}\n\n });\n\n this.applicationInstance.lookup('engine:blog').register('route:post', PostRoute);\n\n try {\n // TODO: for some reason this doesn't work with assert.reject\n await router.transitionTo('blog.post');\n } catch (e) {\n assert.ok(e.message.match(/Defining a custom serialize method on an Engine route is not supported/));\n }\n }\n\n ['@test App.destroy does not leave undestroyed views after clearing engines'](assert) {\n assert.expect(4);\n var engineInstance; // Register engine\n\n var BlogEngine = _engine.default.extend({\n Resolver: _internalTestHelpers.ModuleBasedTestResolver\n });\n\n this.add('engine:blog', BlogEngine);\n\n var EngineIndexRoute = _routing.Route.extend({\n init() {\n this._super(...arguments);\n\n engineInstance = (0, _owner.getOwner)(this);\n }\n\n }); // Register engine route map\n\n\n var BlogMap = function () {\n this.route('post');\n };\n\n this.add('route-map:blog', BlogMap);\n this.router.map(function () {\n this.mount('blog');\n });\n return this.visit('/').then(() => {\n var engine = this.applicationInstance.lookup('engine:blog');\n engine.register('route:index', EngineIndexRoute);\n engine.register('template:index', (0, _emberTemplateCompiler.compile)('Engine Post!'));\n return this.visit('/blog');\n }).then(() => {\n assert.ok(true, '/blog has been handled');\n var route = engineInstance.lookup('route:index');\n var router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(router, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was cleared');\n (0, _runloop.run)(route, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n (0, _runloop.run)(this.applicationInstance, 'destroy');\n assert.equal(router._toplevelView, null, 'the toplevelView was not reinitialized');\n });\n }\n\n [\"@test Generated route should be an instance of App's default route if provided\"](assert) {\n var generatedRoute;\n this.router.map(function () {\n this.route('posts');\n });\n\n var AppRoute = _routing.Route.extend();\n\n this.add('route:basic', AppRoute);\n return this.visit('/posts').then(() => {\n generatedRoute = this.applicationInstance.lookup('route:posts');\n assert.ok(generatedRoute instanceof AppRoute, 'should extend the correct route');\n });\n }\n\n });\n});","define(\"ember/tests/routing/model_loading_test\", [\"@ember/-internals/routing\", \"@ember/controller\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/runloop\", \"@ember/-internals/metal\"], function (_routing, _controller, _runtime, _internalTestHelpers, _runloop, _metal) {\n \"use strict\";\n\n /* eslint-disable no-console */\n var originalConsoleError;\n (0, _internalTestHelpers.moduleFor)('Route - model loading', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.addTemplate('home', 'Hours ');\n this.addTemplate('camelot', '');\n this.addTemplate('homepage', 'Megatroll {{this.name}}
');\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n originalConsoleError = console.error;\n }\n\n teardown() {\n super.teardown();\n console.error = originalConsoleError;\n }\n\n async ['@test warn on URLs not included in the route set'](assert) {\n await this.visit('/');\n await assert.rejects(this.visit('/what-is-this-i-dont-even'), /\\/what-is-this-i-dont-even/);\n }\n\n ['@test properties that autotrack the model update when the model changes'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('track', {\n path: '/track/:id'\n });\n });\n\n class HomeRoute extends _routing.Route {\n async model({\n id\n }) {\n return {\n value: id\n };\n }\n\n }\n\n class HomeController extends _controller.default {\n get derivedProperty() {\n return this.model.value || 'value is unset';\n }\n\n }\n\n this.add('route:track', HomeRoute);\n this.add('controller:track', HomeController);\n this.addTemplate('track', '{{this.derivedProperty}} ');\n return this.visit('/track/2').then(() => {\n assert.equal(document.querySelector('h3').innerText, '2', 'the derived property matches the id');\n }).then(() => {\n return this.visit('/track/3').then(() => {\n assert.equal(document.querySelector('h3').innerText, '3', 'the derived property matches the id');\n });\n });\n }\n\n ['@test The Homepage with a `setupController` hook'](assert) {\n this.addTemplate('home', `{{#each this.hours as |entry|}}\n {{entry}} \n {{/each}}\n \n `);\n this.add('route:home', _routing.Route.extend({\n setupController(controller) {\n controller.set('hours', ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm']);\n }\n\n }));\n return this.visit('/').then(() => {\n var text = this.$('ul li:nth-child(3)').text();\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The route controller is still set when overriding the setupController hook`](assert) {\n this.add('route:home', _routing.Route.extend({\n setupController() {// no-op\n // importantly, we are not calling this._super\n }\n\n }));\n this.add('controller:home', _controller.default.extend());\n return this.visit('/').then(() => {\n var homeRoute = this.applicationInstance.lookup('route:home');\n var homeController = this.applicationInstance.lookup('controller:home');\n assert.equal(homeRoute.controller, homeController, 'route controller is the home controller');\n });\n }\n\n ['@test the route controller can be specified via controllerName'](assert) {\n this.addTemplate('home', '{{this.myValue}}
');\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController'\n }));\n this.add('controller:myController', _controller.default.extend({\n myValue: 'foo'\n }));\n return this.visit('/').then(() => {\n var homeRoute = this.applicationInstance.lookup('route:home');\n var myController = this.applicationInstance.lookup('controller:myController');\n var text = this.$('p').text();\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n assert.equal(text, 'foo', 'The homepage template was rendered with data from the custom controller');\n });\n }\n\n [`@test The route controller specified via controllerName is used in render even when a controller with the routeName is available`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.addTemplate('home', 'home: {{this.myValue}}
');\n this.add('route:home', _routing.Route.extend({\n controllerName: 'myController'\n }));\n this.add('controller:home', _controller.default.extend({\n myValue: 'home'\n }));\n this.add('controller:myController', _controller.default.extend({\n myValue: 'myController'\n }));\n return this.visit('/').then(() => {\n var homeRoute = this.applicationInstance.lookup('route:home');\n var myController = this.applicationInstance.lookup('controller:myController');\n var text = this.$('p').text();\n assert.equal(homeRoute.controller, myController, 'route controller is set by controllerName');\n assert.equal(text, 'home: myController', 'The homepage template was rendered with data from the custom controller');\n });\n }\n\n [`@test The Homepage with a 'setupController' hook modifying other controllers`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.add('route:home', _routing.Route.extend({\n setupController()\n /* controller */\n {\n this.controllerFor('home').set('hours', ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm']);\n }\n\n }));\n this.addTemplate('home', '{{#each this.hours as |entry|}}{{entry}} {{/each}} ');\n return this.visit('/').then(() => {\n var text = this.$('ul li:nth-child(3)').text();\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The Homepage with a computed model that does not get overridden`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.add('controller:home', _controller.default.extend({\n model: (0, _metal.computed)(function () {\n return ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm'];\n })\n }));\n this.addTemplate('home', '{{#each this.model as |passage|}}{{passage}} {{/each}} ');\n return this.visit('/').then(() => {\n var text = this.$('ul li:nth-child(3)').text();\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the context intact');\n });\n }\n\n [`@test The Homepage getting its controller context via model`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.add('route:home', _routing.Route.extend({\n model() {\n return ['Monday through Friday: 9am to 5pm', 'Saturday: Noon to Midnight', 'Sunday: Noon to 6pm'];\n },\n\n setupController(controller, model) {\n assert.equal(this.controllerFor('home'), controller);\n this.controllerFor('home').set('hours', model);\n }\n\n }));\n this.addTemplate('home', '{{#each this.hours as |entry|}}{{entry}} {{/each}} ');\n return this.visit('/').then(() => {\n var text = this.$('ul li:nth-child(3)').text();\n assert.equal(text, 'Sunday: Noon to 6pm', 'The template was rendered with the hours context');\n });\n }\n\n [`@test The Specials Page getting its model by deserializing the params hash`](assert) {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n this.add('route:special', _routing.Route.extend({\n model(params) {\n return _runtime.Object.create({\n menuItemId: params.menu_item_id\n });\n }\n\n }));\n this.addTemplate('special', '{{@model.menuItemId}}
');\n return this.visit('/specials/1').then(() => {\n var text = this.$('p').text();\n assert.equal(text, '1', 'The model was used to render the template');\n });\n }\n\n ['@test The Specials Page defaults to looking models up via `find`']() {\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({\n id\n });\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n this.addTemplate('special', '{{@model.id}}');\n return this.visit('/specials/1').then(() => {\n this.assertText('1', 'The model was used to render the template');\n });\n }\n\n ['@test Moving from one page to another triggers the correct callbacks'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('special', {\n path: '/specials/:menu_item_id'\n });\n });\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n return MenuItem.create({\n id: id\n });\n }\n\n });\n this.add('model:menu_item', MenuItem);\n this.addTemplate('home', 'Home ');\n this.addTemplate('special', '{{@model.id}}
');\n return this.visit('/').then(() => {\n this.assertText('Home', 'The app is now in the initial state');\n var promiseContext = MenuItem.create({\n id: 1\n });\n return this.visit('/specials/1', promiseContext);\n }).then(() => {\n assert.equal(this.currentURL, '/specials/1');\n this.assertText('1', 'The app is now transitioned');\n });\n }\n\n ['@test Nested callbacks are not exited when moving to siblings'](assert) {\n var rootSetup = 0;\n var rootModel = 0;\n var rootSerialize = 0;\n var menuItem;\n var rootElement;\n\n var MenuItem = _runtime.Object.extend();\n\n MenuItem.reopenClass({\n find(id) {\n menuItem = MenuItem.create({\n id: id\n });\n return menuItem;\n }\n\n });\n this.router.map(function () {\n this.route('root', {\n path: '/'\n }, function () {\n this.route('special', {\n path: '/specials/:menu_item_id',\n resetNamespace: true\n });\n });\n });\n this.add('route:root', _routing.Route.extend({\n model() {\n rootModel++;\n return this._super(...arguments);\n },\n\n setupController() {\n rootSetup++;\n },\n\n serialize() {\n rootSerialize++;\n return this._super(...arguments);\n }\n\n }));\n this.add('route:loading', _routing.Route.extend({}));\n this.add('route:home', _routing.Route.extend({}));\n this.add('route:special', _routing.Route.extend({\n model({\n menu_item_id\n }) {\n return MenuItem.find(menu_item_id);\n },\n\n setupController(controller, model) {\n (0, _metal.set)(controller, 'model', model);\n }\n\n }));\n this.addTemplate('root.index', 'Home ');\n this.addTemplate('special', '{{@model.id}}
');\n this.addTemplate('loading', 'LOADING!
');\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('h3')), 'Home', 'The app is now in the initial state');\n assert.equal(rootSetup, 1, 'The root setup was triggered');\n assert.equal(rootSerialize, 0, 'The root serialize was not called');\n assert.equal(rootModel, 1, 'The root model was called');\n var router = this.applicationInstance.lookup('router:main');\n var menuItem = MenuItem.create({\n id: 1\n });\n return router.transitionTo('special', menuItem).then(function () {\n assert.equal(rootSetup, 1, 'The root setup was not triggered again');\n assert.equal(rootSerialize, 0, 'The root serialize was not called'); // TODO: Should this be changed?\n\n assert.equal(rootModel, 1, 'The root model was called again');\n assert.deepEqual(router.location.path, '/specials/1');\n assert.equal(router.currentPath, 'root.special');\n });\n });\n }\n\n ['@test Route inherits model from parent route'](assert) {\n assert.expect(9);\n this.router.map(function () {\n this.route('the-post', {\n path: '/posts/:post_id'\n }, function () {\n this.route('comments');\n this.route('shares', {\n path: '/shares/:share_id',\n resetNamespace: true\n }, function () {\n this.route('share');\n });\n });\n });\n var post1 = {};\n var post2 = {};\n var post3 = {};\n var share1 = {};\n var share2 = {};\n var share3 = {};\n var posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n var shares = {\n 1: share1,\n 2: share2,\n 3: share3\n };\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n\n }));\n this.add('route:the-post.comments', _routing.Route.extend({\n afterModel(post\n /*, transition */\n ) {\n var parent_model = this.modelFor('the-post');\n assert.equal(post, parent_model);\n }\n\n }));\n this.add('route:shares', _routing.Route.extend({\n model(params) {\n return shares[params.share_id];\n }\n\n }));\n this.add('route:shares.share', _routing.Route.extend({\n afterModel(share\n /*, transition */\n ) {\n var parent_model = this.modelFor('shares');\n assert.equal(share, parent_model);\n }\n\n }));\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, 'url: /posts/1/comments was handled');\n return this.visit('/posts/1/shares/1');\n }).then(() => {\n assert.ok(true, 'url: /posts/1/shares/1 was handled');\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, 'url: /posts/2/comments was handled');\n return this.visit('/posts/2/shares/2');\n }).then(() => {\n assert.ok(true, 'url: /posts/2/shares/2 was handled');\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, 'url: /posts/3/shares was handled');\n return this.visit('/posts/3/shares/3');\n }).then(() => {\n assert.ok(true, 'url: /posts/3/shares/3 was handled');\n });\n }\n\n ['@test Routes with { resetNamespace: true } inherits model from parent route'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('the-post', {\n path: '/posts/:post_id'\n }, function () {\n this.route('comments', {\n resetNamespace: true\n }, function () {});\n });\n });\n var post1 = {};\n var post2 = {};\n var post3 = {};\n var posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n\n }));\n this.add('route:comments', _routing.Route.extend({\n afterModel(post\n /*, transition */\n ) {\n var parent_model = this.modelFor('the-post');\n assert.equal(post, parent_model);\n }\n\n }));\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, '/posts/1/comments');\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, '/posts/2/comments');\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, '/posts/3/comments');\n });\n }\n\n ['@test It is possible to get the model from a parent route'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('the-post', {\n path: '/posts/:post_id'\n }, function () {\n this.route('comments', {\n resetNamespace: true\n });\n });\n });\n var post1 = {};\n var post2 = {};\n var post3 = {};\n var currentPost;\n var posts = {\n 1: post1,\n 2: post2,\n 3: post3\n };\n this.add('route:the-post', _routing.Route.extend({\n model(params) {\n return posts[params.post_id];\n }\n\n }));\n this.add('route:comments', _routing.Route.extend({\n model() {\n assert.equal(this.modelFor('the-post'), currentPost);\n }\n\n }));\n currentPost = post1;\n return this.visit('/posts/1/comments').then(() => {\n assert.ok(true, '/posts/1/comments has been handled');\n currentPost = post2;\n return this.visit('/posts/2/comments');\n }).then(() => {\n assert.ok(true, '/posts/2/comments has been handled');\n currentPost = post3;\n return this.visit('/posts/3/comments');\n }).then(() => {\n assert.ok(true, '/posts/3/comments has been handled');\n });\n }\n\n ['@test Parent route context change'](assert) {\n var editCount = 0;\n var editedPostIds = (0, _runtime.A)();\n this.addTemplate('application', '{{outlet}}');\n this.addTemplate('posts', '{{outlet}}');\n this.addTemplate('post', '{{outlet}}');\n this.addTemplate('post/index', 'showing');\n this.addTemplate('post/edit', 'editing');\n this.router.map(function () {\n this.route('posts', function () {\n this.route('post', {\n path: '/:postId',\n resetNamespace: true\n }, function () {\n this.route('edit');\n });\n });\n });\n this.add('route:posts', _routing.Route.extend({\n actions: {\n showPost(context) {\n expectDeprecation(() => {\n this.transitionTo('post', context);\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }\n }));\n this.add('route:post', _routing.Route.extend({\n model(params) {\n return {\n id: params.postId\n };\n },\n\n serialize(model) {\n return {\n postId: model.id\n };\n },\n\n actions: {\n editPost() {\n expectDeprecation(() => {\n this.transitionTo('post.edit');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }\n }));\n this.add('route:post.edit', _routing.Route.extend({\n model() {\n var postId = this.modelFor('post').id;\n editedPostIds.push(postId);\n return null;\n },\n\n setup() {\n this._super(...arguments);\n\n editCount++;\n }\n\n }));\n return this.visit('/posts/1').then(() => {\n assert.ok(true, '/posts/1 has been handled');\n var router = this.applicationInstance.lookup('router:main');\n (0, _runloop.run)(() => router.send('editPost'));\n (0, _runloop.run)(() => router.send('showPost', {\n id: '2'\n }));\n (0, _runloop.run)(() => router.send('editPost'));\n assert.equal(editCount, 2, 'set up the edit route twice without failure');\n assert.deepEqual(editedPostIds, ['1', '2'], 'modelFor posts.post returns the right context');\n });\n }\n\n ['@test ApplicationRoute with model does not proxy the currentPath'](assert) {\n // TODO: FIXME:\n var model = {};\n this.router.map(function () {\n this.route('index', {\n path: '/'\n });\n });\n this.add('route:application', _routing.Route.extend({\n model() {\n return model;\n }\n\n }));\n return this.visit('/').then(() => {\n var routerService = this.applicationInstance.lookup('service:router');\n assert.equal(routerService.currentRouteName, 'index', 'currentPath is index');\n assert.equal('currentPath' in model, false, 'should have defined currentPath on controller');\n });\n }\n\n ['@test Route model hook finds the same model as a manual find'](assert) {\n var post;\n\n var Post = _runtime.Object.extend();\n\n this.add('model:post', Post);\n Post.reopenClass({\n find() {\n post = this;\n return {};\n }\n\n });\n this.router.map(function () {\n this.route('post', {\n path: '/post/:post_id'\n });\n });\n return this.visit('/post/1').then(() => {\n assert.equal(Post, post);\n });\n }\n\n ['@test Routes can refresh themselves causing their model hooks to be re-run'](assert) {\n this.router.map(function () {\n this.route('parent', {\n path: '/parent/:parent_id'\n }, function () {\n this.route('child');\n });\n });\n var appcount = 0;\n this.add('route:application', _routing.Route.extend({\n model() {\n ++appcount;\n }\n\n }));\n var parentcount = 0;\n this.add('route:parent', _routing.Route.extend({\n model(params) {\n assert.equal(params.parent_id, '123');\n ++parentcount;\n },\n\n actions: {\n refreshParent() {\n this.refresh();\n }\n\n }\n }));\n var childcount = 0;\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n ++childcount;\n }\n\n }));\n var router;\n return this.visit('/').then(() => {\n router = this.applicationInstance.lookup('router:main');\n assert.equal(appcount, 1);\n assert.equal(parentcount, 0);\n assert.equal(childcount, 0);\n return (0, _runloop.run)(router, 'transitionTo', 'parent.child', '123');\n }).then(() => {\n assert.equal(appcount, 1);\n assert.equal(parentcount, 1);\n assert.equal(childcount, 1);\n return (0, _runloop.run)(router, 'send', 'refreshParent');\n }).then(() => {\n assert.equal(appcount, 1);\n assert.equal(parentcount, 2);\n assert.equal(childcount, 2);\n });\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test\", [\"@ember/controller\", \"@ember/string\", \"@ember/-internals/runtime\", \"@ember/runloop\", \"@ember/-internals/meta\", \"@ember/-internals/metal\", \"@ember/-internals/routing\", \"router_js\", \"internal-test-helpers\"], function (_controller, _string, _runtime, _runloop, _meta, _metal, _routing, _router_js, _internalTestHelpers) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('Query Params - main', class extends _internalTestHelpers.QueryParamTestCase {\n async refreshModelWhileLoadingTest(loadingReturn) {\n var assert = this.assert;\n assert.expect(9);\n var appModelCount = 0;\n var promiseResolve;\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n appomg: {\n defaultValue: 'applol'\n }\n },\n\n model()\n /* params */\n {\n appModelCount++;\n }\n\n }));\n this.setSingleQPController('index', 'omg', undefined, {\n omg: undefined\n });\n var actionName = typeof loadingReturn !== 'undefined' ? 'loading' : 'ignore';\n var indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n actions: {\n [actionName]: function () {\n return loadingReturn;\n }\n },\n\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 2) {\n assert.deepEqual(params, {\n omg: 'lex'\n });\n return new _runtime.RSVP.Promise(function (resolve) {\n promiseResolve = resolve;\n return;\n });\n } else if (indexModelCount === 3) {\n assert.deepEqual(params, {\n omg: 'hello'\n }, \"Model hook reruns even if the previous one didn't finish\");\n }\n }\n\n }));\n await this.visit('/');\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 1);\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, 'omg', 'lex');\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 2);\n await this.setAndFlush(indexController, 'omg', 'hello');\n assert.equal(appModelCount, 1, 'appModelCount is 1');\n assert.equal(indexModelCount, 3);\n (0, _runloop.run)(function () {\n promiseResolve();\n });\n assert.equal((0, _metal.get)(indexController, 'omg'), 'hello', 'At the end last value prevails');\n }\n\n [\"@test No replaceURL occurs on startup because default values don't show up in URL\"](assert) {\n assert.expect(1);\n this.setSingleQPController('index');\n return this.visitAndAssert('/');\n }\n\n ['@test Calling transitionTo does not lose query params already on the activeTransition'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n this.add('route:parent.child', _routing.Route.extend({\n afterModel() {\n expectDeprecation(() => {\n this.transitionTo('parent.sibling');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.setSingleQPController('parent');\n return this.visit('/parent/child?foo=lol').then(() => {\n this.assertCurrentPath('/parent/sibling?foo=lol', 'redirected to the sibling route, instead of child route');\n assert.equal(this.getController('parent').get('foo'), 'lol', 'controller has value from the active transition');\n });\n }\n\n ['@test Calling transitionTo does not serialize query params already serialized on the activeTransition'](assert) {\n assert.expect(4);\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n this.route('sibling');\n });\n });\n this.add('route:parent.child', _routing.Route.extend({\n afterModel() {\n expectDeprecation(() => {\n this.transitionTo('parent.sibling');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add('controller:parent', _controller.default.extend({\n queryParams: ['array', 'string'],\n array: [],\n string: ''\n })); // `/parent/child?array=[\"one\",2]&string=hello`\n\n return this.visit('/parent/child?array=%5B%22one%22%2C2%5D&string=hello').then(() => {\n this.assertCurrentPath('/parent/sibling?array=%5B%22one%22%2C2%5D&string=hello', 'redirected to the sibling route, instead of child route');\n assert.equal(this.getController('parent').get('string'), 'hello', 'controller has value from the active transition');\n assert.deepEqual(this.getController('parent').get('array'), ['one', 2], 'controller has value from the active transition');\n });\n }\n\n async ['@test Single query params can be set on the controller and reflected in the url'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.setSingleQPController('home');\n await this.visitAndAssert('/');\n var controller = this.getController('home');\n await this.setAndFlush(controller, 'foo', '456');\n this.assertCurrentPath('/?foo=456');\n await this.setAndFlush(controller, 'foo', '987');\n this.assertCurrentPath('/?foo=987');\n }\n\n async ['@test Query params can map to different url keys configured on the controller'](assert) {\n assert.expect(6);\n this.add('controller:index', _controller.default.extend({\n queryParams: [{\n foo: 'other_foo',\n bar: {\n as: 'other_bar'\n }\n }],\n foo: 'FOO',\n bar: 'BAR'\n }));\n await this.visitAndAssert('/');\n var controller = this.getController('index');\n await this.setAndFlush(controller, 'foo', 'LEX');\n this.assertCurrentPath('/?other_foo=LEX', \"QP mapped correctly without 'as'\");\n await this.setAndFlush(controller, 'foo', 'WOO');\n this.assertCurrentPath('/?other_foo=WOO', \"QP updated correctly without 'as'\");\n await this.transitionTo('/?other_foo=NAW');\n assert.equal(controller.get('foo'), 'NAW', 'QP managed correctly on URL transition');\n await this.setAndFlush(controller, 'bar', 'NERK');\n this.assertCurrentPath('/?other_bar=NERK&other_foo=NAW', \"QP mapped correctly with 'as'\");\n await this.setAndFlush(controller, 'bar', 'NUKE');\n this.assertCurrentPath('/?other_bar=NUKE&other_foo=NAW', \"QP updated correctly with 'as'\");\n }\n\n async ['@test Routes have a private overridable serializeQueryParamKey hook'](assert) {\n assert.expect(2);\n this.add('route:index', _routing.Route.extend({\n serializeQueryParamKey: _string.dasherize\n }));\n this.setSingleQPController('index', 'funTimes', '');\n await this.visitAndAssert('/');\n var controller = this.getController('index');\n await this.setAndFlush(controller, 'funTimes', 'woot');\n this.assertCurrentPath('/?fun-times=woot');\n }\n\n async ['@test Can override inherited QP behavior by specifying queryParams as a computed property'](assert) {\n assert.expect(3);\n this.setSingleQPController('index', 'a', 0, {\n queryParams: (0, _metal.computed)(function () {\n return ['c'];\n }),\n c: true\n });\n await this.visitAndAssert('/');\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/', 'QP did not update due to being overriden');\n await this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?c=false', 'QP updated with overridden param');\n }\n\n async ['@test Can concatenate inherited QP behavior by specifying queryParams as an array'](assert) {\n assert.expect(3);\n this.setSingleQPController('index', 'a', 0, {\n queryParams: ['c'],\n c: true\n });\n await this.visitAndAssert('/');\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, 'a', 1);\n this.assertCurrentPath('/?a=1', 'Inherited QP did update');\n await this.setAndFlush(indexController, 'c', false);\n this.assertCurrentPath('/?a=1&c=false', 'New QP did update');\n }\n\n ['@test model hooks receives query params'](assert) {\n assert.expect(2);\n this.setSingleQPController('index');\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n foo: 'bar'\n });\n }\n\n }));\n return this.visitAndAssert('/');\n }\n\n ['@test model hooks receives query params with dynamic segment params'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:id'\n });\n });\n this.setSingleQPController('index');\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n foo: 'bar',\n id: 'baz'\n });\n }\n\n }));\n return this.visitAndAssert('/baz');\n }\n\n ['@test model hooks receives query params (overridden by incoming url value)'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:id'\n });\n });\n this.setSingleQPController('index');\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n foo: 'baz',\n id: 'boo'\n });\n }\n\n }));\n return this.visitAndAssert('/boo?foo=baz');\n }\n\n async ['@test error is thrown if dynamic segment and query param have same name'](assert) {\n this.router.map(function () {\n this.route('index', {\n path: '/:foo'\n });\n });\n this.setSingleQPController('index');\n await assert.rejectsAssertion(this.visitAndAssert('/boo?foo=baz'), `The route 'index' has both a dynamic segment and query param with name 'foo'. Please rename one to avoid collisions.`);\n }\n\n ['@test query params have been set by the time setupController is called'](assert) {\n assert.expect(2);\n this.setSingleQPController('application');\n this.add('route:application', _routing.Route.extend({\n setupController(controller) {\n assert.equal(controller.get('foo'), 'YEAH', \"controller's foo QP property set before setupController called\");\n }\n\n }));\n return this.visitAndAssert('/?foo=YEAH');\n }\n\n ['@test mapped query params have been set by the time setupController is called'](assert) {\n assert.expect(2);\n this.setSingleQPController('application', {\n faz: 'foo'\n });\n this.add('route:application', _routing.Route.extend({\n setupController(controller) {\n assert.equal(controller.get('faz'), 'YEAH', \"controller's foo QP property set before setupController called\");\n }\n\n }));\n return this.visitAndAssert('/?foo=YEAH');\n }\n\n ['@test Route#paramsFor fetches query params with default value'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:something'\n });\n });\n this.setSingleQPController('index');\n this.add('route:index', _routing.Route.extend({\n model()\n /* params, transition */\n {\n assert.deepEqual(this.paramsFor('index'), {\n something: 'baz',\n foo: 'bar'\n }, 'could retrieve params for index');\n }\n\n }));\n return this.visitAndAssert('/baz');\n }\n\n ['@test Route#paramsFor fetches query params with non-default value'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:something'\n });\n });\n this.setSingleQPController('index');\n this.add('route:index', _routing.Route.extend({\n model()\n /* params, transition */\n {\n assert.deepEqual(this.paramsFor('index'), {\n something: 'baz',\n foo: 'boo'\n }, 'could retrieve params for index');\n }\n\n }));\n return this.visitAndAssert('/baz?foo=boo');\n }\n\n ['@test Route#paramsFor fetches default falsy query params'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:something'\n });\n });\n this.setSingleQPController('index', 'foo', false);\n this.add('route:index', _routing.Route.extend({\n model()\n /* params, transition */\n {\n assert.deepEqual(this.paramsFor('index'), {\n something: 'baz',\n foo: false\n }, 'could retrieve params for index');\n }\n\n }));\n return this.visitAndAssert('/baz');\n }\n\n ['@test Route#paramsFor fetches non-default falsy query params'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('index', {\n path: '/:something'\n });\n });\n this.setSingleQPController('index', 'foo', true);\n this.add('route:index', _routing.Route.extend({\n model()\n /* params, transition */\n {\n assert.deepEqual(this.paramsFor('index'), {\n something: 'baz',\n foo: false\n }, 'could retrieve params for index');\n }\n\n }));\n return this.visitAndAssert('/baz?foo=false');\n }\n\n ['@test model hook can query prefix-less application params'](assert) {\n assert.expect(4);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n appomg: 'applol'\n });\n }\n\n }));\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n omg: 'lol'\n });\n assert.deepEqual(this.paramsFor('application'), {\n appomg: 'applol'\n });\n }\n\n }));\n return this.visitAndAssert('/');\n }\n\n ['@test model hook can query prefix-less application params (overridden by incoming url value)'](assert) {\n assert.expect(4);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n this.add('route:application', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n appomg: 'appyes'\n });\n }\n\n }));\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n omg: 'yes'\n });\n assert.deepEqual(this.paramsFor('application'), {\n appomg: 'appyes'\n });\n }\n\n }));\n return this.visitAndAssert('/?appomg=appyes&omg=yes');\n }\n\n async ['@test can opt into full transition by setting refreshModel in route queryParams'](assert) {\n assert.expect(7);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n var appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model()\n /* params, transition */\n {\n appModelCount++;\n }\n\n }));\n var indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, {\n omg: 'lol'\n }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, {\n omg: 'lex'\n }, 'params are correct on second pass');\n }\n }\n\n }));\n await this.visitAndAssert('/');\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, 'omg', 'lex');\n assert.equal(appModelCount, 1, 'app model hook did not run again');\n assert.equal(indexModelCount, 2, 'index model hook ran again due to refreshModel');\n }\n\n async ['@test refreshModel and replace work together'](assert) {\n assert.expect(8);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n var appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model()\n /* params */\n {\n appModelCount++;\n }\n\n }));\n var indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true,\n replace: true\n }\n },\n\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, {\n omg: 'lol'\n }, 'params are correct on first pass');\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, {\n omg: 'lex'\n }, 'params are correct on second pass');\n }\n }\n\n }));\n await this.visitAndAssert('/');\n assert.equal(appModelCount, 1, 'app model hook ran');\n assert.equal(indexModelCount, 1, 'index model hook ran');\n var indexController = this.getController('index');\n this.expectedReplaceURL = '/?omg=lex';\n await this.setAndFlush(indexController, 'omg', 'lex');\n assert.equal(appModelCount, 1, 'app model hook did not run again');\n assert.equal(indexModelCount, 2, 'index model hook ran again due to refreshModel');\n }\n\n async ['@test multiple QP value changes only cause a single model refresh'](assert) {\n assert.expect(2);\n this.setSingleQPController('index', 'alex', 'lol');\n this.setSingleQPController('index', 'steely', 'lel');\n var refreshCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n alex: {\n refreshModel: true\n },\n steely: {\n refreshModel: true\n }\n },\n\n refresh() {\n refreshCount++;\n }\n\n }));\n await this.visitAndAssert('/');\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, {\n alex: 'fran',\n steely: 'david'\n });\n assert.equal(refreshCount, 1, 'index refresh hook only run once');\n }\n\n ['@test refreshModel does not cause a second transition during app boot '](assert) {\n assert.expect(1);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n\n refresh() {\n assert.ok(false);\n }\n\n }));\n return this.visitAndAssert('/?appomg=hello&omg=world');\n }\n\n async ['@test queryParams are updated when a controller property is set and the route is refreshed. Issue #13263 '](assert) {\n this.addTemplate('application', 'Increment {{this.foo}} {{outlet}}');\n this.setSingleQPController('application', 'foo', 1, {\n actions: {\n increment() {\n this.incrementProperty('foo');\n this.send('refreshRoute');\n }\n\n }\n });\n this.add('route:application', _routing.Route.extend({\n actions: {\n refreshRoute() {\n this.refresh();\n }\n\n }\n }));\n await this.visitAndAssert('/');\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '1');\n document.getElementById('test-button').click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '2');\n this.assertCurrentPath('/?foo=2');\n document.getElementById('test-button').click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal((0, _internalTestHelpers.getTextOf)(document.getElementById('test-value')), '3');\n this.assertCurrentPath('/?foo=3');\n }\n\n async [\"@test Use Ember.get to retrieve query params 'refreshModel' configuration\"](assert) {\n assert.expect(7);\n this.setSingleQPController('application', 'appomg', 'applol');\n this.setSingleQPController('index', 'omg', 'lol');\n var appModelCount = 0;\n this.add('route:application', _routing.Route.extend({\n model()\n /* params */\n {\n appModelCount++;\n }\n\n }));\n var indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty() {\n return {\n refreshModel: true\n };\n }\n\n }),\n\n model(params) {\n indexModelCount++;\n\n if (indexModelCount === 1) {\n assert.deepEqual(params, {\n omg: 'lol'\n });\n } else if (indexModelCount === 2) {\n assert.deepEqual(params, {\n omg: 'lex'\n });\n }\n }\n\n }));\n await this.visitAndAssert('/');\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 1);\n var indexController = this.getController('index');\n await this.setAndFlush(indexController, 'omg', 'lex');\n assert.equal(appModelCount, 1);\n assert.equal(indexModelCount, 2);\n }\n\n async ['@test can use refreshModel even with URL changes that remove QPs from address bar'](assert) {\n assert.expect(4);\n this.setSingleQPController('index', 'omg', 'lol');\n var indexModelCount = 0;\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n omg: {\n refreshModel: true\n }\n },\n\n model(params) {\n indexModelCount++;\n var data;\n\n if (indexModelCount === 1) {\n data = 'foo';\n } else if (indexModelCount === 2) {\n data = 'lol';\n }\n\n assert.deepEqual(params, {\n omg: data\n }, 'index#model receives right data');\n }\n\n }));\n await this.visitAndAssert('/?omg=foo');\n await this.transitionTo('/');\n var indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'lol');\n }\n\n async ['@test can opt into a replace query by specifying replace:true in the Route config hash'](assert) {\n assert.expect(2);\n this.setSingleQPController('application', 'alex', 'matchneer');\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n alex: {\n replace: true\n }\n }\n }));\n await this.visitAndAssert('/');\n var appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n await this.setAndFlush(appController, 'alex', 'wallace');\n }\n\n async ['@test Route query params config can be configured using property name instead of URL key'](assert) {\n assert.expect(2);\n this.add('controller:application', _controller.default.extend({\n queryParams: [{\n commitBy: 'commit_by'\n }]\n }));\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n commitBy: {\n replace: true\n }\n }\n }));\n await this.visitAndAssert('/');\n var appController = this.getController('application');\n this.expectedReplaceURL = '/?commit_by=igor_seb';\n await this.setAndFlush(appController, 'commitBy', 'igor_seb');\n }\n\n async ['@test An explicit replace:false on a changed QP always wins and causes a pushState'](assert) {\n assert.expect(3);\n this.add('controller:application', _controller.default.extend({\n queryParams: ['alex', 'steely'],\n alex: 'matchneer',\n steely: 'dan'\n }));\n this.add('route:application', _routing.Route.extend({\n queryParams: {\n alex: {\n replace: true\n },\n steely: {\n replace: false\n }\n }\n }));\n await this.visit('/');\n var appController = this.getController('application');\n this.expectedPushURL = '/?alex=wallace&steely=jan';\n await this.setAndFlush(appController, {\n alex: 'wallace',\n steely: 'jan'\n });\n this.expectedPushURL = '/?alex=wallace&steely=fran';\n await this.setAndFlush(appController, {\n steely: 'fran'\n });\n this.expectedReplaceURL = '/?alex=sriracha&steely=fran';\n await this.setAndFlush(appController, 'alex', 'sriracha');\n }\n\n async ['@test can opt into full transition by setting refreshModel in route queryParams when transitioning from child to parent'](assert) {\n this.addTemplate('parent', '{{outlet}}');\n this.addTemplate('parent.child', \"Parent \");\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n var parentModelCount = 0;\n this.add('route:parent', class extends _routing.Route {\n constructor(...args) {\n super(...args);\n this.queryParams = {\n foo: {\n refreshModel: true\n }\n };\n }\n\n model() {\n parentModelCount++;\n }\n\n });\n this.setSingleQPController('parent', 'foo', 'abc');\n await this.visit('/parent/child?foo=lol');\n assert.equal(parentModelCount, 1);\n (0, _runloop.run)(document.getElementById('parent-link'), 'click');\n assert.equal(parentModelCount, 2);\n }\n\n async [\"@test Use Ember.get to retrieve query params 'replace' configuration\"](assert) {\n assert.expect(2);\n this.setSingleQPController('application', 'alex', 'matchneer');\n this.add('route:application', _routing.Route.extend({\n queryParams: _runtime.Object.create({\n unknownProperty()\n /* keyName */\n {\n // We are simulating all qps requiring refresh\n return {\n replace: true\n };\n }\n\n })\n }));\n await this.visitAndAssert('/');\n var appController = this.getController('application');\n this.expectedReplaceURL = '/?alex=wallace';\n await this.setAndFlush(appController, 'alex', 'wallace');\n }\n\n async ['@test can override incoming QP values in setupController'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('about');\n });\n this.setSingleQPController('index', 'omg', 'lol');\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', 'OVERRIDE');\n },\n\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n\n }\n }));\n await this.visitAndAssert('/about');\n await this.transitionTo('index');\n this.assertCurrentPath('/?omg=OVERRIDE');\n }\n\n async ['@test can override incoming QP array values in setupController'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('about');\n });\n this.setSingleQPController('index', 'omg', ['lol']);\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n assert.ok(true, 'setupController called');\n controller.set('omg', ['OVERRIDE']);\n },\n\n actions: {\n queryParamsDidChange() {\n assert.ok(false, \"queryParamsDidChange shouldn't fire\");\n }\n\n }\n }));\n await this.visitAndAssert('/about');\n await this.transitionTo('index');\n this.assertCurrentPath('/?omg=' + encodeURIComponent(JSON.stringify(['OVERRIDE'])));\n }\n\n ['@test URL transitions that remove QPs still register as QP changes'](assert) {\n assert.expect(2);\n this.setSingleQPController('index', 'omg', 'lol');\n return this.visit('/?omg=borf').then(() => {\n var indexController = this.getController('index');\n assert.equal(indexController.get('omg'), 'borf');\n this.transitionTo('/');\n assert.equal(indexController.get('omg'), 'lol');\n });\n }\n\n async ['@test Subresource naming style is supported'](assert) {\n this.router.map(function () {\n this.route('abc.def', {\n path: '/abcdef'\n }, function () {\n this.route('zoo');\n });\n });\n this.addTemplate('application', `\n A \n B \n {{outlet}}\n `);\n this.setSingleQPController('abc.def', 'foo', 'lol');\n this.setSingleQPController('abc.def.zoo', 'bar', 'haha');\n await this.visitAndAssert('/');\n assert.equal(this.$('#one').attr('href'), '/abcdef?foo=123');\n assert.equal(this.$('#two').attr('href'), '/abcdef/zoo?bar=456&foo=123');\n (0, _runloop.run)(this.$('#one'), 'click');\n this.assertCurrentPath('/abcdef?foo=123');\n (0, _runloop.run)(this.$('#two'), 'click');\n this.assertCurrentPath('/abcdef/zoo?bar=456&foo=123');\n }\n\n async ['@test transitionTo supports query params']() {\n this.setSingleQPController('index', 'foo', 'lol');\n await this.visitAndAssert('/');\n await this.transitionTo({\n queryParams: {\n foo: 'borf'\n }\n });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n await this.transitionTo({\n queryParams: {\n 'index:foo': 'blaf'\n }\n });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n await this.transitionTo({\n queryParams: {\n 'index:foo': false\n }\n });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n await this.transitionTo({\n queryParams: {\n foo: false\n }\n });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n }\n\n async ['@test transitionTo supports query params (multiple)']() {\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo', 'bar'],\n foo: 'lol',\n bar: 'wat'\n }));\n await this.visitAndAssert('/');\n await this.transitionTo({\n queryParams: {\n foo: 'borf'\n }\n });\n this.assertCurrentPath('/?foo=borf', 'shorthand supported');\n await this.transitionTo({\n queryParams: {\n 'index:foo': 'blaf'\n }\n });\n this.assertCurrentPath('/?foo=blaf', 'longform supported');\n await this.transitionTo({\n queryParams: {\n 'index:foo': false\n }\n });\n this.assertCurrentPath('/?foo=false', 'longform supported (bool)');\n await this.transitionTo({\n queryParams: {\n foo: false\n }\n });\n this.assertCurrentPath('/?foo=false', 'shorhand supported (bool)');\n }\n\n async [\"@test setting controller QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n this.setSingleQPController('index', 'foo', '123');\n await this.visit('/');\n var controller = this.getController('index');\n this.expectedPushURL = '/?foo=';\n await this.setAndFlush(controller, 'foo', '');\n }\n\n async [\"@test setting QP to empty string doesn't generate null in URL\"](assert) {\n assert.expect(1);\n this.add('route:index', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n await this.visit('/');\n var controller = this.getController('index');\n this.expectedPushURL = '/?foo=';\n await this.setAndFlush(controller, 'foo', '');\n }\n\n ['@test A default boolean value deserializes QPs as booleans rather than strings'](assert) {\n assert.expect(3);\n this.setSingleQPController('index', 'foo', false);\n this.add('route:index', _routing.Route.extend({\n model(params) {\n assert.equal(params.foo, true, 'model hook received foo as boolean true');\n }\n\n }));\n return this.visit('/?foo=true').then(() => {\n var controller = this.getController('index');\n assert.equal(controller.get('foo'), true);\n this.transitionTo('/?foo=false');\n assert.equal(controller.get('foo'), false);\n });\n }\n\n ['@test Query param without value are empty string'](assert) {\n assert.expect(1);\n this.add('controller:index', _controller.default.extend({\n queryParams: ['foo'],\n foo: ''\n }));\n return this.visit('/?foo=').then(() => {\n var controller = this.getController('index');\n assert.equal(controller.get('foo'), '');\n });\n }\n\n async ['@test Array query params can be set'](assert) {\n assert.expect(2);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.setSingleQPController('home', 'foo', []);\n await this.visit('/');\n var controller = this.getController('home');\n await this.setAndFlush(controller, 'foo', [1, 2]);\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n await this.setAndFlush(controller, 'foo', [3, 4]);\n this.assertCurrentPath('/?foo=%5B3%2C4%5D');\n }\n\n async ['@test (de)serialization: arrays'](assert) {\n assert.expect(4);\n this.setSingleQPController('index', 'foo', [1]);\n await this.visitAndAssert('/');\n await this.transitionTo({\n queryParams: {\n foo: [2, 3]\n }\n });\n this.assertCurrentPath('/?foo=%5B2%2C3%5D', 'shorthand supported');\n await this.transitionTo({\n queryParams: {\n 'index:foo': [4, 5]\n }\n });\n this.assertCurrentPath('/?foo=%5B4%2C5%5D', 'longform supported');\n await this.transitionTo({\n queryParams: {\n foo: []\n }\n });\n this.assertCurrentPath('/?foo=%5B%5D', 'longform supported');\n }\n\n ['@test Url with array query param sets controller property to array'](assert) {\n assert.expect(1);\n this.setSingleQPController('index', 'foo', '');\n return this.visit('/?foo[]=1&foo[]=2&foo[]=3').then(() => {\n var controller = this.getController('index');\n assert.deepEqual(controller.get('foo'), ['1', '2', '3']);\n });\n }\n\n async ['@test Array query params can be pushed/popped'](assert) {\n assert.expect(17);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.setSingleQPController('home', 'foo', (0, _runtime.A)());\n await this.visitAndAssert('/');\n var controller = this.getController('home');\n controller.foo.pushObject(1);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n controller.foo.popObject();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n controller.foo.pushObject(1);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n controller.foo.popObject();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/');\n assert.deepEqual(controller.foo, []);\n controller.foo.pushObject(1);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n controller.foo.pushObject(2);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B1%2C2%5D');\n assert.deepEqual(controller.foo, [1, 2]);\n controller.foo.popObject();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B1%5D');\n assert.deepEqual(controller.foo, [1]);\n controller.foo.unshiftObject('lol');\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B%22lol%22%2C1%5D');\n assert.deepEqual(controller.foo, ['lol', 1]);\n }\n\n async [\"@test Overwriting with array with same content shouldn't refire update\"](assert) {\n assert.expect(4);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n var modelCount = 0;\n this.add('route:home', _routing.Route.extend({\n model() {\n modelCount++;\n }\n\n }));\n this.setSingleQPController('home', 'foo', (0, _runtime.A)([1]));\n await this.visitAndAssert('/');\n assert.equal(modelCount, 1);\n var controller = this.getController('home');\n await this.setAndFlush(controller, 'model', (0, _runtime.A)([1]));\n assert.equal(modelCount, 1);\n this.assertCurrentPath('/');\n }\n\n ['@test Defaulting to params hash as the model should not result in that params object being watched'](assert) {\n assert.expect(1);\n this.router.map(function () {\n this.route('other');\n }); // This causes the params hash, which is returned as a route's\n // model if no other model could be resolved given the provided\n // params (and no custom model hook was defined), to be watched,\n // unless we return a copy of the params hash.\n\n this.setSingleQPController('application', 'woot', 'wat');\n this.add('route:other', _routing.Route.extend({\n model(p, trans) {\n var m = (0, _meta.peekMeta)(trans[_router_js.PARAMS_SYMBOL].application);\n assert.ok(m === null, \"A meta object isn't constructed for this params POJO\");\n }\n\n }));\n return this.visit('/').then(() => {\n return this.transitionTo('other');\n });\n }\n\n async ['@test Setting bound query param property to null or undefined does not serialize to url'](assert) {\n assert.expect(9);\n this.router.map(function () {\n this.route('home');\n });\n this.setSingleQPController('home', 'foo', [1, 2]);\n await this.visitAndAssert('/home');\n var controller = this.getController('home');\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n await this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n await this.transitionTo('/home');\n assert.deepEqual(controller.get('foo'), [1, 2]);\n this.assertCurrentPath('/home');\n await this.setAndFlush(controller, 'foo', null);\n this.assertCurrentPath('/home', 'Setting property to null');\n await this.setAndFlush(controller, 'foo', (0, _runtime.A)([1, 3]));\n this.assertCurrentPath('/home?foo=%5B1%2C3%5D');\n await this.setAndFlush(controller, 'foo', undefined);\n this.assertCurrentPath('/home', 'Setting property to undefined');\n }\n\n async ['@test with null or undefined QPs does not get serialized into url'](assert) {\n this.addTemplate('home', `\n Home \n Home \n `);\n this.router.map(function () {\n this.route('home');\n });\n this.setSingleQPController('home', 'foo', [], {\n nullValue: null,\n undefinedValue: undefined\n });\n await this.visitAndAssert('/home');\n assert.equal(this.$('#null-link').attr('href'), '/home');\n assert.equal(this.$('#undefined-link').attr('href'), '/home');\n }\n\n [\"@test A child of a resource route still defaults to parent route's model even if the child route has a query param\"](assert) {\n assert.expect(2);\n this.setSingleQPController('index', 'woot', undefined, {\n woot: undefined\n });\n this.add('route:application', _routing.Route.extend({\n model()\n /* p, trans */\n {\n return {\n woot: true\n };\n }\n\n }));\n this.add('route:index', _routing.Route.extend({\n setupController(controller, model) {\n assert.deepEqual(model, {\n woot: true\n }, 'index route inherited model route from parent route');\n }\n\n }));\n return this.visitAndAssert('/');\n }\n\n async ['@test opting into replace does not affect transitions between routes']() {\n this.addTemplate('application', `\n Foo \n Bar \n Bar \n {{outlet}}\n `);\n this.router.map(function () {\n this.route('foo');\n this.route('bar');\n });\n this.setSingleQPController('bar', 'raytiley', 'israd');\n this.add('route:bar', class extends _routing.Route {\n constructor(...args) {\n super(...args);\n this.queryParams = {\n raytiley: {\n replace: true\n }\n };\n }\n\n });\n await this.visit('/');\n var controller = this.getController('bar');\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n this.expectedPushURL = '/bar';\n (0, _runloop.run)(document.getElementById('bar-no-qp-link'), 'click');\n this.expectedReplaceURL = '/bar?raytiley=woot';\n await this.setAndFlush(controller, 'raytiley', 'woot');\n this.expectedPushURL = '/foo';\n (0, _runloop.run)(document.getElementById('foo-link'), 'click');\n this.expectedPushURL = '/bar?raytiley=isthebest';\n (0, _runloop.run)(document.getElementById('bar-link'), 'click');\n }\n\n async [\"@test undefined isn't serialized or deserialized into a string\"](assert) {\n this.router.map(function () {\n this.route('example');\n });\n this.addTemplate('application', \"Example \");\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n var entered = 0;\n this.add('route:example', class extends _routing.Route {\n model(params) {\n entered++;\n assert.deepEqual(params, {\n foo: undefined\n });\n }\n\n });\n await this.visitAndAssert('/');\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n await this.transitionTo('example', {\n queryParams: {\n foo: undefined\n }\n });\n assert.equal(entered, 1, 'Should have entered example route');\n this.assertCurrentPath('/example');\n }\n\n ['@test when refreshModel is true and loading hook is undefined, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest();\n }\n\n ['@test when refreshModel is true and loading hook returns false, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest(false);\n }\n\n ['@test when refreshModel is true and loading hook returns true, model hook will rerun when QPs change even if previous did not finish']() {\n return this.refreshModelWhileLoadingTest(true);\n }\n\n async [\"@test warn user that Route's queryParams configuration must be an Object, not an Array\"](assert) {\n assert.expect(1);\n this.add('route:application', _routing.Route.extend({\n queryParams: [{\n commitBy: {\n replace: true\n }\n }]\n }));\n await assert.rejectsAssertion(this.visit('/'), 'You passed in `[{\"commitBy\":{\"replace\":true}}]` as the value for `queryParams` but `queryParams` cannot be an Array');\n }\n\n async ['@test handle route names that clash with Object.prototype properties'](assert) {\n assert.expect(1);\n this.router.map(function () {\n this.route('constructor');\n });\n this.add('route:constructor', _routing.Route.extend({\n queryParams: {\n foo: {\n defaultValue: '123'\n }\n }\n }));\n await this.visit('/');\n await this.transitionTo('constructor', {\n queryParams: {\n foo: '999'\n }\n });\n var controller = this.getController('constructor');\n assert.equal((0, _metal.get)(controller, 'foo'), '999');\n }\n\n async ['@test Single query params defined with tracked properties can be on the controller and reflected in the url'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.add(`controller:home`, _controller.default.extend({\n queryParams: ['foo'],\n foo: (0, _metal.tracked)()\n }));\n await this.visitAndAssert('/');\n var controller = this.getController('home');\n controller.foo = '456';\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=456');\n controller.foo = '987';\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=987');\n }\n\n async ['@test Single query params defined with tracked properties can be linked to (and log is present)'](assert) {\n var _class3, _descriptor, _descriptor2;\n\n assert.expect(3);\n this.addTemplate('application', `\n \n Home\n \n \n 'Home (with params)'\n \n\n \n {{log this.foo}}\n `);\n this.add(`controller:application`, (_class3 = class _class3 extends _controller.default {\n constructor(...args) {\n super(...args);\n this.queryParams = ['foo', 'bar'];\n\n _initializerDefineProperty(this, \"foo\", _descriptor, this);\n\n _initializerDefineProperty(this, \"bar\", _descriptor2, this);\n }\n\n }, (_descriptor = _applyDecoratedDescriptor(_class3.prototype, \"foo\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return [];\n }\n }), _descriptor2 = _applyDecoratedDescriptor(_class3.prototype, \"bar\", [_metal.tracked], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: function () {\n return [];\n }\n })), _class3));\n await this.visitAndAssert('/');\n document.getElementById('the-link').click();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/');\n document.getElementById('the-link-with-params').click();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=%5B123%5D');\n }\n\n async ['@test Single query params defined with native getters and tracked properties can be on the controller and reflected in the url'](assert) {\n assert.expect(3);\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n this.add(`controller:home`, _controller.default.extend({\n queryParams: ['foo'],\n\n get foo() {\n return this.bar;\n },\n\n set foo(value) {\n this.bar = value;\n },\n\n bar: (0, _metal.tracked)()\n }));\n await this.visitAndAssert('/');\n var controller = this.getController('home');\n controller.bar = '456';\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=456');\n controller.bar = '987';\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/?foo=987');\n }\n\n async [`@test Updating single query parameter doesn't affect other query parameters. Issue #14438`](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('grandparent', {\n path: 'grandparent/:foo'\n }, function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n });\n this.addTemplate('grandparent.parent.loading', 'Loading...');\n this.add('route:index', _routing.Route.extend({\n redirect() {\n expectDeprecation(() => {\n this.transitionTo('grandparent.parent.child', 1);\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add('route:grandparent.parent.child', _routing.Route.extend({\n model() {\n return Promise.resolve();\n }\n\n }));\n this.add('controller:grandparent.parent', _controller.default.extend({\n queryParams: ['foo', 'bar'],\n foo: 'FOO',\n bar: 'BAR'\n }));\n await this.visit('/');\n this.assertCurrentPath('/grandparent/1/parent/child');\n var parentController = this.getController('grandparent.parent');\n await this.setAndFlush(parentController, 'foo', 'NEW_FOO');\n assert.equal(parentController.foo, 'NEW_FOO');\n this.assertCurrentPath('/grandparent/1/parent/child?foo=NEW_FOO');\n await this.setAndFlush(parentController, 'bar', 'NEW_BAR');\n assert.equal(parentController.bar, 'NEW_BAR');\n this.assertCurrentPath('/grandparent/1/parent/child?bar=NEW_BAR&foo=NEW_FOO');\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test/model_dependent_state_with_query_params_test\", [\"@ember/controller\", \"@ember/-internals/runtime\", \"@ember/-internals/routing\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_controller, _runtime, _routing, _metal, _internalTestHelpers) {\n \"use strict\";\n\n class ModelDependentQPTestCase extends _internalTestHelpers.QueryParamTestCase {\n boot() {\n this.setupApplication();\n return this.visitApplication();\n }\n\n teardown() {\n super.teardown(...arguments);\n this.assert.ok(!this.expectedModelHookParams, 'there should be no pending expectation of expected model hook params');\n }\n\n reopenController(name, options) {\n this.application.resolveRegistration(`controller:${name}`).reopen(options);\n }\n\n reopenRoute(name, options) {\n this.application.resolveRegistration(`route:${name}`).reopen(options);\n }\n\n async queryParamsStickyTest1(urlPrefix) {\n var assert = this.assert;\n assert.expect(14);\n await this.boot();\n this.$link1.click();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n await this.setAndFlush(this.controller, 'q', 'lol');\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n this.$link2.click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(this.controller.get('q'), 'wat');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n }\n\n async queryParamsStickyTest2(urlPrefix) {\n var assert = this.assert;\n assert.expect(24);\n await this.boot();\n this.expectedModelHookParams = {\n id: 'a-1',\n q: 'lol',\n z: 0\n };\n await this.transitionTo(`${urlPrefix}/a-1?q=lol`);\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-1'\n });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n this.expectedModelHookParams = {\n id: 'a-2',\n q: 'lol',\n z: 0\n };\n await this.transitionTo(`${urlPrefix}/a-2?q=lol`);\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-2'\n }, \"controller's model changed to a-2\");\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n this.expectedModelHookParams = {\n id: 'a-3',\n q: 'lol',\n z: 123\n };\n await this.transitionTo(`${urlPrefix}/a-3?q=lol&z=123`);\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 123);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol&z=123`);\n }\n\n async queryParamsStickyTest3(urlPrefix, articleLookup) {\n var assert = this.assert;\n assert.expect(32);\n this.addTemplate('application', `\n {{#each articles as |a|}}\n Article \n {{/each}}\n `);\n await this.boot();\n this.expectedModelHookParams = {\n id: 'a-1',\n q: 'wat',\n z: 0\n };\n await this.transitionTo(articleLookup, 'a-1');\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-1'\n });\n assert.equal(this.controller.get('q'), 'wat');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n this.expectedModelHookParams = {\n id: 'a-2',\n q: 'lol',\n z: 0\n };\n await this.transitionTo(articleLookup, 'a-2', {\n queryParams: {\n q: 'lol'\n }\n });\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3`);\n this.expectedModelHookParams = {\n id: 'a-3',\n q: 'hay',\n z: 0\n };\n await this.transitionTo(articleLookup, 'a-3', {\n queryParams: {\n q: 'hay'\n }\n });\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-3'\n });\n assert.equal(this.controller.get('q'), 'hay');\n assert.equal(this.controller.get('z'), 0);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=hay`);\n this.expectedModelHookParams = {\n id: 'a-2',\n q: 'lol',\n z: 1\n };\n await this.transitionTo(articleLookup, 'a-2', {\n queryParams: {\n z: 1\n }\n });\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 1);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol&z=1`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=hay`);\n }\n\n async queryParamsStickyTest4(urlPrefix, articleLookup) {\n var assert = this.assert;\n assert.expect(24);\n this.setupApplication();\n this.reopenController(articleLookup, {\n queryParams: {\n q: {\n scope: 'controller'\n }\n }\n });\n await this.visitApplication();\n this.$link1.click();\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath(`${urlPrefix}/a-1`);\n await this.setAndFlush(this.controller, 'q', 'lol');\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol`);\n this.$link2.click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(this.controller.get('q'), 'lol');\n assert.equal(this.controller.get('z'), 0);\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=lol`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=lol`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=lol`);\n this.expectedModelHookParams = {\n id: 'a-3',\n q: 'haha',\n z: 123\n };\n await this.transitionTo(`${urlPrefix}/a-3?q=haha&z=123`);\n assert.deepEqual(this.controller.get('model'), {\n id: 'a-3'\n });\n assert.equal(this.controller.get('q'), 'haha');\n assert.equal(this.controller.get('z'), 123);\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=haha`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=haha`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=haha&z=123`);\n await this.setAndFlush(this.controller, 'q', 'woot');\n assert.equal(this.$link1.getAttribute('href'), `${urlPrefix}/a-1?q=woot`);\n assert.equal(this.$link2.getAttribute('href'), `${urlPrefix}/a-2?q=woot`);\n assert.equal(this.$link3.getAttribute('href'), `${urlPrefix}/a-3?q=woot&z=123`);\n }\n\n async queryParamsStickyTest5(urlPrefix, commentsLookupKey) {\n var assert = this.assert;\n assert.expect(12);\n await this.boot();\n await this.transitionTo(commentsLookupKey, 'a-1');\n var commentsCtrl = this.getController(commentsLookupKey);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n await this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n await this.setAndFlush(commentsCtrl, 'page', 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n await this.transitionTo(commentsLookupKey, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-2/comments`);\n await this.transitionTo(commentsLookupKey, 'a-1');\n assert.equal(commentsCtrl.get('page'), 3);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=3`);\n }\n\n async queryParamsStickyTest6(urlPrefix, articleLookup, commentsLookup) {\n var assert = this.assert;\n assert.expect(13);\n this.setupApplication();\n this.reopenRoute(articleLookup, {\n resetController(controller, isExiting) {\n this.controllerFor(commentsLookup).set('page', 1);\n\n if (isExiting) {\n controller.set('q', 'imdone');\n }\n }\n\n });\n this.addTemplate('about', `\n A \n B \n `);\n await this.visitApplication();\n await this.transitionTo(commentsLookup, 'a-1');\n var commentsCtrl = this.getController(commentsLookup);\n assert.equal(commentsCtrl.get('page'), 1);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n await this.setAndFlush(commentsCtrl, 'page', 2);\n this.assertCurrentPath(`${urlPrefix}/a-1/comments?page=2`);\n await this.transitionTo(commentsLookup, 'a-2');\n assert.equal(commentsCtrl.get('page'), 1);\n assert.equal(this.controller.get('q'), 'wat');\n await this.transitionTo(commentsLookup, 'a-1');\n this.assertCurrentPath(`${urlPrefix}/a-1/comments`);\n assert.equal(commentsCtrl.get('page'), 1);\n await this.transitionTo('about');\n assert.equal(document.getElementById('one').getAttribute('href'), `${urlPrefix}/a-1/comments?q=imdone`);\n assert.equal(document.getElementById('two').getAttribute('href'), `${urlPrefix}/a-2/comments`);\n }\n\n }\n\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('article', {\n path: '/a/:id'\n }, function () {\n this.route('comments', {\n resetNamespace: true\n });\n });\n this.route('about');\n });\n var articles = (0, _runtime.A)([{\n id: 'a-1'\n }, {\n id: 'a-2'\n }, {\n id: 'a-3'\n }]);\n this.add('controller:application', _controller.default.extend({\n articles\n }));\n var self = this;\n var assert = this.assert;\n this.add('route:article', _routing.Route.extend({\n model(params) {\n if (self.expectedModelHookParams) {\n assert.deepEqual(params, self.expectedModelHookParams, 'the ArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedModelHookParams = null;\n }\n\n return articles.findBy('id', params.id);\n }\n\n }));\n this.add('controller:article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n this.add('controller:comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n this.addTemplate('application', `\n {{#each this.articles as |a|}}\n Article \n {{/each}}\n {{outlet}}\n `);\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n var assert = this.assert;\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n assert.equal(this.$link1.getAttribute('href'), '/a/a-1');\n assert.equal(this.$link2.getAttribute('href'), '/a/a-2');\n assert.equal(this.$link3.getAttribute('href'), '/a/a-3');\n this.controller = this.getController('article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"]() {\n return this.queryParamsStickyTest1('/a');\n }\n\n [\"@test query params have 'model' stickiness by default (url changes)\"]() {\n return this.queryParamsStickyTest2('/a');\n }\n\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"]() {\n return this.queryParamsStickyTest3('/a', 'article');\n }\n\n [\"@test 'controller' stickiness shares QP state between models\"]() {\n return this.queryParamsStickyTest4('/a', 'article');\n }\n\n [\"@test 'model' stickiness is scoped to current or first dynamic parent route\"]() {\n return this.queryParamsStickyTest5('/a', 'comments');\n }\n\n ['@test can reset query params using the resetController hook']() {\n return this.queryParamsStickyTest6('/a', 'article', 'comments');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state (nested)', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('site', function () {\n this.route('article', {\n path: '/a/:id'\n }, function () {\n this.route('comments');\n });\n });\n this.route('about');\n });\n var site_articles = (0, _runtime.A)([{\n id: 'a-1'\n }, {\n id: 'a-2'\n }, {\n id: 'a-3'\n }]);\n this.add('controller:application', _controller.default.extend({\n articles: site_articles\n }));\n var self = this;\n var assert = this.assert;\n this.add('route:site.article', _routing.Route.extend({\n model(params) {\n if (self.expectedModelHookParams) {\n assert.deepEqual(params, self.expectedModelHookParams, 'the ArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedModelHookParams = null;\n }\n\n return site_articles.findBy('id', params.id);\n }\n\n }));\n this.add('controller:site.article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: 'page',\n page: 1\n }));\n this.addTemplate('application', `\n {{#each this.articles as |a|}}\n Article \n {{/each}}\n {{outlet}}\n `);\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n var assert = this.assert;\n this.$link1 = document.getElementById('a-1');\n this.$link2 = document.getElementById('a-2');\n this.$link3 = document.getElementById('a-3');\n assert.equal(this.$link1.getAttribute('href'), '/site/a/a-1');\n assert.equal(this.$link2.getAttribute('href'), '/site/a/a-2');\n assert.equal(this.$link3.getAttribute('href'), '/site/a/a-3');\n this.controller = this.getController('site.article');\n });\n }\n\n [\"@test query params have 'model' stickiness by default\"]() {\n return this.queryParamsStickyTest1('/site/a');\n }\n\n [\"@test query params have 'model' stickiness by default (url changes)\"]() {\n return this.queryParamsStickyTest2('/site/a');\n }\n\n [\"@test query params have 'model' stickiness by default (params-based transitions)\"]() {\n return this.queryParamsStickyTest3('/site/a', 'site.article');\n }\n\n [\"@test 'controller' stickiness shares QP state between models\"]() {\n return this.queryParamsStickyTest4('/site/a', 'site.article');\n }\n\n [\"@test 'model' stickiness is scoped to current or first dynamic parent route\"]() {\n return this.queryParamsStickyTest5('/site/a', 'site.article.comments');\n }\n\n ['@test can reset query params using the resetController hook']() {\n return this.queryParamsStickyTest6('/site/a', 'site.article', 'site.article.comments');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Query Params - model-dependent state (nested & more than 1 dynamic segment)', class extends ModelDependentQPTestCase {\n setupApplication() {\n this.router.map(function () {\n this.route('site', {\n path: '/site/:site_id'\n }, function () {\n this.route('article', {\n path: '/a/:article_id'\n }, function () {\n this.route('comments');\n });\n });\n });\n var sites = (0, _runtime.A)([{\n id: 's-1'\n }, {\n id: 's-2'\n }, {\n id: 's-3'\n }]);\n var site_articles = (0, _runtime.A)([{\n id: 'a-1'\n }, {\n id: 'a-2'\n }, {\n id: 'a-3'\n }]);\n this.add('controller:application', _controller.default.extend({\n siteArticles: site_articles,\n sites,\n allSitesAllArticles: (0, _metal.computed)({\n get() {\n var ret = [];\n var siteArticles = this.siteArticles;\n var sites = this.sites;\n sites.forEach(site => {\n ret = ret.concat(siteArticles.map(article => {\n return {\n id: `${site.id}-${article.id}`,\n site_id: site.id,\n article_id: article.id\n };\n }));\n });\n return ret;\n }\n\n })\n }));\n var self = this;\n var assert = this.assert;\n this.add('route:site', _routing.Route.extend({\n model(params) {\n if (self.expectedSiteModelHookParams) {\n assert.deepEqual(params, self.expectedSiteModelHookParams, 'the SiteRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedSiteModelHookParams = null;\n }\n\n return sites.findBy('id', params.site_id);\n }\n\n }));\n this.add('route:site.article', _routing.Route.extend({\n model(params) {\n if (self.expectedArticleModelHookParams) {\n assert.deepEqual(params, self.expectedArticleModelHookParams, 'the SiteArticleRoute model hook received the expected merged dynamic segment + query params hash');\n self.expectedArticleModelHookParams = null;\n }\n\n return site_articles.findBy('id', params.article_id);\n }\n\n }));\n this.add('controller:site', _controller.default.extend({\n queryParams: ['country'],\n country: 'au'\n }));\n this.add('controller:site.article', _controller.default.extend({\n queryParams: ['q', 'z'],\n q: 'wat',\n z: 0\n }));\n this.add('controller:site.article.comments', _controller.default.extend({\n queryParams: ['page'],\n page: 1\n }));\n this.addTemplate('application', `\n {{#each this.allSitesAllArticles as |a|}}\n \n Article [{{a.site_id}}] [{{a.article_id}}]\n \n {{/each}}\n {{outlet}}\n `);\n }\n\n visitApplication() {\n return this.visit('/').then(() => {\n var assert = this.assert;\n this.links = {};\n this.links['s-1-a-1'] = document.getElementById('s-1-a-1');\n this.links['s-1-a-2'] = document.getElementById('s-1-a-2');\n this.links['s-1-a-3'] = document.getElementById('s-1-a-3');\n this.links['s-2-a-1'] = document.getElementById('s-2-a-1');\n this.links['s-2-a-2'] = document.getElementById('s-2-a-2');\n this.links['s-2-a-3'] = document.getElementById('s-2-a-3');\n this.links['s-3-a-1'] = document.getElementById('s-3-a-1');\n this.links['s-3-a-2'] = document.getElementById('s-3-a-2');\n this.links['s-3-a-3'] = document.getElementById('s-3-a-3');\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.site_controller = this.getController('site');\n this.article_controller = this.getController('site.article');\n });\n }\n\n async [\"@test query params have 'model' stickiness by default\"](assert) {\n assert.expect(59);\n await this.boot();\n this.links['s-1-a-1'].click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-1'\n });\n this.assertCurrentPath('/site/s-1/a/a-1');\n await this.setAndFlush(this.article_controller, 'q', 'lol');\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n await this.setAndFlush(this.site_controller, 'country', 'us');\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.links['s-1-a-2'].click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.links['s-2-a-2'].click();\n await (0, _internalTestHelpers.runLoopSettled)();\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?country=us');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?country=us');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n }\n\n async [\"@test query params have 'model' stickiness by default (url changes)\"](assert) {\n assert.expect(88);\n await this.boot();\n this.expectedSiteModelHookParams = {\n site_id: 's-1',\n country: 'au'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n await this.transitionTo('/site/s-1/a/a-1?q=lol');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n }, \"site controller's model is s-1\");\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-1'\n }, \"article controller's model is a-1\");\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.expectedSiteModelHookParams = {\n site_id: 's-2',\n country: 'us'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'lol',\n z: 0\n };\n await this.transitionTo('/site/s-2/a/a-1?country=us&q=lol');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-1'\n }, \"article controller's model is a-1\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.expectedSiteModelHookParams = {\n site_id: 's-2',\n country: 'us'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n await this.transitionTo('/site/s-2/a/a-2?country=us&q=lol');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n }, \"article controller's model is a-2\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.expectedSiteModelHookParams = {\n site_id: 's-2',\n country: 'us'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n await this.transitionTo('/site/s-2/a/a-3?country=us&q=lol&z=123');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n }, \"site controller's model is s-2\");\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-3'\n }, \"article controller's model is a-3\");\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 123);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=lol&z=123');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=lol&z=123');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=lol&z=123');\n this.expectedSiteModelHookParams = {\n site_id: 's-3',\n country: 'nz'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'lol',\n z: 123\n };\n await this.transitionTo('/site/s-3/a/a-3?country=nz&q=lol&z=123');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-3'\n }, \"site controller's model is s-3\");\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-3'\n }, \"article controller's model is a-3\");\n assert.equal(this.site_controller.get('country'), 'nz');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 123);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=lol');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=lol&z=123');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=lol');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=lol&z=123');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?country=nz&q=lol');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?country=nz&q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?country=nz&q=lol&z=123');\n }\n\n async [\"@test query params have 'model' stickiness by default (params-based transitions)\"](assert) {\n assert.expect(118);\n await this.boot();\n this.expectedSiteModelHookParams = {\n site_id: 's-1',\n country: 'au'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'wat',\n z: 0\n };\n await this.transitionTo('site.article', 's-1', 'a-1');\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-1'\n });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'wat');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.expectedSiteModelHookParams = {\n site_id: 's-1',\n country: 'au'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 0\n };\n await this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: {\n q: 'lol'\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3');\n this.expectedSiteModelHookParams = {\n site_id: 's-1',\n country: 'au'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 0\n };\n await this.transitionTo('site.article', 's-1', 'a-3', {\n queryParams: {\n q: 'hay'\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-3'\n });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'hay');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n this.expectedSiteModelHookParams = {\n site_id: 's-1',\n country: 'au'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n await this.transitionTo('site.article', 's-1', 'a-2', {\n queryParams: {\n z: 1\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-1'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.site_controller.get('country'), 'au');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 1);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n this.expectedSiteModelHookParams = {\n site_id: 's-2',\n country: 'us'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-2',\n q: 'lol',\n z: 1\n };\n await this.transitionTo('site.article', 's-2', 'a-2', {\n queryParams: {\n country: 'us'\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-2'\n });\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'lol');\n assert.equal(this.article_controller.get('z'), 1);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n this.expectedSiteModelHookParams = {\n site_id: 's-2',\n country: 'us'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-1',\n q: 'yeah',\n z: 0\n };\n await this.transitionTo('site.article', 's-2', 'a-1', {\n queryParams: {\n q: 'yeah'\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-2'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-1'\n });\n assert.equal(this.site_controller.get('country'), 'us');\n assert.equal(this.article_controller.get('q'), 'yeah');\n assert.equal(this.article_controller.get('z'), 0);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=yeah');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=yeah');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?q=yeah');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?q=hay');\n this.expectedSiteModelHookParams = {\n site_id: 's-3',\n country: 'nz'\n };\n this.expectedArticleModelHookParams = {\n article_id: 'a-3',\n q: 'hay',\n z: 3\n };\n await this.transitionTo('site.article', 's-3', 'a-3', {\n queryParams: {\n country: 'nz',\n z: 3\n }\n });\n assert.deepEqual(this.site_controller.get('model'), {\n id: 's-3'\n });\n assert.deepEqual(this.article_controller.get('model'), {\n id: 'a-3'\n });\n assert.equal(this.site_controller.get('country'), 'nz');\n assert.equal(this.article_controller.get('q'), 'hay');\n assert.equal(this.article_controller.get('z'), 3);\n assert.equal(this.links['s-1-a-1'].getAttribute('href'), '/site/s-1/a/a-1?q=yeah');\n assert.equal(this.links['s-1-a-2'].getAttribute('href'), '/site/s-1/a/a-2?q=lol&z=1');\n assert.equal(this.links['s-1-a-3'].getAttribute('href'), '/site/s-1/a/a-3?q=hay&z=3');\n assert.equal(this.links['s-2-a-1'].getAttribute('href'), '/site/s-2/a/a-1?country=us&q=yeah');\n assert.equal(this.links['s-2-a-2'].getAttribute('href'), '/site/s-2/a/a-2?country=us&q=lol&z=1');\n assert.equal(this.links['s-2-a-3'].getAttribute('href'), '/site/s-2/a/a-3?country=us&q=hay&z=3');\n assert.equal(this.links['s-3-a-1'].getAttribute('href'), '/site/s-3/a/a-1?country=nz&q=yeah');\n assert.equal(this.links['s-3-a-2'].getAttribute('href'), '/site/s-3/a/a-2?country=nz&q=lol&z=1');\n assert.equal(this.links['s-3-a-3'].getAttribute('href'), '/site/s-3/a/a-3?country=nz&q=hay&z=3');\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test/overlapping_query_params_test\", [\"@ember/controller\", \"@ember/-internals/routing\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_controller, _routing, _metal, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Query Params - overlapping query param property names', class extends _internalTestHelpers.QueryParamTestCase {\n setupBase() {\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n return this.visit('/parent/child');\n }\n\n async ['@test can remap same-named qp props'](assert) {\n assert.expect(7);\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n await this.setupBase();\n this.assertCurrentPath('/parent/child');\n var parentController = this.getController('parent');\n var parentChildController = this.getController('parent.child');\n await this.setAndFlush(parentController, 'page', 2);\n this.assertCurrentPath('/parent/child?parentPage=2');\n await this.setAndFlush(parentController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n await this.setAndFlush(parentChildController, 'page', 2);\n this.assertCurrentPath('/parent/child?childPage=2');\n await this.setAndFlush(parentChildController, 'page', 1);\n this.assertCurrentPath('/parent/child');\n parentController.set('page', 2);\n parentChildController.set('page', 2);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n parentController.set('page', 1);\n parentChildController.set('page', 1);\n await (0, _internalTestHelpers.runLoopSettled)();\n this.assertCurrentPath('/parent/child');\n }\n\n async ['@test query params can be either controller property or url key'](assert) {\n assert.expect(3);\n this.setMappedQPController('parent');\n await this.setupBase();\n this.assertCurrentPath('/parent/child');\n await this.transitionTo('parent.child', {\n queryParams: {\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=2');\n await this.transitionTo('parent.child', {\n queryParams: {\n parentPage: 3\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=3');\n }\n\n async ['@test query param matching a url key and controller property'](assert) {\n assert.expect(3);\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'index', 'page');\n await this.setupBase();\n await this.transitionTo('parent.child', {\n queryParams: {\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=2');\n await this.transitionTo('parent.child', {\n queryParams: {\n parentPage: 3\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=3');\n await this.transitionTo('parent.child', {\n queryParams: {\n index: 2,\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?page=2&parentPage=2');\n }\n\n async ['@test query param matching same property on two controllers use the urlKey higher in the chain'](assert) {\n assert.expect(4);\n this.setMappedQPController('parent', 'page', 'parentPage');\n this.setMappedQPController('parent.child', 'page', 'childPage');\n await this.setupBase();\n await this.transitionTo('parent.child', {\n queryParams: {\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=2');\n await this.transitionTo('parent.child', {\n queryParams: {\n parentPage: 3\n }\n });\n this.assertCurrentPath('/parent/child?parentPage=3');\n await this.transitionTo('parent.child', {\n queryParams: {\n childPage: 2,\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?childPage=2&parentPage=2');\n await this.transitionTo('parent.child', {\n queryParams: {\n childPage: 3,\n parentPage: 4\n }\n });\n this.assertCurrentPath('/parent/child?childPage=3&parentPage=4');\n }\n\n async ['@test query params does not error when a query parameter exists for route instances that share a controller'](assert) {\n assert.expect(1);\n\n var parentController = _controller.default.extend({\n queryParams: {\n page: 'page'\n }\n });\n\n this.add('controller:parent', parentController);\n this.add('route:parent.child', _routing.Route.extend({\n controllerName: 'parent'\n }));\n await this.setupBase('/parent');\n await this.transitionTo('parent.child', {\n queryParams: {\n page: 2\n }\n });\n this.assertCurrentPath('/parent/child?page=2');\n }\n\n async ['@test query params in the same route hierarchy with the same url key get auto-scoped'](assert) {\n assert.expect(1);\n this.setMappedQPController('parent');\n this.setMappedQPController('parent.child');\n await assert.rejectsAssertion(this.setupBase(), \"You're not allowed to have more than one controller property map to the same query param key, but both `parent:page` and `parent.child:page` map to `parentPage`. You can fix this by mapping one of the controller properties to a different query param key via the `as` config option, e.g. `page: { as: 'other-page' }`\");\n }\n\n async ['@test Support shared but overridable mixin pattern'](assert) {\n assert.expect(7);\n\n var HasPage = _metal.Mixin.create({\n queryParams: 'page',\n page: 1\n });\n\n this.add('controller:parent', _controller.default.extend(HasPage, {\n queryParams: {\n page: 'yespage'\n }\n }));\n this.add('controller:parent.child', _controller.default.extend(HasPage));\n await this.setupBase();\n this.assertCurrentPath('/parent/child');\n var parentController = this.getController('parent');\n var parentChildController = this.getController('parent.child');\n await this.setAndFlush(parentChildController, 'page', 2);\n this.assertCurrentPath('/parent/child?page=2');\n assert.equal(parentController.get('page'), 1);\n assert.equal(parentChildController.get('page'), 2);\n await this.setAndFlush(parentController, 'page', 2);\n this.assertCurrentPath('/parent/child?page=2&yespage=2');\n assert.equal(parentController.get('page'), 2);\n assert.equal(parentChildController.get('page'), 2);\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test/query_param_async_get_handler_test\", [\"@ember/-internals/metal\", \"@ember/-internals/runtime\", \"@ember/-internals/routing\", \"internal-test-helpers\"], function (_metal, _runtime, _routing, _internalTestHelpers) {\n \"use strict\";\n\n // These tests mimic what happens with lazily loaded Engines.\n (0, _internalTestHelpers.moduleFor)('Query Params - async get handler', class extends _internalTestHelpers.QueryParamTestCase {\n get routerOptions() {\n var fetchedHandlers = this.fetchedHandlers = [];\n return {\n location: 'test',\n\n init() {\n this._super(...arguments);\n\n this._seenHandlers = Object.create(null);\n this._handlerPromises = Object.create(null);\n },\n\n setupRouter() {\n var isNewSetup = this._super(...arguments);\n\n if (isNewSetup) {\n var {\n _handlerPromises: handlerPromises,\n _seenHandlers: seenHandlers\n } = this;\n var getRoute = this._routerMicrolib.getRoute;\n\n this._routerMicrolib.getRoute = function (routeName) {\n fetchedHandlers.push(routeName); // Cache the returns so we don't have more than one Promise for a\n // given handler.\n\n return handlerPromises[routeName] || (handlerPromises[routeName] = new _runtime.RSVP.Promise(resolve => {\n setTimeout(() => {\n var handler = getRoute(routeName);\n seenHandlers[routeName] = handler;\n resolve(handler);\n }, 10);\n }));\n };\n }\n\n return isNewSetup;\n },\n\n _getQPMeta(routeInfo) {\n var handler = this._seenHandlers[routeInfo.name];\n\n if (handler) {\n return (0, _metal.get)(handler, '_qp');\n }\n }\n\n };\n }\n\n async ['@test can render a link to an asynchronously loaded route without fetching the route'](assert) {\n this.router.map(function () {\n this.route('post', {\n path: '/post/:id'\n });\n });\n this.setSingleQPController('post');\n\n var setupAppTemplate = () => {\n this.addTemplate('application', `\n Post \n Post \n {{outlet}}\n `);\n };\n\n setupAppTemplate();\n await this.visitAndAssert('/');\n assert.equal(this.$('.post-link.is-1337').attr('href'), '/post/1337?foo=bar', 'renders correctly with default QP value');\n assert.equal(this.$('.post-link.is-7331').attr('href'), '/post/7331?foo=boo', 'renders correctly with non-default QP value');\n assert.deepEqual(this.fetchedHandlers, ['application', 'index'], `only fetched the handlers for the route we're on`);\n }\n\n ['@test can transitionTo to an asynchronously loaded route with simple query params'](assert) {\n assert.expect(6);\n this.router.map(function () {\n this.route('post', {\n path: '/post/:id'\n });\n this.route('posts');\n });\n this.setSingleQPController('post');\n var postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n return this.transitionTo('posts').then(() => {\n this.assertCurrentPath('/posts');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: {\n foo: 'boo'\n }\n }).then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly set on controller');\n this.assertCurrentPath('/post/1337?foo=boo');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: {\n foo: 'bar'\n }\n }).then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly set with default value');\n this.assertCurrentPath('/post/1337');\n });\n });\n }\n\n ['@test can transitionTo to an asynchronously loaded route with array query params'](assert) {\n assert.expect(5);\n this.router.map(function () {\n this.route('post', {\n path: '/post/:id'\n });\n });\n this.setSingleQPController('post', 'comments', []);\n var postController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n return this.transitionTo('post', 1337, {\n queryParams: {\n comments: [1, 2]\n }\n }).then(() => {\n assert.deepEqual(postController.get('comments'), [1, 2], 'array QP is correctly set with default value');\n this.assertCurrentPath('/post/1337?comments=%5B1%2C2%5D');\n });\n }).then(() => {\n return this.transitionTo('post', 1338).then(() => {\n assert.deepEqual(postController.get('comments'), [], 'array QP is correctly set on controller');\n this.assertCurrentPath('/post/1338');\n });\n });\n }\n\n ['@test can transitionTo to an asynchronously loaded route with mapped query params'](assert) {\n assert.expect(7);\n this.router.map(function () {\n this.route('post', {\n path: '/post/:id'\n }, function () {\n this.route('index', {\n path: '/'\n });\n });\n });\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n var postController;\n var postIndexController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n return this.transitionTo('post.index', 1337, {\n queryParams: {\n note: 6,\n foo: 'boo'\n }\n }).then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly set on controller');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP is correctly set on controller');\n this.assertCurrentPath('/post/1337?foo=boo¬e=6');\n });\n }).then(() => {\n return this.transitionTo('post', 1337, {\n queryParams: {\n foo: 'bar'\n }\n }).then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly set with default value');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP retains value scoped to model');\n this.assertCurrentPath('/post/1337?note=6');\n });\n });\n }\n\n ['@test can transitionTo with a URL'](assert) {\n assert.expect(7);\n this.router.map(function () {\n this.route('post', {\n path: '/post/:id'\n }, function () {\n this.route('index', {\n path: '/'\n });\n });\n });\n this.setSingleQPController('post');\n this.setMappedQPController('post.index', 'comment', 'note');\n var postController;\n var postIndexController;\n return this.visitAndAssert('/').then(() => {\n postController = this.getController('post');\n postIndexController = this.getController('post.index');\n return this.transitionTo('/post/1337?foo=boo¬e=6').then(() => {\n assert.equal(postController.get('foo'), 'boo', 'simple QP is correctly deserialized on controller');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP is correctly deserialized on controller');\n this.assertCurrentPath('/post/1337?foo=boo¬e=6');\n });\n }).then(() => {\n return this.transitionTo('/post/1337?note=6').then(() => {\n assert.equal(postController.get('foo'), 'bar', 'simple QP is correctly deserialized with default value');\n assert.equal(postIndexController.get('comment'), 6, 'mapped QP retains value scoped to model');\n this.assertCurrentPath('/post/1337?note=6');\n });\n });\n }\n\n [\"@test undefined isn't serialized or deserialized into a string\"](assert) {\n assert.expect(4);\n this.router.map(function () {\n this.route('example');\n });\n this.addTemplate('application', \"Example \");\n this.setSingleQPController('example', 'foo', undefined, {\n foo: undefined\n });\n this.add('route:example', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n foo: undefined\n });\n }\n\n }));\n return this.visitAndAssert('/').then(() => {\n assert.equal(this.$('#the-link').attr('href'), '/example', 'renders without undefined qp serialized');\n return this.transitionTo('example', {\n queryParams: {\n foo: undefined\n }\n }).then(() => {\n this.assertCurrentPath('/example');\n });\n });\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test/query_params_paramless_link_to_test\", [\"@ember/controller\", \"internal-test-helpers\"], function (_controller, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Query Params - paramless link-to', class extends _internalTestHelpers.QueryParamTestCase {\n testParamlessLinks(assert, routeName) {\n assert.expect(1);\n this.addTemplate(routeName, `index `);\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: ['foo'],\n foo: 'wat'\n }));\n return this.visit('/?foo=YEAH').then(() => {\n assert.equal(document.getElementById('index-link').getAttribute('href'), '/?foo=YEAH');\n });\n }\n\n [\"@test param-less links in an app booted with query params in the URL don't reset the query params: application\"](assert) {\n return this.testParamlessLinks(assert, 'application');\n }\n\n [\"@test param-less links in an app booted with query params in the URL don't reset the query params: index\"](assert) {\n return this.testParamlessLinks(assert, 'index');\n }\n\n });\n});","define(\"ember/tests/routing/query_params_test/shared_state_test\", [\"@ember/controller\", \"@ember/service\", \"@ember/runloop\", \"internal-test-helpers\"], function (_controller, _service, _runloop, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Query Params - shared service state', class extends _internalTestHelpers.QueryParamTestCase {\n boot() {\n this.setupApplication();\n return this.visitApplication();\n }\n\n setupApplication() {\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n this.route('dashboard');\n });\n this.add('service:filters', _service.default.extend({\n shared: true\n }));\n this.add('controller:home', _controller.default.extend({\n filters: (0, _service.service)()\n }));\n this.add('controller:dashboard', _controller.default.extend({\n filters: (0, _service.service)(),\n queryParams: [{\n 'filters.shared': 'shared'\n }]\n }));\n this.addTemplate('application', `Home {{outlet}}
`);\n this.addTemplate('home', `Dashboard `);\n this.addTemplate('dashboard', `Home `);\n }\n\n visitApplication() {\n return this.visit('/');\n }\n\n ['@test can modify shared state before transition'](assert) {\n assert.expect(1);\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox'); // click the checkbox once to set filters.shared to false\n\n (0, _runloop.run)(this.$input, 'click');\n return this.visit('/dashboard').then(() => {\n assert.ok(true, 'expecting navigating to dashboard to succeed');\n });\n });\n }\n\n ['@test can modify shared state back to the default value before transition'](assert) {\n assert.expect(1);\n return this.boot().then(() => {\n this.$input = document.getElementById('filters-checkbox'); // click the checkbox twice to set filters.shared to false and back to true\n\n (0, _runloop.run)(this.$input, 'click');\n (0, _runloop.run)(this.$input, 'click');\n return this.visit('/dashboard').then(() => {\n assert.ok(true, 'expecting navigating to dashboard to succeed');\n });\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_map_test\", [\"internal-test-helpers\", \"@ember/runloop\", \"@ember/-internals/routing\"], function (_internalTestHelpers, _runloop, _routing) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router.map', class extends _internalTestHelpers.ApplicationTestCase {\n ['@test Router.map returns an Ember Router class'](assert) {\n assert.expect(1);\n var ret = this.router.map(function () {\n this.route('hello');\n });\n assert.ok(_routing.Router.detect(ret));\n }\n\n ['@test Router.map can be called multiple times'](assert) {\n assert.expect(2);\n this.addTemplate('hello', 'Hello!');\n this.addTemplate('goodbye', 'Goodbye!');\n this.router.map(function () {\n this.route('hello');\n });\n this.router.map(function () {\n this.route('goodbye');\n });\n return (0, _runloop.run)(() => {\n return this.visit('/hello').then(() => {\n this.assertText('Hello!');\n }).then(() => {\n return this.visit('/goodbye');\n }).then(() => {\n this.assertText('Goodbye!');\n });\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/basic_test\", [\"@ember/-internals/routing\", \"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/service\"], function (_routing, _metal, _internalTestHelpers, _service) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - main', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#currentRouteName is correctly set for top level route'](assert) {\n assert.expect(6);\n return this.visit('/').then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName,\n params,\n paramNames,\n queryParams\n } = currentRoute;\n assert.equal(name, 'parent.index');\n assert.equal(localName, 'index');\n assert.deepEqual(params, {});\n assert.deepEqual(queryParams, {});\n assert.deepEqual(paramNames, []);\n assert.equal(this.routerService.get('currentRouteName'), 'parent.index');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set for child route'](assert) {\n assert.expect(6);\n return this.visit('/child').then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName,\n params,\n paramNames,\n queryParams\n } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.deepEqual(params, {});\n assert.deepEqual(queryParams, {});\n assert.deepEqual(paramNames, []);\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set after transition'](assert) {\n assert.expect(5);\n return this.visit('/child').then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName\n } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName\n } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n '@test substates survive aborts GH#17430'(assert) {\n assert.expect(2);\n this.add(`route:parent.child`, _routing.Route.extend({\n beforeModel(transition) {\n transition.abort();\n this.intermediateTransitionTo('parent.sister');\n }\n\n }));\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('/child');\n }).catch(e => {\n assert.equal(this.routerService.currentRouteName, 'parent.sister');\n assert.equal(e.message, 'TransitionAborted');\n });\n }\n\n ['@test RouterService#currentRouteName is correctly set on each transition'](assert) {\n assert.expect(9);\n return this.visit('/child').then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName\n } = currentRoute;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.equal(this.routerService.get('currentRouteName'), 'parent.child');\n return this.visit('/sister');\n }).then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName\n } = currentRoute;\n assert.equal(name, 'parent.sister');\n assert.equal(localName, 'sister');\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n return this.visit('/brother');\n }).then(() => {\n var currentRoute = this.routerService.currentRoute;\n var {\n name,\n localName\n } = currentRoute;\n assert.equal(name, 'parent.brother');\n assert.equal(localName, 'brother');\n assert.equal(this.routerService.get('currentRouteName'), 'parent.brother');\n });\n }\n\n ['@test RouterService#rootURL is correctly set to the default value'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('rootURL'), '/');\n });\n }\n\n ['@test RouterService#rootURL is correctly set to a custom value'](assert) {\n assert.expect(1);\n this.add('route:parent.index', _routing.Route.extend({\n init() {\n this._super();\n\n (0, _metal.set)(this._router, 'rootURL', '/homepage');\n }\n\n }));\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('rootURL'), '/homepage');\n });\n }\n\n ['@test RouterService#location is correctly delegated from router:main'](assert) {\n assert.expect(2);\n return this.visit('/').then(() => {\n var location = this.routerService.get('location');\n assert.ok(location);\n assert.ok(location instanceof _routing.NoneLocation);\n });\n }\n\n ['@test RouterService can be injected into router and accessed on init'](assert) {\n assert.expect(1);\n this.router.reopen({\n routerService: (0, _service.service)('router'),\n\n init() {\n this.routerService.one('routeDidChange', () => {\n assert.ok(true, 'routeDidChange event listener called');\n });\n }\n\n });\n return this.visit('/');\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/build_routeinfo_metadata_test\", [\"internal-test-helpers\", \"@ember/service\", \"@ember/-internals/routing\"], function (_internalTestHelpers, _service, _routing) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('buildRouteInfoMetadata', class extends _internalTestHelpers.RouterTestCase {\n '@test basic metadata'(assert) {\n assert.expect(4);\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata, 'parent-index-page');\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata, 'parent-index-page');\n });\n }\n\n }));\n this.add(`route:parent.index`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return 'parent-index-page';\n }\n\n }));\n return this.visit('/');\n }\n\n '@test hierarchical metadata'(assert) {\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n buildRouteInfoMetadata() {\n return 'application-shell';\n },\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata, 'parent-index-page');\n assert.equal(transition.to.parent.name, 'parent');\n assert.equal(transition.to.parent.metadata, 'parent-page');\n assert.equal(transition.to.parent.parent.name, 'application');\n assert.equal(transition.to.parent.parent.metadata, 'application-shell');\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata, 'parent-index-page');\n assert.equal(transition.to.parent.name, 'parent');\n assert.equal(transition.to.parent.metadata, 'parent-page');\n assert.equal(transition.to.parent.parent.name, 'application');\n assert.equal(transition.to.parent.parent.metadata, 'application-shell');\n });\n }\n\n }));\n this.add(`route:parent`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return 'parent-page';\n }\n\n }));\n this.add(`route:parent.index`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return 'parent-index-page';\n }\n\n }));\n return this.visit('/');\n }\n\n '@test metadata can be complex objects'(assert) {\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata.name, 'parent-index-page');\n assert.equal(transition.to.metadata.title('PARENT'), 'My Name is PARENT');\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.metadata.name, 'parent-index-page');\n assert.equal(transition.to.metadata.title('PARENT'), 'My Name is PARENT');\n });\n }\n\n }));\n this.add(`route:parent`, _routing.Route.extend({}));\n this.add(`route:parent.index`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return {\n name: 'parent-index-page',\n title: name => `My Name is ${name}`\n };\n }\n\n }));\n return this.visit('/');\n }\n\n '@test metadata is placed on the `from`'(assert) {\n assert.expect(12);\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (transition.to.name === 'parent.index') {\n assert.equal(transition.to.metadata.name, 'parent-index-page');\n assert.equal(transition.to.metadata.title('INDEX'), 'My Name is INDEX');\n } else {\n assert.equal(transition.from.metadata.name, 'parent-index-page');\n assert.equal(transition.from.metadata.title('INDEX'), 'My Name is INDEX');\n assert.equal(transition.to.metadata.name, 'parent-child-page');\n assert.equal(transition.to.metadata.title('CHILD'), 'My Name is CHILD!!');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (transition.to.name === 'parent.index') {\n assert.equal(transition.to.metadata.name, 'parent-index-page');\n assert.equal(transition.to.metadata.title('INDEX'), 'My Name is INDEX');\n } else {\n assert.equal(transition.from.metadata.name, 'parent-index-page');\n assert.equal(transition.from.metadata.title('INDEX'), 'My Name is INDEX');\n assert.equal(transition.to.metadata.name, 'parent-child-page');\n assert.equal(transition.to.metadata.title('CHILD'), 'My Name is CHILD!!');\n }\n });\n }\n\n }));\n this.add(`route:parent`, _routing.Route.extend({}));\n this.add(`route:parent.index`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return {\n name: 'parent-index-page',\n title: name => `My Name is ${name}`\n };\n }\n\n }));\n this.add(`route:parent.child`, _routing.Route.extend({\n buildRouteInfoMetadata() {\n return {\n name: 'parent-child-page',\n title: name => `My Name is ${name}!!`\n };\n }\n\n }));\n return this.visit('/').then(() => {\n return this.visit('/child');\n });\n }\n\n '@test can be used with model data from `attributes`'(assert) {\n assert.expect(6);\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeDidChange', transition => {\n if (transition.to.name === 'parent.index') {\n assert.equal(transition.to.metadata.name, 'parent-index-page');\n assert.equal(transition.to.metadata.title(transition.to.attributes), 'My Name is INDEX');\n } else {\n assert.equal(transition.from.metadata.name, 'parent-index-page');\n assert.equal(transition.from.metadata.title(transition.from.attributes), 'My Name is INDEX');\n assert.equal(transition.to.metadata.name, 'parent-child-page');\n assert.equal(transition.to.metadata.title(transition.to.attributes), 'My Name is CHILD!!');\n }\n });\n }\n\n }));\n this.add(`route:parent`, _routing.Route.extend({}));\n this.add(`route:parent.index`, _routing.Route.extend({\n model() {\n return {\n name: 'INDEX'\n };\n },\n\n buildRouteInfoMetadata() {\n return {\n name: 'parent-index-page',\n title: model => `My Name is ${model.name}`\n };\n }\n\n }));\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n return {\n name: 'CHILD'\n };\n },\n\n buildRouteInfoMetadata() {\n return {\n name: 'parent-child-page',\n title: model => `My Name is ${model.name}!!`\n };\n }\n\n }));\n return this.visit('/').then(() => {\n return this.visit('/child');\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/currenturl_lifecycle_test\", [\"@ember/service\", \"@ember/object/computed\", \"@ember/-internals/glimmer\", \"@ember/-internals/routing\", \"@ember/-internals/metal\", \"internal-test-helpers\", \"@ember/-internals/runtime\"], function (_service, _computed, _glimmer, _routing, _metal, _internalTestHelpers, _runtime) {\n \"use strict\";\n\n var results = [];\n var ROUTE_NAMES = ['index', 'child', 'sister', 'brother', 'loading'];\n\n var InstrumentedRoute = _routing.Route.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n var service = (0, _metal.get)(this, 'routerService');\n service.on('routeWillChange', transition => {\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} routeWillChange: ${transition.from && transition.from.name} - ${transition.to.name}`, service.get('currentURL')]);\n });\n service.on('routeDidChange', transition => {\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} routeDidChange: ${transition.from && transition.from.name} - ${transition.to.name}`, service.get('currentURL')]);\n });\n },\n\n activate() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} activate`, service.get('currentURL')]);\n },\n\n redirect() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} redirect`, service.get('currentURL')]);\n },\n\n beforeModel() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} beforeModel`, service.get('currentURL')]);\n },\n\n model() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} model`, service.get('currentURL')]);\n return new _runtime.RSVP.Promise(resolve => {\n setTimeout(resolve, 200);\n });\n },\n\n afterModel() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} afterModel`, service.get('currentURL')]);\n },\n\n actions: {\n willTransition(transition) {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} willTransition: ${transition.from && transition.from.name} - ${transition.to.name}`, service.get('currentURL')]);\n return true;\n },\n\n didTransition() {\n var service = (0, _metal.get)(this, 'routerService');\n results.push([`${service.get('currentRouteName')} - ${service.get('currentRoute.name')}`, `${this.routeName} didTransition`, service.get('currentURL')]);\n return true;\n }\n\n }\n });\n\n (0, _internalTestHelpers.moduleFor)('Router Service - currentURL | currentRouteName | currentRoute.name', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n results = [];\n ROUTE_NAMES.forEach(name => {\n var routeName = `parent.${name}`;\n this.add(`route:${routeName}`, InstrumentedRoute.extend());\n this.addTemplate(routeName, '{{current-url}}');\n });\n\n var CurrenURLComponent = _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n currentURL: (0, _computed.readOnly)('routerService.currentURL'),\n currentRouteName: (0, _computed.readOnly)('routerService.currentRouteName'),\n currentRoute: (0, _computed.readOnly)('routerService.currentRoute')\n });\n\n this.addComponent('current-url', {\n ComponentClass: CurrenURLComponent,\n template: '{{this.currentURL}}-{{this.currentRouteName}}-{{this.currentRoute.name}}'\n });\n }\n\n ['@test RouterService#currentURL is correctly set for top level route'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/');\n });\n }\n\n ['@test RouterService#currentURL is correctly set for child route'](assert) {\n assert.expect(1);\n return this.visit('/child').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n });\n }\n\n ['@test RouterService#currentURL is correctly set after transition'](assert) {\n assert.expect(1);\n return this.visit('/child').then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/sister');\n });\n }\n\n ['@test RouterService#currentURL is correctly set on each transition'](assert) {\n assert.expect(3);\n return this.visit('/child').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n return this.visit('/sister');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/sister');\n return this.visit('/brother');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/brother');\n });\n }\n\n ['@test RouterService#currentURL is not set during model lifecycle hooks until routeDidChange'](assert) {\n assert.expect(2);\n return this.visit('/').then(() => {\n assert.deepEqual(results, [['null - undefined', 'parent.index routeWillChange: null - parent.index', null], ['null - undefined', 'parent.index beforeModel', null], ['null - undefined', 'parent.index model', null], ['null - undefined', 'parent.loading activate', null], ['null - undefined', 'parent.loading routeWillChange: null - parent.loading', null], ['null - undefined', 'parent.index routeWillChange: null - parent.loading', null], ['parent.loading - parent.loading', 'parent.index afterModel', '/'], ['parent.loading - parent.loading', 'parent.index redirect', '/'], ['parent.loading - parent.loading', 'parent.index activate', '/'], ['parent.loading - parent.loading', 'parent.index didTransition', '/'], ['parent.index - parent.index', 'parent.loading routeDidChange: null - parent.index', '/'], ['parent.index - parent.index', 'parent.index routeDidChange: null - parent.index', '/']]);\n results = [];\n return this.visit('/child');\n }).then(() => {\n assert.deepEqual(results, [['parent.index - parent.index', 'parent.index willTransition: parent.index - parent.child', '/'], ['parent.index - parent.index', 'parent.child routeWillChange: parent.index - parent.child', '/'], ['parent.index - parent.index', 'parent.loading routeWillChange: parent.index - parent.child', '/'], ['parent.index - parent.index', 'parent.index routeWillChange: parent.index - parent.child', '/'], ['parent.index - parent.index', 'parent.child beforeModel', '/'], ['parent.index - parent.index', 'parent.child model', '/'], ['parent.index - parent.index', 'parent.loading activate', '/'], ['parent.index - parent.index', 'parent.child routeWillChange: parent.index - parent.loading', '/'], ['parent.index - parent.index', 'parent.loading routeWillChange: parent.index - parent.loading', '/'], ['parent.index - parent.index', 'parent.index routeWillChange: parent.index - parent.loading', '/'], ['parent.loading - parent.loading', 'parent.child afterModel', '/child'], ['parent.loading - parent.loading', 'parent.child redirect', '/child'], ['parent.loading - parent.loading', 'parent.child activate', '/child'], ['parent.loading - parent.loading', 'parent.child didTransition', '/child'], ['parent.child - parent.child', 'parent.child routeDidChange: parent.index - parent.child', '/child'], ['parent.child - parent.child', 'parent.loading routeDidChange: parent.index - parent.child', '/child'], ['parent.child - parent.child', 'parent.index routeDidChange: parent.index - parent.child', '/child']]);\n });\n }\n\n ['@test RouterService#currentURL is correctly set with component after consecutive visits'](assert) {\n assert.expect(3);\n return this.visit('/').then(() => {\n this.assertText('/-parent.index-parent.index');\n return this.visit('/child');\n }).then(() => {\n this.assertText('/child-parent.child-parent.child');\n return this.visit('/');\n }).then(() => {\n this.assertText('/-parent.index-parent.index');\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/events_test\", [\"internal-test-helpers\", \"@ember/service\", \"@ember/-internals/routing\", \"@ember/runloop\"], function (_internalTestHelpers, _service, _routing, _runloop) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - events', class extends _internalTestHelpers.RouterTestCase {\n '@test initial render'(assert) {\n assert.expect(12);\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.ok(transition);\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.localName, 'index');\n });\n this.router.on('routeDidChange', transition => {\n assert.ok(transition);\n assert.ok(this.router.currentURL, `has URL ${this.router.currentURL}`);\n assert.equal(this.router.currentURL, '/');\n assert.ok(this.router.currentRouteName, `has route name ${this.router.currentRouteName}`);\n assert.equal(this.router.currentRouteName, 'parent.index');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.index');\n assert.equal(transition.to.localName, 'index');\n });\n }\n\n }));\n return this.visit('/');\n }\n\n '@test subsequent visits'(assert) {\n assert.expect(24);\n var toParent = true;\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toParent) {\n assert.equal(this.router.currentURL, null, 'starts as null');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.child');\n assert.equal(transition.to.localName, 'child');\n assert.equal(transition.to.parent.name, 'parent', 'parent node');\n assert.equal(transition.to.parent.child, transition.to, 'parents child node is the `to`');\n assert.equal(transition.to.parent.parent.name, 'application', 'top level');\n assert.equal(transition.to.parent.parent.parent, null, 'top level');\n } else {\n assert.equal(this.router.currentURL, '/child', 'not changed until transition');\n assert.notEqual(transition.from, undefined);\n assert.equal(transition.from.name, 'parent.child');\n assert.equal(transition.from.localName, 'child');\n assert.equal(transition.to.localName, 'sister');\n assert.equal(transition.to.name, 'parent.sister');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (toParent) {\n assert.equal(this.router.currentURL, '/child');\n assert.equal(transition.from, undefined);\n assert.equal(transition.to.name, 'parent.child');\n assert.equal(transition.to.localName, 'child');\n } else {\n assert.equal(this.router.currentURL, '/sister');\n assert.notEqual(transition.from, undefined);\n assert.equal(transition.from.name, 'parent.child');\n assert.equal(transition.from.localName, 'child');\n assert.equal(transition.to.localName, 'sister');\n assert.equal(transition.to.name, 'parent.sister');\n }\n });\n }\n\n }));\n return this.visit('/child').then(() => {\n toParent = false;\n return this.routerService.transitionTo('parent.sister');\n });\n }\n\n '@test transitions can be retried async'(assert) {\n var done = assert.async();\n this.add(`route:parent.child`, _routing.Route.extend({\n actions: {\n willTransition(transition) {\n transition.abort();\n this.intermediateTransitionTo('parent.sister');\n (0, _runloop.later)(() => {\n transition.retry();\n done();\n }, 500);\n }\n\n }\n }));\n return this.visit('/child').then(() => {\n return this.visit('/');\n }).catch(e => {\n assert.equal(e.message, 'TransitionAborted');\n });\n }\n\n '@test redirection with `transitionTo`'(assert) {\n assert.expect(11);\n var toChild = false;\n var toSister = false;\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.transitionTo('parent.child');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.transitionTo('parent.sister');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n\n if (toChild) {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n toChild = true;\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n });\n }\n\n }));\n return this.visit('/');\n }\n\n '@test redirection with `replaceWith`'(assert) {\n assert.expect(11);\n var toChild = false;\n var toSister = false;\n this.add(`route:parent`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.replaceWith('parent.child');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.replaceWith('parent.sister');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n\n if (toChild) {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n toChild = true;\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n });\n }\n\n }));\n return this.visit('/');\n }\n\n '@test nested redirection with `transitionTo`'(assert) {\n assert.expect(12);\n var toChild = false;\n var toSister = false;\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.transitionTo('parent.sister');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toChild) {\n assert.equal(transition.from.name, 'parent.index');\n\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (toSister) {\n assert.equal(transition.from.name, 'parent.index', 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n } else {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n }\n });\n }\n\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test nested redirection with `replaceWith`'(assert) {\n assert.expect(12);\n var toChild = false;\n var toSister = false;\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n expectDeprecation(() => {\n this.replaceWith('parent.sister');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toChild) {\n assert.equal(transition.from.name, 'parent.index');\n\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister', 'going to /sister');\n } else {\n assert.equal(transition.to.name, 'parent.child', 'going to /child');\n toSister = true;\n }\n } else {\n // Going to `/`\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (toSister) {\n assert.equal(transition.from.name, 'parent.index', 'initial');\n assert.equal(transition.to.name, 'parent.sister', 'landed on /sister');\n } else {\n assert.equal(transition.from, undefined, 'initial');\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n }\n });\n }\n\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test aborted transition'(assert) {\n assert.expect(11);\n var didAbort = false;\n var toChild = false;\n this.add(`route:parent.child`, _routing.Route.extend({\n model(_model, transition) {\n didAbort = true;\n transition.abort();\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (didAbort) {\n assert.equal(transition.to.name, 'parent.index', 'transition aborted');\n assert.equal(transition.from.name, 'parent.index', 'transition aborted');\n } else if (toChild) {\n assert.equal(transition.from.name, 'parent.index', 'from /');\n assert.equal(transition.to.name, 'parent.child', 'to /child');\n } else {\n assert.equal(transition.to.name, 'parent.index', 'going to /');\n assert.equal(transition.from, undefined, 'initial');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (didAbort) {\n assert.equal(transition.to.name, 'parent.index', 'landed on /');\n assert.equal(transition.from.name, 'parent.index', 'initial');\n } else {\n assert.equal(transition.to.name, 'parent.index', 'transition aborted');\n assert.equal(transition.from, undefined, 'transition aborted');\n }\n });\n }\n\n }));\n return this.visit('/').then(() => {\n toChild = true;\n return this.routerService.transitionTo('/child').catch(e => {\n assert.equal(e.name, 'TransitionAborted', 'Transition aborted');\n });\n });\n }\n\n '@test query param transitions'(assert) {\n assert.expect(15);\n var initial = true;\n var addQP = false;\n var removeQP = false;\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'parent.index');\n\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, {\n a: 'true'\n });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, {\n a: 'true'\n });\n assert.deepEqual(transition.to.queryParams, {\n a: 'false',\n b: 'b'\n });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, {\n a: 'false',\n b: 'b'\n });\n assert.deepEqual(transition.to.queryParams, {\n a: 'false'\n });\n } else {\n assert.ok(false, 'never');\n }\n });\n this.router.on('routeDidChange', transition => {\n if (initial) {\n assert.equal(transition.from, null);\n assert.deepEqual(transition.to.queryParams, {\n a: 'true'\n });\n } else if (addQP) {\n assert.deepEqual(transition.from.queryParams, {\n a: 'true'\n });\n assert.deepEqual(transition.to.queryParams, {\n a: 'false',\n b: 'b'\n });\n } else if (removeQP) {\n assert.deepEqual(transition.from.queryParams, {\n a: 'false',\n b: 'b'\n });\n assert.deepEqual(transition.to.queryParams, {\n a: 'false'\n });\n } else {\n assert.ok(false, 'never');\n }\n });\n }\n\n }));\n return this.visit('/?a=true').then(() => {\n addQP = true;\n initial = false;\n return this.routerService.transitionTo('/?a=false&b=b');\n }).then(() => {\n removeQP = true;\n addQP = false;\n return this.routerService.transitionTo('/?a=false');\n });\n }\n\n '@test query param redirects with `transitionTo`'(assert) {\n assert.expect(7);\n var toSister = false;\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n expectDeprecation(() => {\n this.transitionTo('/sister?a=a');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, {\n a: 'a'\n });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, {\n a: 'a'\n });\n });\n }\n\n }));\n return this.visit('/child');\n }\n\n '@test query param redirects with `replaceWith`'(assert) {\n assert.expect(7);\n var toSister = false;\n this.add(`route:parent.child`, _routing.Route.extend({\n model() {\n toSister = true;\n expectDeprecation(() => {\n this.replaceWith('/sister?a=a');\n }, /Calling replaceWith on a route is deprecated/);\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n if (toSister) {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, {\n a: 'a'\n });\n } else {\n assert.equal(transition.to.name, 'parent.child');\n assert.deepEqual(transition.to.queryParams, {});\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'parent.sister');\n assert.deepEqual(transition.to.queryParams, {\n a: 'a'\n });\n });\n }\n\n }));\n return this.visit('/child');\n }\n\n '@test params'(assert) {\n assert.expect(14);\n var initial = true;\n this.add('route:dynamic', _routing.Route.extend({\n model(params) {\n if (initial) {\n assert.deepEqual(params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(params, {\n dynamic_id: '1'\n });\n }\n\n return params;\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'dynamic');\n\n if (initial) {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n assert.deepEqual(transition.to.params, {\n dynamic_id: '1'\n });\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'dynamic');\n assert.deepEqual(transition.to.paramNames, ['dynamic_id']);\n\n if (initial) {\n assert.deepEqual(transition.to.params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(transition.to.params, {\n dynamic_id: '1'\n });\n }\n });\n }\n\n }));\n return this.visit('/dynamic/123').then(() => {\n initial = false;\n return this.routerService.transitionTo('dynamic', 1);\n });\n }\n\n '@test nested params'(assert) {\n assert.expect(30);\n var initial = true;\n this.add('route:dynamicWithChild', _routing.Route.extend({\n model(params) {\n if (initial) {\n assert.deepEqual(params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(params, {\n dynamic_id: '456'\n });\n }\n\n return params.dynamic_id;\n }\n\n }));\n this.add('route:dynamicWithChild.child', _routing.Route.extend({\n model(params) {\n assert.deepEqual(params, {\n child_id: '456'\n });\n return params.child_id;\n }\n\n }));\n this.add(`route:application`, _routing.Route.extend({\n router: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n this.router.on('routeWillChange', transition => {\n assert.equal(transition.to.name, 'dynamicWithChild.child');\n assert.deepEqual(transition.to.paramNames, ['child_id']);\n assert.deepEqual(transition.to.params, {\n child_id: '456'\n });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n\n if (initial) {\n assert.deepEqual(transition.to.parent.params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(transition.from.attributes, '456');\n assert.deepEqual(transition.from.parent.attributes, '123');\n assert.deepEqual(transition.to.parent.params, {\n dynamic_id: '456'\n });\n }\n });\n this.router.on('routeDidChange', transition => {\n assert.equal(transition.to.name, 'dynamicWithChild.child');\n assert.deepEqual(transition.to.paramNames, ['child_id']);\n assert.deepEqual(transition.to.params, {\n child_id: '456'\n });\n assert.deepEqual(transition.to.parent.paramNames, ['dynamic_id']);\n\n if (initial) {\n assert.deepEqual(transition.to.parent.params, {\n dynamic_id: '123'\n });\n } else {\n assert.deepEqual(transition.from.attributes, '456');\n assert.deepEqual(transition.from.parent.attributes, '123');\n assert.deepEqual(transition.to.attributes, '456');\n assert.deepEqual(transition.to.parent.attributes, '456');\n assert.deepEqual(transition.to.parent.params, {\n dynamic_id: '456'\n });\n }\n });\n }\n\n }));\n return this.visit('/dynamic-with-child/123/456').then(() => {\n initial = false;\n return this.routerService.transitionTo('/dynamic-with-child/456/456');\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/isActive_test\", [\"@ember/controller\", \"internal-test-helpers\", \"@ember/service\"], function (_controller, _internalTestHelpers, _service) {\n \"use strict\";\n\n function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n }\n\n function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n\n function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n }\n\n (0, _internalTestHelpers.moduleFor)('Router Service - isActive', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#isActive returns true for simple route'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.ok(this.routerService.isActive('parent.sister'));\n });\n }\n\n ['@test RouterService#isActive returns true for simple route with dynamic segments'](assert) {\n assert.expect(1);\n var dynamicModel = {\n id: 1\n };\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('dynamic', dynamicModel);\n }).then(() => {\n assert.ok(this.routerService.isActive('dynamic', dynamicModel));\n });\n }\n\n async ['@test RouterService#isActive entangles with route transitions'](assert) {\n var _class, _descriptor;\n\n assert.expect(6);\n this.add(`service:foo`, (_class = class _class extends _service.default {\n constructor(...args) {\n super(...args);\n\n _initializerDefineProperty(this, \"router\", _descriptor, this);\n }\n\n get isChildActive() {\n return this.router.isActive('parent.child');\n }\n\n get isSisterActive() {\n return this.router.isActive('parent.sister');\n }\n\n }, _descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [_service.service], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n }), _class));\n await this.visit('/');\n var fooService = this.applicationInstance.lookup('service:foo');\n assert.equal(fooService.isChildActive, false);\n assert.equal(fooService.isSisterActive, false);\n await this.routerService.transitionTo('parent.child');\n assert.equal(fooService.isChildActive, true);\n assert.equal(fooService.isSisterActive, false);\n await this.routerService.transitionTo('parent.sister');\n assert.equal(fooService.isChildActive, false);\n assert.equal(fooService.isSisterActive, true);\n }\n\n ['@test RouterService#isActive does not eagerly instantiate controller for query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n this.add('controller:parent.sister', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC',\n\n init() {\n assert.ok(false, 'should never create');\n\n this._super(...arguments);\n }\n\n }));\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n assert.notOk(this.routerService.isActive('parent.sister', queryParams));\n });\n }\n\n ['@test RouterService#isActive is correct for simple route with basic query params'](assert) {\n assert.expect(2);\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.ok(this.routerService.isActive('parent.child', queryParams));\n assert.notOk(this.routerService.isActive('parent.child', this.buildQueryParams({\n sort: 'DESC'\n })));\n });\n }\n\n ['@test RouterService#isActive for simple route with array as query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n sort: ['ascending']\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.notOk(this.routerService.isActive('parent.child', this.buildQueryParams({\n sort: 'descending'\n })));\n });\n }\n\n ['@test RouterService#isActive does not alter query params hash'](assert) {\n assert.expect(3);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'page'],\n sort: 'ASC',\n page: 1\n }));\n var qp = this.buildQueryParams({\n sort: 'ascending'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', qp);\n }).then(() => {\n assert.ok(this.routerService.isActive('parent.child', qp));\n assert.ok(this.routerService.isActive('parent.child', qp)); // using same qp second time should not fail\n\n assert.deepEqual(qp.queryParams, {\n sort: 'ascending'\n });\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/non_application_test_test\", [\"@ember/service\", \"@ember/-internals/routing\", \"@ember/-internals/metal\", \"@ember/runloop\", \"@ember/-internals/glimmer\", \"internal-test-helpers\"], function (_service, _routing, _metal, _runloop, _glimmer, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - non application test', class extends _internalTestHelpers.RouterNonApplicationTestCase {\n constructor() {\n super(...arguments);\n this.resolver.add('router:main', _routing.Router.extend(this.routerOptions));\n this.router.map(function () {\n this.route('parent', {\n path: '/'\n }, function () {\n this.route('child');\n this.route('sister');\n this.route('brother');\n });\n this.route('dynamic', {\n path: '/dynamic/:dynamic_id'\n });\n this.route('dynamicWithChild', {\n path: '/dynamic-with-child/:dynamic_id'\n }, function () {\n this.route('child', {\n path: '/:child_id'\n });\n });\n });\n }\n\n get routerOptions() {\n return {\n location: 'none'\n };\n }\n\n get router() {\n return this.owner.resolveRegistration('router:main');\n }\n\n get routerService() {\n return this.owner.lookup('service:router');\n }\n\n ['@test RouterService can be instantiated in non application test'](assert) {\n assert.ok(this.routerService);\n }\n\n ['@test RouterService properties can be accessed with default'](assert) {\n assert.expect(5);\n assert.equal(this.routerService.get('currentRouteName'), null);\n assert.equal(this.routerService.get('currentURL'), null);\n assert.equal(this.routerService.get('location'), 'none');\n assert.equal(this.routerService.get('rootURL'), '/');\n assert.equal(this.routerService.get('currentRoute'), null);\n }\n\n ['@test RouterService properties of router can be accessed with default when router is present'](assert) {\n assert.expect(5);\n var router = this.owner.lookup('router:main');\n router.setupRouter();\n assert.equal(this.routerService.get('currentRouteName'), null);\n assert.equal(this.routerService.get('currentURL'), null);\n assert.ok(this.routerService.get('location') instanceof _routing.NoneLocation);\n assert.equal(this.routerService.get('rootURL'), '/');\n assert.equal(this.routerService.get('currentRoute'), null);\n }\n\n ['@test RouterService#urlFor returns url'](assert) {\n assert.equal(this.routerService.urlFor('parent.child'), '/child');\n }\n\n ['@test RouterService#transitionTo with basic route'](assert) {\n assert.expect(2); // Callers who want to actually execute a transition in a non-application\n // test are doing something weird and therefore should do\n // `owner.setupRouter()` explicitly in their tests.\n\n var componentInstance;\n var router = this.owner.lookup('router:main');\n router.setupRouter();\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super(...arguments);\n\n componentInstance = this;\n },\n\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('parent.sister');\n }\n\n }\n }),\n template: `foo-bar`\n });\n this.render('{{foo-bar}}');\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n assert.ok(this.routerService.isActive('parent.sister'));\n }\n\n ['@test RouterService#recognize recognize returns routeInfo'](assert) {\n var routeInfo = this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n assert.ok(routeInfo);\n var {\n name,\n localName,\n parent,\n child,\n params,\n queryParams,\n paramNames\n } = routeInfo;\n assert.equal(name, 'dynamicWithChild.child');\n assert.equal(localName, 'child');\n assert.ok(parent);\n assert.equal(parent.name, 'dynamicWithChild');\n assert.notOk(child);\n assert.deepEqual(params, {\n child_id: '1'\n });\n assert.deepEqual(queryParams, {\n a: 'b'\n });\n assert.deepEqual(paramNames, ['child_id']);\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/recognize_test\", [\"internal-test-helpers\", \"@ember/-internals/routing\"], function (_internalTestHelpers, _routing) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - recognize', class extends _internalTestHelpers.RouterTestCase {\n '@test returns a RouteInfo for recognized URL'(assert) {\n return this.visit('/').then(() => {\n var routeInfo = this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n assert.ok(routeInfo);\n var {\n name,\n localName,\n parent,\n child,\n params,\n queryParams,\n paramNames\n } = routeInfo;\n assert.equal(name, 'dynamicWithChild.child');\n assert.equal(localName, 'child');\n assert.ok(parent);\n assert.equal(parent.name, 'dynamicWithChild');\n assert.notOk(child);\n assert.deepEqual(params, {\n child_id: '1'\n });\n assert.deepEqual(queryParams, {\n a: 'b'\n });\n assert.deepEqual(paramNames, ['child_id']);\n });\n }\n\n '@test does not transition'(assert) {\n this.addTemplate('parent', 'Parent');\n this.addTemplate('dynamic-with-child.child', 'Dynamic Child');\n return this.visit('/').then(() => {\n this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n this.assertText('Parent', 'Did not transition and cause render');\n assert.equal(this.routerService.currentURL, '/', 'Did not transition');\n });\n }\n\n '@test respects the usage of a different rootURL'(assert) {\n this.router.reopen({\n rootURL: '/app/'\n });\n return this.visit('/app').then(() => {\n var routeInfo = this.routerService.recognize('/app/child/');\n assert.ok(routeInfo);\n var {\n name,\n localName,\n parent\n } = routeInfo;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'parent');\n });\n }\n\n '@test must include rootURL'() {\n this.addTemplate('parent', 'Parent');\n this.addTemplate('dynamic-with-child.child', 'Dynamic Child');\n this.router.reopen({\n rootURL: '/app/'\n });\n return this.visit('/app').then(() => {\n expectAssertion(() => {\n this.routerService.recognize('/dynamic-with-child/123/1?a=b');\n }, 'You must pass a url that begins with the application\\'s rootURL \"/app/\"');\n });\n }\n\n '@test returns `null` if URL is not recognized'(assert) {\n return this.visit('/').then(() => {\n var routeInfo = this.routerService.recognize('/foo');\n assert.equal(routeInfo, null);\n });\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Router Service - recognizeAndLoad', class extends _internalTestHelpers.RouterTestCase {\n '@test returns a RouteInfoWithAttributes for recognized URL'(assert) {\n this.add('route:dynamicWithChild', _routing.Route.extend({\n model(params) {\n return {\n name: 'dynamicWithChild',\n data: params.dynamic_id\n };\n }\n\n }));\n this.add('route:dynamicWithChild.child', _routing.Route.extend({\n model(params) {\n return {\n name: 'dynamicWithChild.child',\n data: params.child_id\n };\n }\n\n }));\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/dynamic-with-child/123/1?a=b');\n }).then(routeInfoWithAttributes => {\n assert.ok(routeInfoWithAttributes);\n var {\n name,\n localName,\n parent,\n attributes,\n paramNames,\n params,\n queryParams\n } = routeInfoWithAttributes;\n assert.equal(name, 'dynamicWithChild.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'dynamicWithChild');\n assert.deepEqual(params, {\n child_id: '1'\n });\n assert.deepEqual(queryParams, {\n a: 'b'\n });\n assert.deepEqual(paramNames, ['child_id']);\n assert.deepEqual(attributes, {\n name: 'dynamicWithChild.child',\n data: '1'\n });\n assert.deepEqual(parent.attributes, {\n name: 'dynamicWithChild',\n data: '123'\n });\n assert.deepEqual(parent.paramNames, ['dynamic_id']);\n assert.deepEqual(parent.params, {\n dynamic_id: '123'\n });\n });\n }\n\n '@test does not transition'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return {\n name: 'child',\n data: ['stuff']\n };\n }\n\n }));\n return this.visit('/').then(() => {\n this.routerService.on('routeWillChange', () => assert.ok(false));\n this.routerService.on('routeDidChange', () => assert.ok(false));\n return this.routerService.recognizeAndLoad('/child');\n }).then(() => {\n assert.equal(this.routerService.currentURL, '/');\n this.assertText('Parent');\n });\n }\n\n '@test respects the usage of a different rootURL'(assert) {\n this.router.reopen({\n rootURL: '/app/'\n });\n return this.visit('/app').then(() => {\n return this.routerService.recognizeAndLoad('/app/child/');\n }).then(routeInfoWithAttributes => {\n assert.ok(routeInfoWithAttributes);\n var {\n name,\n localName,\n parent\n } = routeInfoWithAttributes;\n assert.equal(name, 'parent.child');\n assert.equal(localName, 'child');\n assert.equal(parent.name, 'parent');\n });\n }\n\n '@test must include rootURL'() {\n this.router.reopen({\n rootURL: '/app/'\n });\n return this.visit('/app').then(() => {\n expectAssertion(() => {\n this.routerService.recognizeAndLoad('/dynamic-with-child/123/1?a=b');\n }, 'You must pass a url that begins with the application\\'s rootURL \"/app/\"');\n });\n }\n\n '@test rejects if url is not recognized'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n return {\n name: 'child',\n data: ['stuff']\n };\n }\n\n }));\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/foo');\n }).then(() => {\n assert.ok(false, 'never');\n }, reason => {\n assert.equal(reason, 'URL /foo was not recognized');\n });\n }\n\n '@test rejects if there is an unhandled error'(assert) {\n this.addTemplate('parent', 'Parent{{outlet}}');\n this.addTemplate('parent.child', 'Child');\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n throw Error('Unhandled');\n }\n\n }));\n return this.visit('/').then(() => {\n return this.routerService.recognizeAndLoad('/child');\n }).then(() => {\n assert.ok(false, 'never');\n }, err => {\n assert.equal(err.message, 'Unhandled');\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/refresh_test\", [\"@ember/-internals/routing\", \"@ember/canary-features\", \"internal-test-helpers\"], function (_routing, _canaryFeatures, _internalTestHelpers) {\n \"use strict\";\n\n if (_canaryFeatures.EMBER_ROUTING_ROUTER_SERVICE_REFRESH) {\n (0, _internalTestHelpers.moduleFor)('Router Service - refresh', class extends _internalTestHelpers.RouterTestCase {\n async ['@test RouterService#refresh can be used to re-run the model hooks of active routes'](assert) {\n var parentCounter = 0;\n this.add('route:parent', class extends _routing.Route {\n model() {\n ++parentCounter;\n }\n\n });\n var childCounter = 0;\n this.add('route:parent.child', class extends _routing.Route {\n model() {\n ++childCounter;\n }\n\n });\n var sisterCounter = 0;\n this.add('route:parent.sister', class extends _routing.Route {\n model() {\n ++sisterCounter;\n }\n\n });\n await this.visit('/');\n assert.equal(parentCounter, 1);\n assert.equal(childCounter, 0);\n assert.equal(sisterCounter, 0);\n await this.routerService.refresh();\n assert.equal(parentCounter, 2);\n assert.equal(childCounter, 0);\n assert.equal(sisterCounter, 0);\n await this.routerService.refresh('application');\n assert.equal(parentCounter, 3);\n assert.equal(childCounter, 0);\n assert.equal(sisterCounter, 0);\n await this.routerService.transitionTo('parent.child');\n assert.equal(parentCounter, 3);\n assert.equal(childCounter, 1);\n assert.equal(sisterCounter, 0);\n await this.routerService.refresh('parent.child');\n assert.equal(parentCounter, 3);\n assert.equal(childCounter, 2);\n assert.equal(sisterCounter, 0);\n await this.routerService.refresh('parent');\n assert.equal(parentCounter, 4);\n assert.equal(childCounter, 3);\n assert.equal(sisterCounter, 0);\n await this.routerService.transitionTo('parent.sister');\n assert.equal(parentCounter, 4);\n assert.equal(childCounter, 3);\n assert.equal(sisterCounter, 1);\n await this.routerService.refresh();\n assert.equal(parentCounter, 5);\n assert.equal(childCounter, 3);\n assert.equal(sisterCounter, 2);\n }\n\n async ['@test RouterService#refresh verifies that the provided route exists']() {\n await this.visit('/');\n expectAssertion(() => {\n this.routerService.refresh('this-route-does-not-exist');\n }, 'The route \"this-route-does-not-exist\" was not found');\n }\n\n async ['@test RouterService#refresh verifies that the provided route is active']() {\n await this.visit('/');\n expectAssertion(() => {\n this.routerService.refresh('parent.child');\n }, 'The route \"parent.child\" is currently not active');\n }\n\n });\n }\n});","define(\"ember/tests/routing/router_service_test/replaceWith_test\", [\"@ember/-internals/routing\", \"internal-test-helpers\", \"router_js\", \"@ember/controller\"], function (_routing, _internalTestHelpers, _router_js, _controller) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - replaceWith', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n var testCase = this;\n testCase.state = [];\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n testCase.state.push(path);\n this.set('path', path);\n },\n\n replaceURL(path) {\n testCase.state.splice(testCase.state.length - 1, 1, path);\n this.set('path', path);\n }\n\n }));\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#replaceWith returns a Transition'](assert) {\n assert.expect(1);\n var transition;\n return this.visit('/').then(() => {\n transition = this.routerService.replaceWith('parent.child');\n assert.ok(transition instanceof _router_js.InternalTransition);\n return transition;\n });\n }\n\n ['@test RouterService#replaceWith with basic route replaces location'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.replaceWith('parent.brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/brother']);\n });\n }\n\n ['@test RouterService#replaceWith with basic route using URLs replaces location'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('/child');\n }).then(() => {\n return this.routerService.transitionTo('/sister');\n }).then(() => {\n return this.routerService.replaceWith('/brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/brother']);\n });\n }\n\n ['@test RouterService#replaceWith transitioning back to previously visited route replaces location'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.replaceWith('parent.sister');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/sister']);\n });\n }\n\n ['@test RouterService#replaceWith with basic query params does not remove query param defaults'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.replaceWith('parent.sister');\n }).then(() => {\n return this.routerService.replaceWith('parent.child', queryParams);\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child?sort=ASC']);\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/transitionTo_test\", [\"@ember/service\", \"@ember/-internals/glimmer\", \"@ember/-internals/routing\", \"@ember/controller\", \"@ember/runloop\", \"@ember/-internals/metal\", \"internal-test-helpers\", \"router_js\"], function (_service, _glimmer, _routing, _controller, _runloop, _metal, _internalTestHelpers, _router_js) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Router Service - transitionTo', class extends _internalTestHelpers.RouterTestCase {\n constructor() {\n super(...arguments);\n var testCase = this;\n testCase.state = [];\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n testCase.state.push(path);\n this.set('path', path);\n },\n\n replaceURL(path) {\n testCase.state.splice(testCase.state.length - 1, 1, path);\n this.set('path', path);\n }\n\n }));\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n ['@test RouterService#transitionTo returns a Transition'](assert) {\n assert.expect(1);\n var transition;\n return this.visit('/').then(() => {\n transition = this.routerService.transitionTo('parent.child');\n assert.ok(transition instanceof _router_js.InternalTransition);\n return transition;\n });\n }\n\n ['@test RouterService#transitionTo with basic route updates location'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/brother']);\n });\n }\n\n ['@test RouterService#transitionTo transitioning back to previously visited route updates location'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n return this.routerService.transitionTo('parent.brother');\n }).then(() => {\n return this.routerService.transitionTo('parent.sister');\n }).then(() => {\n assert.deepEqual(this.state, ['/', '/child', '/sister', '/brother', '/sister']);\n });\n }\n\n ['@test RouterService#transitionTo with basic route'](assert) {\n assert.expect(1);\n var componentInstance;\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super();\n\n componentInstance = this;\n },\n\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('parent.sister');\n }\n\n }\n }),\n template: `foo-bar`\n });\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n ['@test RouterService#transitionTo with basic route using URL'](assert) {\n assert.expect(1);\n var componentInstance;\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super();\n\n componentInstance = this;\n },\n\n actions: {\n transitionToSister() {\n (0, _metal.get)(this, 'routerService').transitionTo('/sister');\n }\n\n }\n }),\n template: `foo-bar`\n });\n return this.visit('/').then(() => {\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToSister');\n });\n assert.equal(this.routerService.get('currentRouteName'), 'parent.sister');\n });\n }\n\n async ['@test RouterService#transitionTo with dynamic segment'](assert) {\n assert.expect(3);\n var componentInstance;\n var dynamicModel = {\n id: 1,\n contents: 'much dynamicism'\n };\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addTemplate('dynamic', '{{@model.contents}}');\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super();\n\n componentInstance = this;\n },\n\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', dynamicModel);\n }\n\n }\n }),\n template: `foo-bar`\n });\n await this.visit('/');\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\n assert.equal(this.routerService.get('currentRouteName'), 'dynamic');\n assert.equal(this.routerService.get('currentURL'), '/dynamic/1');\n this.assertText('much dynamicism');\n }\n\n async ['@test RouterService#transitionTo with dynamic segment and model hook'](assert) {\n assert.expect(3);\n var componentInstance;\n var dynamicModel = {\n id: 1,\n contents: 'much dynamicism'\n };\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n\n }));\n this.addTemplate('parent.index', '{{foo-bar}}');\n this.addTemplate('dynamic', '{{@model.contents}}');\n this.addComponent('foo-bar', {\n ComponentClass: _glimmer.Component.extend({\n routerService: (0, _service.service)('router'),\n\n init() {\n this._super();\n\n componentInstance = this;\n },\n\n actions: {\n transitionToDynamic() {\n (0, _metal.get)(this, 'routerService').transitionTo('dynamic', 1);\n }\n\n }\n }),\n template: `foo-bar`\n });\n await this.visit('/');\n (0, _runloop.run)(function () {\n componentInstance.send('transitionToDynamic');\n });\n assert.equal(this.routerService.get('currentRouteName'), 'dynamic');\n assert.equal(this.routerService.get('currentURL'), '/dynamic/1');\n this.assertText('much dynamicism');\n }\n\n ['@test RouterService#transitionTo with basic query params does not remove query param defaults'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo passing only queryParams works'](assert) {\n assert.expect(2);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort']\n }));\n var queryParams = this.buildQueryParams({\n sort: 'DESC'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child');\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child');\n }).then(() => {\n return this.routerService.transitionTo(queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=DESC');\n });\n }\n\n ['@test RouterService#transitionTo with unspecified query params'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'page', 'category', 'extra'],\n sort: 'ASC',\n page: null,\n category: undefined\n }));\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo with aliased query params uses the original provided key'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n var queryParams = this.buildQueryParams({\n url_sort: 'ASC'\n });\n return this.visit('/').then(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }).then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?url_sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo with aliased query params uses the original provided key when controller property name'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: {\n cont_sort: 'url_sort'\n },\n cont_sort: 'ASC'\n }));\n var queryParams = this.buildQueryParams({\n cont_sort: 'ASC'\n });\n return this.visit('/').then(() => {\n expectAssertion(() => {\n return this.routerService.transitionTo('parent.child', queryParams);\n }, 'You passed the `cont_sort` query parameter during a transition into parent.child, please update to url_sort');\n });\n }\n\n ['@test RouterService#transitionTo with aliased query params uses the original provided key also when scoped'](assert) {\n assert.expect(1);\n this.add('route:parent', _routing.Route.extend({\n router: (0, _service.service)(),\n\n beforeModel() {\n // in this call `url_sort` will be scoped (`parent.child:url_sort`)\n // when passed into `_hydrateUnsuppliedQueryParams`\n this.router.transitionTo('parent.child', {\n queryParams: {\n url_sort: 'ASC'\n }\n });\n }\n\n }));\n this.add('route:parent.child', _routing.Route.extend({\n queryParams: {\n cont_sort: {\n as: 'url_sort'\n }\n },\n cont_sort: 'ASC'\n }));\n return this.visit('/').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/child?url_sort=ASC');\n });\n }\n\n ['@test RouterService#transitionTo with application query params when redirecting form a different route'](assert) {\n assert.expect(1);\n this.add('route:parent.child', _routing.Route.extend({\n router: (0, _service.service)(),\n\n beforeModel() {\n this.router.transitionTo('parent');\n }\n\n }));\n this.add('controller:parent', _controller.default.extend({\n queryParams: ['url_sort']\n }));\n return this.visit('/child?url_sort=a').then(() => {\n assert.equal(this.routerService.get('currentURL'), '/?url_sort=a');\n });\n }\n\n });\n});","define(\"ember/tests/routing/router_service_test/urlFor_test\", [\"@ember/controller\", \"@ember/string\", \"@ember/-internals/routing\", \"@ember/-internals/metal\", \"internal-test-helpers\"], function (_controller, _string, _routing, _metal, _internalTestHelpers) {\n \"use strict\";\n\n function setupController(app, name) {\n var controllerName = `${(0, _string.capitalize)(name)}Controller`;\n Object.defineProperty(app, controllerName, {\n get() {\n throw new Error(`Generating a URL should not require instantiation of a ${controllerName}.`);\n }\n\n });\n }\n\n (0, _internalTestHelpers.moduleFor)('Router Service - urlFor', class extends _internalTestHelpers.RouterTestCase {\n ['@test RouterService#urlFor returns URL for simple route'](assert) {\n assert.expect(1);\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child');\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments'](assert) {\n assert.expect(1);\n setupController(this.application, 'dynamic');\n var dynamicModel = {\n id: 1,\n contents: 'much dynamicism'\n };\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('dynamic', dynamicModel);\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: 'bar'\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child', queryParams);\n assert.equal('/child?foo=bar', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params and default value'](assert) {\n assert.expect(1);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort'],\n sort: 'ASC'\n }));\n var queryParams = this.buildQueryParams({\n sort: 'ASC'\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child', queryParams);\n assert.equal('/child?sort=ASC', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with basic query params and default value with stickyness'](assert) {\n assert.expect(2);\n this.add('controller:parent.child', _controller.default.extend({\n queryParams: ['sort', 'foo'],\n sort: 'ASC'\n }));\n return this.visit('/child/?sort=DESC').then(() => {\n var controller = this.applicationInstance.lookup('controller:parent.child');\n assert.equal((0, _metal.get)(controller, 'sort'), 'DESC', 'sticky is set');\n var queryParams = this.buildQueryParams({\n foo: 'derp'\n });\n var actual = this.routerService.urlFor('parent.child', queryParams);\n assert.equal(actual, '/child?foo=derp', 'does not use \"stickiness\"');\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with array as query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child', queryParams);\n assert.equal('/child?selectedItems[]=a&selectedItems[]=b&selectedItems[]=c', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with null query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: null\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child', queryParams);\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with undefined query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: undefined\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('parent.child', queryParams);\n assert.equal('/child', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and basic query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: 'bar'\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('dynamic', {\n id: 1\n }, queryParams);\n assert.equal('/dynamic/1?foo=bar', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and array as query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n selectedItems: ['a', 'b', 'c']\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('dynamic', {\n id: 1\n }, queryParams);\n assert.equal('/dynamic/1?selectedItems[]=a&selectedItems[]=b&selectedItems[]=c', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and null query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: null\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('dynamic', {\n id: 1\n }, queryParams);\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor returns URL for simple route with dynamic segments and undefined query params'](assert) {\n assert.expect(1);\n var queryParams = this.buildQueryParams({\n foo: undefined\n });\n return this.visit('/').then(() => {\n var expectedURL = this.routerService.urlFor('dynamic', {\n id: 1\n }, queryParams);\n assert.equal('/dynamic/1', expectedURL);\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path'](assert) {\n assert.expect(1);\n var expectedURL;\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child');\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n assert.equal(expectedURL, this.routerService.get('currentURL'));\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with dynamic segments'](assert) {\n assert.expect(1);\n var expectedURL;\n var dynamicModel = {\n id: 1\n };\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n\n }));\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('dynamic', dynamicModel);\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n assert.equal(expectedURL, this.routerService.get('currentURL'));\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with query params'](assert) {\n assert.expect(1);\n var expectedURL;\n var actualURL;\n var queryParams = this.buildQueryParams({\n foo: 'bar'\n });\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('parent.child', queryParams);\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n assert.equal(expectedURL, actualURL);\n });\n }\n\n ['@test RouterService#urlFor correctly transitions to route via generated path with dynamic segments and query params'](assert) {\n assert.expect(1);\n var expectedURL;\n var actualURL;\n var queryParams = this.buildQueryParams({\n foo: 'bar'\n });\n var dynamicModel = {\n id: 1\n };\n this.add('route:dynamic', _routing.Route.extend({\n model() {\n return dynamicModel;\n }\n\n }));\n return this.visit('/').then(() => {\n expectedURL = this.routerService.urlFor('dynamic', dynamicModel, queryParams);\n return this.routerService.transitionTo(expectedURL);\n }).then(() => {\n actualURL = `${this.routerService.get('currentURL')}?foo=bar`;\n assert.equal(expectedURL, actualURL);\n });\n }\n\n });\n});","define(\"ember/tests/routing/substates_test\", [\"@ember/-internals/runtime\", \"@ember/-internals/routing\", \"@ember/controller\", \"internal-test-helpers\"], function (_runtime, _routing, _controller, _internalTestHelpers) {\n \"use strict\";\n\n var counter;\n\n function step(assert, expectedValue, description) {\n assert.equal(counter, expectedValue, 'Step ' + expectedValue + ': ' + description);\n counter++;\n }\n\n (0, _internalTestHelpers.moduleFor)('Loading/Error Substates', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n counter = 1;\n this.addTemplate('application', `{{outlet}}
`);\n this.addTemplate('index', 'INDEX');\n }\n\n visit(...args) {\n return (0, _internalTestHelpers.runTask)(() => super.visit(...args));\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n get currentPath() {\n var currentPath;\n expectDeprecation(() => {\n currentPath = this.getController('application').get('currentPath');\n }, 'Accessing `currentPath` on `controller:application` is deprecated, use the `currentPath` property on `service:router` instead.');\n return currentPath;\n }\n\n ['@test Slow promise from a child route of application enters nested loading state'](assert) {\n var turtleDeferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('turtle');\n });\n this.add('route:application', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'ApplicationRoute#setupController');\n }\n\n }));\n this.add('route:turtle', _routing.Route.extend({\n model() {\n step(assert, 1, 'TurtleRoute#model');\n return turtleDeferred.promise;\n }\n\n }));\n this.addTemplate('turtle', 'TURTLE');\n this.addTemplate('loading', 'LOADING');\n var promise = this.visit('/turtle').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'TURTLE', `turtle template has loaded and replaced the loading template`);\n });\n var text = this.$('#app').text();\n assert.equal(text, 'LOADING', `The Loading template is nested in application template's outlet`);\n turtleDeferred.resolve();\n return promise;\n }\n\n [`@test Slow promises returned from ApplicationRoute#model don't enter LoadingRoute`](assert) {\n var appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n assert.ok(false, `shouldn't get here`);\n }\n\n }));\n var promise = this.visit('/').then(() => {\n var text = this.$('#app').text();\n assert.equal(text, 'INDEX', `index template has been rendered`);\n });\n\n if (this.element) {\n assert.equal(this.element.textContent, '');\n }\n\n appDeferred.resolve();\n return promise;\n }\n\n [`@test Don't enter loading route unless either route or template defined`](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n this.add('route:dummy', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n this.addTemplate('dummy', 'DUMMY');\n return this.visit('/').then(() => {\n var promise = this.visit('/dummy').then(() => {\n var text = this.$('#app').text();\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n assert.ok(this.appRouter.currentPath !== 'loading', `\n loading state not entered\n `);\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Enter loading route only if loadingRoute is defined'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n this.add('route:dummy', _routing.Route.extend({\n model() {\n step(assert, 1, 'DummyRoute#model');\n return deferred.promise;\n }\n\n }));\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'LoadingRoute#setupController');\n }\n\n }));\n this.addTemplate('dummy', 'DUMMY');\n return this.visit('/').then(() => {\n var promise = this.visit('/dummy').then(() => {\n var text = this.$('#app').text();\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n });\n assert.equal(this.appRouter.currentPath, 'loading', `loading state entered`);\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Enter loading route with correct query parameters'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('dummy');\n });\n this.add('route:dummy', _routing.Route.extend({\n model() {\n step(assert, 1, 'DummyRoute#model');\n return deferred.promise;\n }\n\n }));\n this.add('controller:application', class extends _controller.default {\n constructor(...args) {\n super(...args);\n this.queryParams = ['qux'];\n this.qux = 'initial';\n }\n\n });\n this.add('route:loading', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'LoadingRoute#setupController');\n }\n\n }));\n this.addTemplate('dummy', 'DUMMY');\n return this.visit('/?qux=updated').then(() => {\n assert.equal(this.getController('application').qux, 'updated', 'the application controller has the correct qp value');\n var promise = this.visit('/dummy?qux=updated').then(() => {\n var text = this.$('#app').text();\n assert.equal(text, 'DUMMY', `dummy template has been rendered`);\n assert.equal(this.getController('application').qux, 'updated', 'the application controller has the correct qp value');\n });\n assert.equal(this.appRouter.currentPath, 'loading', `loading state entered`);\n assert.equal(this.currentURL, '/dummy?qux=updated', `during loading url reflect the correct state`);\n assert.equal(this.getController('application').qux, 'updated', 'the application controller has the correct qp value');\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Enter child-loading route with correct query parameters'](assert) {\n assert.expect(8);\n\n var deferred = _runtime.RSVP.defer();\n\n this.router.map(function () {\n this.route('parent', function () {\n this.route('child');\n });\n });\n this.add('route:parent.child', _routing.Route.extend({\n model() {\n step(assert, 1, 'ChildRoute#model');\n return deferred.promise;\n }\n\n }));\n this.add('controller:parent', class extends _controller.default {\n constructor(...args) {\n super(...args);\n this.queryParams = ['qux'];\n this.qux = 'initial';\n }\n\n });\n this.add('route:parent.child_loading', _routing.Route.extend({\n setupController() {\n step(assert, 2, 'ChildLoadingRoute#setupController');\n }\n\n }));\n this.addTemplate('parent', 'PARENT {{outlet}}');\n this.addTemplate('parent.child', 'CHILD');\n return this.visit('/parent?qux=updated').then(() => {\n assert.equal(this.getController('parent').qux, 'updated', 'in the parent route, the parent controller has the correct qp value');\n var promise = this.visit('/parent/child?qux=updated').then(() => {\n var text = this.$('#app').text();\n assert.equal(text, 'PARENT CHILD', `child template has been rendered`);\n assert.equal(this.getController('parent').qux, 'updated', 'after entered in the parent.child route, the parent controller has the correct qp value');\n });\n assert.equal(this.appRouter.currentPath, 'parent.child_loading', `child loading state entered`);\n assert.equal(this.currentURL, '/parent/child?qux=updated', `during child loading, url reflect the correct state`);\n assert.equal(this.getController('parent').qux, 'updated', 'in the child_loading route, the parent controller has the correct qp value');\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter ApplicationLoadingRoute if present'](assert) {\n var appDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n\n }));\n var loadingRouteEntered = false;\n this.add('route:application_loading', _routing.Route.extend({\n setupController() {\n loadingRouteEntered = true;\n }\n\n }));\n var promise = this.visit('/').then(() => {\n assert.equal(this.$('#app').text(), 'INDEX', 'index route loaded');\n });\n assert.ok(loadingRouteEntered, 'ApplicationLoadingRoute was entered');\n appDeferred.resolve();\n return promise;\n }\n\n ['@test Slow promises returned from ApplicationRoute#model enter application_loading if template present'](assert) {\n var appDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('application_loading', `\n TOPLEVEL LOADING
\n `);\n this.add('route:application', _routing.Route.extend({\n model() {\n return appDeferred.promise;\n }\n\n }));\n var promise = this.visit('/').then(() => {\n var length = this.$('#toplevel-loading').length;\n text = this.$('#app').text();\n assert.equal(length, 0, `top-level loading view has been entirely removed from the DOM`);\n assert.equal(text, 'INDEX', 'index has fully rendered');\n });\n var text = this.$('#toplevel-loading').text();\n assert.equal(text, 'TOPLEVEL LOADING', 'still loading the top level');\n appDeferred.resolve();\n return promise;\n }\n\n ['@test Prioritized substate entry works with preserved-namespace nested routes'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar.index', 'YAY');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', {\n path: '/bar'\n }, function () {});\n });\n });\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n return this.visit('/').then(() => {\n var promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'YAY', 'foo.bar.index fully loaded');\n });\n var text = this.$('#app').text();\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Prioritized substate entry works with reset-namespace nested routes'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('bar_loading', 'BAR LOADING');\n this.addTemplate('bar.index', 'YAY');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar', {\n path: '/bar',\n resetNamespace: true\n }, function () {});\n });\n });\n this.add('route:bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n return this.visit('/').then(() => {\n var promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'YAY', 'bar.index fully loaded');\n });\n var text = this.$('#app').text();\n assert.equal(text, 'BAR LOADING', `foo.bar_loading was entered (as opposed to something likefoo/foo/bar_loading)`);\n deferred.resolve();\n return promise;\n });\n }\n\n ['@test Prioritized loading substate entry works with preserved-namespace nested routes'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.bar_loading', 'FOOBAR LOADING');\n this.addTemplate('foo.bar', 'YAY');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n var promise = this.visit('/foo/bar').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'YAY', 'foo.bar has rendered');\n });\n var text = this.$('#app').text();\n assert.equal(text, 'FOOBAR LOADING', `foo.bar_loading was entered (as opposed to something like foo/foo/bar_loading)`);\n deferred.resolve();\n return promise;\n }\n\n async ['@test Prioritized error substate entry works with preserved-namespace nested routes'](assert) {\n this.addTemplate('foo.bar_error', 'FOOBAR ERROR: {{@model.msg}}');\n this.addTemplate('foo.bar', 'YAY');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n this.add('route:foo.bar', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n }\n\n }));\n await this.visit('/');\n await this.visit('/foo/bar');\n assert.equal(this.$('#app').text(), 'FOOBAR ERROR: did it broke?', `foo.bar_error was entered (as opposed to something like foo/foo/bar_error)`);\n }\n\n ['@test Prioritized loading substate entry works with auto-generated index routes'](assert) {\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('foo.index_loading', 'FOO LOADING');\n this.addTemplate('foo.index', 'YAY');\n this.addTemplate('foo', '{{outlet}}');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n this.add('route:foo.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n\n }));\n var promise = this.visit('/foo').then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'YAY', 'foo.index was rendered');\n });\n var text = this.$('#app').text();\n assert.equal(text, 'FOO LOADING', 'foo.index_loading was entered');\n deferred.resolve();\n return promise;\n }\n\n async ['@test Prioritized error substate entry works with auto-generated index routes'](assert) {\n this.addTemplate('foo.index_error', 'FOO ERROR: {{@model.msg}}');\n this.addTemplate('foo.index', 'YAY');\n this.addTemplate('foo', '{{outlet}}');\n this.router.map(function () {\n this.route('foo', function () {\n this.route('bar');\n });\n });\n this.add('route:foo.index', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n }\n\n }));\n this.add('route:foo', _routing.Route.extend({\n model() {\n return true;\n }\n\n }));\n await this.visit('/');\n await this.visit('/foo');\n assert.equal(this.$('#app').text(), 'FOO ERROR: did it broke?', 'foo.index_error was entered');\n }\n\n async ['@test Rejected promises returned from ApplicationRoute transition into top-level application_error'](assert) {\n var reject = true;\n this.addTemplate('index', 'INDEX
');\n this.add('route:application', _routing.Route.extend({\n init() {\n this._super(...arguments);\n },\n\n model() {\n if (reject) {\n return _runtime.RSVP.reject({\n msg: 'BAD NEWS BEARS'\n });\n } else {\n return {};\n }\n }\n\n }));\n this.addTemplate('application_error', `TOPLEVEL ERROR: {{@model.msg}}
`);\n await this.visit('/');\n assert.equal(this.$('#toplevel-error').text(), 'TOPLEVEL ERROR: BAD NEWS BEARS', 'toplevel error rendered');\n reject = false;\n await this.visit('/');\n assert.equal(this.$('#index').text(), 'INDEX', 'the index route resolved');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Loading/Error Substates - nested routes', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n counter = 1;\n this.addTemplate('application', `{{outlet}}
`);\n this.addTemplate('index', 'INDEX');\n this.addTemplate('grandma', 'GRANDMA {{outlet}}');\n this.addTemplate('mom', 'MOM');\n this.router.map(function () {\n this.route('grandma', function () {\n this.route('mom', {\n resetNamespace: true\n }, function () {\n this.route('sally');\n this.route('this-route-throws');\n });\n this.route('puppies');\n });\n this.route('memere', {\n path: '/memere/:seg'\n }, function () {});\n });\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n async ['@test ApplicationRoute#currentPath reflects loading state path'](assert) {\n await this.visit('/');\n\n var momDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('grandma.loading', 'GRANDMALOADING');\n this.add('route:mom', _routing.Route.extend({\n model() {\n return momDeferred.promise;\n }\n\n }));\n var promise = (0, _internalTestHelpers.runTask)(() => this.visit('/grandma/mom')).then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'GRANDMA MOM', `Grandma.mom loaded text is displayed`);\n assert.equal(this.appRouter.currentPath, 'grandma.mom.index', `currentPath reflects final state`);\n });\n var text = this.$('#app').text();\n assert.equal(text, 'GRANDMA GRANDMALOADING', `Grandma.mom loading text displayed`);\n assert.equal(this.appRouter.currentPath, 'grandma.loading', `currentPath reflects loading state`);\n momDeferred.resolve();\n return promise;\n }\n\n async [`@test Loading actions bubble to root but don't enter substates above pivot `](assert) {\n await this.visit('/');\n\n var sallyDeferred = _runtime.RSVP.defer();\n\n var puppiesDeferred = _runtime.RSVP.defer();\n\n this.add('route:application', _routing.Route.extend({\n actions: {\n loading() {\n assert.ok(true, 'loading action received on ApplicationRoute');\n }\n\n }\n }));\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n return sallyDeferred.promise;\n }\n\n }));\n this.add('route:grandma.puppies', _routing.Route.extend({\n model() {\n return puppiesDeferred.promise;\n }\n\n }));\n var promise = this.visit('/grandma/mom/sally');\n assert.equal(this.appRouter.currentPath, 'index', 'Initial route fully loaded');\n sallyDeferred.resolve();\n promise.then(() => {\n assert.equal(this.appRouter.currentPath, 'grandma.mom.sally', 'transition completed');\n var visit = this.visit('/grandma/puppies');\n assert.equal(this.appRouter.currentPath, 'grandma.mom.sally', 'still in initial state because the only loading state is above the pivot route');\n return visit;\n }).then(() => {\n (0, _internalTestHelpers.runTask)(() => puppiesDeferred.resolve());\n assert.equal(this.appRouter.currentPath, 'grandma.puppies', 'Finished transition');\n });\n return promise;\n }\n\n async ['@test Default error event moves into nested route'](assert) {\n await this.visit('/');\n this.addTemplate('grandma.error', 'ERROR: {{@model.msg}}');\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n\n }\n }));\n await this.visit('/grandma/mom/sally');\n step(assert, 3, 'App finished loading');\n assert.equal(this.$('#app').text(), 'GRANDMA ERROR: did it broke?', 'error bubbles');\n assert.equal(this.appRouter.currentPath, 'grandma.error', 'Initial route fully loaded');\n }\n\n async [`@test Non-bubbled errors that re-throw aren't swallowed`](assert) {\n await this.visit('/');\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error(err) {\n // returns undefined which is falsey\n throw err;\n }\n\n }\n }));\n await assert.rejects(this.visit('/grandma/mom/sally'), function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n }\n\n async [`@test Handled errors that re-throw aren't swallowed`](assert) {\n await this.visit('/');\n var handledError;\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n expectDeprecation(() => {\n this.transitionTo('mom.this-route-throws');\n }, /Calling transitionTo on a route is deprecated/);\n return false;\n }\n\n }\n }));\n this.add('route:mom.this-route-throws', _routing.Route.extend({\n model() {\n step(assert, 3, 'MomThisRouteThrows#model');\n throw handledError;\n }\n\n }));\n await assert.rejects(this.visit('/grandma/mom/sally'), function (err) {\n return err.msg === 'did it broke?';\n }, `it broke`);\n }\n\n async ['@test errors that are bubbled are thrown at a higher level if not handled'](assert) {\n await this.visit('/');\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n\n }\n }));\n await assert.rejects(this.visit('/grandma/mom/sally'), function (err) {\n return err.msg == 'did it broke?';\n }, 'Correct error was thrown');\n }\n\n async [`@test Handled errors that are thrown through rejection aren't swallowed`](assert) {\n await this.visit('/');\n var handledError;\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n expectDeprecation(() => {\n this.transitionTo('mom.this-route-throws');\n }, /Calling transitionTo on a route is deprecated/);\n return false;\n }\n\n }\n }));\n this.add('route:mom.this-route-throws', _routing.Route.extend({\n model() {\n step(assert, 3, 'MomThisRouteThrows#model');\n return _runtime.RSVP.reject(handledError);\n }\n\n }));\n await assert.rejects(this.visit('/grandma/mom/sally'), function (err) {\n return err.msg === 'did it broke?';\n }, 'it broke');\n }\n\n async ['@test Default error events move into nested route, prioritizing more specifically named error routes - NEW'](assert) {\n await this.visit('/');\n this.addTemplate('grandma.error', 'ERROR: {{@model.msg}}');\n this.addTemplate('mom_error', 'MOM ERROR: {{@model.msg}}');\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error() {\n step(assert, 2, 'MomSallyRoute#actions.error');\n return true;\n }\n\n }\n }));\n await this.visit('/grandma/mom/sally');\n step(assert, 3, 'Application finished booting');\n assert.equal(this.$('#app').text(), 'GRANDMA MOM ERROR: did it broke?', 'the more specifically named mome error substate was entered over the other error route');\n assert.equal(this.appRouter.currentPath, 'grandma.mom_error', 'Initial route fully loaded');\n }\n\n async ['@test Slow promises waterfall on startup'](assert) {\n await this.visit('/');\n\n var grandmaDeferred = _runtime.RSVP.defer();\n\n var sallyDeferred = _runtime.RSVP.defer();\n\n this.addTemplate('loading', 'LOADING');\n this.addTemplate('mom', 'MOM {{outlet}}');\n this.addTemplate('mom.loading', 'MOMLOADING');\n this.addTemplate('mom.sally', 'SALLY');\n this.add('route:grandma', _routing.Route.extend({\n model() {\n step(assert, 1, 'GrandmaRoute#model');\n return grandmaDeferred.promise;\n }\n\n }));\n this.add('route:mom', _routing.Route.extend({\n model() {\n step(assert, 2, 'MomRoute#model');\n return {};\n }\n\n }));\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 3, 'SallyRoute#model');\n return sallyDeferred.promise;\n },\n\n setupController() {\n step(assert, 4, 'SallyRoute#setupController');\n }\n\n }));\n var promise = (0, _internalTestHelpers.runTask)(() => this.visit('/grandma/mom/sally')).then(() => {\n text = this.$('#app').text();\n assert.equal(text, 'GRANDMA MOM SALLY', `Sally template displayed`);\n });\n var text = this.$('#app').text();\n assert.equal(text, 'LOADING', `The loading template is nested in application template's outlet`);\n (0, _internalTestHelpers.runTask)(() => grandmaDeferred.resolve());\n text = this.$('#app').text();\n assert.equal(text, 'GRANDMA MOM MOMLOADING', `Mom's child loading route is displayed due to sally's slow promise`);\n sallyDeferred.resolve();\n return promise;\n }\n\n async ['@test Enter child loading state of pivot route'](assert) {\n await this.visit('/');\n\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('grandma.loading', 'GMONEYLOADING');\n this.add('route:mom.sally', _routing.Route.extend({\n setupController() {\n step(assert, 1, 'SallyRoute#setupController');\n }\n\n }));\n this.add('route:grandma.puppies', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n await this.visit('/grandma/mom/sally');\n assert.equal(this.appRouter.currentPath, 'grandma.mom.sally', 'Initial route fully loaded');\n var promise = (0, _internalTestHelpers.runTask)(() => this.visit('/grandma/puppies')).then(() => {\n assert.equal(this.appRouter.currentPath, 'grandma.puppies', 'Finished transition');\n });\n assert.equal(this.appRouter.currentPath, 'grandma.loading', `in pivot route's child loading state`);\n deferred.resolve();\n return promise;\n }\n\n async [`@test Error events that aren't bubbled don't throw application assertions`](assert) {\n await this.visit('/');\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n assert.equal(err.msg, 'did it broke?', `it didn't break`);\n return false;\n }\n\n }\n }));\n return this.visit('/grandma/mom/sally');\n }\n\n ['@test Handled errors that bubble can be handled at a higher level'](assert) {\n var handledError;\n this.add('route:mom', _routing.Route.extend({\n actions: {\n error(err) {\n step(assert, 3, 'MomRoute#actions.error');\n assert.equal(err, handledError, `error handled and rebubbled is handleable at higher route`);\n }\n\n }\n }));\n this.add('route:mom.sally', _routing.Route.extend({\n model() {\n step(assert, 1, 'MomSallyRoute#model');\n return _runtime.RSVP.reject({\n msg: 'did it broke?'\n });\n },\n\n actions: {\n error(err) {\n step(assert, 2, 'MomSallyRoute#actions.error');\n handledError = err;\n return true;\n }\n\n }\n }));\n return this.visit('/grandma/mom/sally');\n }\n\n async ['@test Setting a query param during a slow transition should work'](assert) {\n await this.visit('/');\n\n var deferred = _runtime.RSVP.defer();\n\n this.addTemplate('memere.loading', 'MMONEYLOADING');\n this.add('route:grandma', _routing.Route.extend({\n beforeModel: function () {\n expectDeprecation(() => {\n this.transitionTo('memere', 1);\n }, /Calling transitionTo on a route is deprecated/);\n }\n }));\n this.add('route:memere', _routing.Route.extend({\n queryParams: {\n test: {\n defaultValue: 1\n }\n }\n }));\n this.add('route:memere.index', _routing.Route.extend({\n model() {\n return deferred.promise;\n }\n\n }));\n var promise = (0, _internalTestHelpers.runTask)(() => this.visit('/grandma')).then(() => {\n assert.equal(this.appRouter.currentPath, 'memere.index', 'Transition should be complete');\n });\n var memereController = this.getController('memere');\n assert.equal(this.appRouter.currentPath, 'memere.loading', 'Initial route should be loading');\n memereController.set('test', 3);\n assert.equal(this.appRouter.currentPath, 'memere.loading', 'Initial route should still be loading');\n assert.equal(memereController.get('test'), 3, 'Controller query param value should have changed');\n deferred.resolve();\n return promise;\n }\n\n });\n});","define(\"ember/tests/routing/template_rendering_test\", [\"@ember/-internals/routing\", \"@ember/controller\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/runloop\", \"@ember/-internals/glimmer\"], function (_routing, _controller, _runtime, _internalTestHelpers, _runloop, _glimmer) {\n \"use strict\";\n\n /* eslint-disable no-console */\n var originalConsoleError;\n (0, _internalTestHelpers.moduleFor)('Route - template rendering', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this.addTemplate('home', 'Hours ');\n this.addTemplate('camelot', '');\n this.addTemplate('homepage', 'Megatroll {{this.name}}
');\n this.router.map(function () {\n this.route('home', {\n path: '/'\n });\n });\n originalConsoleError = console.error;\n }\n\n teardown() {\n super.teardown();\n console.error = originalConsoleError;\n }\n\n get currentPath() {\n var currentPath;\n expectDeprecation(() => {\n currentPath = this.applicationInstance.lookup('controller:application').get('currentPath');\n }, 'Accessing `currentPath` on `controller:application` is deprecated, use the `currentPath` property on `service:router` instead.');\n return currentPath;\n }\n\n async ['@test warn on URLs not included in the route set'](assert) {\n await this.visit('/');\n await assert.rejects(this.visit('/what-is-this-i-dont-even'), /\\/what-is-this-i-dont-even/);\n }\n\n ['@test render uses templateName from route'](assert) {\n this.addTemplate('the_real_home_template', 'THIS IS THE REAL HOME
');\n this.add('route:home', _routing.Route.extend({\n templateName: 'the_real_home_template'\n }));\n return this.visit('/').then(() => {\n var text = this.$('p').text();\n assert.equal(text, 'THIS IS THE REAL HOME', 'the homepage template was rendered');\n });\n }\n\n ['@test Generated names can be customized when providing routes with dot notation'](assert) {\n assert.expect(4);\n this.addTemplate('index', 'Index
');\n this.addTemplate('application', \"Home {{outlet}}
\");\n this.addTemplate('foo', \"{{outlet}}
\");\n this.addTemplate('bar', \"{{outlet}}
\");\n this.addTemplate('bar.baz', '{{this.name}}Bottom!
');\n this.router.map(function () {\n this.route('foo', {\n path: '/top'\n }, function () {\n this.route('bar', {\n path: '/middle',\n resetNamespace: true\n }, function () {\n this.route('baz', {\n path: '/bottom'\n });\n });\n });\n });\n this.add('route:foo', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'FooBarRoute was called');\n return this._super(...arguments);\n }\n\n }));\n this.add('route:bar.baz', _routing.Route.extend({\n setupController() {\n assert.ok(true, 'BarBazRoute was called');\n return this._super(...arguments);\n }\n\n }));\n this.add('controller:bar', _controller.default.extend({\n name: 'Bar'\n }));\n this.add('controller:bar.baz', _controller.default.extend({\n name: 'BarBaz'\n }));\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle .bottom p')), 'BarBazBottom!', 'The templates were rendered into their appropriate parents');\n });\n }\n\n [\"@test Child routes render into their parent route's template by default\"](assert) {\n this.addTemplate('index', 'Index
');\n this.addTemplate('application', \"Home {{outlet}}
\");\n this.addTemplate('top', \"{{outlet}}
\");\n this.addTemplate('middle', \"{{outlet}}
\");\n this.addTemplate('middle.bottom', 'Bottom!
');\n this.router.map(function () {\n this.route('top', function () {\n this.route('middle', {\n resetNamespace: true\n }, function () {\n this.route('bottom');\n });\n });\n });\n return this.visit('/top/middle/bottom').then(() => {\n assert.ok(true, '/top/middle/bottom has been handled');\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('.main .middle .bottom p')), 'Bottom!', 'The templates were rendered into their appropriate parents');\n });\n }\n\n ['@test Application template does not duplicate when re-rendered'](assert) {\n this.addTemplate('application', 'I render once {{outlet}}');\n this.router.map(function () {\n this.route('posts');\n });\n this.add('route:application', _routing.Route.extend({\n model() {\n return (0, _runtime.A)();\n }\n\n }));\n return this.visit('/posts').then(() => {\n assert.ok(true, '/posts has been handled');\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('h3.render-once')), 'I render once');\n });\n }\n\n ['@test Child routes should render inside the application template if the application template causes a redirect'](assert) {\n this.addTemplate('application', 'App {{outlet}}');\n this.addTemplate('posts', 'posts');\n this.router.map(function () {\n this.route('posts');\n this.route('photos');\n });\n this.add('route:application', _routing.Route.extend({\n afterModel() {\n expectDeprecation(() => {\n this.transitionTo('posts');\n }, /Calling transitionTo on a route is deprecated/);\n }\n\n }));\n return this.visit('/posts').then(() => {\n var rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'App posts');\n });\n }\n\n async [\"@test The template is not re-rendered when the route's model changes\"](assert) {\n this.router.map(function () {\n this.route('page', {\n path: '/page/:name'\n });\n });\n this.add('route:page', _routing.Route.extend({\n model(params) {\n return _runtime.Object.create({\n name: params.name\n });\n }\n\n }));\n var insertionCount = 0;\n this.add('component:foo-bar', _glimmer.Component.extend({\n didInsertElement() {\n insertionCount += 1;\n }\n\n }));\n this.addTemplate('page', '{{@model.name}}{{foo-bar}}
');\n var rootElement = document.getElementById('qunit-fixture');\n await this.visit('/page/first');\n assert.ok(true, '/page/first has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'first');\n assert.equal(insertionCount, 1);\n await this.visit('/page/second');\n assert.ok(true, '/page/second has been handled');\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'second');\n assert.equal(insertionCount, 1, 'view should have inserted only once');\n var router = this.applicationInstance.lookup('router:main');\n await (0, _runloop.run)(() => router.transitionTo('page', _runtime.Object.create({\n name: 'third'\n })));\n assert.equal((0, _internalTestHelpers.getTextOf)(rootElement.querySelector('p')), 'third');\n assert.equal(insertionCount, 1, 'view should still have inserted only once');\n }\n\n ['@test {{outlet}} works when created after initial render'](assert) {\n this.addTemplate('sample', 'Hi{{#if this.showTheThing}}{{outlet}}{{/if}}Bye');\n this.addTemplate('sample.inner', 'Yay');\n this.addTemplate('sample.inner2', 'Boo');\n this.router.map(function () {\n this.route('sample', {\n path: '/'\n }, function () {\n this.route('inner', {\n path: '/'\n });\n this.route('inner2', {\n path: '/2'\n });\n });\n });\n var rootElement;\n return this.visit('/').then(() => {\n rootElement = document.getElementById('qunit-fixture');\n assert.equal(rootElement.textContent.trim(), 'HiBye', 'initial render');\n (0, _runloop.run)(() => this.applicationInstance.lookup('controller:sample').set('showTheThing', true));\n assert.equal(rootElement.textContent.trim(), 'HiYayBye', 'second render');\n return this.visit('/2');\n }).then(() => {\n assert.equal(rootElement.textContent.trim(), 'HiBooBye', 'third render');\n });\n }\n\n ['@test Components inside an outlet have their didInsertElement hook invoked when the route is displayed'](assert) {\n this.addTemplate('index', '{{#if this.showFirst}}{{my-component}}{{else}}{{other-component}}{{/if}}');\n var myComponentCounter = 0;\n var otherComponentCounter = 0;\n var indexController;\n this.router.map(function () {\n this.route('index', {\n path: '/'\n });\n });\n this.add('controller:index', _controller.default.extend({\n showFirst: true\n }));\n this.add('route:index', _routing.Route.extend({\n setupController(controller) {\n indexController = controller;\n }\n\n }));\n this.add('component:my-component', _glimmer.Component.extend({\n didInsertElement() {\n myComponentCounter++;\n }\n\n }));\n this.add('component:other-component', _glimmer.Component.extend({\n didInsertElement() {\n otherComponentCounter++;\n }\n\n }));\n return this.visit('/').then(() => {\n assert.strictEqual(myComponentCounter, 1, 'didInsertElement invoked on displayed component');\n assert.strictEqual(otherComponentCounter, 0, 'didInsertElement not invoked on displayed component');\n (0, _runloop.run)(() => indexController.set('showFirst', false));\n assert.strictEqual(myComponentCounter, 1, 'didInsertElement not invoked on displayed component');\n assert.strictEqual(otherComponentCounter, 1, 'didInsertElement invoked on displayed component');\n });\n }\n\n });\n});","define(\"ember/tests/routing/toplevel_dom_test\", [\"@ember/-internals/environment\", \"internal-test-helpers\"], function (_environment, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Top Level DOM Structure', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super(...arguments);\n this._APPLICATION_TEMPLATE_WRAPPER = _environment.ENV._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n teardown() {\n super.teardown();\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = this._APPLICATION_TEMPLATE_WRAPPER;\n }\n\n ['@test topmost template with wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = true;\n this.addTemplate('application', 'hello world');\n return this.visit('/').then(() => {\n this.assertComponentElement(this.element, {\n content: 'hello world'\n });\n });\n }\n\n ['@test topmost template without wrapper']() {\n _environment.ENV._APPLICATION_TEMPLATE_WRAPPER = false;\n this.addTemplate('application', 'hello world');\n return this.visit('/').then(() => {\n this.assertInnerHTML('hello world');\n });\n }\n\n });\n});","define(\"ember/tests/service_injection_test\", [\"@ember/-internals/owner\", \"@ember/controller\", \"@ember/service\", \"@ember/-internals/runtime\", \"internal-test-helpers\", \"@ember/-internals/metal\"], function (_owner, _controller, _service, _runtime, _internalTestHelpers, _metal) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('Service Injection', class extends _internalTestHelpers.ApplicationTestCase {\n async ['@test Service can be injected and is resolved'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.service)('my-service')\n }));\n\n var MyService = _service.default.extend();\n\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n await this.visit('/');\n var controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n }\n\n async ['@test Service can be an object proxy and access owner in init GH#16484'](assert) {\n var serviceOwner;\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.service)('my-service')\n }));\n\n var MyService = _service.default.extend(_runtime._ProxyMixin, {\n init() {\n this._super(...arguments);\n\n serviceOwner = (0, _owner.getOwner)(this);\n }\n\n });\n\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n var instance = await this.visit('/');\n var controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.get('myService') instanceof MyService);\n assert.equal(serviceOwner, instance, 'should be able to `getOwner` in init');\n }\n\n });\n (0, _internalTestHelpers.moduleFor)('Service Injection with ES5 Getters', class extends _internalTestHelpers.ApplicationTestCase {\n async ['@test Service can be injected and is resolved without calling `get`'](assert) {\n this.add('controller:application', _controller.default.extend({\n myService: (0, _service.service)('my-service')\n }));\n\n var MyService = _service.default.extend({\n name: (0, _metal.computed)(function () {\n return 'The service name';\n })\n });\n\n this.add('service:my-service', MyService);\n this.addTemplate('application', '');\n await this.visit('/');\n var controller = this.applicationInstance.lookup('controller:application');\n assert.ok(controller.myService instanceof MyService);\n assert.equal(controller.myService.name, 'The service name', 'service property accessible');\n }\n\n });\n});","define(\"ember/tests/view_instrumentation_test\", [\"@ember/instrumentation\", \"internal-test-helpers\"], function (_instrumentation, _internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('View Instrumentation', class extends _internalTestHelpers.ApplicationTestCase {\n constructor() {\n super();\n this.addTemplate('application', `{{outlet}}`);\n this.addTemplate('index', `Index `);\n this.addTemplate('posts', `Posts `);\n this.router.map(function () {\n this.route('posts');\n });\n }\n\n teardown() {\n (0, _instrumentation.reset)();\n super.teardown();\n }\n\n ['@test Nodes without view instances are instrumented'](assert) {\n var called = false;\n (0, _instrumentation.subscribe)('render', {\n before() {\n called = true;\n },\n\n after() {}\n\n });\n return this.visit('/').then(() => {\n assert.equal(this.textValue(), 'Index', 'It rendered the correct template');\n assert.ok(called, 'Instrumentation called on first render');\n called = false;\n return this.visit('/posts');\n }).then(() => {\n assert.equal(this.textValue(), 'Posts', 'It rendered the correct template');\n assert.ok(called, 'Instrumentation called on transition to non-view backed route');\n });\n }\n\n });\n});","define(\"internal-test-helpers/index\", [\"exports\", \"internal-test-helpers/lib/factory\", \"internal-test-helpers/lib/build-owner\", \"internal-test-helpers/lib/confirm-export\", \"internal-test-helpers/lib/equal-inner-html\", \"internal-test-helpers/lib/equal-tokens\", \"internal-test-helpers/lib/module-for\", \"internal-test-helpers/lib/strip\", \"internal-test-helpers/lib/apply-mixins\", \"internal-test-helpers/lib/get-text-of\", \"internal-test-helpers/lib/ember-dev/deprecation\", \"internal-test-helpers/lib/define-template-values\", \"internal-test-helpers/lib/compile\", \"internal-test-helpers/lib/matchers\", \"internal-test-helpers/lib/run\", \"internal-test-helpers/lib/test-context\", \"internal-test-helpers/lib/test-cases/abstract\", \"internal-test-helpers/lib/test-cases/abstract-application\", \"internal-test-helpers/lib/test-cases/application\", \"internal-test-helpers/lib/test-cases/query-param\", \"internal-test-helpers/lib/test-cases/rendering\", \"internal-test-helpers/lib/test-cases/router-non-application\", \"internal-test-helpers/lib/test-cases/router\", \"internal-test-helpers/lib/test-cases/autoboot-application\", \"internal-test-helpers/lib/test-resolver\", \"internal-test-helpers/lib/browser-detect\", \"internal-test-helpers/lib/registry-check\"], function (_exports, _factory, _buildOwner, _confirmExport, _equalInnerHtml, _equalTokens, _moduleFor, _strip, _applyMixins, _getTextOf, _deprecation, _defineTemplateValues, _compile, _matchers, _run, _testContext, _abstract, _abstractApplication, _application, _queryParam, _rendering, _routerNonApplication, _router, _autobootApplication, _testResolver, _browserDetect, _registryCheck) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(_exports, \"factory\", {\n enumerable: true,\n get: function () {\n return _factory.default;\n }\n });\n Object.defineProperty(_exports, \"buildOwner\", {\n enumerable: true,\n get: function () {\n return _buildOwner.default;\n }\n });\n Object.defineProperty(_exports, \"confirmExport\", {\n enumerable: true,\n get: function () {\n return _confirmExport.default;\n }\n });\n Object.defineProperty(_exports, \"equalInnerHTML\", {\n enumerable: true,\n get: function () {\n return _equalInnerHtml.default;\n }\n });\n Object.defineProperty(_exports, \"equalTokens\", {\n enumerable: true,\n get: function () {\n return _equalTokens.default;\n }\n });\n Object.defineProperty(_exports, \"moduleFor\", {\n enumerable: true,\n get: function () {\n return _moduleFor.default;\n }\n });\n Object.defineProperty(_exports, \"setupTestClass\", {\n enumerable: true,\n get: function () {\n return _moduleFor.setupTestClass;\n }\n });\n Object.defineProperty(_exports, \"strip\", {\n enumerable: true,\n get: function () {\n return _strip.default;\n }\n });\n Object.defineProperty(_exports, \"applyMixins\", {\n enumerable: true,\n get: function () {\n return _applyMixins.default;\n }\n });\n Object.defineProperty(_exports, \"getTextOf\", {\n enumerable: true,\n get: function () {\n return _getTextOf.default;\n }\n });\n Object.defineProperty(_exports, \"expectDeprecation\", {\n enumerable: true,\n get: function () {\n return _deprecation.expectDeprecation;\n }\n });\n Object.defineProperty(_exports, \"expectNoDeprecation\", {\n enumerable: true,\n get: function () {\n return _deprecation.expectNoDeprecation;\n }\n });\n Object.defineProperty(_exports, \"expectDeprecationAsync\", {\n enumerable: true,\n get: function () {\n return _deprecation.expectDeprecationAsync;\n }\n });\n Object.defineProperty(_exports, \"ignoreDeprecation\", {\n enumerable: true,\n get: function () {\n return _deprecation.ignoreDeprecation;\n }\n });\n Object.defineProperty(_exports, \"defineComponent\", {\n enumerable: true,\n get: function () {\n return _defineTemplateValues.defineComponent;\n }\n });\n Object.defineProperty(_exports, \"defineSimpleHelper\", {\n enumerable: true,\n get: function () {\n return _defineTemplateValues.defineSimpleHelper;\n }\n });\n Object.defineProperty(_exports, \"defineSimpleModifier\", {\n enumerable: true,\n get: function () {\n return _defineTemplateValues.defineSimpleModifier;\n }\n });\n Object.defineProperty(_exports, \"compile\", {\n enumerable: true,\n get: function () {\n return _compile.default;\n }\n });\n Object.defineProperty(_exports, \"equalsElement\", {\n enumerable: true,\n get: function () {\n return _matchers.equalsElement;\n }\n });\n Object.defineProperty(_exports, \"classes\", {\n enumerable: true,\n get: function () {\n return _matchers.classes;\n }\n });\n Object.defineProperty(_exports, \"styles\", {\n enumerable: true,\n get: function () {\n return _matchers.styles;\n }\n });\n Object.defineProperty(_exports, \"regex\", {\n enumerable: true,\n get: function () {\n return _matchers.regex;\n }\n });\n Object.defineProperty(_exports, \"runAppend\", {\n enumerable: true,\n get: function () {\n return _run.runAppend;\n }\n });\n Object.defineProperty(_exports, \"runDestroy\", {\n enumerable: true,\n get: function () {\n return _run.runDestroy;\n }\n });\n Object.defineProperty(_exports, \"runTask\", {\n enumerable: true,\n get: function () {\n return _run.runTask;\n }\n });\n Object.defineProperty(_exports, \"runTaskNext\", {\n enumerable: true,\n get: function () {\n return _run.runTaskNext;\n }\n });\n Object.defineProperty(_exports, \"runLoopSettled\", {\n enumerable: true,\n get: function () {\n return _run.runLoopSettled;\n }\n });\n Object.defineProperty(_exports, \"getContext\", {\n enumerable: true,\n get: function () {\n return _testContext.getContext;\n }\n });\n Object.defineProperty(_exports, \"setContext\", {\n enumerable: true,\n get: function () {\n return _testContext.setContext;\n }\n });\n Object.defineProperty(_exports, \"unsetContext\", {\n enumerable: true,\n get: function () {\n return _testContext.unsetContext;\n }\n });\n Object.defineProperty(_exports, \"AbstractTestCase\", {\n enumerable: true,\n get: function () {\n return _abstract.default;\n }\n });\n Object.defineProperty(_exports, \"AbstractApplicationTestCase\", {\n enumerable: true,\n get: function () {\n return _abstractApplication.default;\n }\n });\n Object.defineProperty(_exports, \"ApplicationTestCase\", {\n enumerable: true,\n get: function () {\n return _application.default;\n }\n });\n Object.defineProperty(_exports, \"QueryParamTestCase\", {\n enumerable: true,\n get: function () {\n return _queryParam.default;\n }\n });\n Object.defineProperty(_exports, \"RenderingTestCase\", {\n enumerable: true,\n get: function () {\n return _rendering.default;\n }\n });\n Object.defineProperty(_exports, \"RouterNonApplicationTestCase\", {\n enumerable: true,\n get: function () {\n return _routerNonApplication.default;\n }\n });\n Object.defineProperty(_exports, \"RouterTestCase\", {\n enumerable: true,\n get: function () {\n return _router.default;\n }\n });\n Object.defineProperty(_exports, \"AutobootApplicationTestCase\", {\n enumerable: true,\n get: function () {\n return _autobootApplication.default;\n }\n });\n Object.defineProperty(_exports, \"TestResolver\", {\n enumerable: true,\n get: function () {\n return _testResolver.default;\n }\n });\n Object.defineProperty(_exports, \"ModuleBasedTestResolver\", {\n enumerable: true,\n get: function () {\n return _testResolver.ModuleBasedResolver;\n }\n });\n Object.defineProperty(_exports, \"isEdge\", {\n enumerable: true,\n get: function () {\n return _browserDetect.isEdge;\n }\n });\n Object.defineProperty(_exports, \"verifyRegistration\", {\n enumerable: true,\n get: function () {\n return _registryCheck.verifyRegistration;\n }\n });\n});","define(\"internal-test-helpers/lib/apply-mixins\", [\"exports\", \"internal-test-helpers/lib/get-all-property-names\"], function (_exports, _getAllPropertyNames) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = applyMixins;\n\n function isGenerator(mixin) {\n return Array.isArray(mixin.cases) && typeof mixin.generate === 'function';\n }\n\n function applyMixins(TestClass, ...mixins) {\n mixins.forEach(mixinOrGenerator => {\n var mixin;\n\n if (isGenerator(mixinOrGenerator)) {\n var generator = mixinOrGenerator;\n mixin = {};\n generator.cases.forEach((value, idx) => {\n Object.assign(mixin, generator.generate(value, idx));\n });\n Object.assign(TestClass.prototype, mixin);\n } else if (typeof mixinOrGenerator === 'function') {\n var properties = (0, _getAllPropertyNames.default)(mixinOrGenerator);\n mixin = new mixinOrGenerator();\n properties.forEach(name => {\n TestClass.prototype[name] = function () {\n return mixin[name].apply(mixin, arguments);\n };\n });\n } else {\n mixin = mixinOrGenerator;\n Object.assign(TestClass.prototype, mixin);\n }\n });\n return TestClass;\n }\n});","define(\"internal-test-helpers/lib/browser-detect\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.isEdge = void 0;\n var isEdge = /Edge/.test(navigator.userAgent);\n _exports.isEdge = isEdge;\n});","define(\"internal-test-helpers/lib/build-owner\", [\"exports\", \"@ember/-internals/container\", \"@ember/-internals/routing\", \"@ember/application/instance\", \"@ember/application\", \"@ember/-internals/runtime\"], function (_exports, _container, _routing, _instance, _application, _runtime) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = buildOwner;\n\n class ResolverWrapper {\n constructor(resolver) {\n this.resolver = resolver;\n }\n\n create() {\n return this.resolver;\n }\n\n }\n\n function buildOwner(options = {}) {\n var ownerOptions = options.ownerOptions || {};\n var resolver = options.resolver;\n var bootOptions = options.bootOptions || {};\n\n var Owner = _runtime.Object.extend(_runtime.RegistryProxyMixin, _runtime.ContainerProxyMixin);\n\n var namespace = _runtime.Object.create({\n Resolver: new ResolverWrapper(resolver)\n });\n\n var fallbackRegistry = _application.default.buildRegistry(namespace);\n\n fallbackRegistry.register('router:main', _routing.Router);\n var registry = new _container.Registry({\n fallback: fallbackRegistry\n });\n\n _instance.default.setupRegistry(registry, bootOptions);\n\n var owner = Owner.create({\n __registry__: registry,\n __container__: null\n }, ownerOptions);\n var container = registry.container({\n owner\n });\n owner.__container__ = container;\n return owner;\n }\n});","define(\"internal-test-helpers/lib/compile\", [\"exports\", \"@glimmer/compiler\", \"@glimmer/opcode-compiler\", \"ember-template-compiler\"], function (_exports, _compiler, _opcodeCompiler, _emberTemplateCompiler) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = compile;\n\n /**\n @module ember\n */\n\n /**\n Uses HTMLBars `compile` function to process a string into a compiled template.\n \n This is not present in production builds.\n \n @private\n @method compile\n @param {String} templateString This is the string to be compiled by HTMLBars.\n @param {Object} options This is an options hash to augment the compiler options.\n */\n function compile(templateSource, options = {}, scopeValues = {}) {\n var _a, _b, _c, _d, _e;\n\n options.locals = (_a = options.locals) !== null && _a !== void 0 ? _a : Object.keys(scopeValues !== null && scopeValues !== void 0 ? scopeValues : {});\n var [block, usedLocals] = (0, _compiler.precompileJSON)(templateSource, (0, _emberTemplateCompiler.compileOptions)(options));\n var reifiedScopeValues = usedLocals.map(key => scopeValues[key]);\n var templateBlock = {\n block: JSON.stringify(block),\n moduleName: (_d = (_b = options.moduleName) !== null && _b !== void 0 ? _b : (_c = options.meta) === null || _c === void 0 ? void 0 : _c.moduleName) !== null && _d !== void 0 ? _d : '(unknown template module)',\n scope: reifiedScopeValues.length > 0 ? () => reifiedScopeValues : null,\n isStrictMode: (_e = options.strictMode) !== null && _e !== void 0 ? _e : false\n };\n return (0, _opcodeCompiler.templateFactory)(templateBlock);\n }\n});","define(\"internal-test-helpers/lib/confirm-export\", [\"exports\", \"require\"], function (_exports, _require) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = confirmExport;\n\n function getDescriptor(obj, path) {\n var parts = path.split('.');\n var value = obj;\n\n for (var i = 0; i < parts.length - 1; i++) {\n var part = parts[i];\n value = value[part];\n\n if (!value) {\n return undefined;\n }\n }\n\n var last = parts[parts.length - 1];\n return Object.getOwnPropertyDescriptor(value, last);\n }\n\n function confirmExport(Ember, assert, path, moduleId, exportName) {\n try {\n var desc;\n\n if (path !== null) {\n desc = getDescriptor(Ember, path);\n assert.ok(desc, `the ${path} property exists on the Ember global`);\n } else {\n desc = null;\n }\n\n if (desc === null) {\n var mod = (0, _require.default)(moduleId);\n assert.notEqual(mod[exportName], undefined, `${moduleId}#${exportName} is not \\`undefined\\``);\n } else if (typeof exportName === 'string') {\n var _mod = (0, _require.default)(moduleId);\n\n var value = 'value' in desc ? desc.value : desc.get.call(Ember);\n assert.equal(value, _mod[exportName], `Ember.${path} is exported correctly`);\n assert.notEqual(_mod[exportName], undefined, `Ember.${path} is not \\`undefined\\``);\n } else if ('value' in desc) {\n assert.equal(desc.value, exportName.value, `Ember.${path} is exported correctly`);\n } else {\n var _mod2 = (0, _require.default)(moduleId);\n\n assert.equal(desc.get, _mod2[exportName.get], `Ember.${path} getter is exported correctly`);\n assert.notEqual(desc.get, undefined, `Ember.${path} getter is not undefined`);\n\n if (exportName.set) {\n assert.equal(desc.set, _mod2[exportName.set], `Ember.${path} setter is exported correctly`);\n assert.notEqual(desc.set, undefined, `Ember.${path} setter is not undefined`);\n }\n }\n } catch (error) {\n assert.pushResult({\n result: false,\n message: `An error occurred while testing ${path} is exported from ${moduleId}.`,\n source: error\n });\n }\n }\n});","define(\"internal-test-helpers/lib/define-template-values\", [\"exports\", \"@glimmer/manager\", \"@glimmer/runtime\", \"internal-test-helpers/lib/compile\"], function (_exports, _manager, _runtime, _compile) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.defineComponent = defineComponent;\n _exports.defineSimpleHelper = defineSimpleHelper;\n _exports.defineSimpleModifier = defineSimpleModifier;\n\n class FunctionalHelperManager {\n constructor() {\n this.capabilities = (0, _manager.helperCapabilities)('3.23', {\n hasValue: true\n });\n }\n\n createHelper(fn, args) {\n return {\n fn,\n args\n };\n }\n\n getValue({\n fn,\n args\n }) {\n return fn(...args.positional);\n }\n\n getDebugName(fn) {\n return fn.name || '(anonymous function)';\n }\n\n }\n\n var FUNCTIONAL_HELPER_MANAGER = new FunctionalHelperManager();\n\n var FUNCTIONAL_HELPER_MANAGER_FACTORY = () => FUNCTIONAL_HELPER_MANAGER;\n\n class FunctionalModifierManager {\n constructor() {\n this.capabilities = (0, _manager.modifierCapabilities)('3.22');\n }\n\n createModifier(fn, args) {\n return {\n fn,\n args,\n element: undefined,\n destructor: undefined\n };\n }\n\n installModifier(state, element) {\n state.element = element;\n this.setupModifier(state);\n }\n\n updateModifier(state) {\n this.destroyModifier(state);\n this.setupModifier(state);\n }\n\n setupModifier(state) {\n var {\n fn,\n args,\n element\n } = state;\n state.destructor = fn(element, args.positional, args.named);\n }\n\n destroyModifier(state) {\n if (typeof state.destructor === 'function') {\n state.destructor();\n }\n }\n\n getDebugName(fn) {\n return fn.name || '(anonymous function)';\n }\n\n }\n\n var FUNCTIONAL_MODIFIER_MANAGER = new FunctionalModifierManager();\n\n var FUNCTIONAL_MODIFIER_MANAGER_FACTORY = () => FUNCTIONAL_MODIFIER_MANAGER;\n\n function defineComponent(scopeValues, templateSource, definition = (0, _runtime.templateOnlyComponent)()) {\n var templateFactory = (0, _compile.default)(templateSource, {\n strictMode: scopeValues !== null\n }, scopeValues !== null && scopeValues !== void 0 ? scopeValues : {});\n (0, _manager.setComponentTemplate)(templateFactory, definition);\n return definition;\n }\n\n function defineSimpleHelper(helperFn) {\n return (0, _manager.setHelperManager)(FUNCTIONAL_HELPER_MANAGER_FACTORY, helperFn);\n }\n\n function defineSimpleModifier(modifierFn) {\n return (0, _manager.setModifierManager)(FUNCTIONAL_MODIFIER_MANAGER_FACTORY, modifierFn);\n }\n});","define(\"internal-test-helpers/lib/element-helpers\", [\"exports\", \"internal-test-helpers/lib/test-context\"], function (_exports, _testContext) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.getElement = getElement;\n\n function getElement() {\n var context = (0, _testContext.getContext)();\n\n if (!context) {\n throw new Error('Test context is not set up.');\n }\n\n var element = context.element;\n\n if (!element) {\n throw new Error('`element` property on test context is not set up.');\n }\n\n return element;\n }\n});","define(\"internal-test-helpers/lib/ember-dev/assertion\", [\"exports\", \"internal-test-helpers/lib/ember-dev/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupAssertionHelpers = setupAssertionHelpers;\n var BREAK = {};\n /*\n This assertion helper is used to test assertions made using Ember.assert.\n It injects two helpers onto `window`:\n \n - expectAssertion(func: Function, [expectedMessage: String | RegExp])\n \n This function calls `func` and asserts that `Ember.assert` is invoked during\n the execution. Moreover, it takes a String or a RegExp as a second optional\n argument that can be used to test if a specific assertion message was\n generated.\n \n - ignoreAssertion(func: Function)\n \n This function calls `func` and disables `Ember.assert` during the execution.\n In particular, this prevents `Ember.assert` from throw errors that would\n disrupt the control flow.\n */\n\n function setupAssertionHelpers(hooks, env) {\n var originalAssertFunc = env.getDebugFunction('assert');\n hooks.beforeEach(function (assert) {\n var expectAssertion = (func, expectedMessage) => {\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, 'Assertions disabled in production builds.');\n return;\n }\n\n var sawCall = false;\n var actualMessage = undefined; // The try-catch statement is used to \"exit\" `func` as soon as\n // the first useful assertion has been produced.\n\n try {\n (0, _utils.callWithStub)(env, 'assert', func, (message, test) => {\n sawCall = true;\n\n if ((0, _utils.checkTest)(test)) {\n return;\n }\n\n actualMessage = message;\n throw BREAK;\n });\n } catch (e) {\n if (e !== BREAK) {\n throw e;\n }\n }\n\n check(assert, sawCall, actualMessage, expectedMessage);\n };\n\n var ignoreAssertion = func => {\n (0, _utils.callWithStub)(env, 'assert', func);\n };\n\n window.expectAssertion = expectAssertion;\n window.ignoreAssertion = ignoreAssertion;\n });\n hooks.afterEach(function () {\n // Edge will occasionally not run finally blocks, so we have to be extra\n // sure we restore the original assert function\n env.setDebugFunction('assert', originalAssertFunc);\n window.expectAssertion = null;\n window.ignoreAssertion = null;\n });\n }\n\n function check(assert, sawCall, actualMessage, expectedMessage) {\n // Run assertions in an order that is useful when debugging a test failure.\n if (!sawCall) {\n assert.ok(false, `Expected Ember.assert to be called (Not called with any value).`);\n } else if (!actualMessage) {\n assert.ok(false, `Expected a failing Ember.assert (Ember.assert called, but without a failing test).`);\n } else {\n if (expectedMessage) {\n if (expectedMessage instanceof RegExp) {\n assert.ok(expectedMessage.test(actualMessage), `Expected failing Ember.assert: '${expectedMessage}', but got '${actualMessage}'.`);\n } else {\n assert.equal(actualMessage, expectedMessage, `Expected failing Ember.assert: '${expectedMessage}', but got '${actualMessage}'.`);\n }\n } else {\n // Positive assertion that assert was called\n assert.ok(true, 'Expected a failing Ember.assert.');\n }\n }\n }\n});","define(\"internal-test-helpers/lib/ember-dev/containers\", [\"exports\", \"@ember/-internals/container\"], function (_exports, _container) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupContainersCheck = setupContainersCheck;\n var {\n _leakTracking: containerLeakTracking\n } = _container.Container;\n\n function setupContainersCheck(hooks) {\n hooks.afterEach(function () {\n if (containerLeakTracking === undefined) return;\n var {\n config\n } = QUnit;\n var {\n testName,\n testId,\n module: {\n name: moduleName\n },\n finish: originalFinish\n } = config.current;\n\n config.current.finish = function () {\n originalFinish.call(this);\n originalFinish = undefined;\n config.queue.unshift(function () {\n if (containerLeakTracking.hasContainers()) {\n containerLeakTracking.reset(); // eslint-disable-next-line no-console\n\n console.assert(false, `Leaked container after test ${moduleName}: ${testName} testId=${testId}`);\n }\n });\n };\n });\n }\n});","define(\"internal-test-helpers/lib/ember-dev/debug\", [\"exports\", \"internal-test-helpers/lib/ember-dev/method-call-tracker\"], function (_exports, _methodCallTracker) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class DebugAssert {\n constructor(methodName, env) {\n this.methodName = methodName;\n this.env = env;\n this.tracker = null;\n }\n\n inject() {}\n\n restore() {\n this.reset();\n }\n\n reset() {\n if (this.tracker) {\n this.tracker.restoreMethod();\n }\n\n this.tracker = null;\n }\n\n assert() {\n if (this.tracker) {\n this.tracker.assert();\n }\n }\n\n runExpectation(func, callback, async = false) {\n var originalTracker = null; // When helpers are passed a callback, they get a new tracker context\n\n if (func) {\n originalTracker = this.tracker;\n this.tracker = null;\n }\n\n if (!this.tracker) {\n this.tracker = new _methodCallTracker.default(this.env, this.methodName);\n } // Yield to caller with tracker instance\n\n\n callback(this.tracker); // Once the given callback is invoked, the pending assertions should be\n // flushed immediately\n\n if (func) {\n if (async) {\n return (async () => {\n try {\n await func();\n } finally {\n this.assert();\n this.reset();\n this.tracker = originalTracker;\n }\n })();\n } else {\n try {\n func();\n } finally {\n this.assert();\n this.reset();\n this.tracker = originalTracker;\n }\n }\n }\n }\n\n }\n\n var _default = DebugAssert;\n _exports.default = _default;\n});","define(\"internal-test-helpers/lib/ember-dev/deprecation\", [\"exports\", \"@ember/debug\", \"internal-test-helpers/lib/ember-dev/debug\", \"internal-test-helpers/lib/ember-dev/utils\"], function (_exports, _debug, _debug2, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupDeprecationHelpers = setupDeprecationHelpers;\n _exports.default = _exports.expectNoDeprecationAsync = _exports.expectNoDeprecation = _exports.expectDeprecationAsync = _exports.ignoreDeprecation = _exports.expectDeprecation = void 0;\n\n function setupDeprecationHelpers(hooks, env) {\n var assertion = new DeprecationAssert(env);\n hooks.beforeEach(function () {\n assertion.reset();\n assertion.inject();\n });\n hooks.afterEach(function () {\n assertion.assert();\n assertion.restore();\n });\n }\n\n var expectDeprecation = () => {\n throw new Error('DeprecationAssert: To use `expectDeprecation` in a test you must call `setupDeprecationHelpers` first');\n };\n\n _exports.expectDeprecation = expectDeprecation;\n\n var ignoreDeprecation = () => {\n throw new Error('DeprecationAssert: To use `ignoreDeprecation` in a test you must call `setupDeprecationHelpers` first');\n };\n\n _exports.ignoreDeprecation = ignoreDeprecation;\n\n var expectDeprecationAsync = () => {\n throw new Error('DeprecationAssert: To use `expectDeprecationAsync` in a test you must call `setupDeprecationHelpers` first');\n };\n\n _exports.expectDeprecationAsync = expectDeprecationAsync;\n\n var expectNoDeprecation = () => {\n throw new Error('DeprecationAssert: To use `expectNoDeprecation` in a test you must call `setupDeprecationHelpers` first');\n };\n\n _exports.expectNoDeprecation = expectNoDeprecation;\n\n var expectNoDeprecationAsync = () => {\n throw new Error('DeprecationAssert: To use `expectNoDeprecationAsync` in a test you must call `setupDeprecationHelpers` first');\n };\n\n _exports.expectNoDeprecationAsync = expectNoDeprecationAsync;\n\n class DeprecationAssert extends _debug2.default {\n constructor(env) {\n super('deprecate', env);\n }\n\n inject() {\n window.expectNoDeprecation = _exports.expectNoDeprecation = expectNoDeprecation = this.expectNoDeprecation.bind(this);\n window.expectNoDeprecationAsync = _exports.expectNoDeprecationAsync = expectNoDeprecationAsync = this.expectNoDeprecationAsync.bind(this);\n window.expectDeprecation = _exports.expectDeprecation = expectDeprecation = this.expectDeprecation.bind(this);\n window.expectDeprecationAsync = _exports.expectDeprecationAsync = expectDeprecationAsync = this.expectDeprecationAsync.bind(this);\n window.ignoreDeprecation = _exports.ignoreDeprecation = ignoreDeprecation = this.ignoreDeprecation.bind(this);\n super.inject();\n }\n\n restore() {\n super.restore();\n window.expectNoDeprecation = undefined;\n window.expectNoDeprecationAsync = undefined;\n window.expectDeprecation = undefined;\n window.expectDeprecationAsync = undefined;\n window.ignoreDeprecation = undefined;\n } // Expects no deprecation to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test.\n //\n // expectNoDeprecation(function() {\n // fancyNewThing();\n // });\n //\n // expectNoDeprecation();\n // Ember.deprecate(\"Old And Busted\");\n //\n\n\n expectNoDeprecation(func) {\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoDeprecation was called after expectDeprecation was called!');\n }\n\n tracker.expectNoCalls();\n });\n } // Expects no deprecation to happen within an async function.\n //\n // expectNoDeprecationAsync(async function() {\n // await fancyAsyncThing();\n // });\n //\n\n\n async expectNoDeprecationAsync(func) {\n await this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoDeprecation was called after expectDeprecation was called!');\n }\n\n tracker.expectNoCalls();\n }, true);\n }\n\n expectDeprecation(messageOrFuncOrIsEnabled = true, messageOrIsEnabled = true, isEnabled = true) {\n var func;\n var message;\n\n if (typeof messageOrFuncOrIsEnabled === 'boolean') {\n func = undefined;\n isEnabled = messageOrFuncOrIsEnabled;\n } else if (typeof messageOrFuncOrIsEnabled === 'function') {\n func = messageOrFuncOrIsEnabled;\n\n if (typeof messageOrIsEnabled === 'boolean') {\n isEnabled = messageOrIsEnabled;\n } else {\n message = messageOrIsEnabled;\n }\n } else {\n (true && !(typeof messageOrIsEnabled === 'boolean') && (0, _debug.assert)(`second argument must be isEnabled flag, got ${messageOrIsEnabled}`, typeof messageOrIsEnabled === 'boolean'));\n message = messageOrFuncOrIsEnabled;\n isEnabled = messageOrIsEnabled;\n }\n\n if (isEnabled) {\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectDeprecation was called after expectNoDeprecation was called!');\n }\n\n tracker.expectCall(message, ['id', 'until']);\n });\n } else {\n this.expectNoDeprecation(func);\n }\n }\n\n async expectDeprecationAsync(func, messageOrIsEnabled = true, isEnabled = true) {\n var message;\n\n if (typeof messageOrIsEnabled === 'boolean') {\n isEnabled = messageOrIsEnabled;\n } else {\n message = messageOrIsEnabled;\n }\n\n if (isEnabled) {\n await this.runExpectation(func, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectDeprecation was called after expectNoDeprecation was called!');\n }\n\n tracker.expectCall(message, ['id', 'until']);\n }, true);\n } else {\n await this.expectNoDeprecationAsync(func);\n }\n }\n\n ignoreDeprecation(func) {\n (0, _utils.callWithStub)(this.env, 'deprecate', func);\n }\n\n }\n\n var _default = DeprecationAssert;\n _exports.default = _default;\n});","define(\"internal-test-helpers/lib/ember-dev/method-call-tracker\", [\"exports\", \"internal-test-helpers/lib/ember-dev/utils\"], function (_exports, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class MethodCallTracker {\n constructor(env, methodName) {\n this._env = env;\n this._methodName = methodName;\n this._isExpectingNoCalls = false;\n this._expectedMessages = [];\n this._expectedOptionLists = [];\n this._actuals = [];\n this._originalMethod = undefined;\n }\n\n stubMethod() {\n if (this._originalMethod) {\n // Method is already stubbed\n return;\n }\n\n var env = this._env;\n var methodName = this._methodName;\n this._originalMethod = env.getDebugFunction(methodName);\n env.setDebugFunction(methodName, (message, test, options) => {\n var resultOfTest = (0, _utils.checkTest)(test);\n\n this._actuals.push([message, resultOfTest, options]);\n });\n }\n\n restoreMethod() {\n if (this._originalMethod) {\n this._env.setDebugFunction(this._methodName, this._originalMethod);\n }\n }\n\n expectCall(message, options) {\n this.stubMethod();\n\n this._expectedMessages.push(message || /.*/);\n\n this._expectedOptionLists.push(options);\n }\n\n expectNoCalls() {\n this.stubMethod();\n this._isExpectingNoCalls = true;\n }\n\n isExpectingNoCalls() {\n return this._isExpectingNoCalls;\n }\n\n isExpectingCalls() {\n return !this._isExpectingNoCalls && this._expectedMessages.length;\n }\n\n assert() {\n var {\n assert\n } = QUnit.config.current;\n var methodName = this._methodName;\n var isExpectingNoCalls = this._isExpectingNoCalls;\n var expectedMessages = this._expectedMessages;\n var expectedOptionLists = this._expectedOptionLists;\n var actuals = this._actuals;\n var o, i, j;\n\n if (!isExpectingNoCalls && expectedMessages.length === 0 && actuals.length === 0) {\n return;\n }\n\n if (!true\n /* DEBUG */\n ) {\n assert.ok(true, `calls to Ember.${methodName} disabled in production builds.`);\n return;\n }\n\n if (isExpectingNoCalls) {\n var actualMessages = [];\n\n for (i = 0; i < actuals.length; i++) {\n if (!actuals[i][1]) {\n actualMessages.push(actuals[i][0]);\n }\n }\n\n assert.ok(actualMessages.length === 0, `Expected no Ember.${methodName} calls, got ${actuals.length}: ${actualMessages.join(', ')}`);\n return;\n }\n\n var actual;\n var match = undefined;\n var matched = new Set();\n\n for (o = 0; o < expectedMessages.length; o++) {\n var expectedMessage = expectedMessages[o];\n var expectedOptionList = expectedOptionLists[o];\n\n for (i = 0; i < actuals.length; i++) {\n var matchesMessage = false;\n var matchesOptionList = false;\n actual = actuals[i];\n\n if (actual[1] === true) {\n continue;\n }\n\n if (expectedMessage instanceof RegExp && expectedMessage.test(actual[0])) {\n matchesMessage = true;\n } else if (expectedMessage === actual[0]) {\n matchesMessage = true;\n }\n\n if (expectedOptionList === undefined) {\n matchesOptionList = true;\n } else if (actual[2]) {\n matchesOptionList = true;\n\n for (j = 0; j < expectedOptionList.length; j++) {\n matchesOptionList = matchesOptionList && Object.prototype.hasOwnProperty.call(actual[2], expectedOptionList[j]);\n }\n }\n\n if (matchesMessage && matchesOptionList) {\n match = actual;\n matched.add(i);\n continue;\n }\n }\n\n var expectedOptionsMessage = expectedOptionList ? `and options: { ${expectedOptionList.join(', ')} }` : 'and no options';\n var actualOptionsMessage = actual && actual[2] ? `and options: { ${Object.keys(actual[2]).join(', ')} }` : 'and no options';\n\n if (!actual) {\n assert.ok(false, `Received no Ember.${methodName} calls at all, expecting: ${expectedMessage}`);\n } else if (match && !match[1]) {\n assert.ok(true, `Received failing Ember.${methodName} call with message: ${match[0]}`);\n } else if (match && match[1]) {\n assert.ok(false, `Expected failing Ember.${methodName} call, got succeeding with message: ${match[0]}`);\n } else if (actual[1]) {\n assert.ok(false, `Did not receive failing Ember.${methodName} call matching '${expectedMessage}' ${expectedOptionsMessage}, last was success with '${actual[0]}' ${actualOptionsMessage}`);\n } else if (!actual[1]) {\n assert.ok(false, `Did not receive failing Ember.${methodName} call matching '${expectedMessage}' ${expectedOptionsMessage}, last was failure with '${actual[0]}' ${actualOptionsMessage}`);\n }\n }\n\n for (i = 0; i < actuals.length; i++) {\n if (!matched.has(i) && actuals[i][1] !== true) {\n assert.ok(false, `Unexpected Ember.${methodName} call: ${actuals[i][0]}`);\n }\n }\n }\n\n }\n\n _exports.default = MethodCallTracker;\n});","define(\"internal-test-helpers/lib/ember-dev/namespaces\", [\"exports\", \"@ember/-internals/metal\", \"@ember/runloop\"], function (_exports, _metal, _runloop) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupNamespacesCheck = setupNamespacesCheck;\n\n function setupNamespacesCheck(hooks) {\n hooks.afterEach(function () {\n var {\n assert\n } = QUnit.config.current;\n\n if (_metal.NAMESPACES.length > 0) {\n assert.ok(false, 'Should not have any NAMESPACES after tests');\n (0, _runloop.run)(() => {\n var namespaces = _metal.NAMESPACES.slice();\n\n for (var i = 0; i < namespaces.length; i++) {\n namespaces[i].destroy();\n }\n });\n }\n\n var keys = Object.keys(_metal.NAMESPACES_BY_ID);\n\n if (keys.length > 0) {\n assert.ok(false, 'Should not have any NAMESPACES_BY_ID after tests');\n\n for (var i = 0; i < keys.length; i++) {\n delete _metal.NAMESPACES_BY_ID[keys[i]];\n }\n }\n });\n }\n});","define(\"internal-test-helpers/lib/ember-dev/observers\", [\"exports\", \"@ember/-internals/metal\", \"@ember/runloop\"], function (_exports, _metal, _runloop) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupObserversCheck = setupObserversCheck;\n\n function setupObserversCheck(hooks) {\n hooks.afterEach(function () {\n var {\n assert\n } = QUnit.config.current;\n\n if (_metal.ASYNC_OBSERVERS.size > 0) {\n assert.ok(false, 'Should not have any ASYNC_OBSERVERS after tests');\n (0, _runloop.run)(() => {\n _metal.ASYNC_OBSERVERS.forEach((_, target) => {\n _metal.ASYNC_OBSERVERS.delete(target);\n\n if (isDestroyable(target)) {\n try {\n target.destroy();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e);\n }\n }\n });\n });\n }\n\n if (_metal.SYNC_OBSERVERS.size > 0) {\n assert.ok(false, 'Should not have any SYNC_OBSERVERS after tests');\n (0, _runloop.run)(() => {\n _metal.SYNC_OBSERVERS.forEach((_, target) => {\n _metal.SYNC_OBSERVERS.delete(target);\n\n if (isDestroyable(target)) {\n try {\n target.destroy();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(e);\n }\n }\n });\n });\n }\n });\n }\n\n function isDestroyable(obj) {\n return 'destroy' in obj && typeof obj['destroy'] === 'function';\n }\n});","define(\"internal-test-helpers/lib/ember-dev/run-loop\", [\"exports\", \"@ember/runloop\"], function (_exports, _runloop) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupRunLoopCheck = setupRunLoopCheck;\n\n // @ts-ignore\n function setupRunLoopCheck(hooks) {\n hooks.afterEach(function (assert) {\n if ((0, _runloop._getCurrentRunLoop)() || (0, _runloop._hasScheduledTimers)()) {\n var done = assert.async(); // use a setTimeout to allow the current run loop to flush via autorun\n\n setTimeout(() => {\n // increment expected assertion count for the assertions just below\n if (assert['test'].expected !== null) {\n assert['test'].expected += 2;\n } // if it is _still_ not completed, we have a problem and the test should be fixed\n\n\n assert.ok(!(0, _runloop._hasScheduledTimers)(), 'Ember run should not have scheduled timers at end of test');\n assert.ok(!(0, _runloop._getCurrentRunLoop)(), 'Should not be in a run loop at end of test'); // attempt to recover so the rest of the tests can run\n\n while ((0, _runloop._getCurrentRunLoop)()) {\n (0, _runloop.end)();\n }\n\n (0, _runloop._cancelTimers)();\n done();\n }, 0);\n }\n });\n }\n});","define(\"internal-test-helpers/lib/ember-dev/setup-qunit\", [\"exports\", \"ember\", \"@ember/debug\", \"internal-test-helpers/lib/ember-dev/assertion\", \"internal-test-helpers/lib/ember-dev/containers\", \"internal-test-helpers/lib/ember-dev/deprecation\", \"internal-test-helpers/lib/ember-dev/namespaces\", \"internal-test-helpers/lib/ember-dev/observers\", \"internal-test-helpers/lib/ember-dev/run-loop\", \"internal-test-helpers/lib/ember-dev/warning\"], function (_exports, _ember, _debug, _assertion, _containers, _deprecation, _namespaces, _observers, _runLoop, _warning) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = setupQUnit;\n\n function setupQUnit() {\n var env = {\n getDebugFunction: _debug.getDebugFunction,\n setDebugFunction: _debug.setDebugFunction\n };\n var originalModule = QUnit.module;\n\n QUnit.module = function (name, callback) {\n return originalModule(name, function (hooks) {\n (0, _containers.setupContainersCheck)(hooks);\n (0, _namespaces.setupNamespacesCheck)(hooks);\n (0, _observers.setupObserversCheck)(hooks);\n (0, _runLoop.setupRunLoopCheck)(hooks);\n (0, _assertion.setupAssertionHelpers)(hooks, env);\n (0, _deprecation.setupDeprecationHelpers)(hooks, env);\n (0, _warning.setupWarningHelpers)(hooks, env);\n callback(hooks);\n });\n };\n\n QUnit.assert.rejects = async function (promise, expected, message) {\n var error;\n var prevOnError = _ember.default.onerror;\n\n _ember.default.onerror = e => {\n error = e;\n };\n\n try {\n await promise;\n } catch (e) {\n error = e;\n }\n\n QUnit.assert.throws(() => {\n if (error) {\n throw error;\n }\n }, expected, message);\n _ember.default.onerror = prevOnError;\n };\n\n QUnit.assert.throwsAssertion = function (block, expected, message) {\n if (!true\n /* DEBUG */\n ) {\n QUnit.assert.ok(true, 'Assertions disabled in production builds.');\n return;\n }\n\n return QUnit.assert.throws(block, expected, message);\n };\n\n QUnit.assert.rejectsAssertion = async function (promise, expected, message) {\n if (!true\n /* DEBUG */\n ) {\n QUnit.assert.ok(true, 'Assertions disabled in production builds.');\n return promise;\n }\n\n await QUnit.assert.rejects(promise, expected, message);\n };\n }\n});","define(\"internal-test-helpers/lib/ember-dev/utils\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.callWithStub = callWithStub;\n _exports.checkTest = checkTest;\n\n function noop() {}\n\n function callWithStub(env, name, func, debugStub = noop) {\n var originalFunc = env.getDebugFunction(name);\n\n try {\n env.setDebugFunction(name, debugStub);\n func();\n } finally {\n env.setDebugFunction(name, originalFunc);\n }\n }\n\n function checkTest(test) {\n return typeof test === 'function' ? test() : test;\n }\n});","define(\"internal-test-helpers/lib/ember-dev/warning\", [\"exports\", \"internal-test-helpers/lib/ember-dev/debug\", \"internal-test-helpers/lib/ember-dev/utils\"], function (_exports, _debug, _utils) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setupWarningHelpers = setupWarningHelpers;\n _exports.default = void 0;\n\n function setupWarningHelpers(hooks, env) {\n var assertion = new WarningAssert(env);\n hooks.beforeEach(function () {\n assertion.reset();\n assertion.inject();\n });\n hooks.afterEach(function () {\n assertion.assert();\n assertion.restore();\n });\n }\n\n class WarningAssert extends _debug.default {\n constructor(env) {\n super('warn', env);\n }\n\n inject() {\n // Expects no warning to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test.\n //\n // expectNoWarning(function() {\n // fancyNewThing();\n // });\n //\n // expectNoWarning();\n // Ember.warn(\"Oh snap, didn't expect that\");\n //\n var expectNoWarning = func => {\n if (typeof func !== 'function') {\n func = undefined;\n }\n\n this.runExpectation(func, tracker => {\n if (tracker.isExpectingCalls()) {\n throw new Error('expectNoWarning was called after expectWarning was called!');\n }\n\n tracker.expectNoCalls();\n });\n }; // Expect a warning to happen within a function, or if no function is\n // passed, from the time of calling until the end of the test. Can be called\n // multiple times to assert warnings with different specific messages\n // happened.\n //\n // expectWarning(function() {\n // Ember.warn(\"Times they are a-changin'\");\n // }, /* optionalStringOrRegex */);\n //\n // expectWarning(/* optionalStringOrRegex */);\n // Ember.warn(\"Times definitely be changin'\");\n //\n\n\n var expectWarning = (func, message) => {\n var actualFunc;\n\n if (typeof func !== 'function') {\n message = func;\n actualFunc = undefined;\n } else {\n actualFunc = func;\n }\n\n this.runExpectation(actualFunc, tracker => {\n if (tracker.isExpectingNoCalls()) {\n throw new Error('expectWarning was called after expectNoWarning was called!');\n }\n\n tracker.expectCall(message);\n });\n };\n\n var ignoreWarning = func => {\n (0, _utils.callWithStub)(this.env, 'warn', func);\n };\n\n window.expectNoWarning = expectNoWarning;\n window.expectWarning = expectWarning;\n window.ignoreWarning = ignoreWarning;\n }\n\n restore() {\n super.restore();\n window.expectWarning = null;\n window.expectNoWarning = null;\n window.ignoreWarning = null;\n }\n\n }\n\n var _default = WarningAssert;\n _exports.default = _default;\n});","define(\"internal-test-helpers/lib/equal-inner-html\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = equalInnerHTML;\n\n // detect side-effects of cloning svg elements in IE9-11\n var ieSVGInnerHTML = (() => {\n if (!document.createElementNS) {\n return false;\n }\n\n var div = document.createElement('div');\n var node = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n div.appendChild(node);\n var clone = div.cloneNode(true);\n return clone.innerHTML === ' ';\n })();\n\n function normalizeInnerHTML(actualHTML) {\n if (ieSVGInnerHTML) {\n // Replace ` ` with ` `, etc.\n // drop namespace attribute\n // replace self-closing elements\n actualHTML = actualHTML.replace(/ xmlns=\"[^\"]+\"/, '').replace(/<([^ >]+) [^/>]*\\/>/gi, (tag, tagName) => `${tag.slice(0, tag.length - 3)}>${tagName}>`);\n }\n\n return actualHTML;\n }\n\n function equalInnerHTML(assert, fragment, html) {\n var actualHTML = normalizeInnerHTML(fragment.innerHTML);\n assert.pushResult({\n result: actualHTML === html,\n actual: actualHTML,\n expected: html\n });\n }\n});","define(\"internal-test-helpers/lib/equal-tokens\", [\"exports\", \"simple-html-tokenizer\"], function (_exports, _simpleHtmlTokenizer) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = equalTokens;\n\n function generateTokens(containerOrHTML) {\n if (typeof containerOrHTML === 'string') {\n return {\n tokens: (0, _simpleHtmlTokenizer.tokenize)(containerOrHTML),\n html: containerOrHTML\n };\n } else {\n return {\n tokens: (0, _simpleHtmlTokenizer.tokenize)(containerOrHTML.innerHTML),\n html: containerOrHTML.innerHTML\n };\n }\n }\n\n function normalizeTokens(tokens) {\n tokens.forEach(token => {\n if (token.type === 'StartTag') {\n token.attributes = token.attributes.sort((a, b) => {\n if (a[0] > b[0]) {\n return 1;\n }\n\n if (a[0] < b[0]) {\n return -1;\n }\n\n return 0;\n });\n }\n });\n }\n\n function equalTokens(actualContainer, expectedHTML, message = null) {\n var actual = generateTokens(actualContainer);\n var expected = generateTokens(expectedHTML);\n normalizeTokens(actual.tokens);\n normalizeTokens(expected.tokens);\n var {\n assert\n } = QUnit.config.current;\n var equiv = QUnit.equiv(actual.tokens, expected.tokens);\n\n if (equiv && expected.html !== actual.html) {\n assert.deepEqual(actual.tokens, expected.tokens, message);\n } else {\n assert.pushResult({\n result: QUnit.equiv(actual.tokens, expected.tokens),\n actual: actual.html,\n expected: expected.html,\n message\n });\n }\n }\n});","define(\"internal-test-helpers/lib/factory\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = factory;\n\n function setProperties(object, properties) {\n for (var key in properties) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n object[key] = properties[key];\n }\n }\n }\n\n var guids = 0;\n\n function factory() {\n function Klass(options) {\n setProperties(this, options);\n this._guid = guids++;\n this.isDestroyed = false;\n }\n\n Klass.prototype.constructor = Klass;\n\n Klass.prototype.destroy = function () {\n this.isDestroyed = true;\n };\n\n Klass.prototype.toString = function () {\n return '';\n };\n\n Klass.create = create;\n Klass.extend = extend;\n Klass.reopen = extend;\n Klass.reopenClass = reopenClass;\n return Klass;\n\n function create(options) {\n return new this.prototype.constructor(options);\n }\n\n function reopenClass(options) {\n setProperties(this, options);\n }\n\n function extend(options) {\n function Child(options) {\n Klass.call(this, options);\n }\n\n var Parent = this;\n Child.prototype = new Parent();\n Child.prototype.constructor = Child;\n setProperties(Child, Klass);\n setProperties(Child.prototype, options);\n Child.create = create;\n Child.extend = extend;\n Child.reopen = extend;\n Child.reopenClass = reopenClass;\n return Child;\n }\n }\n});","define(\"internal-test-helpers/lib/get-all-property-names\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = getAllPropertyNames;\n\n function getAllPropertyNames(Klass) {\n var proto = Klass.prototype;\n var properties = new Set();\n\n while (proto !== Object.prototype) {\n var names = Object.getOwnPropertyNames(proto);\n names.forEach(name => properties.add(name));\n proto = Object.getPrototypeOf(proto);\n }\n\n return properties;\n }\n});","define(\"internal-test-helpers/lib/get-text-of\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = getTextOf;\n\n function getTextOf(elem) {\n return elem.textContent.trim();\n }\n});","define(\"internal-test-helpers/lib/matchers\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.regex = regex;\n _exports.classes = classes;\n _exports.styles = styles;\n _exports.equalsElement = equalsElement;\n var HTMLElement = window.HTMLElement;\n var MATCHER_BRAND = '3d4ef194-13be-4ccf-8dc7-862eea02c93e';\n\n function isMatcher(obj) {\n return typeof obj === 'object' && obj !== null && MATCHER_BRAND in obj;\n }\n\n function equalsAttr(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n return expected === actual;\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should equal ${this.expected()}`;\n }\n\n };\n }\n\n function regex(r) {\n return {\n [MATCHER_BRAND]: true,\n\n match(v) {\n return r.test(v);\n },\n\n expected() {\n return r.toString();\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n\n };\n }\n\n function classes(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n actual = actual.trim();\n return actual && expected.split(/\\s+/).sort().join(' ') === actual.trim().split(/\\s+/).sort().join(' ');\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n\n };\n }\n\n function styles(expected) {\n return {\n [MATCHER_BRAND]: true,\n\n match(actual) {\n // coerce `null` or `undefined` to an empty string\n // needed for matching empty styles on IE9 - IE11\n actual = actual || '';\n actual = actual.trim();\n return expected.split(';').map(s => s.trim()).filter(s => s).sort().join('; ') === actual.split(';').map(s => s.trim()).filter(s => s).sort().join('; ');\n },\n\n expected() {\n return expected;\n },\n\n message() {\n return `should match ${this.expected()}`;\n }\n\n };\n }\n\n function equalsElement(assert, element, tagName, attributes, content) {\n assert.pushResult({\n result: element.tagName === tagName.toUpperCase(),\n actual: element.tagName.toLowerCase(),\n expected: tagName,\n message: `expect tagName to be ${tagName}`\n });\n var expectedAttrs = {};\n var expectedCount = 0;\n\n for (var name in attributes) {\n var expected = attributes[name];\n\n if (expected !== null) {\n expectedCount++;\n }\n\n var matcher = isMatcher(expected) ? expected : equalsAttr(expected);\n expectedAttrs[name] = matcher;\n assert.pushResult({\n result: expectedAttrs[name].match(element.getAttribute(name)),\n actual: element.getAttribute(name),\n expected: matcher.expected(),\n message: `Element's ${name} attribute ${matcher.message()}`\n });\n }\n\n var actualAttributes = {};\n\n for (var i = 0, l = element.attributes.length; i < l; i++) {\n actualAttributes[element.attributes[i].name] = element.attributes[i].value;\n }\n\n if (!(element instanceof HTMLElement)) {\n assert.pushResult({\n result: element instanceof HTMLElement,\n message: 'Element must be an HTML Element, not an SVG Element'\n });\n } else {\n assert.pushResult({\n result: element.attributes.length === expectedCount || !attributes,\n actual: element.attributes.length,\n expected: expectedCount,\n message: `Expected ${expectedCount} attributes; got ${element.outerHTML}`\n });\n\n if (content !== null) {\n assert.pushResult({\n result: element.innerHTML === content,\n actual: element.innerHTML,\n expected: content,\n message: `The element had '${content}' as its content`\n });\n }\n }\n }\n});","define(\"internal-test-helpers/lib/module-for\", [\"exports\", \"@ember/canary-features\", \"internal-test-helpers/lib/apply-mixins\", \"internal-test-helpers/lib/get-all-property-names\", \"internal-test-helpers/lib/test-context\", \"rsvp\", \"@glimmer/destroyable\"], function (_exports, _canaryFeatures, _applyMixins, _getAllPropertyNames, _testContext, _rsvp, _destroyable) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = moduleFor;\n _exports.setupTestClass = setupTestClass;\n\n /* globals URLSearchParams */\n var ASSERT_DESTROYABLES = (() => {\n if (typeof URLSearchParams === 'undefined' || typeof document !== 'object') {\n return false;\n }\n\n var queryParams = new URLSearchParams(document.location.search.substring(1));\n var assertDestroyables = queryParams.get('assertDestroyables');\n return assertDestroyables !== null;\n })();\n\n function moduleFor(description, TestClass, ...mixins) {\n QUnit.module(description, function (hooks) {\n setupTestClass(hooks, TestClass, ...mixins);\n });\n }\n\n function afterEachFinally() {\n (0, _testContext.unsetContext)();\n\n if (true\n /* DEBUG */\n && ASSERT_DESTROYABLES) {\n (0, _destroyable.assertDestroyablesDestroyed)();\n }\n }\n\n function setupTestClass(hooks, TestClass, ...mixins) {\n hooks.beforeEach(function (assert) {\n if (true\n /* DEBUG */\n && ASSERT_DESTROYABLES) {\n (0, _destroyable.enableDestroyableTracking)();\n }\n\n var instance = new TestClass(assert);\n this.instance = instance;\n (0, _testContext.setContext)(instance);\n\n if (instance.beforeEach) {\n return instance.beforeEach(assert);\n }\n });\n hooks.afterEach(function () {\n var promises = [];\n var instance = this.instance;\n this.instance = null;\n\n if (instance.teardown) {\n promises.push(instance.teardown());\n }\n\n if (instance.afterEach) {\n promises.push(instance.afterEach());\n } // this seems odd, but actually saves significant time\n // in the test suite\n //\n // returning a promise from a QUnit test always adds a 13ms\n // delay to the test, this filtering prevents returning a\n // promise when it is not needed\n\n\n var filteredPromises = promises.filter(Boolean);\n\n if (filteredPromises.length > 0) {\n return (0, _rsvp.all)(filteredPromises).finally(afterEachFinally);\n }\n\n afterEachFinally();\n });\n\n if (mixins.length > 0) {\n (0, _applyMixins.default)(TestClass, ...mixins);\n }\n\n var properties = (0, _getAllPropertyNames.default)(TestClass);\n properties.forEach(generateTest);\n\n function shouldTest(features) {\n return features.every(feature => {\n if (feature[0] === '!') {\n return !(0, _canaryFeatures.isEnabled)(feature.slice(1));\n } else {\n return (0, _canaryFeatures.isEnabled)(feature);\n }\n });\n }\n\n function generateTest(name) {\n if (name.indexOf('@test ') === 0) {\n QUnit.test(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else if (name.indexOf('@only ') === 0) {\n // eslint-disable-next-line qunit/no-only\n QUnit.only(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else if (name.indexOf('@skip ') === 0) {\n QUnit.skip(name.slice(5), function (assert) {\n return this.instance[name](assert);\n });\n } else {\n var match = /^@feature\\(([A-Z_a-z-! ,]+)\\) /.exec(name);\n\n if (match) {\n var features = match[1].replace(/ /g, '').split(',');\n\n if (shouldTest(features)) {\n QUnit.test(name.slice(match[0].length), function (assert) {\n return this.instance[name](assert);\n });\n }\n }\n }\n }\n }\n});","define(\"internal-test-helpers/lib/node-query\", [\"exports\", \"@ember/debug\", \"internal-test-helpers/lib/system/synthetic-events\"], function (_exports, _debug, _syntheticEvents) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n /* global Node */\n class NodeQuery {\n static query(selector, context = document) {\n (true && !(context && context instanceof Node) && (0, _debug.assert)(`Invalid second parameter to NodeQuery.query`, context && context instanceof Node));\n return new NodeQuery(toArray(context.querySelectorAll(selector)));\n }\n\n static element(element) {\n return new NodeQuery([element]);\n }\n\n constructor(nodes) {\n (true && !(Array.isArray(nodes)) && (0, _debug.assert)('NodeQuery must be initialized with a literal array', Array.isArray(nodes)));\n this.nodes = nodes;\n\n for (var i = 0; i < nodes.length; i++) {\n this[i] = nodes[i];\n }\n\n this.length = nodes.length;\n Object.freeze(this);\n }\n\n find(selector) {\n assertSingle(this);\n return this[0].querySelector(selector);\n }\n\n findAll(selector) {\n var nodes = [];\n this.nodes.forEach(node => {\n nodes.push(...node.querySelectorAll(selector));\n });\n return new NodeQuery(nodes);\n }\n\n trigger(eventName, options) {\n return this.nodes.map(node => (0, _syntheticEvents.fireEvent)(node, eventName, options));\n }\n\n click() {\n return this.trigger('click');\n }\n\n focus() {\n this.nodes.forEach(_syntheticEvents.focus);\n }\n\n blur() {\n this.nodes.forEach(_syntheticEvents.blur);\n }\n\n text() {\n return this.nodes.map(node => node.textContent).join('');\n }\n\n attr(name) {\n if (arguments.length !== 1) {\n throw new Error('not implemented');\n }\n\n assertSingle(this);\n return this.nodes[0].getAttribute(name);\n }\n\n prop(name, value) {\n if (arguments.length > 1) {\n return this.setProp(name, value);\n }\n\n assertSingle(this);\n return this.nodes[0][name];\n }\n\n setProp(name, value) {\n this.nodes.forEach(node => node[name] = value);\n return this;\n }\n\n val(value) {\n if (arguments.length === 1) {\n return this.setProp('value', value);\n }\n\n return this.prop('value');\n }\n\n is(selector) {\n return this.nodes.every(node => (0, _syntheticEvents.matches)(node, selector));\n }\n\n hasClass(className) {\n return this.is(`.${className}`);\n }\n\n }\n\n _exports.default = NodeQuery;\n\n function assertSingle(nodeQuery) {\n if (nodeQuery.length !== 1) {\n throw new Error(`attr(name) called on a NodeQuery with ${this.nodes.length} elements. Expected one element.`);\n }\n }\n\n function toArray(nodes) {\n var out = [];\n\n for (var i = 0; i < nodes.length; i++) {\n out.push(nodes[i]);\n }\n\n return out;\n }\n});","define(\"internal-test-helpers/lib/registry-check\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.verifyRegistration = verifyRegistration;\n\n function verifyRegistration(assert, owner, fullName) {\n assert.ok(owner.resolveRegistration(fullName), `has registration: ${fullName}`);\n }\n});","define(\"internal-test-helpers/lib/run\", [\"exports\", \"@ember/runloop\", \"@glimmer/destroyable\", \"rsvp\"], function (_exports, _runloop, _destroyable, _rsvp) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.runAppend = runAppend;\n _exports.runDestroy = runDestroy;\n _exports.runTask = runTask;\n _exports.runTaskNext = runTaskNext;\n _exports.runLoopSettled = runLoopSettled;\n\n function runAppend(view) {\n (0, _runloop.run)(view, 'appendTo', document.getElementById('qunit-fixture'));\n }\n\n function runDestroy(toDestroy) {\n if (toDestroy) {\n (0, _runloop.run)(_destroyable.destroy, toDestroy);\n }\n }\n\n function runTask(callback) {\n return (0, _runloop.run)(callback);\n }\n\n function runTaskNext() {\n return new _rsvp.Promise(resolve => {\n return (0, _runloop.next)(resolve);\n });\n } // TODO: Find a better name 😎\n\n\n function runLoopSettled(event) {\n return new _rsvp.Promise(function (resolve) {\n // Every 5ms, poll for the async thing to have finished\n var watcher = setInterval(() => {\n // If there are scheduled timers or we are inside of a run loop, keep polling\n if ((0, _runloop._hasScheduledTimers)() || (0, _runloop._getCurrentRunLoop)()) {\n return;\n } // Stop polling\n\n\n clearInterval(watcher); // Synchronously resolve the promise\n\n resolve(event);\n }, 5);\n });\n }\n});","define(\"internal-test-helpers/lib/strip\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = strip;\n\n function strip([...strings], ...values) {\n var str = strings.map((string, index) => {\n var interpolated = values[index];\n return string + (interpolated !== undefined ? interpolated : '');\n }).join('');\n return str.split('\\n').map(s => s.trim()).join('');\n }\n});","define(\"internal-test-helpers/lib/system/synthetic-events\", [\"exports\", \"@ember/runloop\"], function (_exports, _runloop) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.matches = matches;\n _exports.click = click;\n _exports.focus = focus;\n _exports.blur = blur;\n _exports.fireEvent = fireEvent;\n _exports.elMatches = void 0;\n\n /* globals Element */\n var DEFAULT_EVENT_OPTIONS = {\n canBubble: true,\n cancelable: true\n };\n var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];\n var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n var elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);\n _exports.elMatches = elMatches;\n\n function matches(el, selector) {\n return elMatches.call(el, selector);\n }\n\n function isFocusable(el) {\n var focusableTags = ['INPUT', 'BUTTON', 'LINK', 'SELECT', 'A', 'TEXTAREA'];\n var {\n tagName,\n type\n } = el;\n\n if (type === 'hidden') {\n return false;\n }\n\n return focusableTags.indexOf(tagName) > -1 || el.contentEditable === 'true';\n }\n\n function click(el, options = {}) {\n (0, _runloop.run)(() => fireEvent(el, 'mousedown', options));\n focus(el);\n (0, _runloop.run)(() => fireEvent(el, 'mouseup', options));\n (0, _runloop.run)(() => fireEvent(el, 'click', options));\n }\n\n function focus(el) {\n if (!el) {\n return;\n }\n\n if (isFocusable(el)) {\n (0, _runloop.run)(null, function () {\n var browserIsNotFocused = document.hasFocus && !document.hasFocus(); // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document doesn't have focus just\n // use trigger('focusin') instead.\n\n if (browserIsNotFocused) {\n fireEvent(el, 'focusin');\n } // makes `document.activeElement` be `el`. If the browser is focused, it also fires a focus event\n\n\n el.focus(); // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it\n\n if (browserIsNotFocused) {\n fireEvent(el, 'focus');\n }\n });\n }\n }\n\n function blur(el) {\n if (isFocusable(el)) {\n (0, _runloop.run)(null, function () {\n var browserIsNotFocused = document.hasFocus && !document.hasFocus();\n fireEvent(el, 'focusout'); // makes `document.activeElement` be `body`.\n // If the browser is focused, it also fires a blur event\n\n el.blur(); // Chrome/Firefox does not trigger the `blur` event if the window\n // does not have focus. If the document does not have focus then\n // fire `blur` event via native event.\n\n if (browserIsNotFocused) {\n fireEvent(el, 'blur');\n }\n });\n }\n }\n\n function fireEvent(element, type, options = {}) {\n if (!element) {\n return;\n }\n\n var event;\n\n if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {\n var rect = element.getBoundingClientRect();\n var x = rect.left + 1;\n var y = rect.top + 1;\n var simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, Object.assign(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n\n element.dispatchEvent(event);\n return event;\n }\n\n function buildBasicEvent(type, options = {}) {\n var event = document.createEvent('Events');\n event.initEvent(type, true, true);\n Object.assign(event, options);\n return event;\n }\n\n function buildMouseEvent(type, options = {}) {\n var event;\n\n try {\n event = document.createEvent('MouseEvents');\n var eventOpts = Object.assign({}, DEFAULT_EVENT_OPTIONS, options);\n event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n\n return event;\n }\n\n function buildKeyboardEvent(type, options = {}) {\n var event;\n\n try {\n event = document.createEvent('KeyEvents');\n var eventOpts = Object.assign({}, DEFAULT_EVENT_OPTIONS, options);\n event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n\n return event;\n }\n});","define(\"internal-test-helpers/lib/test-cases/abstract-application\", [\"exports\", \"ember-template-compiler\", \"@ember/-internals/environment\", \"internal-test-helpers/lib/test-cases/abstract\", \"internal-test-helpers/lib/run\"], function (_exports, _emberTemplateCompiler, _environment, _abstract, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class AbstractApplicationTestCase extends _abstract.default {\n _ensureInstance(bootOptions) {\n if (this._applicationInstancePromise) {\n return this._applicationInstancePromise;\n }\n\n return this._applicationInstancePromise = (0, _run.runTask)(() => this.application.boot()).then(app => {\n this.applicationInstance = app.buildInstance();\n return this.applicationInstance.boot(bootOptions);\n });\n }\n\n async visit(url, options) {\n // Create the instance\n var instance = await this._ensureInstance(options).then(instance => (0, _run.runTask)(() => instance.visit(url))); // Await all asynchronous actions\n\n await (0, _run.runLoopSettled)();\n return instance;\n }\n\n get element() {\n if (this._element) {\n return this._element;\n } else if (_environment.ENV._APPLICATION_TEMPLATE_WRAPPER) {\n return this._element = document.querySelector('#qunit-fixture > div.ember-view');\n } else {\n return this._element = document.querySelector('#qunit-fixture');\n }\n }\n\n set element(element) {\n this._element = element;\n }\n\n afterEach() {\n (0, _run.runDestroy)(this.applicationInstance);\n (0, _run.runDestroy)(this.application);\n super.teardown();\n }\n\n get applicationOptions() {\n return {\n rootElement: '#qunit-fixture'\n };\n }\n\n get routerOptions() {\n return {\n location: 'none'\n };\n }\n\n get router() {\n return this.application.resolveRegistration('router:main');\n }\n\n compile()\n /* string, options */\n {\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n\n }\n\n _exports.default = AbstractApplicationTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/abstract\", [\"exports\", \"internal-test-helpers/lib/node-query\", \"internal-test-helpers/lib/equal-inner-html\", \"internal-test-helpers/lib/equal-tokens\", \"internal-test-helpers/lib/element-helpers\", \"internal-test-helpers/lib/matchers\", \"internal-test-helpers/lib/run\"], function (_exports, _nodeQuery, _equalInnerHtml, _equalTokens, _elementHelpers, _matchers, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n /* global Element */\n var TextNode = window.Text;\n var HTMLElement = window.HTMLElement;\n var Comment = window.Comment;\n\n function isMarker(node) {\n if (node instanceof Comment && node.textContent === '') {\n return true;\n }\n\n if (node instanceof TextNode && node.textContent === '') {\n return true;\n }\n\n return false;\n }\n\n class AbstractTestCase {\n constructor(assert) {\n this.element = null;\n this.snapshot = null;\n this.assert = assert;\n var {\n fixture\n } = this;\n\n if (fixture) {\n this.setupFixture(fixture);\n }\n }\n\n teardown() {}\n\n afterEach() {}\n\n setupFixture(innerHTML) {\n var fixture = document.getElementById('qunit-fixture');\n fixture.innerHTML = innerHTML;\n } // The following methods require `this.element` to work\n\n\n get firstChild() {\n return this.nthChild(0);\n }\n\n nthChild(n) {\n var i = 0;\n var node = (0, _elementHelpers.getElement)().firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n i++;\n }\n\n if (i > n) {\n break;\n } else {\n node = node.nextSibling;\n }\n }\n\n return node;\n }\n\n get nodesCount() {\n var count = 0;\n var node = (0, _elementHelpers.getElement)().firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n count++;\n }\n\n node = node.nextSibling;\n }\n\n return count;\n }\n\n $(sel) {\n if (sel instanceof Element) {\n return _nodeQuery.default.element(sel);\n } else if (typeof sel === 'string') {\n return _nodeQuery.default.query(sel, (0, _elementHelpers.getElement)());\n } else if (sel !== undefined) {\n throw new Error(`Invalid this.$(${sel})`);\n } else {\n return _nodeQuery.default.element((0, _elementHelpers.getElement)());\n }\n }\n\n wrap(element) {\n return _nodeQuery.default.element(element);\n }\n\n click(selector) {\n var element;\n\n if (typeof selector === 'string') {\n element = (0, _elementHelpers.getElement)().querySelector(selector);\n } else {\n element = selector;\n }\n\n var event = element.click();\n return (0, _run.runLoopSettled)(event);\n }\n\n textValue() {\n return (0, _elementHelpers.getElement)().textContent;\n }\n\n takeSnapshot() {\n var snapshot = this.snapshot = [];\n var node = (0, _elementHelpers.getElement)().firstChild;\n\n while (node) {\n if (!isMarker(node)) {\n snapshot.push(node);\n }\n\n node = node.nextSibling;\n }\n\n return snapshot;\n }\n\n assertText(text) {\n this.assert.strictEqual(this.textValue(), text, `#qunit-fixture content should be: \\`${text}\\``);\n }\n\n assertInnerHTML(html) {\n (0, _equalInnerHtml.default)(this.assert, (0, _elementHelpers.getElement)(), html);\n }\n\n assertHTML(html) {\n (0, _equalTokens.default)((0, _elementHelpers.getElement)(), html, `#qunit-fixture content should be: \\`${html}\\``);\n }\n\n assertElement(node, {\n ElementType = HTMLElement,\n tagName,\n attrs = null,\n content = null\n }) {\n if (!(node instanceof ElementType)) {\n throw new Error(`Expecting a ${ElementType.name}, but got ${node}`);\n }\n\n (0, _matchers.equalsElement)(this.assert, node, tagName, attrs, content);\n }\n\n assertComponentElement(node, {\n ElementType = HTMLElement,\n tagName = 'div',\n attrs = null,\n content = null\n }) {\n attrs = Object.assign({}, {\n id: (0, _matchers.regex)(/^ember\\d*$/),\n class: (0, _matchers.classes)('ember-view')\n }, attrs || {});\n this.assertElement(node, {\n ElementType,\n tagName,\n attrs,\n content\n });\n }\n\n assertSameNode(actual, expected) {\n this.assert.strictEqual(actual, expected, 'DOM node stability');\n }\n\n assertInvariants(oldSnapshot, newSnapshot) {\n oldSnapshot = oldSnapshot || this.snapshot;\n newSnapshot = newSnapshot || this.takeSnapshot();\n this.assert.strictEqual(newSnapshot.length, oldSnapshot.length, 'Same number of nodes');\n\n for (var i = 0; i < oldSnapshot.length; i++) {\n this.assertSameNode(newSnapshot[i], oldSnapshot[i]);\n }\n }\n\n assertPartialInvariants(start, end) {\n this.assertInvariants(this.snapshot, this.takeSnapshot().slice(start, end));\n }\n\n assertStableRerender() {\n this.takeSnapshot();\n (0, _run.runTask)(() => this.rerender());\n this.assertInvariants();\n }\n\n }\n\n _exports.default = AbstractTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/application\", [\"exports\", \"internal-test-helpers/lib/test-cases/test-resolver-application\", \"@ember/application\", \"@ember/-internals/routing\", \"internal-test-helpers/lib/run\"], function (_exports, _testResolverApplication, _application, _routing, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class ApplicationTestCase extends _testResolverApplication.default {\n constructor() {\n super(...arguments);\n var {\n applicationOptions\n } = this;\n this.application = (0, _run.runTask)(this.createApplication.bind(this, applicationOptions));\n this.resolver = this.application.__registry__.resolver;\n\n if (this.resolver) {\n this.resolver.add('router:main', _routing.Router.extend(this.routerOptions));\n }\n }\n\n createApplication(myOptions = {}, MyApplication = _application.default) {\n return MyApplication.create(myOptions);\n }\n\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n autoboot: false\n });\n }\n\n get appRouter() {\n return this.applicationInstance.lookup('router:main');\n }\n\n get currentURL() {\n return this.appRouter.get('currentURL');\n }\n\n async transitionTo() {\n await this.appRouter.transitionTo(...arguments);\n await (0, _run.runLoopSettled)();\n }\n\n controllerFor(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n }\n\n _exports.default = ApplicationTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/autoboot-application\", [\"exports\", \"internal-test-helpers/lib/test-cases/test-resolver-application\", \"@ember/application\", \"@ember/-internals/routing\"], function (_exports, _testResolverApplication, _application, _routing) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class AutobootApplicationTestCase extends _testResolverApplication.default {\n createApplication(options, MyApplication = _application.default) {\n var myOptions = Object.assign(this.applicationOptions, options);\n var application = this.application = MyApplication.create(myOptions);\n this.resolver = application.__registry__.resolver;\n\n if (this.resolver) {\n this.resolver.add('router:main', _routing.Router.extend(this.routerOptions));\n }\n\n return application;\n }\n\n visit(url) {\n return this.application.boot().then(() => {\n return this.applicationInstance.visit(url);\n });\n }\n\n get applicationInstance() {\n var {\n application\n } = this;\n\n if (!application) {\n return undefined;\n }\n\n return application.__deprecatedInstance__;\n }\n\n }\n\n _exports.default = AutobootApplicationTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/query-param\", [\"exports\", \"@ember/controller\", \"@ember/-internals/routing\", \"internal-test-helpers/lib/test-cases/application\", \"internal-test-helpers/lib/run\"], function (_exports, _controller, _routing, _application, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class QueryParamTestCase extends _application.default {\n constructor() {\n super(...arguments);\n var testCase = this;\n testCase.expectedPushURL = null;\n testCase.expectedReplaceURL = null;\n this.add('location:test', _routing.NoneLocation.extend({\n setURL(path) {\n if (testCase.expectedReplaceURL) {\n testCase.assert.ok(false, 'pushState occurred but a replaceState was expected');\n }\n\n if (testCase.expectedPushURL) {\n testCase.assert.equal(path, testCase.expectedPushURL, 'an expected pushState occurred');\n testCase.expectedPushURL = null;\n }\n\n this.set('path', path);\n },\n\n replaceURL(path) {\n if (testCase.expectedPushURL) {\n testCase.assert.ok(false, 'replaceState occurred but a pushState was expected');\n }\n\n if (testCase.expectedReplaceURL) {\n testCase.assert.equal(path, testCase.expectedReplaceURL, 'an expected replaceState occurred');\n testCase.expectedReplaceURL = null;\n }\n\n this.set('path', path);\n }\n\n }));\n }\n\n visitAndAssert(path) {\n return this.visit(...arguments).then(() => {\n this.assertCurrentPath(path);\n });\n }\n\n getController(name) {\n return this.applicationInstance.lookup(`controller:${name}`);\n }\n\n getRoute(name) {\n return this.applicationInstance.lookup(`route:${name}`);\n }\n\n get routerOptions() {\n return {\n location: 'test'\n };\n }\n\n async setAndFlush(obj, prop, value) {\n if (typeof prop === 'object') {\n obj.setProperties(prop);\n } else {\n obj.set(prop, value);\n }\n\n await (0, _run.runLoopSettled)();\n }\n\n assertCurrentPath(path, message = `current path equals '${path}'`) {\n this.assert.equal(this.appRouter.get('location.path'), path, message);\n }\n /**\n Sets up a Controller for a given route with a single query param and default\n value. Can optionally extend the controller with an object.\n @public\n @method setSingleQPController\n */\n\n\n setSingleQPController(routeName, param = 'foo', defaultValue = 'bar', options = {}) {\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: [param],\n [param]: defaultValue\n }, options));\n }\n /**\n Sets up a Controller for a given route with a custom property/url key mapping.\n @public\n @method setMappedQPController\n */\n\n\n setMappedQPController(routeName, prop = 'page', urlKey = 'parentPage', defaultValue = 1, options = {}) {\n this.add(`controller:${routeName}`, _controller.default.extend({\n queryParams: {\n [prop]: urlKey\n },\n [prop]: defaultValue\n }, options));\n }\n\n }\n\n _exports.default = QueryParamTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/rendering\", [\"exports\", \"ember-template-compiler\", \"@ember/-internals/views\", \"@ember/-internals/glimmer\", \"internal-test-helpers/lib/test-resolver\", \"internal-test-helpers/lib/test-cases/abstract\", \"internal-test-helpers/lib/build-owner\", \"internal-test-helpers/lib/run\"], function (_exports, _emberTemplateCompiler, _views, _glimmer, _testResolver, _abstract, _buildOwner, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n var TextNode = window.Text;\n\n class RenderingTestCase extends _abstract.default {\n constructor() {\n super(...arguments);\n var bootOptions = this.getBootOptions();\n var owner = this.owner = (0, _buildOwner.default)({\n ownerOptions: this.getOwnerOptions(),\n resolver: this.getResolver(),\n bootOptions,\n viewRegistry: Object.create(null)\n });\n owner.register('-view-registry:main', Object.create(null), {\n instantiate: false\n });\n owner.register('event_dispatcher:main', _views.EventDispatcher);\n this.renderer = this.owner.lookup('renderer:-dom');\n this.element = document.querySelector('#qunit-fixture');\n this.component = null;\n\n if (!bootOptions || bootOptions.isInteractive !== false && bootOptions.skipEventDispatcher !== true) {\n owner.lookup('event_dispatcher:main').setup(this.getCustomDispatcherEvents(), this.element);\n }\n }\n\n compile() {\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n\n getCustomDispatcherEvents() {\n return {};\n }\n\n getOwnerOptions() {}\n\n getBootOptions() {}\n\n get resolver() {\n return this.owner.__registry__.fallback.resolver;\n }\n\n getResolver() {\n return new _testResolver.ModuleBasedResolver();\n }\n\n add(specifier, factory) {\n this.resolver.add(specifier, factory);\n }\n\n addTemplate(templateName, templateString) {\n if (typeof templateName === 'string') {\n this.resolver.add(`template:${templateName}`, this.compile(templateString, {\n moduleName: templateName\n }));\n } else {\n this.resolver.add(templateName, this.compile(templateString, {\n moduleName: templateName.moduleName\n }));\n }\n }\n\n addComponent(name, {\n ComponentClass = null,\n template = null\n }) {\n if (ComponentClass) {\n this.resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n this.resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `components/${name}`\n }));\n }\n }\n\n afterEach() {\n try {\n if (this.component) {\n (0, _run.runDestroy)(this.component);\n }\n\n if (this.owner) {\n (0, _run.runDestroy)(this.owner);\n }\n } finally {\n (0, _glimmer._resetRenderers)();\n }\n }\n\n get context() {\n return this.component;\n }\n\n render(templateStr, context = {}) {\n var {\n owner\n } = this;\n owner.register('template:-top-level', this.compile(templateStr, {\n moduleName: '-top-level'\n }));\n var attrs = Object.assign({}, context, {\n tagName: '',\n layoutName: '-top-level'\n });\n owner.register('component:-top-level', _glimmer.Component.extend(attrs));\n this.component = owner.lookup('component:-top-level');\n (0, _run.runAppend)(this.component);\n }\n\n rerender() {\n this.component.rerender();\n }\n\n registerHelper(name, funcOrClassBody) {\n var type = typeof funcOrClassBody;\n\n if (type === 'function') {\n this.owner.register(`helper:${name}`, (0, _glimmer.helper)(funcOrClassBody));\n } else if (type === 'object' && type !== null) {\n this.owner.register(`helper:${name}`, _glimmer.Helper.extend(funcOrClassBody));\n } else {\n throw new Error(`Cannot register ${funcOrClassBody} as a helper`);\n }\n }\n\n registerCustomHelper(name, definition) {\n this.owner.register(`helper:${name}`, definition);\n }\n\n registerComponent(name, {\n ComponentClass = _glimmer.Component,\n template = null\n }) {\n var {\n owner\n } = this;\n\n if (ComponentClass) {\n owner.register(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n owner.register(`template:components/${name}`, this.compile(template, {\n moduleName: `my-app/templates/components/${name}.hbs`\n }));\n }\n }\n\n registerModifier(name, ModifierClass) {\n var {\n owner\n } = this;\n owner.register(`modifier:${name}`, ModifierClass);\n }\n\n registerComponentManager(name, manager) {\n var owner = this.owner;\n owner.register(`component-manager:${name}`, manager);\n }\n\n registerTemplate(name, template) {\n var {\n owner\n } = this;\n\n if (typeof template === 'string') {\n owner.register(`template:${name}`, this.compile(template, {\n moduleName: `my-app/templates/${name}.hbs`\n }));\n } else {\n throw new Error(`Registered template \"${name}\" must be a string`);\n }\n }\n\n registerService(name, klass) {\n this.owner.register(`service:${name}`, klass);\n }\n\n assertTextNode(node, text) {\n if (!(node instanceof TextNode)) {\n throw new Error(`Expecting a text node, but got ${node}`);\n }\n\n this.assert.strictEqual(node.textContent, text, 'node.textContent');\n }\n\n }\n\n _exports.default = RenderingTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/router-non-application\", [\"exports\", \"ember-template-compiler\", \"@ember/-internals/views\", \"@ember/-internals/glimmer\", \"internal-test-helpers/lib/test-resolver\", \"internal-test-helpers/lib/test-cases/abstract\", \"internal-test-helpers/lib/build-owner\", \"internal-test-helpers/lib/run\"], function (_exports, _emberTemplateCompiler, _views, _glimmer, _testResolver, _abstract, _buildOwner, _run) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class RouterNonApplicationTestCase extends _abstract.default {\n constructor() {\n super(...arguments);\n var bootOptions = this.getBootOptions();\n var owner = this.owner = (0, _buildOwner.default)({\n ownerOptions: this.getOwnerOptions(),\n resolver: this.getResolver(),\n bootOptions,\n viewRegistry: Object.create(null)\n });\n owner.register('-view-registry:main', Object.create(null), {\n instantiate: false\n });\n owner.register('event_dispatcher:main', _views.EventDispatcher);\n this.renderer = this.owner.lookup('renderer:-dom');\n this.element = document.querySelector('#qunit-fixture');\n this.component = null;\n }\n\n compile() {\n return (0, _emberTemplateCompiler.compile)(...arguments);\n }\n\n getOwnerOptions() {}\n\n getBootOptions() {}\n\n get resolver() {\n return this.owner.__registry__.fallback.resolver;\n }\n\n getResolver() {\n return new _testResolver.ModuleBasedResolver();\n }\n\n add(specifier, factory) {\n this.resolver.add(specifier, factory);\n }\n\n addTemplate(templateName, templateString) {\n if (typeof templateName === 'string') {\n this.resolver.add(`template:${templateName}`, this.compile(templateString, {\n moduleName: templateName\n }));\n } else {\n this.resolver.add(templateName, this.compile(templateString, {\n moduleName: templateName.moduleName\n }));\n }\n }\n\n addComponent(name, {\n ComponentClass = null,\n template = null\n }) {\n if (ComponentClass) {\n this.resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n this.resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `components/${name}`\n }));\n }\n }\n\n afterEach() {\n try {\n if (this.component) {\n (0, _run.runDestroy)(this.component);\n }\n\n if (this.owner) {\n (0, _run.runDestroy)(this.owner);\n }\n } finally {\n (0, _glimmer._resetRenderers)();\n }\n }\n\n render(templateStr, context = {}) {\n var {\n owner\n } = this;\n owner.register('template:-top-level', this.compile(templateStr, {\n moduleName: '-top-level'\n }));\n var attrs = Object.assign({}, context, {\n tagName: '',\n layoutName: '-top-level'\n });\n owner.register('component:-top-level', _glimmer.Component.extend(attrs));\n this.component = owner.lookup('component:-top-level');\n (0, _run.runAppend)(this.component);\n }\n\n }\n\n _exports.default = RouterNonApplicationTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/router\", [\"exports\", \"internal-test-helpers/lib/test-cases/application\"], function (_exports, _application) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class RouterTestCase extends _application.default {\n constructor() {\n super(...arguments);\n this.router.map(function () {\n this.route('parent', {\n path: '/'\n }, function () {\n this.route('child');\n this.route('sister');\n this.route('brother');\n });\n this.route('dynamic', {\n path: '/dynamic/:dynamic_id'\n });\n this.route('dynamicWithChild', {\n path: '/dynamic-with-child/:dynamic_id'\n }, function () {\n this.route('child', {\n path: '/:child_id'\n });\n });\n });\n }\n\n get routerService() {\n return this.applicationInstance.lookup('service:router');\n }\n\n buildQueryParams(queryParams) {\n return {\n queryParams\n };\n }\n\n }\n\n _exports.default = RouterTestCase;\n});","define(\"internal-test-helpers/lib/test-cases/test-resolver-application\", [\"exports\", \"internal-test-helpers/lib/test-cases/abstract-application\", \"internal-test-helpers/lib/test-resolver\", \"@ember/-internals/glimmer\"], function (_exports, _abstractApplication, _testResolver, _glimmer) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.default = void 0;\n\n class TestResolverApplicationTestCase extends _abstractApplication.default {\n get applicationOptions() {\n return Object.assign(super.applicationOptions, {\n Resolver: _testResolver.ModuleBasedResolver\n });\n }\n\n add(specifier, factory) {\n this.resolver.add(specifier, factory);\n }\n\n addTemplate(templateName, templateString) {\n this.resolver.add(`template:${templateName}`, this.compile(templateString, {\n moduleName: `my-app/templates/${templateName.replace(/\\./g, '/')}.hbs`\n }));\n }\n\n addComponent(name, {\n ComponentClass = _glimmer.Component,\n template = null\n }) {\n if (ComponentClass) {\n this.resolver.add(`component:${name}`, ComponentClass);\n }\n\n if (typeof template === 'string') {\n this.resolver.add(`template:components/${name}`, this.compile(template, {\n moduleName: `my-app/templates/components/${name}.hbs`\n }));\n }\n }\n\n }\n\n _exports.default = TestResolverApplicationTestCase;\n});","define(\"internal-test-helpers/lib/test-context\", [\"exports\"], function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.setContext = setContext;\n _exports.getContext = getContext;\n _exports.unsetContext = unsetContext;\n\n var __test_context__;\n /**\n * Stores the provided context as the \"global testing context\".\n *\n * @param {Object} context the context to use\n */\n\n\n function setContext(context) {\n __test_context__ = context;\n }\n /**\n * Retrive the \"global testing context\" as stored by `setContext`.\n *\n * @returns {Object} the previously stored testing context\n */\n\n\n function getContext() {\n return __test_context__;\n }\n /**\n * Clear the \"global testing context\".\n */\n\n\n function unsetContext() {\n __test_context__ = undefined;\n }\n});","define(\"internal-test-helpers/lib/test-resolver\", [\"exports\", \"ember-template-compiler\"], function (_exports, _emberTemplateCompiler) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true\n });\n _exports.ModuleBasedResolver = _exports.default = void 0;\n var DELIMITER = '%';\n\n function serializeKey(specifier, source, namespace) {\n var [type, name] = specifier.split(':');\n return `${type}://${[name, namespace ? '[source invalid due to namespace]' : source, namespace].join(DELIMITER)}`;\n }\n\n class Resolver {\n constructor() {\n this._registered = {};\n }\n\n resolve(specifier) {\n return this._registered[specifier] || this._registered[serializeKey(specifier)];\n }\n\n add(lookup, factory) {\n var key;\n\n switch (typeof lookup) {\n case 'string':\n if (lookup.indexOf(':') === -1) {\n throw new Error('Specifiers added to the resolver must be in the format of type:name');\n }\n\n key = serializeKey(lookup);\n break;\n\n case 'object':\n key = serializeKey(lookup.specifier, lookup.source, lookup.namespace);\n break;\n\n default:\n throw new Error('Specifier string has an unknown type');\n }\n\n return this._registered[key] = factory;\n }\n\n addTemplate(templateName, template) {\n var templateType = typeof template;\n\n if (templateType !== 'string') {\n throw new Error(`You called addTemplate for \"${templateName}\" with a template argument of type of '${templateType}'. addTemplate expects an argument of an uncompiled template as a string.`);\n }\n\n return this._registered[serializeKey(`template:${templateName}`)] = (0, _emberTemplateCompiler.compile)(template, {\n moduleName: `my-app/templates/${templateName}.hbs`\n });\n }\n\n static create() {\n return new this();\n }\n\n }\n\n var _default = Resolver;\n /*\n * A resolver with moduleBasedResolver = true handles error and loading\n * substates differently than a standard resolver.\n */\n\n _exports.default = _default;\n\n class ModuleBasedResolver extends Resolver {\n get moduleBasedResolver() {\n return true;\n }\n\n }\n\n _exports.ModuleBasedResolver = ModuleBasedResolver;\n});","define(\"internal-test-helpers/tests/index-test\", [\"internal-test-helpers\"], function (_internalTestHelpers) {\n \"use strict\";\n\n (0, _internalTestHelpers.moduleFor)('internal-test-helpers', class extends _internalTestHelpers.AbstractTestCase {\n ['@test module present'](assert) {\n assert.ok(true, 'each package needs at least one test to be able to run through `npm test`');\n }\n\n });\n});"],"names":[],"mappings":";AAAA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5jBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1qBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACviBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1gDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACt+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACviBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC39BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACn0CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACttCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9GA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACh0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3jDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz2BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACplCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC58CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5rCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChyBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACn8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACveA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACphBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;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;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC9DA;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;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;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;;ACnBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;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;;ACxDA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;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;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3mDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/+CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChgCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACl5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;","file":"ember-tests.js"}
\ No newline at end of file
diff --git a/ember-vendored-pr-19806/tests/ember.js b/ember-vendored-pr-19806/tests/ember.js
new file mode 100644
index 0000000..e168e4a
--- /dev/null
+++ b/ember-vendored-pr-19806/tests/ember.js
@@ -0,0 +1,61482 @@
+(function() {
+/*!
+ * @overview Ember - JavaScript Application Framework
+ * @copyright Copyright 2011-2021 Tilde Inc. and contributors
+ * Portions Copyright 2006-2011 Strobe Inc.
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
+ * @license Licensed under MIT license
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
+ * @version 4.1.0-alpha.2.mixonic-drop-export-of-built-ins+5d24ae74
+ */
+/* eslint-disable no-var */
+
+/* globals global globalThis self */
+
+/* eslint-disable-next-line no-unused-vars */
+var define, require;
+
+(function () {
+ var globalObj = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : null;
+
+ if (globalObj === null) {
+ throw new Error('unable to locate global object');
+ }
+
+ if (typeof globalObj.define === 'function' && typeof globalObj.require === 'function') {
+ define = globalObj.define;
+ require = globalObj.require;
+ return;
+ }
+
+ var registry = Object.create(null);
+ var seen = Object.create(null);
+
+ function missingModule(name, referrerName) {
+ if (referrerName) {
+ throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
+ } else {
+ throw new Error('Could not find module ' + name);
+ }
+ }
+
+ function internalRequire(_name, referrerName) {
+ var name = _name;
+ var mod = registry[name];
+
+ if (!mod) {
+ name = name + '/index';
+ mod = registry[name];
+ }
+
+ var exports = seen[name];
+
+ if (exports !== undefined) {
+ return exports;
+ }
+
+ exports = seen[name] = {};
+
+ if (!mod) {
+ missingModule(_name, referrerName);
+ }
+
+ var deps = mod.deps;
+ var callback = mod.callback;
+ var reified = new Array(deps.length);
+
+ for (var i = 0; i < deps.length; i++) {
+ if (deps[i] === 'exports') {
+ reified[i] = exports;
+ } else if (deps[i] === 'require') {
+ reified[i] = require;
+ } else {
+ reified[i] = require(deps[i], name);
+ }
+ }
+
+ callback.apply(this, reified);
+ return exports;
+ }
+
+ require = function (name) {
+ return internalRequire(name, null);
+ }; // eslint-disable-next-line no-unused-vars
+
+
+ define = function (name, deps, callback) {
+ registry[name] = {
+ deps: deps,
+ callback: callback
+ };
+ }; // setup `require` module
+
+
+ require['default'] = require;
+
+ require.has = function registryHas(moduleName) {
+ return Boolean(registry[moduleName]) || Boolean(registry[moduleName + '/index']);
+ };
+
+ require._eak_seen = require.entries = registry;
+})();
+define("@ember/-internals/bootstrap/index", ["require"], function (_require) {
+ "use strict";
+
+ (function bootstrap() {
+ // Bootstrap Node module
+ // eslint-disable-next-line no-undef
+ if (typeof module === 'object' && typeof module.require === 'function') {
+ // tslint:disable-next-line: no-require-imports
+ module.exports = (0, _require.default)("ember").default;
+ }
+ })();
+});
+define("@ember/-internals/browser-environment/index", ["exports"], function (_exports) {
+ "use strict";
+
+ Object.defineProperty(_exports, "__esModule", {
+ value: true
+ });
+ _exports.hasDOM = _exports.isIE = _exports.isFirefox = _exports.isChrome = _exports.userAgent = _exports.history = _exports.location = _exports.window = void 0;
+ // check if window exists and actually is the global
+ var hasDom = typeof self === 'object' && self !== null && self.Object === Object && typeof Window !== 'undefined' && self.constructor === Window && typeof document === 'object' && document !== null && self.document === document && typeof location === 'object' && location !== null && self.location === location && typeof history === 'object' && history !== null && self.history === history && typeof navigator === 'object' && navigator !== null && self.navigator === navigator && typeof navigator.userAgent === 'string';
+ _exports.hasDOM = hasDom;
+ var window = hasDom ? self : null;
+ _exports.window = window;
+ var location$1 = hasDom ? self.location : null;
+ _exports.location = location$1;
+ var history$1 = hasDom ? self.history : null;
+ _exports.history = history$1;
+ var userAgent = hasDom ? self.navigator.userAgent : 'Lynx (textmode)';
+ _exports.userAgent = userAgent;
+ var isChrome = hasDom ? typeof chrome === 'object' && !(typeof opera === 'object') : false;
+ _exports.isChrome = isChrome;
+ var isFirefox = hasDom ? typeof InstallTrigger !== 'undefined' : false;
+ _exports.isFirefox = isFirefox;
+ var isIE = hasDom ? typeof MSInputMethodContext !== 'undefined' && typeof documentMode !== 'undefined' : false;
+ _exports.isIE = isIE;
+});
+define("@ember/-internals/container/index", ["exports", "@ember/-internals/owner", "@ember/-internals/utils", "@ember/debug"], function (_exports, _owner, _utils, _debug) {
+ "use strict";
+
+ Object.defineProperty(_exports, "__esModule", {
+ value: true
+ });
+ _exports.privatize = privatize;
+ _exports.getFactoryFor = getFactoryFor;
+ _exports.setFactoryFor = setFactoryFor;
+ _exports.INIT_FACTORY = _exports.Container = _exports.Registry = void 0;
+ var leakTracking;
+ var containers;
+
+ if (true
+ /* DEBUG */
+ ) {
+ // requires v8
+ // chrome --js-flags="--allow-natives-syntax --expose-gc"
+ // node --allow-natives-syntax --expose-gc
+ try {
+ if (typeof gc === 'function') {
+ leakTracking = (() => {
+ // avoid syntax errors when --allow-natives-syntax not present
+ var GetWeakSetValues = new Function('weakSet', 'return %GetWeakSetValues(weakSet, 0)');
+ containers = new WeakSet();
+ return {
+ hasContainers() {
+ gc();
+ return GetWeakSetValues(containers).length > 0;
+ },
+
+ reset() {
+ var values = GetWeakSetValues(containers);
+
+ for (var i = 0; i < values.length; i++) {
+ containers.delete(values[i]);
+ }
+ }
+
+ };
+ })();
+ }
+ } catch (e) {// ignore
+ }
+ }
+ /**
+ A container used to instantiate and cache objects.
+
+ Every `Container` must be associated with a `Registry`, which is referenced
+ to determine the factory and options that should be used to instantiate
+ objects.
+
+ The public API for `Container` is still in flux and should not be considered
+ stable.
+
+ @private
+ @class Container
+ */
+
+
+ class Container {
+ constructor(registry, options = {}) {
+ this.registry = registry;
+ this.owner = options.owner || null;
+ this.cache = (0, _utils.dictionary)(options.cache || null);
+ this.factoryManagerCache = (0, _utils.dictionary)(options.factoryManagerCache || null);
+ this.isDestroyed = false;
+ this.isDestroying = false;
+
+ if (true
+ /* DEBUG */
+ ) {
+ this.validationCache = (0, _utils.dictionary)(options.validationCache || null);
+
+ if (containers !== undefined) {
+ containers.add(this);
+ }
+ }
+ }
+ /**
+ @private
+ @property registry
+ @type Registry
+ @since 1.11.0
+ */
+
+ /**
+ @private
+ @property cache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property validationCache
+ @type InheritingDict
+ */
+
+ /**
+ Given a fullName return a corresponding instance.
+ The default behavior is for lookup to return a singleton instance.
+ The singleton is scoped to the container, allowing multiple containers
+ to all have their own locally scoped singletons.
+ ```javascript
+ let registry = new Registry();
+ let container = registry.container();
+ registry.register('api:twitter', Twitter);
+ let twitter = container.lookup('api:twitter');
+ twitter instanceof Twitter; // => true
+ // by default the container will return singletons
+ let twitter2 = container.lookup('api:twitter');
+ twitter2 instanceof Twitter; // => true
+ twitter === twitter2; //=> true
+ ```
+ If singletons are not wanted, an optional flag can be provided at lookup.
+ ```javascript
+ let registry = new Registry();
+ let container = registry.container();
+ registry.register('api:twitter', Twitter);
+ let twitter = container.lookup('api:twitter', { singleton: false });
+ let twitter2 = container.lookup('api:twitter', { singleton: false });
+ twitter === twitter2; //=> false
+ ```
+ @private
+ @method lookup
+ @param {String} fullName
+ @param {Object} [options]
+ @param {String} [options.source] The fullname of the request source (used for local lookup)
+ @return {any}
+ */
+
+
+ lookup(fullName, options) {
+ if (this.isDestroyed) {
+ throw new Error(`Can not call \`.lookup\` after the owner has been destroyed`);
+ }
+
+ (true && !(this.registry.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(fullName)));
+ return lookup(this, this.registry.normalize(fullName), options);
+ }
+ /**
+ A depth first traversal, destroying the container, its descendant containers and all
+ their managed objects.
+ @private
+ @method destroy
+ */
+
+
+ destroy() {
+ this.isDestroying = true;
+ destroyDestroyables(this);
+ }
+
+ finalizeDestroy() {
+ resetCache(this);
+ this.isDestroyed = true;
+ }
+ /**
+ Clear either the entire cache or just the cache for a particular key.
+ @private
+ @method reset
+ @param {String} fullName optional key to reset; if missing, resets everything
+ */
+
+
+ reset(fullName) {
+ if (this.isDestroyed) return;
+
+ if (fullName === undefined) {
+ destroyDestroyables(this);
+ resetCache(this);
+ } else {
+ resetMember(this, this.registry.normalize(fullName));
+ }
+ }
+ /**
+ Returns an object that can be used to provide an owner to a
+ manually created instance.
+ @private
+ @method ownerInjection
+ @returns { Object }
+ */
+
+
+ ownerInjection() {
+ var injection = {};
+ (0, _owner.setOwner)(injection, this.owner);
+ return injection;
+ }
+ /**
+ Given a fullName, return the corresponding factory. The consumer of the factory
+ is responsible for the destruction of any factory instances, as there is no
+ way for the container to ensure instances are destroyed when it itself is
+ destroyed.
+ @public
+ @method factoryFor
+ @param {String} fullName
+ @param {Object} [options]
+ @param {String} [options.source] The fullname of the request source (used for local lookup)
+ @return {any}
+ */
+
+
+ factoryFor(fullName) {
+ if (this.isDestroyed) {
+ throw new Error(`Can not call \`.factoryFor\` after the owner has been destroyed`);
+ }
+
+ var normalizedName = this.registry.normalize(fullName);
+ (true && !(this.registry.isValidFullName(normalizedName)) && (0, _debug.assert)('fullName must be a proper full name', this.registry.isValidFullName(normalizedName)));
+ return factoryFor(this, normalizedName, fullName);
+ }
+
+ }
+
+ _exports.Container = Container;
+
+ if (true
+ /* DEBUG */
+ ) {
+ Container._leakTracking = leakTracking;
+ }
+ /*
+ * Wrap a factory manager in a proxy which will not permit properties to be
+ * set on the manager.
+ */
+
+
+ function wrapManagerInDeprecationProxy(manager) {
+ var validator = {
+ set(_obj, prop) {
+ throw new Error(`You attempted to set "${prop}" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.`);
+ }
+
+ }; // Note:
+ // We have to proxy access to the manager here so that private property
+ // access doesn't cause the above errors to occur.
+
+ var m = manager;
+ var proxiedManager = {
+ class: m.class,
+
+ create(props) {
+ return m.create(props);
+ }
+
+ };
+ return new Proxy(proxiedManager, validator);
+ }
+
+ function isSingleton(container, fullName) {
+ return container.registry.getOption(fullName, 'singleton') !== false;
+ }
+
+ function isInstantiatable(container, fullName) {
+ return container.registry.getOption(fullName, 'instantiate') !== false;
+ }
+
+ function lookup(container, fullName, options = {}) {
+ var normalizedName = fullName;
+
+ if (options.singleton === true || options.singleton === undefined && isSingleton(container, fullName)) {
+ var cached = container.cache[normalizedName];
+
+ if (cached !== undefined) {
+ return cached;
+ }
+ }
+
+ return instantiateFactory(container, normalizedName, fullName, options);
+ }
+
+ function factoryFor(container, normalizedName, fullName) {
+ var cached = container.factoryManagerCache[normalizedName];
+
+ if (cached !== undefined) {
+ return cached;
+ }
+
+ var factory = container.registry.resolve(normalizedName);
+
+ if (factory === undefined) {
+ return;
+ }
+
+ if (true
+ /* DEBUG */
+ && factory && typeof factory._onLookup === 'function') {
+ factory._onLookup(fullName);
+ }
+
+ var manager = new FactoryManager(container, factory, fullName, normalizedName);
+
+ if (true
+ /* DEBUG */
+ ) {
+ manager = wrapManagerInDeprecationProxy(manager);
+ }
+
+ container.factoryManagerCache[normalizedName] = manager;
+ return manager;
+ }
+
+ function isSingletonClass(container, fullName, {
+ instantiate,
+ singleton
+ }) {
+ return singleton !== false && !instantiate && isSingleton(container, fullName) && !isInstantiatable(container, fullName);
+ }
+
+ function isSingletonInstance(container, fullName, {
+ instantiate,
+ singleton
+ }) {
+ return singleton !== false && instantiate !== false && (singleton === true || isSingleton(container, fullName)) && isInstantiatable(container, fullName);
+ }
+
+ function isFactoryClass(container, fullname, {
+ instantiate,
+ singleton
+ }) {
+ return instantiate === false && (singleton === false || !isSingleton(container, fullname)) && !isInstantiatable(container, fullname);
+ }
+
+ function isFactoryInstance(container, fullName, {
+ instantiate,
+ singleton
+ }) {
+ return instantiate !== false && (singleton === false || !isSingleton(container, fullName)) && isInstantiatable(container, fullName);
+ }
+
+ function instantiateFactory(container, normalizedName, fullName, options) {
+ var factoryManager = factoryFor(container, normalizedName, fullName);
+
+ if (factoryManager === undefined) {
+ return;
+ } // SomeClass { singleton: true, instantiate: true } | { singleton: true } | { instantiate: true } | {}
+ // By default majority of objects fall into this case
+
+
+ if (isSingletonInstance(container, fullName, options)) {
+ var instance = container.cache[normalizedName] = factoryManager.create(); // if this lookup happened _during_ destruction (emits a deprecation, but
+ // is still possible) ensure that it gets destroyed
+
+ if (container.isDestroying) {
+ if (typeof instance.destroy === 'function') {
+ instance.destroy();
+ }
+ }
+
+ return instance;
+ } // SomeClass { singleton: false, instantiate: true }
+
+
+ if (isFactoryInstance(container, fullName, options)) {
+ return factoryManager.create();
+ } // SomeClass { singleton: true, instantiate: false } | { instantiate: false } | { singleton: false, instantiation: false }
+
+
+ if (isSingletonClass(container, fullName, options) || isFactoryClass(container, fullName, options)) {
+ return factoryManager.class;
+ }
+
+ throw new Error('Could not create factory');
+ }
+
+ function destroyDestroyables(container) {
+ var cache = container.cache;
+ var keys = Object.keys(cache);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = cache[key];
+
+ if (value.destroy) {
+ value.destroy();
+ }
+ }
+ }
+
+ function resetCache(container) {
+ container.cache = (0, _utils.dictionary)(null);
+ container.factoryManagerCache = (0, _utils.dictionary)(null);
+ }
+
+ function resetMember(container, fullName) {
+ var member = container.cache[fullName];
+ delete container.factoryManagerCache[fullName];
+
+ if (member) {
+ delete container.cache[fullName];
+
+ if (member.destroy) {
+ member.destroy();
+ }
+ }
+ }
+
+ var INIT_FACTORY = (0, _utils.symbol)('INIT_FACTORY');
+ _exports.INIT_FACTORY = INIT_FACTORY;
+
+ function getFactoryFor(obj) {
+ return obj[INIT_FACTORY];
+ }
+
+ function setFactoryFor(obj, factory) {
+ obj[INIT_FACTORY] = factory;
+ }
+
+ class FactoryManager {
+ constructor(container, factory, fullName, normalizedName) {
+ this.container = container;
+ this.owner = container.owner;
+ this.class = factory;
+ this.fullName = fullName;
+ this.normalizedName = normalizedName;
+ this.madeToString = undefined;
+ this.injections = undefined;
+ setFactoryFor(this, this);
+
+ if (isInstantiatable(container, fullName)) {
+ setFactoryFor(factory, this);
+ }
+ }
+
+ toString() {
+ if (this.madeToString === undefined) {
+ this.madeToString = this.container.registry.makeToString(this.class, this.fullName);
+ }
+
+ return this.madeToString;
+ }
+
+ create(options) {
+ var {
+ container
+ } = this;
+
+ if (container.isDestroyed) {
+ throw new Error(`Can not create new instances after the owner has been destroyed (you attempted to create ${this.fullName})`);
+ }
+
+ var props = {};
+ (0, _owner.setOwner)(props, container.owner);
+ setFactoryFor(props, this);
+
+ if (options !== undefined) {
+ props = Object.assign({}, props, options);
+ }
+
+ if (true
+ /* DEBUG */
+ ) {
+ var lazyInjections;
+ var validationCache = this.container.validationCache; // Ensure that all lazy injections are valid at instantiation time
+
+ if (!validationCache[this.fullName] && this.class && typeof this.class._lazyInjections === 'function') {
+ lazyInjections = this.class._lazyInjections();
+ lazyInjections = this.container.registry.normalizeInjectionsHash(lazyInjections);
+ this.container.registry.validateInjections(lazyInjections);
+ }
+
+ validationCache[this.fullName] = true;
+ (true && !(typeof this.class.create === 'function') && (0, _debug.assert)(`Failed to create an instance of '${this.normalizedName}'. Most likely an improperly defined class or an invalid module export.`, typeof this.class.create === 'function'));
+ }
+
+ return this.class.create(props);
+ }
+
+ }
+
+ var VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/;
+ /**
+ A registry used to store factory and option information keyed
+ by type.
+
+ A `Registry` stores the factory and option information needed by a
+ `Container` to instantiate and cache objects.
+
+ The API for `Registry` is still in flux and should not be considered stable.
+
+ @private
+ @class Registry
+ @since 1.11.0
+ */
+
+ class Registry {
+ constructor(options = {}) {
+ this.fallback = options.fallback || null;
+ this.resolver = options.resolver || null;
+ this.registrations = (0, _utils.dictionary)(options.registrations || null);
+ this._localLookupCache = Object.create(null);
+ this._normalizeCache = (0, _utils.dictionary)(null);
+ this._resolveCache = (0, _utils.dictionary)(null);
+ this._failSet = new Set();
+ this._options = (0, _utils.dictionary)(null);
+ this._typeOptions = (0, _utils.dictionary)(null);
+ }
+ /**
+ A backup registry for resolving registrations when no matches can be found.
+ @private
+ @property fallback
+ @type Registry
+ */
+
+ /**
+ An object that has a `resolve` method that resolves a name.
+ @private
+ @property resolver
+ @type Resolver
+ */
+
+ /**
+ @private
+ @property registrations
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _normalizeCache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _resolveCache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _options
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _typeOptions
+ @type InheritingDict
+ */
+
+ /**
+ Creates a container based on this registry.
+ @private
+ @method container
+ @param {Object} options
+ @return {Container} created container
+ */
+
+
+ container(options) {
+ return new Container(this, options);
+ }
+ /**
+ Registers a factory for later injection.
+ Example:
+ ```javascript
+ let registry = new Registry();
+ registry.register('model:user', Person, {singleton: false });
+ registry.register('fruit:favorite', Orange);
+ registry.register('communication:main', Email, {singleton: false});
+ ```
+ @private
+ @method register
+ @param {String} fullName
+ @param {Function} factory
+ @param {Object} options
+ */
+
+
+ register(fullName, factory, options = {}) {
+ (true && !(this.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+ (true && !(factory !== undefined) && (0, _debug.assert)(`Attempting to register an unknown factory: '${fullName}'`, factory !== undefined));
+ var normalizedName = this.normalize(fullName);
+ (true && !(!this._resolveCache[normalizedName]) && (0, _debug.assert)(`Cannot re-register: '${fullName}', as it has already been resolved.`, !this._resolveCache[normalizedName]));
+
+ this._failSet.delete(normalizedName);
+
+ this.registrations[normalizedName] = factory;
+ this._options[normalizedName] = options;
+ }
+ /**
+ Unregister a fullName
+ ```javascript
+ let registry = new Registry();
+ registry.register('model:user', User);
+ registry.resolve('model:user').create() instanceof User //=> true
+ registry.unregister('model:user')
+ registry.resolve('model:user') === undefined //=> true
+ ```
+ @private
+ @method unregister
+ @param {String} fullName
+ */
+
+
+ unregister(fullName) {
+ (true && !(this.isValidFullName(fullName)) && (0, _debug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+ var normalizedName = this.normalize(fullName);
+ this._localLookupCache = Object.create(null);
+ delete this.registrations[normalizedName];
+ delete this._resolveCache[normalizedName];
+ delete this._options[normalizedName];
+
+ this._failSet.delete(normalizedName);
+ }
+ /**
+ Given a fullName return the corresponding factory.
+ By default `resolve` will retrieve the factory from
+ the registry.
+ ```javascript
+ let registry = new Registry();
+ registry.register('api:twitter', Twitter);
+ registry.resolve('api:twitter') // => Twitter
+ ```
+ Optionally the registry can be provided with a custom resolver.
+ If provided, `resolve` will first provide the custom resolver
+ the opportunity to resolve the fullName, otherwise it will fallback
+ to the registry.
+ ```javascript
+ let registry = new Registry();
+ registry.resolver = function(fullName) {
+ // lookup via the module system of choice
+ };
+ // the twitter factory is added to the module system
+ registry.resolve('api:twitter') // => Twitter
+ ```
+ @private
+ @method resolve
+ @param {String} fullName
+ @param {Object} [options]
+ @param {String} [options.source] the fullname of the request source (used for local lookups)
+ @return {Function} fullName's factory
+ */
+
+
+ resolve(fullName) {
+ var factory = resolve(this, this.normalize(fullName));
+
+ if (factory === undefined && this.fallback !== null) {
+ factory = this.fallback.resolve(...arguments);
+ }
+
+ return factory;
+ }
+ /**
+ A hook that can be used to describe how the resolver will
+ attempt to find the factory.
+ For example, the default Ember `.describe` returns the full
+ class name (including namespace) where Ember's resolver expects
+ to find the `fullName`.
+ @private
+ @method describe
+ @param {String} fullName
+ @return {string} described fullName
+ */
+
+
+ describe(fullName) {
+ if (this.resolver !== null && this.resolver.lookupDescription) {
+ return this.resolver.lookupDescription(fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.describe(fullName);
+ } else {
+ return fullName;
+ }
+ }
+ /**
+ A hook to enable custom fullName normalization behavior
+ @private
+ @method normalizeFullName
+ @param {String} fullName
+ @return {string} normalized fullName
+ */
+
+
+ normalizeFullName(fullName) {
+ if (this.resolver !== null && this.resolver.normalize) {
+ return this.resolver.normalize(fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.normalizeFullName(fullName);
+ } else {
+ return fullName;
+ }
+ }
+ /**
+ Normalize a fullName based on the application's conventions
+ @private
+ @method normalize
+ @param {String} fullName
+ @return {string} normalized fullName
+ */
+
+
+ normalize(fullName) {
+ return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName));
+ }
+ /**
+ @method makeToString
+ @private
+ @param {any} factory
+ @param {string} fullName
+ @return {function} toString function
+ */
+
+
+ makeToString(factory, fullName) {
+ var _a;
+
+ if (this.resolver !== null && this.resolver.makeToString) {
+ return this.resolver.makeToString(factory, fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.makeToString(factory, fullName);
+ } else {
+ return typeof factory === 'string' ? factory : (_a = factory.name) !== null && _a !== void 0 ? _a : '(unknown class)';
+ }
+ }
+ /**
+ Given a fullName check if the container is aware of its factory
+ or singleton instance.
+ @private
+ @method has
+ @param {String} fullName
+ @param {Object} [options]
+ @param {String} [options.source] the fullname of the request source (used for local lookups)
+ @return {Boolean}
+ */
+
+
+ has(fullName) {
+ if (!this.isValidFullName(fullName)) {
+ return false;
+ }
+
+ return has(this, this.normalize(fullName));
+ }
+ /**
+ Allow registering options for all factories of a type.
+ ```javascript
+ let registry = new Registry();
+ let container = registry.container();
+ // if all of type `connection` must not be singletons
+ registry.optionsForType('connection', { singleton: false });
+ registry.register('connection:twitter', TwitterConnection);
+ registry.register('connection:facebook', FacebookConnection);
+ let twitter = container.lookup('connection:twitter');
+ let twitter2 = container.lookup('connection:twitter');
+ twitter === twitter2; // => false
+ let facebook = container.lookup('connection:facebook');
+ let facebook2 = container.lookup('connection:facebook');
+ facebook === facebook2; // => false
+ ```
+ @private
+ @method optionsForType
+ @param {String} type
+ @param {Object} options
+ */
+
+
+ optionsForType(type, options) {
+ this._typeOptions[type] = options;
+ }
+
+ getOptionsForType(type) {
+ var optionsForType = this._typeOptions[type];
+
+ if (optionsForType === undefined && this.fallback !== null) {
+ optionsForType = this.fallback.getOptionsForType(type);
+ }
+
+ return optionsForType;
+ }
+ /**
+ @private
+ @method options
+ @param {String} fullName
+ @param {Object} options
+ */
+
+
+ options(fullName, options) {
+ var normalizedName = this.normalize(fullName);
+ this._options[normalizedName] = options;
+ }
+
+ getOptions(fullName) {
+ var normalizedName = this.normalize(fullName);
+ var options = this._options[normalizedName];
+
+ if (options === undefined && this.fallback !== null) {
+ options = this.fallback.getOptions(fullName);
+ }
+
+ return options;
+ }
+
+ getOption(fullName, optionName) {
+ var options = this._options[fullName];
+
+ if (options !== undefined && options[optionName] !== undefined) {
+ return options[optionName];
+ }
+
+ var type = fullName.split(':')[0];
+ options = this._typeOptions[type];
+
+ if (options && options[optionName] !== undefined) {
+ return options[optionName];
+ } else if (this.fallback !== null) {
+ return this.fallback.getOption(fullName, optionName);
+ }
+
+ return undefined;
+ }
+ /**
+ This is deprecated in favor of explicit injection of dependencies.
+ Reference: https://deprecations.emberjs.com/v3.x#toc_implicit-injections
+ ```
+ @private
+ @method injection
+ @param {String} factoryName
+ @param {String} property
+ @param {String} injectionName
+ @deprecated
+ */
+
+
+ injection(fullName, property) {
+ (true && !(false) && (0, _debug.deprecate)(`As of Ember 4.0.0, owner.inject no longer injects values into resolved instances, and calling the method has been deprecated. Since this method no longer does anything, it is fully safe to remove this injection. As an alternative to this API, you can refactor to explicitly inject \`${property}\` on \`${fullName}\`, or look it up directly using the \`getOwner\` API.`, false, {
+ id: 'remove-owner-inject',
+ until: '5.0.0',
+ url: 'https://deprecations.emberjs.com/v4.x#toc_implicit-injections',
+ for: 'ember-source',
+ since: {
+ enabled: '4.0.0'
+ }
+ }));
+ }
+ /**
+ @private
+ @method knownForType
+ @param {String} type the type to iterate over
+ */
+
+
+ knownForType(type) {
+ var localKnown = (0, _utils.dictionary)(null);
+ var registeredNames = Object.keys(this.registrations);
+
+ for (var index = 0; index < registeredNames.length; index++) {
+ var fullName = registeredNames[index];
+ var itemType = fullName.split(':')[0];
+
+ if (itemType === type) {
+ localKnown[fullName] = true;
+ }
+ }
+
+ var fallbackKnown, resolverKnown;
+
+ if (this.fallback !== null) {
+ fallbackKnown = this.fallback.knownForType(type);
+ }
+
+ if (this.resolver !== null && this.resolver.knownForType) {
+ resolverKnown = this.resolver.knownForType(type);
+ }
+
+ return Object.assign({}, fallbackKnown, localKnown, resolverKnown);
+ }
+
+ isValidFullName(fullName) {
+ return VALID_FULL_NAME_REGEXP.test(fullName);
+ }
+
+ }
+
+ _exports.Registry = Registry;
+
+ if (true
+ /* DEBUG */
+ ) {
+ var proto = Registry.prototype;
+
+ proto.normalizeInjectionsHash = function (hash) {
+ var injections = [];
+
+ for (var key in hash) {
+ if (Object.prototype.hasOwnProperty.call(hash, key)) {
+ var {
+ specifier
+ } = hash[key];
+ (true && !(this.isValidFullName(specifier)) && (0, _debug.assert)(`Expected a proper full name, given '${specifier}'`, this.isValidFullName(specifier)));
+ injections.push({
+ property: key,
+ specifier
+ });
+ }
+ }
+
+ return injections;
+ };
+
+ proto.validateInjections = function (injections) {
+ if (!injections) {
+ return;
+ }
+
+ for (var i = 0; i < injections.length; i++) {
+ var {
+ specifier
+ } = injections[i];
+ (true && !(this.has(specifier)) && (0, _debug.assert)(`Attempting to inject an unknown injection: '${specifier}'`, this.has(specifier)));
+ }
+ };
+ }
+
+ function resolve(registry, _normalizedName) {
+ var normalizedName = _normalizedName;
+ var cached = registry._resolveCache[normalizedName];
+
+ if (cached !== undefined) {
+ return cached;
+ }
+
+ if (registry._failSet.has(normalizedName)) {
+ return;
+ }
+
+ var resolved;
+
+ if (registry.resolver) {
+ resolved = registry.resolver.resolve(normalizedName);
+ }
+
+ if (resolved === undefined) {
+ resolved = registry.registrations[normalizedName];
+ }
+
+ if (resolved === undefined) {
+ registry._failSet.add(normalizedName);
+ } else {
+ registry._resolveCache[normalizedName] = resolved;
+ }
+
+ return resolved;
+ }
+
+ function has(registry, fullName) {
+ return registry.resolve(fullName) !== undefined;
+ }
+
+ var privateNames = (0, _utils.dictionary)(null);
+ var privateSuffix = `${Math.random()}${Date.now()}`.replace('.', '');
+
+ function privatize([fullName]) {
+ var name = privateNames[fullName];
+
+ if (name) {
+ return name;
+ }
+
+ var [type, rawName] = fullName.split(':');
+ return privateNames[fullName] = (0, _utils.intern)(`${type}:${rawName}-${privateSuffix}`);
+ }
+ /*
+ Public API for the container is still in flux.
+ The public API, specified on the application namespace should be considered the stable API.
+ // @module container
+ @private
+ */
+
+});
+define("@ember/-internals/environment/index", ["exports"], function (_exports) {
+ "use strict";
+
+ Object.defineProperty(_exports, "__esModule", {
+ value: true
+ });
+ _exports.getLookup = getLookup;
+ _exports.setLookup = setLookup;
+ _exports.getENV = getENV;
+ _exports.ENV = _exports.context = _exports.global = void 0;
+
+ // from lodash to catch fake globals
+ function checkGlobal(value) {
+ return value && value.Object === Object ? value : undefined;
+ } // element ids can ruin global miss checks
+
+
+ function checkElementIdShadowing(value) {
+ return value && value.nodeType === undefined ? value : undefined;
+ } // export real global
+
+
+ var global$1 = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || typeof mainContext !== 'undefined' && mainContext || // set before strict mode in Ember loader/wrapper
+ new Function('return this')(); // eval outside of strict mode
+
+ _exports.global = global$1;
+
+ var context = function (global, Ember) {
+ return Ember === undefined ? {
+ imports: global,
+ exports: global,
+ lookup: global
+ } : {
+ // import jQuery
+ imports: Ember.imports || global,
+ // export Ember
+ exports: Ember.exports || global,
+ // search for Namespaces
+ lookup: Ember.lookup || global
+ };
+ }(global$1, global$1.Ember);
+
+ _exports.context = context;
+
+ function getLookup() {
+ return context.lookup;
+ }
+
+ function setLookup(value) {
+ context.lookup = value;
+ }
+ /**
+ The hash of environment variables used to control various configuration
+ settings. To specify your own or override default settings, add the
+ desired properties to a global hash named `EmberENV` (or `ENV` for
+ backwards compatibility with earlier versions of Ember). The `EmberENV`
+ hash must be created before loading Ember.
+
+ @class EmberENV
+ @type Object
+ @public
+ */
+
+
+ var ENV = {
+ ENABLE_OPTIONAL_FEATURES: false,
+
+ /**
+ Determines whether Ember should add to `Array`
+ native object prototypes, a few extra methods in order to provide a more
+ friendly API.
+ We generally recommend leaving this option set to true however, if you need
+ to turn it off, you can add the configuration property
+ `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.
+ Note, when disabled (the default configuration for Ember Addons), you will
+ instead have to access all methods and functions from the Ember
+ namespace.
+ @property EXTEND_PROTOTYPES
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ EXTEND_PROTOTYPES: {
+ Array: true
+ },
+
+ /**
+ The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log
+ a full stack trace during deprecation warnings.
+ @property LOG_STACKTRACE_ON_DEPRECATION
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ LOG_STACKTRACE_ON_DEPRECATION: true,
+
+ /**
+ The `LOG_VERSION` property, when true, tells Ember to log versions of all
+ dependent libraries in use.
+ @property LOG_VERSION
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ LOG_VERSION: true,
+ RAISE_ON_DEPRECATION: false,
+ STRUCTURED_PROFILE: false,
+
+ /**
+ Whether to insert a `
` wrapper around the
+ application template. See RFC #280.
+ This is not intended to be set directly, as the implementation may change in
+ the future. Use `@ember/optional-features` instead.
+ @property _APPLICATION_TEMPLATE_WRAPPER
+ @for EmberENV
+ @type Boolean
+ @default true
+ @private
+ */
+ _APPLICATION_TEMPLATE_WRAPPER: true,
+
+ /**
+ Whether to use Glimmer Component semantics (as opposed to the classic "Curly"
+ components semantics) for template-only components. See RFC #278.
+ This is not intended to be set directly, as the implementation may change in
+ the future. Use `@ember/optional-features` instead.
+ @property _TEMPLATE_ONLY_GLIMMER_COMPONENTS
+ @for EmberENV
+ @type Boolean
+ @default false
+ @private
+ */
+ _TEMPLATE_ONLY_GLIMMER_COMPONENTS: false,
+
+ /**
+ Whether to perform extra bookkeeping needed to make the `captureRenderTree`
+ API work.
+ This has to be set before the ember JavaScript code is evaluated. This is
+ usually done by setting `window.EmberENV = { _DEBUG_RENDER_TREE: true };`
+ before the "vendor" `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+